데이터정제

결측지 정제

결측치는 누락된 값, 비어 있는 값을 말한다
데이터 수집 과정에서의 오류로 인해 결측치가 포함되어 있다면 함수가 적용되지 않거나 분석 결과가 왜곡될 수 있다.

결측치 찾기

   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
    

극단적인 값

극단치 - 존재할 가능성은 있지만 굉장히 드문 경우
극단치 제거

  1. 어디까지를 정상 범위로 볼 것인지
  2. 통계적인 기준에서 극단적으로 크거나 작을 때 (ex 상자그림)
  • 상자그림
    box
    중심에서 멀리 떨어진 점으로 극단치의 기준을 정하루 수 있다.

    • boxplot() : 상자 그림으로 표현할 변수 지정 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  
      

카테고리:

업데이트: