728x90

07 데이터 정제 - 빠진 데이터, 이상한 데이터 제거하기

07-1 빠진 데이터를 찾아라! - 결측치 정제하기

  • 결측치(Missing Value) : 누락된 값, 비어 있는 값을 의미
    • 결측치가 있으면 함수가 적용되지 않거나 분석 결과가 왜곡되는 문제가 발생
    • 실제 데이터에서는 결측치가 있는지 확인해 제거하는 정제 과정을 거친 후에 분석
    df <- data.frame(sex = c("M", "F", NA, "M", "F"),
                     score = c(5, 4, 3, 4, NA))
    df
    
    ##    sex score
    ## 1    M     5
    ## 2    F     4
    ## 3 <NA>     3
    ## 4    M     4
    ## 5    F    NA
    
    is.na(df)  # 결측치 확인
    
    ##        sex score
    ## [1,] FALSE FALSE
    ## [2,] FALSE FALSE
    ## [3,]  TRUE FALSE
    ## [4,] FALSE FALSE
    ## [5,] FALSE  TRUE
    
    table(is.na(df))  # 결측치 빈도 출력
    
    ## FALSE  TRUE
    ##     8     2
    
    library(dplyr)               # dplyr 패키지 로드
    
    df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex))  # score, sex 결측치 제거
    df_nomiss
    
    ##   sex score
    ## 1   M     5
    ## 2   F     4
    ## 3   M     4
    
    df_nomiss2 <- na.omit(df)  # 모든 변수에 결측치 없는 데이터 추출
    df_nomiss2
    
    ##   sex score
    ## 1   M     5
    ## 2   F     4
    ## 4   M     4
    
    mean(df$score, na.rm = T)  # 결측치 제외하고 평균 산출
    
    ## [1] 4

07-2 이상한 데이터를 찾아라! - 이상치 정제하기

  • 이상치(Outlier) : 정상 범주에서 크게 벗어난 값
    • 오류는 아니지만 굉장히 드물게 발생하는 극단적인 값이 있을 수도 있음
    • 이상치가 포함되어 있으면 분석 결과가 왜곡되기 때문에 분석에 앞서 이상치를 제거하는 작업을 해야 함
  • 이상치 제거하기 - 존재할 수 없는 값
    outlier <- data.frame(sex = c(1, 2, 1, 3, 2, 1),
                          score = c(5, 4, 3, 4, 2, 6))
    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이면 NA 할당
    outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex)
    outlier
    
    ##   sex score
    ## 1   1     5
    ## 2   2     4
    ## 3   1     3
    ## 4  NA     4
    ## 5   2     2
    ## 6   1     6
    
    # score가 5보다 크면 NA 할당
    outlier$score <- ifelse(outlier$score > 5, NA, outlier$score)
    outlier
    
    ##   sex score
    ## 1   1     5
    ## 2   2     4
    ## 3   1     3
    ## 4  NA     4
    ## 5   2     2
    ## 6   1    NA
    
    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
  • 이상치 제거하기 - 극단적인 값
    boxplot(mpg$hwy)
    
    boxplot(mpg$hwy)$stats  # 상자 그림 통계치 출력
    
    ##      [,1]
    ## [1,]   12  # 아래쪽 극단치 경계
    ## [2,]   18  # 1사분위수
    ## [3,]   25  # 중앙값
    ## [4,]   27  # 3사분위수
    ## [5,]   37  # 위쪽 극단치 경계
    ## attr(,"class")
    ##         1
    ## "integer"
    
    # 12~37 벗어나면 NA 할당
    mpg$hwy <- ifelse(mpg$hwy < 12 | mpg$hwy > 37, NA, mpg$hwy)
    table(is.na(mpg$hwy))
    
    ## FALSE  TRUE
    ##   226     8
    
    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
출처 : Do it! 쉽게 배우는 R 데이터 분석
 

Do it! 쉽게 배우는 R 데이터 분석

통계, 프로그래밍을 1도 몰라도 데이터를 혼자서 다룰 수 있다!데이터 분석 프로젝트 전 과정 수록!데이터 분석을 처음 시작한 초보자도 어깨춤을 추며 데이터를 혼자 다룰 수 있게 한다는 강의

book.naver.com

728x90