LabHub
배우기 러닝패스 코스

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

형식은 다 맞는데 값이 이상하다

LabHub 에서 이어서 보기

한 줄 요약

검증기를 통과한 자료가 이상하다고 말하려면 근거가 있어야 하고, 그 근거는 값 하나가 아니라 분포다. 그리고 분포가 주는 것은 증거가 아니라 단서다.

왜 이게 필요했나

스키마도 맞고, 칼럼 수도 맞고, 결측도 규칙대로다. 검증기는 초록불이다. 그런데 이번 달 매출이 어딘가 이상하다. 어디가 이상하냐고 물으면 대답할 말이 없다.

이 자리에서 할 수 있는 일은 자료 자체를 설명하는 표를 만드는 것이다. 칼럼마다 타입이 무엇이고, 빈 값이 몇 퍼센트이고, 서로 다른 값이 몇 가지이고, 값의 길이가 대개 몇 글자이고, 가장 흔한 값이 무엇이며 그 값이 전체의 몇 퍼센트인지. 이 표를 프로파일이라고 부른다.

프로파일 하나만으로는 이상한지 알기 어렵다. 이상은 절대적인 값이 아니라 지난번과의 차이로 드러나기 때문이다. 그래서 프로파일은 전달분마다 남겨 두고 견준다.

어떻게 동작하나

칼럼 하나에서 뽑을 것은 대략 이렇다.

| 항목 | 무엇을 잡아내나 |
| --- | --- |
| 결측 비율 | 상대 시스템이 어느 칸을 못 채우기 시작했다 |
| 고유 비율 | 식별자여야 할 칸에 같은 값이 반복되기 시작했다 |
| 값 길이 분포 | 전화번호에서 지역번호가 빠졌다, 코드 자릿수가 바뀌었다 |
| 최빈값과 그 비율 | 특정 값 하나가 갑자기 전체의 3분의 1이 됐다 |
| 최소와 최대 | 단위가 바뀌었거나 이상치가 들어왔다 |

값 길이 분포는 특히 값싸고 잘 듣는다. 형식 검사를 통과하는 값이라도 길이가 다르면 만든 쪽이 달라진 것이고, 최빈 길이에서 벗어난 몇 건을 직접 꺼내 보면 대개 원인이 바로 보인다.

그다음이 전달분 사이의 비교다. 규칙은 단순할수록 좋다. 결측 비율이 5%p 넘게 움직였는가, 고유 비율이 0.2 넘게 움직였는가, 최빈 길이가 달라졌는가, 최빈값의 점유율이 10%p 넘게 움직였는가. 문턱값은 자료마다 다르게 정해야 하고, 어떤 값을 썼는지 적어 두는 것이 문턱값 자체보다 중요하다.

마지막이 첫 자리 숫자 분포다. 자연스럽게 모인 숫자들의 첫 자리는 1이 약 30%, 2가 약 18%, 9가 약 5% 로 나타난다. 이 관찰을 [벤포드 법칙](https://en.wikipedia.org/wiki/Benford%27s_law)이라고 부른다. 관측한 분포를 기대 분포와 견주는 표준적인 방법은 적합도 검정이고, 미국 표준기술연구소 통계 핸드북의 [카이제곱 적합도 검정](https://www.itl.nist.gov/div898/handbook/eda/section3/eda35f.htm)이 그 절차를 적어 두었다. 이 실습은 그보다 단순하게 기대 비율과의 최대 차이 하나로 판정한다 — 검정을 대신하려는 것이 아니라 사람이 볼 자리를 고르는 잣대로만 쓴다. 사람이 손으로 지어낸 숫자는 이 모양을 잘 따르지 못한다 — 4만원대, 5만원대처럼 특정 자릿수에 몰린다.

현장에서 만나는 모습

첫째, 벤포드를 증거로 쓴다. 이것이 가장 위험한 실수다. 첫 자리 분포가 어긋났다는 사실은 "그 칼럼을 사람이 봐야 한다" 는 뜻이지 "누가 조작했다" 는 뜻이 아니다. 분포가 어긋나는 데는 조작 말고도 이유가 많다 — 가격표가 몇 가지로 정해져 있거나, 반올림 규칙이 있거나, 최소 주문 금액이 있으면 그것만으로 어긋난다.

둘째, 안 통하는 자료에 적용한다. 벤포드가 성립하려면 값이 여러 자릿수에 걸쳐 퍼져 있어야 한다. 점수가 100부터 130 사이에만 있는 칼럼은 첫 자리가 사실상 1 뿐이라, 정직한 자료인데도 기대 분포와 크게 어긋난다. 그래서 적용 가능성을 먼저 판정해야 한다 — 건수가 충분한가, 최대와 최소의 비율이 자릿수를 여럿 덮는가. 이 판정 없이 돌린 벤포드는 멀쩡한 자료를 계속 신고하고, 그러면 아무도 그 신고를 읽지 않게 된다.

셋째, 신호 하나로 판단한다. 실제로 쓸 만한 것은 신호를 겹쳐 보는 것이다. 같은 칼럼에서 최빈값 점유율이 뛰었고, 고유 비율이 떨어졌고, 첫 자리 분포도 어긋났다면 그 셋은 같은 사건을 가리킬 가능성이 높다. 하나만 걸린 칼럼과 셋이 걸린 칼럼은 다르게 다룬다.

넷째, 단서를 던지고 끝낸다. 보고서의 마지막 줄은 "무엇이 이상하다" 가 아니라 "다음으로 무엇을 확인해야 하는가" 여야 한다. 손으로 적은 듯한 금액이 어느 담당자에게 몰려 있는지, 자릿수가 바뀐 전화번호가 어느 시스템에서 왔는지 — 이어서 볼 자리를 적어 주는 것까지가 이 일의 몫이다.

실무에서 진짜 중요한 것

다음 실습에서 할 것

같은 모양의 전표 전달분 세 달치를 만든다. 두 달은 평범하고 한 달은 형식이 다 맞는데 값이 이상하다. 칼럼별 프로파일을 뽑고, 값 길이 분포에서 벗어난 값을 직접 꺼내 보고, 전달분 사이의 분포 변화를 문턱값으로 판정한다. 그다음 첫 자리 숫자 분포를 재어 손댄 흔적을 의심하고, 값 범위가 좁은 칼럼을 반례로 넣어 벤포드가 적용되지 않는 경우를 코드가 스스로 말하게 한다. 마지막에는 여러 신호를 겹쳐 조사 대상 목록과 다음에 확인할 것을 남긴다. 채점기는 매번 다른 전달분을 만들어 여러분의 도구를 실제로 실행하고 답을 대조한다.