LabHub
배우기 러닝패스 코스

고객 데이터 다루기 · 표본과 통계로 이상 찾기 · 실습

검증기는 초록불인데 숫자가 이상하다

LabHub 에서 이어서 보기

목표

칼럼별 프로파일과 전달분 사이의 분포 변화, 그리고 첫 자리 숫자 분포로 형식은 맞는데 값이 이상한 자료를 찾아내는 도구 profile.py 를 만든다. 벤포드가 통하지 않는 칼럼을 반례로 넣어, 이것이 증거가 아니라 단서임을 코드가 스스로 말하게 한다.

왜 중요한가

스키마도 맞고 결측도 규칙대로인데 숫자가 이상한 일이 있다. 이때 "이상합니다" 만으로는 아무도 움직이지 않는다. 근거가 필요하고, 그 근거는 값 하나가 아니라 분포다.
프로파일 하나만으로는 판단이 어렵다. 이상은 절대적인 값이 아니라 지난 전달분과의 차이로 드러나기 때문이다. 그래서 프로파일은 전달분마다 남겨 두고 견주며, 문턱값을 코드에 적어 둔다 — 적어 두지 않은 문턱값은 다음 사람이 고칠 수 없다.
첫 자리 숫자 분포는 값싸고 잘 듣는 신호이지만 가장 오해받는 신호이기도 하다. 분포가 어긋났다는 것은 사람이 봐야 한다는 뜻이지 누가 조작했다는 뜻이 아니고, 값 범위가 좁은 칼럼에서는 정직한 자료도 늘 어긋난다. 그래서 적용 가능성을 먼저 판정해야 한다.
채점기는 여러분의 문구를 믿지 않는다. 임시 디렉터리에 채점기가 만든 전달분을 차려 놓고 여러분의 도구를 실제로 실행해 프로파일과 판정을 채점기가 직접 계산한 값과 대조한다. 거래처와 금액은 실행마다 바뀐다.

단계

1. /root/prof/gen_feed.py 를 만들어 실행해 /root/prof/feed 아래 2026-04.csv·2026-05.csv·2026-06.csv 를 만드세요. 셋 다 형식 검증은 통과합니다.
2. /root/prof/profile.pyprofile <파일> 을 만들어 칼럼마다 타입·결측·고유 비율·값 길이·최빈값·범위를 내게 하세요.
3. digits <파일> <칼럼> 을 더해 값 길이 분포와 최빈 길이에서 벗어난 값을 내게 하세요.
4. drift <파일A> <파일B> 를 더해 전달분 사이의 분포 변화를 문턱값으로 판정하게 하세요.
5. benford <파일> <칼럼> 을 더해 첫 자리 숫자 분포와 기대 분포의 차이를 내게 하고, 두 전달분을 비교해 /root/prof/benford.json 에 적으세요.
6. benford 에 적용 가능성 판정을 더해, 값 범위가 좁은 칼럼에 applicable 을 false 로 하고 verdict 를 not_applicable 로 하세요. 결과는 /root/prof/narrow.json 에 적습니다.
7. 여러 신호를 겹쳐 조사 대상 목록을 만들고 칼럼마다 다음에 확인할 것을 /root/prof/leads.json 에 적으세요.
8. 전체를 한 장으로 정리해 /root/prof/prof_report.json/root/prof/prof_report.md 를 만드세요.

참고

단계 8개

  1. 세 달치 전달분 만들기
  2. 칼럼마다 자기 소개를 시키기
  3. 값 길이에서 벗어난 것 꺼내 보기
  4. 지난 전달분과 견주기
  5. 첫 자리 숫자 분포 재기
  6. 벤포드가 통하지 않는 칼럼
  7. 신호를 겹쳐 조사 대상 만들기
  8. 단서를 한 장으로 넘기기