CDM 확률 모델로 로또 분석하기
CDM(Conditional Distribution Model) 기반 확률 모델을 활용하여 로또 번호의 출현 패턴을 분석하는 방법을 설명합니다. 조건부 확률과 베이지안 접근법의 기초부터 실전 적용까지 다룹니다.
데이터 과학으로 로또를 바라보기
로또 번호는 완전한 무작위(random)로 추첨됩니다. 그러나 과거 데이터를 통계적으로 분석하면 특정 패턴이나 분포 특성을 관찰할 수 있고, 이를 기반으로 조건부 확률 모델(CDM, Conditional Distribution Model)을 구성할 수 있습니다. 이 글에서는 CDM의 개념과 로또 분석에의 적용 방법을 단계별로 설명합니다.
CDM이란 무엇인가?
CDM은 특정 조건이 주어졌을 때의 확률 분포를 모델링하는 기법입니다. 로또에 적용하면, "이전 N회차의 결과가 주어졌을 때, 다음 회차에 특정 번호가 나올 조건부 확률"을 계산합니다. 수식으로 표현하면:
P(X_n+1 = k | X_n, X_n-1, ..., X_n-m)
여기서 X는 각 회차의 당첨 번호 집합이고, k는 1~45 중 특정 번호, m은 참조할 과거 회차 수입니다.
Step 1: 데이터 수집과 전처리
동행복권 공식 사이트에서 역대 모든 회차의 당첨 번호를 수집합니다. 2002년 제1회부터 현재까지 약 1,100회 이상의 데이터가 존재합니다. 각 회차의 6개 당첨 번호와 보너스 번호를 별도의 컬럼으로 정리하고, 추가적으로 다음과 같은 파생 변수를 생성합니다.
- 각 번호의 최근 N회차 출현 빈도
- 번호 간 동시 출현(co-occurrence) 빈도
- 각 번호의 출현 간격(gap)
- 구간별(1~9, 10~18 등) 번호 분포
- 홀짝 비율, 합계, 표준편차 등 조합 특성
Step 2: 조건부 확률 계산
각 번호(1~45)에 대해 조건부 출현 확률을 계산합니다. 예를 들어, 최근 5회차 동안 7번이 2번 나왔을 때, 다음 회차에 7번이 다시 나올 조건부 확률은:
P(7번 출현 | 최근 5회 중 2회 출현) = (해당 조건에서 7번이 출현한 횟수) / (해당 조건이 발생한 총 횟수)
이 과정을 45개 번호 각각에 대해 반복하면, 각 번호의 조건부 출현 확률 벡터를 얻을 수 있습니다. 일반적으로 표본 크기가 충분할 때 이 값들은 기본 확률(6/45 = 약 0.133)에 매우 가깝지만, 미세한 편차가 관찰될 수 있습니다.
Step 3: 베이지안 업데이트
베이지안 접근법을 적용하면 사전 확률(prior)을 매 회차 결과로 업데이트할 수 있습니다. 사전 분포로 균등 분포(1/45)를 설정한 뒤, 각 회차의 결과를 관측값으로 활용해 사후 분포(posterior)를 갱신합니다.
- 사전 분포: P(k) = 1/45 (모든 번호 동일)
- 우도(Likelihood): 최근 데이터에서 관측된 출현 빈도 기반
- 사후 분포: 베이즈 정리를 통해 사전 x 우도 / 정규화 상수로 계산
이렇게 구한 사후 분포는 각 번호의 "현재 상태"를 반영한 확률 추정치가 됩니다.
Step 4: 시뮬레이션과 검증
CDM 모델의 성능을 검증하기 위해 백테스트(backtesting)를 수행합니다. 과거 데이터의 80%로 모델을 학습하고, 나머지 20%로 예측 정확도를 평가합니다. 평가 지표로는 다음을 사용합니다.
- 예측 상위 10개 번호 중 실제 당첨 번호 포함 비율
- 기본 확률(6/45) 대비 적중률 향상 정도
- 로그 우도(log-likelihood) 비교
현실적인 기대치
솔직하게 말씀드리면, CDM을 포함한 어떤 통계 모델도 로또의 완전한 무작위성을 "이길" 수는 없습니다. 로또 추첨기는 물리적으로 독립 사건을 생성하도록 설계되어 있으며, 과거 데이터에서 발견되는 패턴 대부분은 통계적 노이즈입니다. 다만 CDM 분석은 다음과 같은 부가적인 가치를 제공합니다.
- 데이터 분석과 확률론 학습의 훌륭한 실습 과제
- 비합리적 번호 선택(인지 편향)을 방지하는 객관적 근거 제공
- 로또를 데이터 관점에서 즐기는 새로운 방법 제시
CDM 모델은 당첨을 보장하는 마법이 아니라, 로또라는 확률 게임을 더 깊이 이해하기 위한 도구입니다. Python이나 R을 다룰 줄 안다면 직접 구현해보시기를 권합니다.