본문 바로가기

데이터 분석

R 데이터 분석 - 데이터 가공 (2)

 
 


 





 




 

데이터 합치기 

 
 
 
 
중간고사 데이터 생성

R - 열 우선
test1 <- data.frame(id = c(1,2,3,4,5), midterm = (60,80,70,90,85))
test1

 
 
 
 
 
기말고사 데이터 생성

test2 <- data.frame(id = c(1,2,3,4,5), final = c(70,83,65,95,80))

 
 
 
 
 
total 데이터 

total <- left_join(test1, test2, by = "id")
total
id를 기준으로 total에 할당

 
 
 
 
 
다른 데이터를 활용해 변수 추가하기 

name <- data.frame(class = c(1,2,3,4,5), teacher = c("kim","lee","park","choi","jung"))
name

 
 

exam_new <- left_join(exam, name, by = class)
exam_new

 
 
 
 
 
 
세로로 합치기 

학생 1~5번 시험 데이터 생성 
group_a <- data.frmae(id = c(1,2,3,4,5), test = c(60,80,70,90,85))

학생 6~10번 시험 데이터 생성 
group_b <- data.frmae(id = c(6,7,8,9,10), test = c(70,83,65,95,80))

group_a
group_b

group_all <- bind_rows(group_a, group_b)
group_all

 
 
 
 
 
 
 


 

 

 

 

 

 


 

 
데이터 정제 

 
 
결측치 정제하기 
 
결측치 (missing value) 는 누락된 값, 비어있는 값을 의미한다.
 
결측치가 있으면 함수가 적용되지 않거나, 분석 결과가 왜곡되는 문제가 발생한다.
실제 데이터에는 결측치가 있는지 확인해 제거하는 과정을 거친 후 분석해야 한다.
 
 

df <- data.frame(sex = c("M","F","NA","M","F"), score = c(5,4,3,4,NA))
df

 
 
 
 
 
 
결측치 확인하기 

is.na(df)

> 
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,]  TRUE FALSE
[4,] FALSE FALSE
[5,] FALSE  TRUE

 
 
 
 
 
결측치 빈도 확인 

table(is.na(df))
table(is.na(df$sex))
table(is.na(df$score))

> FALSE  TRUE 
    8     2
false는 결측치 아닌 값 개수, true는 결측치인 값 개수

 
 

sum(df$score)
mean(df$sex)
결측치가 df속에 있다면 값은 NA로 나옴

 
 
 
 
 
 
결측치 제거하기 

score 가 NA인 데이터만 출력
df %>% filter(is.na(score))

score 결측치 제거
df %>% filter(!is.na(score))

df_nomiss <- df %>% filter(!is.na(score))
mean(df_nomiss)

 
 
 
 
 
 
여러 변수 동시에 결측치 없는 데이터 추출 

df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex))
df_nomiss

 
 
 
 
 
결측치가 하나라도 있으면 제거하기 
 
na.omit() 을 이용하면 변수를 지정하지 않고 결측치가 한번에 제거됨
 

df_nomiss2 <- na.omit(df)
df_nomiss2

 
 
 
 
 
함수의 결측치 제외 기능 사용하기

mean(df$score,na.rm = T)

 
 
 
 

exam <- read.csv("csv_exam.csv")
exam[c(3,8,15), "math"] <- NA
exam
exam %>% summarise(mean_math = mean(math))
exam %>% summarise(mean_math = mean(math, na.rm = T)
평균, 합계, 중앙값 산출 
exam %>% summarise(mean_math = mean(math, na.rm = T), sum_math = sum(math, na.rm = T),
median_math = median(math, na.rm = T))

 
 
 
 
 
 
 
결측치 대체하기 

평균값으로 결측치 대체하기 
mean(na.rm = T)

exam$math 값이 없으면 55로 대체하기 
exam$math <- ifelse(is.na(exam$math), 55, exam$math)
table(is.na(exam$math))

# 테이블 형태 결과 예시
> FALSE  TRUE 
   3     2
   
exam

 

 

 

 


 


 

 

 

 


 
 
이상치 정제하기 
 
정상 범주에서 크게 벗어난 값을 '이상치(outlier)' 라고 한다. 
 
이상치가 데이터에 포함되어 있으면 결과가 왜곡되기 때문에 이상치를 제거해야 한다.
 

outlier <- data.frame(sex = c(1,2,1,3,2,1), score = c(5,4,3,4,2,6))
outlier

table(outlier$sex)
# "sex" 변수의 값들을 카운트하여 표로서 보여줍니다. 
table(outlier$score)
# 테이블은 각 값들의 빈도를 확인하는 데 사용

 
 
 

sex 가 3이면 NA 할당
outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex)
outliler

score 가 5보다 크면 NA 할당
outlier$score <- ifelse(outlier$score == 5, NA, outlier$score)
ourlier

 
 
 
 
 
 
 
 
sex, score 변수 모두 이상치를 결측치로 변환했으니 결측치 제거하기 

성별별로 점수의 평균을 계산하는 작업
outlier %>% filter(!is.na(sex) & !is.na(score)) %>% group_by(sex) %>% 
summarise(mean_score = mean(score))