본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

Null 과 outlier 처리 — default 아니라 전략

~11 min · nulls, outliers, imputation

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

Null 은 덮기 전에 먼저 이해해

"Null 있네, mean 이나 0 이나 forward-fill 로 채우자" — 데이터 일에서 제일 흔한 나쁜 반사 신경이야. Null 은 언제나 정보를 담고 있어: 그 필드가 해당 사항 없음이라 비었거나, source 가 기록을 안 했거나, 버그거나. 기원이 다르면 대응도 달라야 하고, "mean 으로 채우기" 가 정답인 경우는 거의 없어.

정당한 전략 4가지

  1. Row drop — 그 필드 없이는 row 가 쓸모없을 때. df.dropna(subset=['order_id', 'amount_usd']).
  2. Column drop — 필드가 거의 다 null 이고, 버려도 잃는 정보가 없을 때.
  3. Sentinel 로 impute — 명시적인 'unknown', -1, 또는 도메인 default. Downstream 로직이 값을 요구하는데 missing 자체가 의미 있을 때.
  4. 통계로 impute — mean/median/forward-fill. 그 필드가 row 사이에서 정말 같은 성질일 때만. 실전에선 드물고, 버그를 가리는 쪽이 더 잦아.

Outlier — 같은 규율

Outlier 는 셋 중 하나야: (a) 입력 에러 (amount = 99999999, 진짜 의도는 9999.99), (b) 정상이지만 극단적인 값, (c) 본인이 애초에 찾고 있던 신호 그 자체 (fraud, anomaly). 자동으로 자르거나 자동으로 지우지 마. 드러내고, 세고, 파이프라인마다 그게 뭘 뜻하는지 정해.

Code

명시적 null/outlier 처리 — 한 거 로깅, silent fix 안 함·python
import logging
import pandas as pd

log = logging.getLogger('quality')

def handle_nulls(df: pd.DataFrame, required: list[str]) -> pd.DataFrame:
    n_before = len(df)
    df = df.dropna(subset=required)
    log.info('nulls.dropped=%d required=%s', n_before - len(df), required)
    return df

def handle_outliers(df: pd.DataFrame, col: str, low_q: float = 0.01, high_q: float = 0.99) -> pd.DataFrame:
    lo, hi = df[col].quantile([low_q, high_q])
    mask = df[col].between(lo, hi)
    n_drop = (~mask).sum()
    log.info('outliers.col=%s low_q=%.4f high_q=%.4f dropped=%d', col, lo, hi, n_drop)
    # 중요: drop 한 row 는 audit 위해 어딘가에 작성
    df.loc[~mask].to_parquet(f'audit/outliers_{col}.parquet', index=False)
    return df.loc[mask]

External links

Exercise

Null 이 5% 넘는 column 하나를 가진 DataFrame 을 골라. 그 null 이 뭘 뜻하는지 — count 만 보지 말고 row 를 직접 봐 — 한 단락으로 적어. 그다음 위 4가지 중 맞는 전략을 골라. 답이 "모르겠으니 upstream 소유자한테 물어봐야겠다" 라면, 그것도 아주 솔직하고 훌륭한 답이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.