본문 바로가기

데이터 분석/R

Part Ⅶ: 데이터 정제(결측치 / 이상치)

is.na() !is.na() na.omit() na.rm = T
결측치(NA) 확인 결측치 제외 모든 변수에서 결측치 없는
데이터 추출
함수의 결측치 제외 기능
  • 결측치를 포함한 상태로 분석을 진행하는 경우 통계값은 NA가 반환이 된다. ∴ 결측치 정제가 중요

<Exercises>

[ ⅰ. 결측치 (Missing Value) 정제하기 pg. 170 ]

mpg 데이터 원본에는 결측치가 없습니다. 우선 mpg 데이터를 불러와 몇 개의 값을 결측치로 만들겠습니다. 아래 코드를 실행하면 다섯 행의 hwy 변수에 NA가 할당됩니다.

mpg <- as.data.frame(ggplot2::mpg)           # mpg 데이터 불러오기
mpg[c(65, 124, 131, 153, 212), "hwy"] <- NA  # NA 할당하기

결측치가 들어있는 mpg 데이터를 활용해서 문제를 해결해보세요.

  • Q1. drv(구동방식)별로 hwy(고속도로 연비) 평균이 어떻게 다른지 알아보려고 합니다. 분석을 하기 전에 우선 변수에 결측치가 있는지 확인해야 합니다. drv 변수와 hwy 변수에 결측치가 있는지 알아보세요.

  • Q2. filter() 이용해 hwy 변수의 결측치를 제외하고, 어떤 구동방식의 hwy 평균이 높은지 알아보세요. 하나의 dplyr 구문으로 만들어야 합니다.

더보기
library(ggplot2)
library(dplyr)

mpg <- as.data.frame(ggplot2::mpg)
mpg[c(65, 124, 131, 153, 212), "hwy"] <- NA

# Q1
table(is.na(mpg$drv))
table(is.na(mpg$hwy))

# Q2-1
mpg %>% filter(!is.na(hwy)) %>%
  group_by(drv) %>% 
  summarise(mean_hwy = mean(hwy)) %>% 
  arrange(desc(mean_hwy))

# Q2-2
mpg %>% group_by(drv) %>% 
  summarise(mean_hwy = mean(hwy, na.rm = T)) %>% 
  arrange(desc(mean_hwy))

 


[ ⅱ. 이상치 (Outlier) 정제하기 pg. 178]

  • 이상치 : 논리적으로 존재할 수 없는 값 → 결측 처리 후 제외하고 분석
  • 이상치에 대한 통계적 판단 : 상하위 0.3% 극단치 또는 상자그림 ±1.5 IQR 벗어나면 극단치
    • 상자그림 : 데이터의 분포를 직사각형의 상자 모양으로 표현한 그래프

이미지 출처 : 「Do It! 쉽게 배우는 R 데이터 분석 pg. 175」

 

우선 mpg 데이터를 불러와서 일부러 이상치를 만들겠습니다. drv(구동방식) 변수의 값은 4(사륜구동), f(전륜구동), r(후륜구동) 세 종류로 되어있습니다. 몇 개의 행에 존재할 수 없는 값 k를 할당하겠습니다. cty(도시 연비) 변수도 몇 개의 행에 극단적으로 크거나 작은 값을 할당하겠습니다.

mpg <- as.data.frame(ggplot2::mpg)                  # mpg 데이터 불러오기
mpg[c(10, 14, 58, 93), "drv"] <- "k"                # drv 이상치 할당
mpg[c(29, 43, 129, 203), "cty"] <- c(3, 4, 39, 42)  # cty 이상치 할당

구동방식별로 도시 연비가 다른지 알아보려고 합니다. 분석을 하려면 우선 두 변수에 이상치가 있는지 확인하려고 합니다.

  • Q1. drv 이상치가 있는지 확인하세요. 이상치를 결측 처리한 다음 이상치가 사라졌는지 확인하세요. 결측 처리 때는 %in% 기호를 활용하세요.

  • Q2. 상자 그림을 이용해서 cty 이상치가 있는지 확인하세요. 상자 그림의 통계치를 이용해 정상 범위를 벗어난 값을 결측 처리한 다시 상자 그림을 만들어 이상치가 사라졌는지 확인하세요.

  • Q3. 변수의 이상치를 결측처리 했으니 이제 분석할 차례입니다. 이상치를 제외한 다음 drv별로 cty 평균이 어떻게 다른지 알아보세요. 하나의 dplyr 구문으로 만들어야 합니다.

더보기
library(ggplot2)
library(dplyr)

mpg <- as.data.frame(ggplot2::mpg)                  # mpg 데이터 불러오기
mpg[c(10, 14, 58, 93), "drv"] <- "k"                # drv 이상치 할당
mpg[c(29, 43, 129, 203), "cty"] <- c(3, 4, 39, 42)  # cty 이상치 할당

# Q1
table(mpg$drv)

mpg$drv <- ifelse(mpg$drv %in% c("4", "f", "r"), mpg$drv, NA)
table(is.na(mpg$drv))
table(mpg$drv)


# Q2
boxplot(mpg$cty)$stats

mpg$cty <- ifelse(mpg$cty < 9 | mpg$cty > 26, NA, mpg$cty)

table(is.na(mpg$cty))
boxplot(mpg$cty)$stats

# Q3-1
mpg %>% filter(!is.na(drv) & !is.na(cty)) %>% 
  group_by(drv) %>% summarise(mean_cty = mean(cty))

# Q3-2
mpg %>% group_by(drv) %>% summarise(mean_cty = mean(cty, na.rm = T))

 

 

 

교재 : 「Do it! 쉽게 배우는 R 데이터 분석

티스토리에서 R 코드블럭 적용하기

'데이터 분석 > R' 카테고리의 다른 글

Part ⅩⅠ: 지도 시각화  (0) 2021.01.11
Part Ⅹ: 텍스트 마이닝  (0) 2021.01.11
Part Ⅸ: 한국 복지 패널 데이터 분석  (0) 2021.01.07
Part Ⅷ: 데이터 시각화  (0) 2021.01.07
Part Ⅵ: 데이터 전처리  (0) 2021.01.06
Part Ⅴ: 데이터 분석 기초  (0) 2021.01.05