R 패키지를 이용한 고급 임퓨테이션

발행: (2025년 12월 11일 오전 04:42 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

결측값이란 무엇인가요?

설문 데이터를 수집한다고 가정해 보세요. 참가자가 결혼한 경우, 결혼 상태는 married 로 표시되고 배우자와 자녀의 이름을 제공할 수 있습니다. 미혼 응답자에게는 이러한 항목이 자연스럽게 비워집니다.

이는 결측값의 전형적인 예이지만, 결측 데이터는 사람의 실수(데이터 입력 누락), 잘못된 입력(예: 음수 나이), 혹은 데이터 수집 중 시스템 오류 등으로도 발생할 수 있습니다.

결측 데이터를 다루기 전에, 어떤 유형의 결측이 발생했는지 파악하는 것이 중요합니다.

결측값의 유형

결측 데이터는 일반적으로 세 가지 범주로 분류됩니다:

MCAR (Missing Completely At Random)

다른 변수와 전혀 관계없이 무작위로 결측값이 발생합니다.
예시: 설문 참가자가 실수로 질문을 건너뛰는 경우. MCAR는 드물지만, 결측이 편향을 일으키지 않기 때문에 가장 다루기 쉽습니다.

MAR (Missing At Random)

결측값이 다른 관측된 변수에 의존하지만, 결측 자체의 값에는 의존하지 않습니다.
예시: 남성은 정신 건강에 관한 설문 질문에 답할 확률이 낮은 경우. 다른 데이터로 결측을 예측할 수 있지만, 직접 관측되지는 않습니다. MAR 값은 종종 안전하게 대체(impute)할 수 있습니다.

NMAR (Not Missing At Random)

결측값이 그 값 자체 혹은 숨겨진 요인과 관련이 있습니다.
예시: 배우자 이름이 누락된 경우, 이는 미혼 참가자이거나 의도적으로 정보를 제공하지 않은 것일 수 있습니다. NMAR은 신중히 다루어야 하며, 무시하면 분석에 편향을 초래할 수 있습니다.

결측값 처리 전략

결측값 삭제

결측 데이터 비율이 매우 작을 때(예: < 5 %) 결측값을 무시하고 삭제할 수 있습니다:

clean_data <- na.omit(dataset)

하지만 너무 많은 행을 삭제하면 특히 결측이 일정한 패턴을 보일 때 중요한 정보를 잃게 될 수 있습니다.

결측값 대체(Imputation)

대체는 결측값을 합리적인 값으로 채워 데이터의 구조와 분포를 유지하는 방법입니다.

  • 수치형 데이터 – 평균, 중앙값, 이동 평균 등을 사용.
  • 범주형 데이터 – 최빈값(mode) 또는 예측 기반 대체 사용.
  • 특수 경우-1(나이)이나 "Unknown"(범주형 필드) 같은 플레이스홀더 값을 사용(빠른 탐색에 유용).

예시

# 수치형 변수에 평균 대체
dataset$age[is.na(dataset$age)] <- mean(dataset$age, na.rm = TRUE)

# 범주형 변수에 최빈값 대체
dataset$gender[is.na(dataset$gender)] <- as.character(stats::mode(dataset$gender))

R 패키지를 활용한 고급 대체

R에는 강력한 대체 기능을 제공하는 여러 패키지가 있습니다:

  • Hmisc – 범용 대체.
  • missForest – 랜덤 포레스트를 이용한 비모수 대체.
  • Amelia – 시계열 및 횡단면 데이터에 대한 다중 대체.
  • mice – 연쇄 방정식에 의한 다변량 대체(MAR 데이터에 대한 표준).

여기서는 MAR 결측값에 널리 사용되는 mice 패키지를 중심으로 살펴보겠습니다.

mice 패키지 사용법

1단계: 패키지와 데이터 로드

library(mice)
library(VIM)
library(lattice)

data(nhanes)  # NHANES 데이터셋
# NHANES는 25개의 관측치와 4개의 변수(age, bmi, hyp, chl)를 포함합니다.
# bmi, hyp, chl 변수에 결측값이 존재합니다.

# Age는 구간(1, 2, 3)으로 코딩되어 있어 factor로 변환하는 것이 좋습니다:
nhanes$age <- as.factor(nhanes$age)

2단계: 결측 패턴 파악

md.pattern(nhanes)

이 함수는 어떤 변수들이 동시에 결측되는지 등 결측 패턴을 보여줍니다.

결측 데이터 시각화

nhanes_miss <- aggr(
  nhanes,
  col = mdc(1:2),
  numbers = TRUE,
  sortVars = TRUE,
  labels = names(nhanes),
  cex.axis = .7,
  gap = 3,
  ylab = c("Proportion of missingness", "Missingness Pattern")
)

marginplot(
  nhanes[, c("chl", "bmi")],
  col = mdc(1:2),
  cex.numbers = 1.2,
  pch = 19
)
  • aggr()는 변수별 결측 비율을 보여줍니다.
  • marginplot()은 관측값과 결측값의 분포를 시각화하여 MCAR 패턴을 식별하는 데 도움을 줍니다.

3단계: 결측값 대체

mice_imputes <- mice(nhanes, m = 5, maxit = 40)
# m = 5  → 5개의 대체 데이터셋 생성
# maxit = 40 → 각 대체 과정의 최대 반복 횟수
# 기본 방법: 수치형 변수에 대해 Predictive Mean Matching(PMM)
mice_imputes$method

4단계: 대체된 데이터셋 추출

imputed_data <- complete(mice_imputes, 5)  # 5번째 대체 데이터셋 사용

5단계: 대체 품질 평가

XY 플롯

xyplot(mice_imputes, bmi ~ chl | .imp, pch = 20, cex = 1.4)
  • 파란 점 = 실제 관측값
  • 빨간 점 = 대체된 값

대체가 잘 이루어졌다면 빨간 점이 파란 점과 유사하게 배치됩니다.

밀도 플롯

densityplot(mice_imputes)

관측값과 대체값의 분포를 비교합니다.

6단계: 다중 대체 데이터셋을 활용한 모델링

lm_5_model   <- with(mice_imputes, lm(chl ~ age + bmi + hyp))
combo_5_model <- pool(lm_5_model)
summary(combo_5_model)

with()는 각 대체 데이터셋에 모델을 적합하고, pool()은 결과를 결합해 단일 대체 데이터셋을 사용할 때보다 더 신뢰할 수 있는 추정치를 제공합니다.

요약

  • 결측값은 데이터 분석에서 흔히 마주치는 문제입니다.
  • 결측의 유형과 양에 따라 무시하거나, 삭제하거나, 대체할 수 있습니다.
  • mice, Hmisc, Amelia, missForest와 같은 R 패키지는 고급 대체 방법을 제공합니다.
  • mice 패키지는 MAR 결측값에 특히 강력하며, 다중 대체와 견고한 모델링을 지원합니다.
  • VIM을 이용한 결측 시각화는 결측값의 특성을 파악하고 적절한 대체 전략을 선택하는 데 도움을 줍니다.

결측 데이터를 적절히 처리하면 정확하고 편향되지 않은 신뢰성 높은 모델을 구축할 수 있으며, 이는 성공적인 데이터 사이언스 프로젝트의 핵심 요소입니다.

Back to Blog

관련 글

더 보기 »