Null 은 덮기 전에 먼저 이해해
"Null 있네, mean 이나 0 이나 forward-fill 로 채우자" — 데이터 일에서 제일 흔한 나쁜 반사 신경이야. Null 은 언제나 정보를 담고 있어: 그 필드가 해당 사항 없음이라 비었거나, source 가 기록을 안 했거나, 버그거나. 기원이 다르면 대응도 달라야 하고, "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). 자동으로 자르거나 자동으로 지우지 마. 드러내고, 세고, 파이프라인마다 그게 뭘 뜻하는지 정해.