Skip to main content
결측치 처리는 fillna()를 먼저 적용하는 문제가 아니라, 왜 비었는지를 먼저 파악하는 문제입니다. 같은 결측치 비율이라도 패턴이 다르면 선택해야 하는 전략이 달라집니다.

진단 기준

  • 규모: 열별/행별 결측치 비율
  • 집중 구간: 특정 기간, 특정 채널, 특정 고객군에 결측치가 몰리는지
  • 동반 결측: 여러 컬럼이 동시에 비는 조합이 반복되는지

기본 진단 코드

import pandas as pd

missing_rate = df.isna().mean().sort_values(ascending=False)
print(missing_rate.head(10))

row_missing = df.isna().sum(axis=1)
print(row_missing.describe())

# 특정 그룹(예: 채널)별 결측률
channel_missing = (
    df.assign(is_price_missing=df["price"].isna())
      .groupby("channel")["is_price_missing"]
      .mean()
      .sort_values(ascending=False)
)
print(channel_missing)

패턴을 읽는 방법

  1. 랜덤 결측(MCAR) 가능성이 높으면 단순 대체가 유효할 수 있습니다.
  2. **그룹 의존 결측(MAR)**이면 그룹별 대체가 더 안전합니다.
  3. 비관측 요인 결측(MNAR) 의심 구간은 대체보다 별도 플래그 피처(is_missing)를 함께 둡니다.

동반 결측 확인

missing_combo = (
    df[["age", "income", "job"]]
    .isna()
    .astype(int)
    .value_counts()
    .rename("count")
)
print(missing_combo.head())
동반 결측 조합이 반복되면, 수집 파이프라인 문제인지 입력 UX 문제인지를 먼저 확인하는 편이 정확합니다.

이어서 볼 문서