REPRODUCIBLE RESEARCH · 02

45개를 보고 고른 최다 번호는
왜 특별해 보일까요?

공정한 가상 추첨에서도 45개 번호를 모두 살펴본 뒤 가장 많이 나온 번호를 고르면, 91.16%의 실험에서 “번호 하나에 적용할 5% 기준”을 넘었습니다. 추첨을 바꾼 것이 아니라, 결과를 고르는 방법을 바꿨을 뿐입니다.

“이 번호가 드물게 많다”와 “어떤 번호든 많다”는 다릅니다

실제 1~616회 자료에서는 20번이 103회로 가장 많이 나왔습니다. 공정한 추첨에서 번호 하나의 평균 출현 횟수는 616 × 6/45 = 82.13회입니다. 평균보다 약 21회 많으니 특별한 번호처럼 보일 수 있습니다. 그러나 20번은 관측 전에 정한 번호가 아니라 45개를 모두 보고 고른 최댓값입니다.

번호 하나를 정하고 그 번호의 우연한 변동을 묻는 질문과, 45개 중 어느 하나라도 극단적인지 묻는 질문에는 다른 기준이 필요합니다. 이 차이를 실제 추첨의 특성에 기대지 않고 확인하려고, 모든 번호가 같은 조건인 가상 추첨을 만들었습니다. 실제 자료는 616회라는 구간 길이와 위 사례를 정하는 데 사용했고, 시뮬레이션에 실제 번호의 빈도를 학습시키거나 복원 추출하지 않았습니다.

먼저 번호 하나의 5% 경계를 정확히 계산했습니다

매 회차가 독립이고 1~45 중 6개를 균일하게 뽑는다면, 미리 정한 번호 하나의 616회 출현 횟수 X는 이항분포 Binomial(616, 6/45)를 따릅니다. “많이 나왔다”만 보는 단측 기준으로 P(X ≥ k)가 5% 이하가 되는 가장 작은 정수 k를 계산했습니다.

그 경계는 97회입니다. 정확한 꼬리 확률 P(X ≥ 97)는 4.67%입니다. 횟수는 정수이므로 정확히 5%가 되지 않습니다. 이 기준은 관측 전에 정한 번호 하나에 대한 기준이며, 45개를 검색한 뒤 선택한 번호에 그대로 붙일 수는 없습니다.

독자는 이 5%를 “그 번호가 우연일 확률”이라고 읽지 않아야 합니다. 공정 모형이 맞고 정한 검사 절차를 반복할 때, 이런 큰 횟수가 나오는 확률을 뜻합니다. 특정 번호가 특별한 능력을 가졌을 확률을 계산한 값이 아닙니다.

실험 한 번에서 무엇을 했나요?

  1. 1~45에서 중복 없이 6개를 뽑는 가상 추첨을 616회 생성해 선택용 구간을 만듭니다.
  2. 그 구간에서 1번의 출현 횟수와, 45개 중 가장 많은 번호의 출현 횟수를 기록합니다. 공동 최다면 작은 번호를 선택합니다.
  3. 새로운 616회 검증용 구간을 생성합니다. 앞 구간에서 선택한 번호를 바꾸지 않고 출현 횟수를 셉니다.
  4. 앞의 세 횟수가 각각 97회 이상인지 기록합니다. 추가로 앞 구간 최댓값에 다중 비교 보정 경계 110회를 적용합니다.

이 과정을 5,000번 반복했습니다. 각 구간에서는 실제 6/45처럼 한 회차에 같은 번호가 두 번 들어가지 않게 했습니다. 그 결과 45개 번호의 출현 횟수는 서로 독립이 아닙니다. 한 번호가 들어오면 같은 회차에서 다른 번호가 들어갈 자리가 줄어드는 관계를 시뮬레이션에도 유지했습니다.

같은 추첨 모형, 다른 선택 절차의 결과

5,000개 실험 중 경계 이상의 출현 횟수를 기록한 실험 수
확인 방법평가 구간경계실험 수비율
미리 정한 1번선택용 구간97회 이상219 / 5,0004.38%
45개를 본 뒤 최다 번호 선택같은 선택용 구간97회 이상4,558 / 5,00091.16%
선택된 번호를 그대로 재검사새 검증용 구간97회 이상255 / 5,0005.10%
45회 비교를 보정한 최다 번호선택용 구간110회 이상200 / 5,0004.00%

미리 정한 1번은 4.38%, 45개를 보고 고른 최다 번호는 91.16%였습니다. 두 행의 차이는 공정한 데이터에서도 사후 선택만으로 만들어졌습니다. 후자의 기준 초과를 곧바로 “특별한 번호 발견”이라고 부르면 대부분의 가상 실험에서 잘못된 발견을 하게 됩니다.

선택한 번호를 새 구간에 그대로 가져가면 기준 초과 비율은 5.10%로 내려갔습니다. 선택용 구간의 평균 출현 횟수도 101.48회였지만, 같은 번호의 검증용 구간 평균은 82.22회였습니다. 모형의 기대값 82.13회에 가까워지는 결과입니다.

여기서 5.10%와 이론의 4.67% 차이는 유한한 시뮬레이션 오차의 영향을 받습니다. 이 설정에서 검증 구간 기준 이상의 비율에 대한 몬테카를로 표준오차는 약 0.31퍼센트포인트이며, 정규 근사 95% 오차 폭은 약 ±0.61퍼센트포인트입니다. 이 오차 폭은 가상 반복의 수치 오차를 설명할 뿐, 실제 추첨의 공정성에 대한 신뢰구간이 아닙니다.

45개를 모두 검사하려면 기준도 바뀌어야 합니다

간단한 보정 방법은 각 번호의 허용 확률을 0.05/45로 낮추는 것입니다. 이를 본페로니 보정이라고 합니다. 각 사건의 확률을 더한 값이 “어느 하나라도 생길 확률”의 상한이라는 원리이므로, 번호별 횟수가 서로 독립이어야 한다는 조건은 필요하지 않습니다.

이 기준에서 가장 작은 출현 횟수 경계는 110회이고, 번호 하나의 정확한 상측 확률은 0.09%입니다. 시뮬레이션에서 45개 중 하나라도 이 경계 이상인 실험은 200회, 4.00%였습니다. 실제 1~616회 최댓값인 20번의 103회는 보정 전 97회는 넘지만 보정 후 110회에는 미치지 못합니다.

이것도 실제 추첨의 공정성을 확정하는 검정은 아닙니다. 이번 보정 범위는 “정해진 616회 구간에서 45개 번호의 과다 출현”뿐입니다. 적게 나온 번호, 여러 분할점, 다양한 기간 길이, 번호 조합과 패턴까지 함께 찾았다면 비교한 선택지가 더 많아집니다. 그중 마음에 드는 것만 보고한 뒤 이 45개 기준을 적용하면 다시 과장됩니다.

실제 기록에 적용할 때의 해석

20번은 앞 616회에 103회 나왔지만 뒤 616회에는 66회 나왔습니다. 그렇다고 다음 기간에 반드시 덜 나오는 “역방향 법칙”을 찾았다는 뜻은 아닙니다. 같은 번호의 미래 기대값은 공정·독립 모형에서 과거 빈도와 무관합니다. 선택 과정에서 높았던 관측값과 미래의 기대값을 분리하는 것이 핵심입니다.

확률을 주장하는 자료를 볼 때는 “이 번호를 언제 골랐는가”, “다른 번호나 기간을 몇 개나 비교했는가”, “선택에 쓰지 않은 새 자료에서도 결과를 확인했는가”를 살펴보세요. 성공 사례만 모은 표보다 전체 후보와 실패한 결과까지 공개한 비교가 해석하기 쉽습니다. 이런 질문은 추천 번호를 만들기 위한 것이 아니라, 우연한 기록을 예측 능력으로 포장한 설명을 구별하는 데 도움이 됩니다.

설정·재현 방법과 한계

난수 생성기는 Mulberry32, 시작값은 20260927입니다. 한 줄의 난수 흐름에서 각 실험의 선택용 616회, 검증용 616회 순서로 값을 사용했습니다. 각 회차의 여섯 번호는 부분 Fisher–Yates 섞기로 비복원 추출했습니다. 암호학적 난수나 실제 복권 추첨 장치를 재현한 것이 아니라, 균일·독립 추첨 모형을 설명하는 결정적 의사난수 실험입니다. 시작값과 설정은 결과를 재현하기 위한 것이며, 데이터 공개 전에 사전등록했다는 뜻은 아닙니다.

계산은 고정 시작값으로 한 번 정한 실험을 그대로 공개합니다. 알려진 이항분포의 작은 예제와 확률 합계, 상측 경계의 최소성, 중복 없는 추첨, 원자료·코드 해시, 공개한 5,000행과 재계산 결과의 일치를 자동 검사합니다. 동일한 코드의 재현은 설계의 모든 가정이 현실에 맞는다는 보장이 아니므로, 실제 예측이나 감사의 결론으로 확대하지 않습니다.

같은 시작값으로 다시 계산하기

두 코드 파일과 원자료 JSON을 같은 폴더에 저장하고 Node.js 22 이상에서 아래 명령을 실행합니다. 추가 패키지 없이 두 연구의 결과 파일을 재생성합니다. 같은 이름의 결과 파일은 덮어씁니다.

node reproduce-research.mjs ./lotto-results.json

다른 시작값의 반복은 공개 함수 simulateSelectionBias에 seed, trials, drawsPerPeriod를 전달해 실행할 수 있습니다. 시작값을 바꿔 마음에 드는 결과만 선택하면 이 글에서 설명한 선택 문제가 다시 생기므로, 변경한 설정과 모든 결과를 함께 남겨야 합니다.