데이터정제
결측지 정제
결측치는 누락된 값, 비어 있는 값을 말한다
데이터 수집 과정에서의 오류로 인해 결측치가 포함되어 있다면 함수가 적용되지 않거나 분석 결과가 왜곡될 수 있다.
결측치 찾기
sex score
1 M 5
2 F 4
3 <NA> 3
4 M 4
5 F NA
- NA : 결측치
- 문자로 구성된 변수는 <>감싸진 형태
-
따옴표가 있는 “NA”는 영문자 NA를 의미
- 결측치 확인하기 - is.na()
sex score [1,] FALSE FALSE [2,] FALSE FALSE [3,] TRUE FALSE [4,] FALSE FALSE [5,] FALSE TRUE
- 결측치인 값은 TRUE로 나옴
- is.na()를 테이블에 적용하면 빈도를 알 수 있다
FALSE TRUE 8 2
- 결측치 제거
- 결측치를 제거하려면 구체적으로 어떤 변수에 결측치가 있는지 알아야 함
- table(is.na())에 변수명을 지정하여 결측치의 갯수를 찾을 수 있다
table(is.na(df$sex)) #sex 결측치 빈도 FALSE TRUE 4 1
- 결측치가 포함된 데이터를 함수에 적용하면 NA가 출력됨
결측치 제거하기
- 결측지 있는 행 제거
is.na()를 filter()에 적용하면 결측치가 있는 행을 제거할 수 있음df %>% filter(is.na(score)) sex score 1 F NA
- !is.na()를 통해 결측치가 없는 행을 추출
df %>% filter(!is.na(score))
- 추출한 데이터로 데이터 프레임을 만들면 결측치가 없는 데이터가 된다
df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex)) df_nomiss sex score 1 M 5 2 F 4 3 M 4
- na.omit() - 변수를 지정하지 않고 결측치가 있는 행을 한 번에 제거
df_nomiss2 <- na.omit(df) df_nomiss2 sex score 1 M 5 2 F 4 3 M 4
결측치 제외 기능
수치 연산함수들은 결측치를 제외하고 연산하도록 설정하는 na.rm파라미터 지원
mean(df$score, na.rm = T) # 결측치 제외하고 평균 산출
[1] 4
- summrise()로 요약 통계량을 산출 할때도 사용가능
결측치 대체하기
결측치 대체법 - 데이터가 작고 결측치가 많은 경우 결측치를 제거하면 너무 많은 데이터가 손실되기 때문에 다른 값으로 대체하여 해결
- 결측치를 제외하고 math평균
[1] 55.23529
- NA값을 평균으로 대체 - ifelse()
exam$math <- ifelse(is.na(exam$math), 55, exam$math)
- 평균 출력
mean(exam$math) [1] 55.2
이상치 정제하기
이상치 - 정상 범주에서 크게 벗어난 값
이상치가 포함되어 있으면 분석 결과가 왜곡되기 때문에 이상치를 제거해야 한다
존재할 수 없는 값
논리적으로 존재할 수 없는 값이 데이터에 포함되어 있는 경우 분명한 오류이기 때문에 결측치로 변환한 후 분석에서 제외한다
outlier
sex score
1 1 5
2 2 4
3 1 3
4 3 4
5 2 2
6 1 6
- 이상치 확인하기
table(outlier$sex) 1 2 3 3 2 1 table(outlier$score) 2 3 4 5 6 1 1 2 1 1
sex에 존재할 수 없는 값 3이 하나,
score에 존재할 수 없는 값 6이 하나 있다 - 결측 처리하기
이상치를 결측치로 변환outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex) # sex가 3이면 NA 할당 outlier$score <- ifelse(outlier$score > 5, NA, outlier$score) # score가 5보다 크면 NA 할당
- 결측치를 제외한 후 성별에 따른 score평균
outlier %>% filter(!is.na(sex) & !is.na(score)) %>% group_by(sex) %>% summarise(mean_score = mean(score)) # A tibble: 2 x 2 sex mean_score <dbl> <dbl> 1 1 4 2 2 3
극단적인 값
극단치 - 존재할 가능성은 있지만 굉장히 드문 경우
극단치 제거
- 어디까지를 정상 범위로 볼 것인지
- 통계적인 기준에서 극단적으로 크거나 작을 때 (ex 상자그림)
-
상자그림
중심에서 멀리 떨어진 점으로 극단치의 기준을 정하루 수 있다.- boxplot() : 상자 그림으로 표현할 변수 지정
- boxplot(mpg$hwy)$stats : 상자그림 통계치 출력
[,1] [1,] 12 #아래쪽 극단치 경계 [2,] 18 #1사분위수 [3,] 25 #중앙값 [4,] 27 #3사분위수 [5,] 37 #위쪽 극단치 경계 attr(,"class") 1 "integer"
- 12 ~ 37을 벗어나면 극단치로 분류
- 결측 처리하기
# 12~37을 벗어나면 NA 할당 mpg$hwy <- ifelse(mpg$hwy < 12 | mpg$hwy > 37, NA, mpg$hwy)
- 결측치를 제외하고 분석
mpg %>% group_by(drv) %>% summarise(mean_hwy = mean(hwy, na.rm = T)) # A tibble: 3 x 2 drv mean_hwy <chr> <dbl> 1 4 19.2 2 f 27.8 3 r 21