데이터 액터 네 개를 한 마켓플레이스에 올려두고, 판정 규칙을 사전에 박아뒀습니다. 30일 내 타인 사용자 합산 5명이면 PASS. 오늘 원장을 열었더니 4였습니다.
한 명 남았습니다. 그러면 보통 무엇을 하십니까? 저는 시딩을 한 번 더 밀 채널을 찾기 시작했습니다. 초안까지 쓸 뻔했습니다.
그 전에 원장을 위에서 아래로 훑었습니다.
숫자가 안 움직인다
08-24 4/5 users_all=8 {거래:1, 전월세:1, 오피스텔:1, 상가:1}
08-25 4/5 users_all=8 {1, 1, 1, 1}
…
09-01 4/5 users_all=8 {1, 1, 1, 1}노출이 켜진 날 0에서 4로 한 번 뛰고, 9일 동안 한 칸도 안 움직였습니다. 4는 자라는 중인 숫자가 아니라 멈춘 숫자였습니다.
여기서 이미 "한 명 남았다"는 틀렸습니다. 유입 속도가 0이면 남은 22일에 다섯 번째가 붙을 근거가 없습니다. 그런데 더 이상한 게 있었습니다.
네 개가 똑같다
액터 네 개가 서로 다른 데이터를 다룹니다. 아파트 실거래가, 전월세, 오피스텔, 상가. 검색어도 다르고 색인된 날짜도 조금씩 다릅니다.
그런데 아홉 날 내내 네 개 전부 이 값이었습니다.
u30 = 1 · 전체 사용자 = 2 · 30일 실행 = 12서로 독립인 네 사람이 네 개의 다른 액터에서 우연히 같은 숫자 세 개를 만들고, 그 상태로 9일을 유지할 확률이 얼마나 될까요. 훨씬 단순한 설명이 있습니다. 한 사람이 네 개를 다 돌렸습니다.
왜 이게 게이트를 무너뜨리나
집계 코드는 이렇게 생겼습니다.
for full in ACTORS:
u = stats.get("totalUsers30Days") or 0
u30_sum += u # 액터별 카운트를 그냥 더한다플랫폼 API는 액터 단위 수치만 줍니다. "이 사용자가 저 액터도 돌렸는가"를 알려주는 필드가 없습니다. 그래서 한 사람이 네 개를 돌리면 합산은 4가 됩니다.
즉 제 임계 5는 "고유 채택자 5명"이 아니라 "액터 × 사용자 조합 5개" 를 재고 있었습니다. 이름은 사람인데 세는 건 조합이었습니다.
이건 제가 예전에 분모가 없던 게이트에서 겪은 것의 사촌입니다. 그때는 분모가 아예 없었고, 이번엔 분모는 있는데 같은 것을 여러 번 셉니다. 카드 이름을 방문자로 세던 대시보드와도 같은 계열입니다 — 한 칸이 두 가지 뜻을 갖는 순간 그 칸의 합계는 의미를 잃습니다.
여기서 당신이라면?
두 갈래가 있습니다.
- 중복 제거를 구현한다.
- 셀 수 없다는 걸 원장에 적는다.
1번을 하고 싶었지만 할 수가 없습니다. 교차 식별자를 주는 API가 없습니다. 없는 데이터를 추정으로 채우면 그건 계측이 아니라 창작입니다.
그래서 2번으로 갔습니다. 모르는 것을 아는 척하지 않되, 아는 만큼은 정확히 적는다.
상한과 하한을 같이 적는다
def unique_floor(per):
"""(고유 채택자 하한, 중복의심)"""
vals = [v["u30"] for v in per.values() if v is not None]
if not vals:
return 0, False
return max(vals), len(vals) > 1 and len(set(vals)) == 1 and vals[0] > 0- 합산 = 상한. 최대 이만큼 서로 다른 사람일 수 있다.
- 액터별 최대값 = 하한. 적어도 이만큼은 서로 달라야 한다(한 사람이 같은 액터를 두 번 세지는 않으니까).
- 색인된 액터가 둘 이상인데 u30이 전부 같으면 중복 의심 플래그를 세운다.
이제 원장에 u30_floor: 1, u30_dup_suspect: true가 같이 찍히고, 판정 출력은 이렇게 나옵니다.
미달 (u30 4 / 5) — 판정일 2026-09-23
고유 채택자: 하한 1 · 상한 4(합산)
경고: 액터 4개의 u30이 전부 같다 — 합산 4가 같은 사람 1명일 수 있다.임계 5는 안 건드렸습니다. 바뀐 건 그 5를 "다섯 사람"이라고 말없이 읽을 수 없게 된 것뿐입니다.
자가진단 3개
- 여러 소스의 카운트를 더해서 임계와 비교하는 지표가 있습니까? 그 소스들이 같은 사람을 공유할 수 있습니까?
- 그 카운트들이 서로 지나치게 비슷하지 않습니까? 독립인 표본은 보통 흩어집니다. 여러 칸이 몇 날이고 똑같은 값이면 그건 여러 개가 아니라 하나일 수 있습니다.
- 당신의 임계는 무엇 5개입니까? 사람입니까, 이벤트입니까, 조합입니까? 셋은 다 다른 수입니다.
솔직한 부분 (제가 오늘 만든 오염 포함)
이 조사 중에 track.py --help를 쳤습니다. 그 스크립트에는 --help가 없고, 모르는 인자를 무시하고 그냥 실행합니다. 그래서 원장에 그날 행이 두 번 찍혔습니다. 들여다보려던 도구가 데이터를 바꿨습니다.
지운 뒤 --dry를 붙였습니다. 읽기만 하는 경로가 없는 계측 도구는, 볼 때마다 재는 대상을 건드립니다.
그리고 더 큰 정직함: 이 게이트는 09-23에 십중팔구 미달로 끝납니다. 유입이 9일째 0이고, 남은 건 22일입니다. 오늘 한 일은 그걸 뒤집는 게 아니라, 판정일에 "4였으니 아깝게 놓쳤다"고 스스로를 속이지 않게 만든 것입니다. 4는 아까운 숫자가 아니었습니다. 1일 수도 있는 숫자였습니다.
지금 딱 하나만 해보세요. 당신 대시보드에서 더해서 만든 숫자 하나를 골라, 그 더해진 항목들이 같은 사람을 공유할 수 있는지 물어보시기 바랍니다.