결측치 처리와 이상치 탐지로 데이터 전처리 파이프라인 설계하기
결측치 삭제·보간·KNN Imputation과 Z-점수·IQR·DBSCAN 이상치 탐지 방식을 데이터 전처리 파이프라인 관점에서 정리한다.
2026-08-14 · 최초 발행 2025-10-14
결측값과 이상값은 같은 방식으로 다루지 않는다
데이터 전처리는 학습·추론 파이프라인의 일관성, 재현성, 성능을 확보하기 위한 작업이다. 결측과 이상치를 처리하지 않으면 모델 바이어스가 커지고 운영 안정성과 비용에도 영향을 준다.
결측치(Missing Value)는 관측할 수 없었거나 수집이 실패해 값이 비어 있는 상태다. 발생 양상은 MCAR(무작위 완전), MAR(무작위), MNAR(무작위 아님)으로 나뉜다. 처리 방식도 데이터의 구조에 따라 달라진다.
삭제(Deletion)는 레코드나 특성을 제거하는 방식으로 단순하고 비용이 낮지만 정보 손실 위험이 있다. 보간(Interpolation)은 시간이나 순서를 기준으로 연속값을 추정하며 선형·스플라인·전후방 채움 등을 사용한다. KNN Imputation은 유사 이웃을 이용하는 다변량 대치 방식으로 비선형 관계를 보존할 수 있다.
이상치(Outlier)는 데이터 생성 과정에서 확률적으로 드물거나, 군집 구조에서 벗어난 샘플이다. Z-점수는 표준화한 값에 임계값 규칙을 적용하고, IQR은 사분위 범위와 상자수염 규칙을 이용한다. DBSCAN은 밀도 기반 군집과 잡음을 분리한다.
감사 결과가 처리 정책을 결정한다
전처리를 시작하기 전에 결측률과 결측 패턴(MCAR/MAR/MNAR)을 확인하고, 이상치의 분포·스케일·군집성을 분석한다. 물리적으로 가능한 범위나 비즈니스 규칙도 임계값 설계에 반영해야 한다.
결측률이 낮은 경우에는 삭제를 우선 고려할 수 있다. 예를 들어 결측률이 <5%이면 삭제를 검토하고, 5~30% 또는 30%+ 구간에서는 보간이나 대치로 전환한다. 시계열 또는 연속형 데이터에는 보간을, 다변량 상관이 강한 경우에는 KNN 대치를 적용한다.
이상치 탐지는 비용이 낮은 규칙 기반 탐지부터 시작한다. Z-점수와 IQR로 첫 번째 선별을 한 뒤, 비선형 구조나 여러 군집을 반영해야 한다면 DBSCAN으로 정밀 탐지를 보완한다.
전처리기의 적합은 학습 세트에서만 수행한다. 검증·테스트 세트에는 변환만 적용해야 누수를 막을 수 있다. 스케일링, 대치, 이상치 플래깅, 제거 또는 클리핑의 순서도 고정한다.
운영 단계에서는 결측률과 이상치율의 드리프트를 감지하고, 알림·롤백·파라미터 재조정을 자동화한다. 데이터 계약(Data Contract)과 품질 지표(SLA) 관리도 함께 다룬다.
원시 데이터에서 정제 결과까지의 흐름
처리 방법별 선택 기준
| 방법 | 성능(예측 보존) | 확장성 | 일관성 | 안정성(잡음 민감도) | 운영 편의 |
|---|---|---|---|---|---|
| 삭제(Deletion) | 중 | 매우 높음 | 높음 | 중 | 매우 높음 |
| 보간(Interpolation) | 중~높음(시계열) | 높음 | 높음 | 중 | 높음 |
| KNN Imputation | 높음(비선형) | 중 | 중 | 중 | 중 |
| Z-점수 | 중 | 매우 높음 | 중 | 낮음(비정규 분포 취약) | 매우 높음 |
| IQR | 중 | 매우 높음 | 중 | 중 | 매우 높음 |
| DBSCAN | 높음(복잡 구조) | 중 | 중 | 높음(파라미터 민감) | 중 |
실제 평가는 데이터 분포, 샘플 수, 특성 차원에 따라 달라진다.
전처리 정책을 적용할 때 확인할 항목
결측률 히트맵, 상관 행렬, 분포와 박스플롯으로 데이터를 감사한다. MCAR·MAR·MNAR 가설을 검증하고 비즈니스 규칙에 맞는 유효 범위를 정한다.
필요한 경우 스케일링을 먼저 적용한 뒤 결측값을 대치하고, 이상치를 표시한 후 처리한다. 학습과 검증을 분리한 상태에서 학습 세트로만 적합해야 한다.
Z-점수 임계값은 3을 보수적으로, 2.5를 민감하게 사용할 수 있다. IQR 범위는 1.5×IQR이 일반적이고 3×IQR은 보수적이다. KNN의 k값은 5~15 범위에서 탐색하며 거리는 유클리드를 사용하고 스케일링이 필요하다. DBSCAN의 eps는 k-distance plot(예: k=MinPts)을 기준으로 잡고, min_samples는 ≈2×차원으로 설정한다.
이상치를 제거할지 캡핑할지는 모델 민감도와 업무 리스크를 고려해 정책으로 정한다. 이상치 여부를 이진 특성으로 남겨 모델 학습에 활용할 수도 있다.
Python으로 구성한 처리 예시
전제: Python 3.10+, pandas 2.x, numpy 1.26+, scikit-learn 1.4+, scipy 1.11+
데이터: df(DataFrame), 수치형 컬럼 num_cols, 시계열 인덱스 옵션
# 환경: Python 3.10+, pandas 2.x, scikit-learn 1.4+
import numpy as np, pandas as pd
from sklearn.impute import KNNImputer
from sklearn.preprocessing import StandardScaler, RobustScaler
from sklearn.cluster import DBSCAN
df = df.copy()
# 1) 결측치 삭제(열/행) – 결측률<5%인 열에 한정
col_na_rate = df.isna().mean()
drop_cols = col_na_rate[col_na_rate < 0.05].index.tolist()
# 중요 특성 보호 예외 처리 필요 시 제외 목록 적용
df = df.dropna(subset=drop_cols)
# 2) 시계열 보간(해당 시계열 컬럼만)
time_cols = ['sensor1', 'sensor2']
if isinstance(df.index, pd.DatetimeIndex):
df[time_cols] = df[time_cols].interpolate(method='time').ffill().bfill()
else:
df[time_cols] = df[time_cols].interpolate(method='linear').ffill().bfill()
# 3) KNN Imputation(다변량)
num_cols = [c for c in df.select_dtypes(include=np.number).columns if c not in time_cols]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df[num_cols])
knn_imp = KNNImputer(n_neighbors=7, weights='distance')
X_imputed = knn_imp.fit_transform(X_scaled)
df[num_cols] = scaler.inverse_transform(X_imputed)
# 4) 이상치 탐지 1단계: Z-점수, IQR
zs_threshold = 3.0
zs = (df[num_cols] - df[num_cols].mean()) / df[num_cols].std(ddof=0)
flag_z = (zs.abs() > zs_threshold)
q1, q3 = df[num_cols].quantile(0.25), df[num_cols].quantile(0.75)
iqr = q3 - q1
low = q1 - 1.5 * iqr
high = q3 + 1.5 * iqr
flag_iqr = (df[num_cols] < low) | (df[num_cols] > high)
# 5) 이상치 탐지 2단계: DBSCAN(표준화 후)
rb = RobustScaler()
X_rb = rb.fit_transform(df[num_cols])
db = DBSCAN(eps=0.8, min_samples=max(5, 2 * X_rb.shape[1]), n_jobs=-1)
labels = db.fit_predict(X_rb)
flag_db = (labels == -1)
# 6) 이상치 처리: 제거 또는 캡핑
outlier_flag = flag_z.any(axis=1) | flag_iqr.any(axis=1) | flag_db
# 예시: 캡핑
df_capped = df.copy()
for c in num_cols:
df_capped[c] = np.clip(df_capped[c], low[c], high[c])
# 이상치 여부 플래그 보존
df_capped['is_outlier'] = outlier_flag.astype(int)
위 예시는 단일 데이터셋을 위한 예시다. 실무에서는 학습 세트로만 fit하고 검증·테스트 세트에는 transform을 적용한다. KNN과 DBSCAN 전에 표준화·로버스트 스케일을 적용하며, KNNImputer와 DBSCAN은 O(n^2) 경향이 있으므로 샘플링·근사(FAISS/ANN)를 고려한다.
데이터 유형에 따른 적용 모습
생산 설비 시계열 센서에서는 보간으로 누락 구간을 대치하고 DBSCAN으로 비정상 운전 패턴을 탐지할 수 있다. 경보 플래그는 MTBF 예측 모델과 결합한다.
전자상거래 거래 데이터에서는 KNN 대치로 가격·재고 결측을 보정하고 IQR로 주문 수량 이상치를 캡핑한다. 수요 예측 및 재고 최적화 정확도 향상에 활용한다.
헬스케어 바이오신호에는 Z-점수로 노이즈를 제거하고 스플라인 보간으로 신호 연속성을 확보한다. 이상 이벤트 탐지 민감도를 높이고 오탐률을 줄이는 데 쓸 수 있다.
품질 관리 체계가 남기는 효과
데이터 품질 저하를 전제로 모델 성능은 AUC/MAE 3~10%p 개선 범위를 기대할 수 있다. 파이프라인 실패율이 30% 이상 감소한 사례도 관측됐다.
데이터 신뢰도와 설명가능성이 높아지고 운영 장애가 줄어든다. 규정 준수와 감사 대응도 수월해진다.