Null 덮지 말고 먼저 이해해
"Null 있으니까 mean / 0 / forward-fill 로 채우자" 본능이 데이터 작업에서 가장 흔한 나쁜 반사. Null 은 항상 정보 가져 — 필드가 적용 안 돼서 missing, source 가 기록 안 해서 missing, 또는 버그라서 missing. 각 origin 이 다른 응답 필요하고 "mean 으로 채움" 은 거의 절대 옳은 거 아니야.
4가지 정당한 전략
- Row drop — row 가 그 필드 없이 쓸모없을 때.
df.dropna(subset=['order_id', 'amount_usd']). - Column drop — 필드가 거의 다 null 이고 제거해도 정보 손실 없을 때.
- Sentinel 으로 impute — 명시적
'unknown',-1, 또는 도메인 default — downstream 로직이 값 필요한데 missing 이 의미 있을 때. - 통계로 impute — mean/median/forward-fill — 필드가 row 간 진정 호환 가능할 때만. 실전엔 드물고 자주 버그 가림.
Outlier — 같은 규율
Outlier 는 (a) 입력 에러 (amount = 99999999 인데 의도가 9999.99), (b) 정당하지만 비범한 값, 또는 (c) 본인이 탐지하려던 신호 자체 (fraud, anomaly) 일 수 있어. 자동 cap 또는 자동 제거 마. Surface 하고, count 하고, 파이프라인마다 뭘 의미하는지 결정.