[R] 결측치 처리

반응형
    반응형

    R 결측치 처리

    데이터 분석에서 중요한 단계 중 하나인 데이터 정제 및 전처리에 대해 얘기해보려고 합니다. 데이터 정제는 원데이터를 분석하기 쉬운 데이터로 만드는 과정으로, 데이터의 품질을 높이고 분석 결과의 신뢰성을 보장합니다. 이 중 결측치 처리에 대해서 보겠습니다.

    결측치 확인

    먼저, 결측치를 확인하는 방법을 알아봅시다. is.na() 함수를 사용하면 데이터 프레임 내의 결측치를 확인할 수 있습니다. data를 만들어서 진행해보겠습니다.

    data <- data.frame(
      A = c(1, 2, NA, 4, 5),
      B = c("a", NA, "c", "d", "e")
    )
    
    # 결측치 확인
    is.na(data)

    결측치 제거하기

    1. 결측치가 포함된 행 전체 제거

    na.omit() 함수를 이용하면 결측치가 포함된 행을 전체 제거합니다.

    clean_data <- na.omit(data)

    2. 결측치가 없는 행만 선택

    complete.cases() 함수를 사용해 결측치가 없는 행만 선택할 수도 있습니다. na.omit()과 같은 방법입니다.

    clean_data <- data[complete.cases(data), ]

     

    3. 특정 열에서 결측치 제거

    전체 데이터 프레임에서 결측치를 제거하는 대신, 특정 열에서만 결측치를 제거할 수도 있습니다. 예를 들어, 열 A에서 결측치를 제거하려면 다음과 같이 합니다.

    data_clean_A <- data[!is.na(data$A), ]

    B열의 결측치는 제거되지 않고 A열의 결측치만 제거된 것을 볼 수 있습니다.

     

     

    4. 결측치가 많은 열 제거

    결측치가 너무 많은 경우 아예 열을 제거하는 것이 더 나은 경우도 있습니다. dplyr 패키지의 select() 함수를 사용하여 결측치 지정된 비율보다 높은 열을 제거할 수 있습니다.

    library('dplyr')
    # 결측치 비율이 50% 이상인 열 제거
    clean_data <- data %>%
      select(where(~ sum(is.na(.)) / nrow(data) < 0.5))

    하지만 만약 where 안에 조건에 해당하는 열이 하나도 없다면 오류가 발생합니다.

     

    이를 방지하기 위해 조건에 해당하는 열이 하나도 없을때는 빈테이블을 반환하도록 합니다.

    
    library('dplyr')
    # 결측치 비율이 50% 이상인 열의 이름을 찾기
    columns_to_keep <- sapply(data, function(col) sum(is.na(col)) / nrow(data) > 0.5)
    
    # 열이 선택되지 않을 경우 빈 데이터 프레임 반환
    if (all(!columns_to_keep)) {
      clean_data <- data.frame()
    } else {
      clean_data <- data %>% select(names(columns_to_keep)[columns_to_keep])
    }
    print(clean_data)
    

     

    해당 데이터에는 결측치가 50%이상 되는 경우가 없기 때문에 빈 데이터프레임이 나왔습니다.

     

     

     

    결측치 대체하기

    결측치를 제거하지 않고 다른 값으로 대체합니다. 예를 들어, 평균값이나 중앙값으로 대체하는 방법이 있습니다. 분야에 따라 필요한 값이나 일반적인 값을 넣어도 됩니다.

    data$A[is.na(data$A)] <- mean(data$A, na.rm = TRUE)
    data$B[is.na(data$B)] <- "missing"

     

    열 A의 결측치를 평균값으로, 열 B의 결측치를 "missing"이라는 값으로 대체합니다.

     

     

    마치며

    데이터분석을 하면 마주할 수밖에 없는 결측치 처리에 대해 알아보았습니다. 분석할 데이터가 이쁘고 정갈하게 나에게 주어지는 게 아니기 때문에 언제나 결측치를 어떻게 할것인지 판단해야하고 그 판단이 정확할수록 모델 성능이 좋아집니다. 많은 경험이 뒷받침되어야겠죠? 참고가 되시길 바랍니다.

    댓글

    Designed by JB FACTORY

    ....