본문 바로가기
통계

[통계] Python에서 MICE를 사용하여 결측치 대체하기 (Scikit-learn의 IterativeImputer)

by 배써니 2025. 7. 3.

이번 포스팅에서는 지난 MICE 기초 포스팅 내용에 이어,
Scikit-learn의 IterativeImputer를 활용해 MICE(Multivariate Imputation by Chained Equations) 방식으로 결측치를 대체하는 구체적인 내용에 대해 다뤄보도록 하겠다.

IterativeImputer는 Scikit-learn에서 제공하는 패키지이다.


우선, 필자가 실제 데이터 분석에 사용했던 예시 코드는 아래와 같다.

imputer = IterativeImputer(random_state=42)
mice_result = imputer.fit_transform(mice_input_df)

MICE를 적용하기 위해 간단한 전처리(수치형 + 범주형 데이터 분리, 원핫인코딩 등)를 거친 mice_input_df 데이터에 MICE 방식의 결측치 대체를 적용한 뒤, mice_result라는 변수로 정의하는 코드이다.


01. IterativeImputer는 어떤 도구인가?

IterativeImputer는 여러 개의 변수들이 서로 영향을 주는 관계를 이용해 결측치를 보간하는 방법이다. MICE는 변수 하나씩 돌아가며 결측값을 예측하고, 그것을 반복(iterate)하면서 점점 더 정교한 값을 추정한다. 이름 그대로 "Chained Equations" — 변수들을 연쇄적으로 예측하는 방식을 의미한다.

IterativeImpurter의 주요 파라미터는 아래와 같다.

IterativeImputer(
    estimator=None,              # 사용할 예측 모델 (default: BayesianRidge)
    max_iter=10,                 # 반복 횟수 (기본 10회)
    initial_strategy='mean',    # 초기 결측치 채움 방법
    random_state=42             # 랜덤 시드
)

 

파라미터 설명
estimator 어떤 모델로 결측치를 예측할지 지정(회귀 모델), default=BayesianRidge()
initial_strategy 첫 단계에서 결측치를 어떤 값으로 채울지 (‘mean’, ‘median’, ‘most_frequent’ 등), default=’mean’
max_iter 전체 보간 과정을 몇 번 반복할지, default=10
random_state 반복 결과 재현을 위한 시드, default=None

※ 많은 결측치가 있는 변수에 대해서는 불안정할 수 있으며, 반복마다 예측이 바뀌기 때문에 random_state 고정 필수.
더 다양한 하이퍼파라미터 참고 : https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html


02. MICE 진행 절차 (IterativeImputer의 로직 요약)

1. 초기값으로 결측치를 잠정 대체

: 평균, 중위수 등으로 일단 결측치를 채워서 예측 모델을 학습

2. 각 열을 타겟으로 지정하며 결측치 예측

: 결측치가 있는 A 열을 가장 먼저 타겟으로 두고
→ B, C(결측치가 없는 상태)열을 사용하여 회귀모델 학습
→ A열의 결측치였던 값들을 예측하여 대체

B를 타겟으로 지정
→ A(임시 보간된 값 포함), C를 이용하여 회귀모델 학습
→ B의 결측치 예측

마찬가지로 나머지 열들도 동일하게 진행

3. 위의 과정 반복

: 하이퍼파라미터 max_iter만큼 반복(기본값은 10)하며, 반복할수록 값이 수렴하고 더 정밀한 예측이 이루어짐.

4. 모델은 기본적으로 BayesianRidge (선형 회귀 기반)

: DecisionTree나 KNN 등으로 변경하는 것도 가능.


03. [ 정리 ]  fit_transform() 호출 시 수행 과정

1. 초기값 채우기
2. 열마다 모델 학습 & 예측
3. 전체 반복 (max_iter의 수만큼)
4. 최종적으로 모든 결측치가 채워진 numpy 배열 반환 (단, 아래와 같은 코드를 사용하여  데이터프레임 형태로 반환 가능)

pd.DataFrame(mice_result, columns=mice_input_df.columns)