결측치 처리와 중복 제거로 데이터 품질 관리하기
결측 메커니즘에 따른 삭제·보간·예측 기반 대치와 정확·퍼지 매칭 중복 제거 전략을 실무 관점에서 정리한다.
2026-08-14 · 최초 발행 2024-04-29
결측 메커니즘이 처리 방법을 결정한다
데이터 정제에서 결측치와 중복 레코드는 모델 학습과 리포팅 결과를 함께 흔든다. 결측치는 단순히 비어 있는 값이 아니라, 왜 값이 빠졌는지에 따라 처리 결과의 편향이 달라진다.
결측치 메커니즘은 다음처럼 구분한다.
- MCAR은 결측이 완전무작위로 발생하는 경우다.
- MAR은 관측된 변수에 조건부로 결측이 발생하는 경우다.
- MNAR은 값 자체에 결측 발생 여부가 의존하는 경우다.
삭제, 보간, 단순 대치, 예측 기반 대치 중 무엇을 선택할지는 이 가정에 의존한다. 중복 제거 역시 같은 실체가 여러 레코드로 존재하는 문제를 정합화하는 작업이다. 키가 명확하면 정확 일치로 처리하고, 키가 불완전하면 퍼지 매칭을 이용한 엔터티 해결이 필요하다.
삭제부터 예측 기반 대치까지의 선택 기준
MCAR 비율이 낮다면 행을 제거하는 방식이 모델 편향을 최소화하는 선택이 될 수 있다. 리스트와이즈 삭제는 결측치를 포함한 행 전체를 없애므로 단순하고 성능이 좋지만, 표본 손실 위험이 있다. 페어와이즈 삭제는 분석마다 사용할 수 있는 쌍만 남기는 방식으로 상관·공분산 분석처럼 국지적인 분석에 쓸 수 있다.
MAR에서는 공변량을 활용하는 예측 기반 대치가 적합하다. KNN, MICE(IterativeImputer), 회귀와 트리 모델은 변수 사이의 구조를 반영할 수 있다. 다중 대치로 대치 불확실성을 추정할 수도 있지만, 계산량이 늘고 데이터 리크를 막기 위한 관리가 필요하다.
MNAR로 추정되는 경우에는 외부 데이터 결합 또는 모델링 기반 대치와 민감도 분석을 함께 고려한다.
수치형 값은 평균·중앙값·사분위수로 대치하거나 시계열의 선형·스플라인·전후값 보간을 적용할 수 있다. 범주형 값은 최빈값 대치나 Unknown 버킷화를 사용한다. 다만 단순 대치는 분포 보존에 한계가 있다.
방법별로 달라지는 성능과 통계적 보존
| 방법 | 성능(속도) | 확장성 | 일관성(통계 보존) | 안정성(재현성) | 운영 편의 |
|---|---|---|---|---|---|
| 삭제 | 매우 높음 | 매우 높음 | 낮음(표본 손실) | 높음 | 매우 높음 |
| 단순 대치 | 높음 | 높음 | 보통(분산 축소) | 높음 | 높음 |
| 보간(시계열) | 보통 | 높음 | 보통~높음(추세 보존) | 높음 | 보통 |
| 예측 기반 대치 | 보통~낮음 | 보통 | 높음(구조 반영) | 보통(튜닝 필요) | 보통 |
| 정확 일치 중복 제거 | 매우 높음 | 매우 높음 | 높음 | 매우 높음 | 매우 높음 |
| 퍼지 매칭 중복 제거 | 보통 | 보통 | 높음(정합화) | 보통(임계값 의존) | 보통 |
중복 레코드는 정규화와 검증을 함께 설계한다
정확 일치 중복 제거는 키와 정규화 규칙을 기준으로 레코드를 판별한다. 성능과 일관성 측면에서 유리하다. 키가 완전하지 않은 경우에는 토큰 정규화, 블로킹, 자로-윙클러 또는 코사인 유사도, 임계값 튜닝을 조합해 퍼지 매칭을 수행한다.
정규화 단계에서는 케이스·공백·특수문자·한글 자모·로마자 변환과 전화·주소 표준화를 다룬다. 이후 우편번호, 도메인, 이니셜 키로 후보를 줄이고 유사도를 계산한다. 임계값은 라벨된 페어로 Precision-Recall 균형을 검증하며 조정한다.
병합할 때는 최신 타임스탬프와 신뢰 소스 같은 골든 레코드 우선순위를 정하고, 필드별 충돌 해결 규칙을 둔다.
재현 가능한 정제 파이프라인으로 운영하기
처리 전에 결측률, 중복률, 변수 타입과 분포를 프로파일링하고 허용 결측률·중복 판정 규칙·정제 후 유지 표본률·정합성 KPI를 정한다.
결측률이 ≤5%이면 삭제를, 5~30%이면 단순 대치나 보간을, >30% 또는 MAR/MNAR로 추정되면 예측 기반 대치를 분기 기준으로 삼을 수 있다. 대치 이후에는 교차검증으로 모델 성능과 분포 왜곡을 평가하고, 민감도 분석으로 임계값과 하이퍼파라미터를 조정한다.
운영 측면에서는 아이템포턴시, 원자적 커밋과 롤백, 변경 이력 저장을 갖춰 감사 가능성을 확보한다. 모델 학습 시 학습·검증 데이터를 분리하고 대치기 학습은 학습 세트에 한정해 데이터 리크를 막아야 한다. 매칭 전후에는 해시·가명 처리, 민감정보 마스킹, 접근 제어도 함께 적용한다.
Python으로 프로파일링과 단순 대치 적용하기
전제조건: Python 3.10+, pandas>=1.5, scikit-learn>=1.2, rapidfuzz>=2.13
import pandas as pd
from sklearn.impute import SimpleImputer
df = pd.read_csv("input.csv") # 샘플 데이터
# 결측/중복 프로파일링
missing_rate = df.isna().mean().sort_values(ascending=False)
dup_rate = 1 - len(df.drop_duplicates()) / len(df)
# 결측률 5% 이하 수치형 → 행 삭제
low_missing_cols = [c for c in df.columns if df[c].isna().mean() <= 0.05]
df_drop = df.dropna(subset=low_missing_cols)
# 수치형 단순 대치, 범주형 최빈값 대치
num_cols = df.select_dtypes(include="number").columns
cat_cols = df.select_dtypes(exclude="number").columns
df_imputed = df.copy()
df_imputed[num_cols] = SimpleImputer(strategy="median").fit_transform(df[num_cols])
df_imputed[cat_cols] = SimpleImputer(strategy="most_frequent").fit_transform(df[cat_cols])
시계열 데이터는 인덱스를 정렬한 뒤 시간 기준 보간을 적용할 수 있다.
# 전제: 시계열 인덱스 정렬
ts = pd.read_csv("timeseries.csv", parse_dates=["ts"]).set_index("ts").sort_index()
ts["value_interp"] = ts["value"].interpolate(method="time", limit_direction="both")
변수 간 관계를 반영해야 한다면 MICE 방식의 반복 대치를 사용할 수 있다. fit은 학습 데이터에만 적용한다.
from sklearn.experimental import enable_iterative_imputer # noqa: F401
from sklearn.impute import IterativeImputer
from sklearn.ensemble import RandomForestRegressor
num_df = df.select_dtypes(include="number")
imp = IterativeImputer(estimator=RandomForestRegressor(n_estimators=100, n_jobs=-1), random_state=42)
df_mice = df.copy()
df_mice[num_df.columns] = imp.fit_transform(num_df) # 학습 데이터에 한정하여 fit
정확 일치와 퍼지 매칭을 함께 사용하는 예시
import pandas as pd
from rapidfuzz import fuzz, process
cust = pd.read_csv("customers.csv")
# 정확 일치 제거
dedup_exact = cust.drop_duplicates(subset=["email_normalized", "phone_normalized"])
# 퍼지 매칭(간단 예시): 블로킹 후 이름 유사도
block = cust.groupby("zip5")
pairs = []
for _, g in block:
names = g["name_normalized"].tolist()
for i, n in enumerate(names):
match = process.extractOne(n, names[i+1:], scorer=fuzz.WRatio)
if match and match[1] >= 90:
a = g.iloc[i]
b = g[g["name_normalized"] == match[0]].iloc[0]
pairs.append((a["id"], b["id"], match[1]))
pairs_df = pd.DataFrame(pairs, columns=["id_a","id_b","score"])
# 골든 레코드 선택 로직 적용 후 머지 수행
삭제나 대치 전후에는 표본수, 분포(KS 검정), 상관 구조 변화를 모니터링한다. 퍼지 매칭의 임계값은 라벨된 페어로 PR 곡선과 F1 최대화를 기준으로 검증한다.
데이터 성격에 따른 적용 장면
이커머스 추천에서는 클릭스트림 결측 이벤트를 타임라인으로 보간하고, 중복 고객 계정을 통합해 사용자 기반 모델의 정확도를 높일 수 있다. 금융 CRM에서는 주소와 연락처의 퍼지 매칭으로 고객을 단일화해 캠페인 중복 발송을 줄인다.
헬스케어 데이터에서는 검사치를 MAR로 가정한 MICE 대치가 생존분석 편향 완화와 리포트 신뢰도 개선에 쓰일 수 있다. IoT·설비 데이터는 센서 결측 구간을 선형 또는 스플라인으로 보간해 이상탐지 모델의 연속성을 확보한다.
정제 결과로 표본 유지율 +1030%p, 모델 AUC/Accuracy +15%p, 중복 제거율 2~10% 향상을 기대할 수 있다(도메인 의존). 편향 완화와 리포팅 일관성, 데이터 거버넌스와 감사 추적성도 함께 얻는다. 파이프라인 실패율 감소, 재처리 시간 단축, 비용 절감 역시 운영 측면의 효과다.