
데이터 전처리 과정에서 결측치(Missing Values)를 어떻게 처리하느냐는 모델의 최종 성능을 결정짓는 가장 중요한 분수령입니다. 많은 초보 개발자들이 단순히 fillna(df.mean())를 사용하여 빠르게 문제를 넘기려 하지만, 이는 데이터의 분산을 왜곡하고 변수 간의 상관관계를 파괴하는 치명적인 결과를 초래할 수 있습니다. 본 포스팅에서는 단순 통계량 기반의 대치법과 머신러닝 알고리즘을 활용한 다변량 대치법(KNN, Iterative Imputer)의 메커니즘 차이를 분석하고, 실무 상황별로 어떤 알고리즘을 선택해야 하는지에 대한 7가지 전문적인 해결 가이드를 제시합니다.
1. 결측치 대치 알고리즘별 핵심 메커니즘 및 차이점 비교
단순 대치와 다변량 대치는 데이터의 '맥락'을 이해하느냐에 큰 차이가 있습니다. 아래 표는 각 방식의 기술적 특징과 장단점을 상세히 비교한 결과입니다.
| 비교 항목 | Simple Imputer (Mean/Median) | KNN Imputer | Iterative Imputer (MICE) |
|---|---|---|---|
| 기본 원리 | 단일 컬럼의 중심 경향성 활용 | 유사한 인접 이웃(K개)의 평균 | 다른 특성을 회귀 모델로 학습 |
| 데이터 관계성 | 변수 간 상관관계 무시 | 국소적 패턴(Local) 반영 | 전역적 관계(Global) 반영 |
| 계산 복잡도 | 매우 낮음 (O(N)) | 매우 높음 (거리 계산 필요) | 중간 (반복 학습 수행) |
| 이상치 민감도 | 매우 높음 (평균 왜곡 발생) | 중간 (K값에 따라 상쇄) | 낮음 (로버스트 모델 선택 시) |
| 주요 해결 시나리오 | 실시간 서빙, 데이터가 매우 클 때 | 소규모 데이터, 비선형 관계 존재 시 | 대부분의 일반적인 Tabular 데이터 |
2. 실무 고도화를 위한 결측치 처리 Sample Example 7가지
개발자가 현업 파이프라인에서 직면하는 다양한 상황에 맞춰 바로 복사해서 사용할 수 있는 최적화 코드셋입니다.
Example 1: Scikit-learn SimpleImputer를 활용한 전략적 대치
수치형 데이터는 중앙값으로, 범주형 데이터는 최빈값으로 처리하는 가장 기본적인 해결 방법입니다.
from sklearn.impute import SimpleImputer
import pandas as pd
import numpy as np
# 데이터 로드 (결측치가 포함된 샘플)
df = pd.DataFrame({'age': [25, np.nan, 30, 22, 40], 'score': [85, 90, np.nan, 70, 95]})
# 전략: 중앙값(Median) 대치 - 이상치에 강건함
imputer = SimpleImputer(strategy='median')
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
print("Simple Median Imputation Results:\n", df_imputed)
Example 2: KNN Imputer를 이용한 유클리드 거리 기반 대치
데이터 포인트 간의 유사도를 측정하여 결측치를 채웁니다. 특성 간의 스케일링이 반드시 선행되어야 합니다.
from sklearn.impute import KNNImputer
from sklearn.preprocessing import StandardScaler
# KNN은 거리 기반이므로 스케일링이 필수
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
# n_neighbors=2로 설정하여 가장 유사한 2개의 행 참고
knn_imputer = KNNImputer(n_neighbors=2, weights="distance")
df_knn_imputed = knn_imputer.fit_transform(df_scaled)
# 다시 역스케일링하여 원본 스케일로 복구
df_final = pd.DataFrame(scaler.inverse_transform(df_knn_imputed), columns=df.columns)
Example 3: Iterative Imputer (MICE)를 활용한 다변량 상관관계 반영
각 특성을 다른 특성의 함수로 모델링하여 반복적으로 결측치를 추정하는 가장 강력한 기법입니다.
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.linear_model import BayesianRidge
# 회귀 모델로 BayesianRidge를 사용하여 불확실성까지 고려
it_imputer = IterativeImputer(estimator=BayesianRidge(), max_iter=10, random_state=42)
df_mice = pd.DataFrame(it_imputer.fit_transform(df), columns=df.columns)
print("MICE (Iterative) Imputation Results:\n", df_mice)
Example 4: 특정 컬럼 조건에 따른 그룹별 평균값 대치 해결
전체 평균이 아닌, 그룹(예: 성별, 직급)의 평균을 사용해 데이터의 해상도를 높이는 방법입니다.
# 'Group' 컬럼 기준으로 'Salary'의 결측치를 그룹별 평균으로 채움
df['Salary'] = df['Salary'].fillna(df.groupby('Group')['Salary'].transform('mean'))
Example 5: Missing Indicator를 활용한 결측 패턴 정보 보존
결측치 자체가 중요한 정보(예: 설문 거부)일 경우, 대치와 동시에 결측 여부를 피처로 추가합니다.
from sklearn.impute import SimpleImputer
# add_indicator=True 설정 시 'is_missing' 컬럼 자동 생성 효과
indicator_imputer = SimpleImputer(strategy='mean', add_indicator=True)
imputed_data_with_flag = indicator_imputer.fit_transform(df)
Example 6: 시계열 데이터(Time-Series)를 위한 보간법(Interpolation) 최적화
시간의 흐름이 중요한 데이터에서는 평균값 대신 전후 데이터를 이용한 선형 보간을 사용합니다.
# 시계열 데이터의 흐름을 반영한 선형 보간
df_time = pd.Series([1, np.nan, 3, np.nan, 5])
df_interpolated = df_time.interpolate(method='linear')
Example 7: 파이프라인(Pipeline)에 Imputer 통합하여 데이터 누수 방지
학습 데이터의 통계량이 테스트 데이터에 오염되는 것을 방지하는 실무 표준 구조입니다.
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
# 전처리(대치)와 모델을 하나의 파이프라인으로 구성
model_pipeline = Pipeline([
('imputer', IterativeImputer(random_state=42)),
('regressor', RandomForestRegressor())
])
model_pipeline.fit(X_train, y_train)
3. 전문가의 선택 가이드: 언제 무엇을 써야 하는가?
기술적 완성도보다 중요한 것은 도메인과 시스템 환경에 맞는 적절한 타협입니다.
- 평균/중앙값 대치: 데이터가 수억 건 이상이거나 실무 서빙에서 레이턴시(Latency)가 매우 중요할 때 선택합니다. 또한 결측치 비율이 1% 미만으로 매우 적을 때 효율적입니다.
- KNN Imputer: 변수 간의 관계가 비선형적이고, 데이터셋의 크기가 수만 건 이내일 때 강력합니다. 다만, 메모리 소모가 크다는 점을 해결해야 합니다.
- Iterative Imputer: 현대적인 머신러닝 프로젝트의 기본값입니다. 변수 간의 선형/비선형 상관관계를 모두 학습할 수 있으며 가장 재현성이 높습니다.
4. 결론: 데이터의 진실성을 지키는 전처리
결측치를 채우는 것은 새로운 데이터를 창조하는 과정입니다. 잘못된 대치는 모델에 '거짓 정보'를 학습시키는 것과 같습니다. 단순 평균값 대치에서 벗어나 Iterative Imputer나 KNN과 같은 다변량 기법을 검토하는 것만으로도 모델의 AUC나 RMSE 성능을 5~10% 이상 개선할 수 있습니다.
Tip: 어떤 방식을 선택하든 대치 전후의 데이터 분포(KDE Plot)를 시각화하여 원래의 데이터 분포가 심하게 왜곡되지 않았는지 반드시 검증하십시오.
내용 출처 및 참고 문헌
- Scikit-learn Documentation: "Imputation of missing values" (v1.4)
- Statistical Analysis with Missing Data - Little, R. J., & Rubin, D. B.
- Journal of Statistical Software: "Multivariate Imputation by Chained Equations (MICE) in R"
- Towards Data Science: "6 Different Ways to Compensate for Missing Values"
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] 시계열 데이터 처리 시 Windowing 함수 최적화 7가지 방법과 성능 차이 해결 (0) | 2026.04.19 |
|---|---|
| [PYTHON] 고차원 데이터 차원의 저주 해결 방법 3가지와 PCA t-SNE UMAP 성능 차이 (0) | 2026.04.19 |
| [PYTHON] 불균형 데이터셋 해결을 위한 SMOTE 한계와 7가지 대안 방법 및 성능 차이 (0) | 2026.04.19 |
| [PYTHON] 데이터 드리프트(Data Drift) 탐지를 위한 7가지 통계적 방법과 해결 차이점 (0) | 2026.04.19 |
| [PYTHON] AI 데이터 저장 시 Parquet가 CSV보다 유리한 7가지 이유와 성능 차이 해결 방법 (0) | 2026.04.19 |