소수점 한 자리를 쓸 수 있는 칸에서 2,280번 모두 쓰지 않았다 — 인물 라운드 표의 점수 격자
AI 인물 생성 시즌 리포트를 열면 가운데에 열다섯 줄짜리 표가 있다. 라운드 번호, 프롬프트 종류, 그리고 일치율. 일치율 칸에는 이렇게 적혀 있다.
74.0%61.0%82.0%
소수점 뒤에 한 자리가 있다. 그 자리가 있다는 것은 거기에 들어갈 값이 있다는 뜻이다. 74.3%도, 61.8%도 적힐 수 있는 칸이다. 그런데 우리가 공개한 인물 리포트 국문 전수 152편의 라운드 표를 모두 모아 2,280칸을 세어 보니, 그 자리는 2,280번 모두 0이었다.
이 글은 그 발견에서 출발해 "일치율이라는 숫자는 실제로 몇 가지 값만 쓰는가"를 전수 조사한 기록이다. 점수가 무엇을 뜻하는지는 예전 칼럼에서 다뤘다. 여기서는 뜻을 묻지 않고, 쓰이는 값의 목록만 센다. 결론부터 적으면 셋이다. 점수는 정수 격자다. 그 격자는 5점·10점 단위로 몰려 있지 않다. 그리고 실제로 쓰이는 값의 폭은 넉 달 동안 절반 이하로 좁아졌다 — 표본 크기를 같게 맞춰도 남는 변화다.
방법 — 표를 세고, 표시 코드를 확인한다
모집단은 저장소에 공개된 인물 생성 시즌 리포트의 국문판 전수 152편(시즌 번호 1~204)이다. 각 편의 '라운드별 일치율 추이' 표에서 라운드 번호·프롬프트 종류·채택 여부·일치율을 읽었다. 152편 × 15줄 = 2,280줄이고, 파싱 실패와 빈 칸은 0건이었다. 표 길이가 15가 아닌 편은 없다.
중요한 것은 그다음이다. '모든 값이 정수다'라는 관찰은 두 가지로 설명될 수 있다. 원래 점수가 정수일 수도 있고, 소수점이 있는 점수를 표시할 때 반올림해 버린 것일 수도 있다. 후자라면 이 글의 전제가 무너진다. 그래서 리포트를 만드는 코드를 직접 확인했다.
return `${Number(n).toFixed(1)}%`;
리포트 생성기(html2pdf/src/web-character-summary-builder.js)의 서식 함수는 toFixed(1)이다. 즉 소수점 한 자리까지는 지면에 내보낸다. 점수가 74.3이었다면 표에는 74.3%가 찍혔을 것이다. 2,280번 모두 .0이 나왔다는 것은 저장된 값이 소수점 첫째 자리까지 정수였다는 뜻이다(엄밀히는 ±0.05 안에서 정수). 이 확인을 거쳤으니 아래부터는 점수를 정수로 다룬다.
한 가지를 더 걸러 낸다. 2,280줄 중 814줄(35.7%)에는 '유지' 배지가 붙어 있다. 이 배지는 그 줄의 숫자가 그 라운드 후보의 새 측정값이 아니라 그 시점 챔피언의 점수라는 표시다 — 그 성질은 '유지' 배지 전수 조사에서 다뤘다. 같은 값을 여러 줄에 복사하는 줄을 섞으면 "어떤 값이 얼마나 자주 나오는가"가 왜곡되므로, 빈도와 사용 폭은 배지가 없는 1,466줄에서만 계산하고 '쓰이는 값의 집합'만 2,280줄 전체로 본다.
결과 ① — 쓰이는 값은 60가지, 그리고 40 위로는 빈틈이 없다
2,280칸에 등장하는 서로 다른 값은 60가지다. 최저 0, 최고 84. 0부터 84까지는 정수가 85개 있으니 그중 60개가 쓰이고 25개가 한 번도 쓰이지 않았다.
그 25개가 어디에 있는지가 재미있다. 전부 39 이하다. 쓰이지 않은 값은 1~8, 11~21, 23, 24, 26, 27, 34, 39뿐이고, 40부터 84까지 45개 정수는 하나도 빠짐없이 적어도 한 번 등장한다. 즉 점수판에는 구멍 난 구간이 없다. 40 아래가 뚫려 있는 것은 격자가 거칠어서가 아니라 그 구간의 점수가 거의 나오지 않기 때문이다 — 뒤에서 보듯 40 미만은 152편 중 여섯 편에서만 나온다.
결과 ② — 5점 단위도, 10점 단위도 아니다
사람이 매긴 점수에는 보통 흔적이 남는다. 70점과 75점이 72점·73점보다 유난히 많아지는 '라운드 넘버 쏠림'이다. 판정이 사실상 다섯 칸 눈금을 쓰고 있다면 표가 그렇게 보일 것이다. 측정값 1,466줄의 끝자리를 세어 봤다.
| 끝자리 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 측정 1,466줄 | 122 | 162 | 157 | 144 | 148 | 155 | 157 | 137 | 157 | 127 |
| 전체 2,280줄 | 191 | 229 | 248 | 230 | 246 | 224 | 245 | 217 | 233 | 217 |
쏠림이 없다. 균일 분포를 가정한 적합도 검정에서 측정 1,466줄은 χ²=11.75(자유도 9, p≈0.23), 전체 2,280줄은 χ²=11.71(p≈0.23)이다. 어느 쪽도 균일 가설을 기각하지 못한다. 5의 배수는 1,466줄 중 277줄(18.89%)로, 균일하다면 기대되는 20%(293.2줄)보다 오히려 적다(z=−1.06). 10의 배수는 122줄(8.32%)로 기대 10%(146.6줄)보다 더 적다(z=−2.14).
방향에 주의할 만하다. 만약 어긋남이 있다면 그것은 라운드 넘버 쏠림이 아니라 그 반대다. 끝자리 0이 열 칸 중 가장 드물다(122줄). 판정이 "대략 70점" 같은 어림수로 수렴하는 성질은 이 데이터에 없다.
결과 ③ — 바닥 쪽 값은 분포가 아니라 여섯 시즌의 사건이다
격자의 아래쪽은 통계처럼 보이지만 통계가 아니다. 40 아래 측정값은 모두 합쳐 25줄인데, 그 25줄이 나온 시즌은 152편 중 여섯 편(시즌 5·6·11·59·69·101)뿐이다. 그리고 25줄 전부가 미채택 라운드이고, 24줄이 수정 프롬프트다(예외는 시즌 101의 36.0% 한 줄로, 생성 프롬프트다).
격자의 최저값 0.0%도 이 묶음에 있다. 시즌 5의 14라운드, 수정 프롬프트, 미채택이다. 같은 시즌의 상단 배지는 최고 일치율과 최종 일치율이 모두 49.0%라고 적고 있다 — 0점짜리 줄은 챔피언 근처에도 가지 못한 시도였고, 그 시즌 성적에는 영향을 주지 않았다.
프롬프트 종류로 갈라 보면 바닥의 출처가 분명해진다. 생성 프롬프트 757줄의 최저는 36, 수정 프롬프트 709줄의 최저는 0이다. 기존 이미지를 고치는 쪽이 실패할 때 훨씬 깊이 떨어진다. 반대로 채택된 453줄의 최저는 42이고 쓰인 값도 39가지로 좁다 — 60가지 중 21가지는 채택된 줄에 한 번도 나타나지 않는다. 그 21가지가 전부 42 아래인 것은 아니다. 17가지는 42 미만이고, 거기에 43·44·45·50이 더 붙는다. 즉 채택이라는 체는 '42 아래를 자르는 선'이 아니라 아래쪽에 구멍이 숭숭 난 체다 — 채택된 줄은 42와 46~49를 쓰고 43·44·45·50을 건너뛰며, 51부터 84까지 34개 정수는 모두 쓴다.
결과 ④ — 천장은 84이고, 두 번 닿았다
위쪽은 아래쪽보다 훨씬 단단하다. 2,280칸에서 가장 큰 값은 84이고, 85 이상은 한 번도 없다. 84는 20칸에 찍혀 있지만 그중 18칸은 '유지' 배지가 붙은 복사본이고, 새로 측정된 84는 두 줄뿐이다 — 시즌 138의 1라운드(귀여움, 8월 31일)와 시즌 144의 1라운드(예쁨, 9월 4일). 둘 다 생성 프롬프트이고 둘 다 채택됐다. 20칸이 두 시즌에서만 나온 이유도 거기에 있다 — 1라운드에서 역대 최고점이 나오면 그 시즌의 남은 줄들이 그 점수를 받아 적는다. 측정값으로 세면 83은 다섯 줄, 82는 열넷, 81은 열일곱, 80은 스물둘이다.
표시 점수가 천장을 뚫지 못한다는 사실 자체는 점수 분산을 다룬 칼럼에서 이미 보고했다. 여기서 덧붙일 것은 그 천장이 얼마나 가파른지다. 80 이상은 2,280칸 중 148칸(6.5%), 측정값으로는 1,466줄 중 60줄(4.1%)이고, 거기에 쓰인 값은 다섯 가지(80·81·82·83·84)뿐이다. 60가지 중 다섯 가지가 상단을 다 덮는다.
결과 ⑤ — 실제로 쓰이는 폭이 넉 달 동안 절반 이하로 좁아졌다
여기까지는 아카이브 전체를 한 덩어리로 본 결과다. 시간 축으로 자르면 격자 자체는 그대로인데 그 격자 위에서 실제로 쓰이는 칸의 수가 뚜렷하게 줄어든다. 아래가 이 글의 핵심 표다.
| 구간(리포트 종료일) | 시즌 | 측정 줄 | 쓰인 값 | 최저 | 중앙 | 최고 | 표본 87줄 보정 |
|---|---|---|---|---|---|---|---|
| 2026-06 | 2 | 30 | 15 | 53 | 58 | 68 | 14.7 |
| 2026-07 | 34 | 324 | 53 | 0 | 65 | 81 | 33.9 |
| 2026-08 | 50 | 503 | 45 | 22 | 69 | 84 | 27.9 |
| 2026-09 | 56 | 522 | 31 | 53 | 73 | 84 | 22.4 |
| 2026-10 | 10 | 87 | 22 | 59 | 72 | 83 | 19.2 |
'쓰인 값' 열만 보면 53 → 45 → 31 → 22로 줄어든다. 그런데 이 열은 그대로 믿으면 안 된다. 서로 다른 개수의 줄에서 센 값이기 때문이다 — 줄이 많으면 희귀한 값이 섞여 들어올 기회도 많아지므로, 표본이 큰 구간이 자동으로 커 보인다.
다행히 이 데이터에서는 그 함정이 결론을 흔들지 않는다. 9월은 7월보다 측정 줄이 많은데(522줄 대 324줄) 쓰인 값은 더 적다(31가지 대 53가지). 표본 효과와 반대 방향이다. 확인을 위해 각 구간에서 87줄(10월 구간의 크기)을 무작위 복원추출해 쓰인 값의 수를 재는 일을 4,000번 반복했다. 맨 오른쪽 열이 그 평균이다 — 33.9 → 27.9 → 22.4 → 19.2로, 표본을 같게 맞춰도 좁아짐이 그대로 남는다.
좁아지는 쪽은 주로 아래쪽이다. 하위 5% 점수는 7월 40에서 8월 54, 9월 61, 10월 66으로 올라갔고, 중앙값은 65 → 69 → 73 → 72로 움직였다. 반면 최고값은 81 → 84 → 84 → 83으로 거의 제자리다. 점수대가 위로 올라간 것이 아니라 낮은 점수가 나오지 않게 됐다는 쪽이 사실에 가깝다.
결과 ⑥ — 한 시즌의 표는 60가지 중 일곱 가지만 쓴다
독자가 실제로 마주하는 단위는 아카이브가 아니라 리포트 한 편이다. 한 편의 표 15줄에 서로 다른 값이 몇 개 들어 있는지 세어 봤다. 중앙값은 7이고 평균은 7.05다. 가장 단조로운 편은 세 가지 값으로 15줄을 채웠고(3편), 가장 다양한 편이 열두 가지다(1편).
| 한 편의 15줄에 쓰인 값의 수 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|
| 리포트 편수 | 3 | 10 | 20 | 23 | 37 | 29 | 14 | 9 | 6 | 1 |
그리고 지면은 그 일곱 가지를 다시 뭉갠다. 리포트의 점수에는 색이 붙는데, 생성기가 쓰는 경계는 80 이상 초록·60 이상 주황·그 아래 빨강 세 단계다. 측정 1,466줄 중 1,191줄(81.2%)이 주황 한 칸에 들어가고, 그 칸에 들어가는 값은 60가지 중 20가지다. 152편 중 74편은 15줄이 전부 한 가지 색이다. 눈으로 훑는 독자에게 그 표는 숫자 일곱 개가 아니라 색 하나로 보인다.
빈도 쪽도 비슷하게 집중돼 있다. 측정값의 절반은 상위 아홉 가지 값(72·71·73·75·74·70·68·76·69)에 들어가고, 80%는 열아홉 가지, 90%는 스물여섯 가지가 덮는다. 격자는 1점 단위로 촘촘하지만 실제 사용은 70 근방 열 칸에 몰려 있다.
한계 — 이 분석이 말할 수 없는 것
첫째, 이 글은 '표시된 점수'의 집합을 센 것이고 판정기 내부 값이 아니다. 생성기가 소수점 한 자리까지 내보낸다는 사실은 코드로 확인했으므로 저장된 값이 ±0.05 안에서 정수라고까지는 말할 수 있다. 그러나 판정 모델이 내부적으로 연속값을 만들어 저장 전에 정수로 반올림하는지, 애초에 정수만 내보내는지는 공개 지면으로 구분할 수 없다. '격자가 정수다'는 기록된 숫자의 성질이다.
둘째, 결과 ⑤의 구간 비교에는 판정기 변경이 섞여 있다. 2026년 9월 13일에 코드와 설정을 바꾸지 않은 상태로 인물 판정 분포가 계단처럼 움직인 일이 있었다(핀이 없는 모델 별칭이 원인이었고, 그 사실은 우리 운영 기록에 남아 있다). 9월 13일 전 측정값은 쓰인 값 60가지·최저 0이고 그 뒤는 29가지·최저 53이다. 즉 '폭이 좁아졌다'는 관찰과 '판정기가 바뀌었다'는 사실이 같은 시점에 겹쳐 있어, 좁아짐의 원인을 데이터만으로 운영 변화와 판정기 교체 중 하나로 돌릴 수 없다. 9월 13일 전후를 섞은 점수 통계는 그 자체로 조심해서 읽어야 한다.
셋째, 구간을 가른 날짜는 라운드가 돈 날짜가 아니라 리포트의 종료일이다. 리포트 JSON-LD의 datePublished는 발행일이 아니라 시즌 종료일이라는 것을 지난 칼럼에서 확인했고, 여기서도 그 필드를 구간 기준으로 썼다. 한 시즌의 15라운드는 대체로 하루 안에 끝나므로 월 단위 구간에서는 어긋남이 작지만, 월이 바뀌는 경계의 시즌은 한 칸 밀릴 수 있다.
넷째, 10월 구간은 10편·87줄이다. 2026년 10월 11일까지의 리포트만 집계했으므로 그 달의 수치는 열흘치다. 표본 보정 열을 넣은 이유가 그것이고, 그 열의 19.2라는 값도 87줄에서 센 평균이라 구간 사이의 순서를 보는 데까지만 쓰는 것이 안전하다.
다섯째, '쓰이지 않은 값'은 영원히 쓰이지 않는 값이 아니다. 1~8이 한 번도 안 나온 것은 그 점수가 불가능하다는 증거가 아니라 넉 달 2,280칸에서 관측되지 않았다는 기록이다. 실제로 0은 한 번 나왔고 9와 10도 각각 한 번 나왔다 — 한 번씩 나오는 값이 있는 구간에서 '한 번도 없음'은 금지가 아니라 희소함이다.
여섯째, 테마별 차이는 이 글에서 결론으로 쓰지 않았다. 테마 열한 종의 측정 줄은 71줄에서 232줄까지 세 배 이상 벌어져 있고, 테마마다 시즌이 몰려 있는 시기도 달라서(결과 ⑤의 시간 변화와 엉킨다) 테마 간 '쓰인 값의 수' 비교는 두 효과를 분리하지 못한다. 끝자리 검정을 테마별로 열한 번 돌리면 매력(χ²=20.39)과 훈훈함(χ²=20.05) 두 테마가 5% 수준에서 균일 가설을 기각한다 — 다만 1% 임계값(21.67)은 둘 다 넘지 못하고, 검정을 열한 번 반복하면 5% 기각이 한두 개 나오는 것은 흔한 일이다. 결과 ②의 전체 결론이 테마별로 뒤집히지는 않지만, 개별 테마에 쏠림이 있다/없다를 이 표본으로 단정하지는 않는다.
그래서 무엇이 남는가
세 가지가 남는다. 첫째, 정밀도는 있는데 쓰이지 않았다. 지면은 소수점 한 자리를 내보낼 준비가 돼 있고 코드도 그렇게 적혀 있다. 그런데 2,280칸에서 그 자리는 한 번도 채워지지 않았다. 표의 .0은 정밀도가 아니라 서식이다. 리포트를 읽는 사람이 74.0%와 74.3%를 구별할 수 있다고 느낀다면, 그 느낌은 데이터가 주는 것이 아니라 소수점이 주는 것이다.
둘째, 그래도 격자는 거칠지 않다. 이 조사를 시작할 때 우리가 예상한 결과는 5점 눈금이었다. 사람이든 모델이든 점수를 매길 때 어림수로 수렴하는 성질이 있고, 그러면 70·75·80이 솟은 표가 나와야 한다. 나오지 않았다 — 끝자리는 균일에서 기각되지 않고(p≈0.23), 5의 배수는 기대보다 적고, 끝자리 0은 열 칸 중 가장 드물다. 40부터 84까지 45개 정수가 전부 쓰였다는 것도 같은 방향이다. 일치율은 1점 단위로 움직이는 숫자다.
셋째, 그런데 그 1점 단위를 독자가 보는 일은 거의 없다. 한 편의 표는 60가지 중 일곱 가지를 쓰고, 그 일곱 가지의 81%는 주황 한 색으로 칠해지고, 152편 중 74편은 15줄이 한 색이다. 측정값의 절반이 아홉 가지 값에 모여 있다. 즉 이 숫자의 해상도는 격자에서 한 번, 사용 폭에서 또 한 번, 색에서 세 번째로 떨어진다. 넉 달에 걸친 좁아짐(53가지 → 22가지)은 그 세 번째 단계에서 가장 먼저 눈에 보이지 않게 되는 종류의 변화다 — 쓰이는 값이 절반으로 줄어드는 동안 표의 색은 그대로였다.
원자료는 열려 있다. 시즌 131은 15줄을 여섯 가지 값으로 채운 편이고(74.0%가 여섯 줄, 그중 다섯 줄이 '유지'), 시즌 5는 격자의 최저값 0.0%가 실제로 지면에 찍힌 편이다. 어느 편을 열어도 소수점 뒤는 0이다.
집계 기준. 저장소의 공개 인물 생성 시즌 리포트 국문 전수 152편(시즌 번호 1~204, JSON-LD datePublished 2026-06-30 ~ 2026-10-11). 각 편의 '라운드별 일치율 추이' 표에서 라운드 번호·프롬프트 종류(생성/수정)·채택 여부('미채택' 배지)·'유지' 배지·일치율을 추출했다. 표는 152편 모두 15줄이어서 총 2,280줄이고, 파싱 실패·빈 값은 0건이다. 표시 서식이 소수점 한 자리임은 생성기 html2pdf/src/web-character-summary-builder.js 의 Number(n).toFixed(1) 로 확인했고, 2,280칸의 소수점 자리가 모두 0임은 리포트 HTML을 직접 검색해 교차 확인했다(소수점이 0이 아닌 칸 0건). '측정 줄'은 '유지' 배지가 없는 1,466줄이며, 814줄(35.7%)의 배지 있는 줄은 그 줄 후보의 새 측정값이 아니라 그 시점 챔피언 점수를 표시하므로 빈도·사용 폭 계산에서 제외했다('쓰이는 값의 집합'과 결과 ①·②의 2,280줄 행은 전체를 썼다). 끝자리 검정은 10칸 균일 분포에 대한 카이제곱 적합도 검정(자유도 9)이고, 5·10의 배수 비율은 각각 p=0.2, p=0.1 이항 분포의 z 값이다. 결과 ⑤의 '표본 87줄 보정'은 각 구간에서 87줄을 무작위 복원추출해 서로 다른 값의 수를 센 뒤 4,000회 평균한 값이다. 색 경계는 생성기의 rateSpan(80 이상·60 이상·그 미만)을 따랐다. 구간은 리포트의 종료일 기준 월이며, 비율은 소수점 둘째 자리에서 반올림했다.