[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