⚠️ 이 글은 통계 분석 교육 목적이며, 로또 당첨을 보장하지 않습니다. 모든 조합의 당첨 확률은 동일하게 1/8,145,060입니다.
시리즈 링크
- #1 로또 번호를 만들어 볼까?
- #2 로또 번호를 맞춰 볼까?
- #3 1,213회 데이터 기본 통계
- #4 "나올 때 됐다" — 도박사의 오류 증명
- #5 로또 공은 과거를 기억하지 않는다
- #6 27번의 전설, "빼면 나오는 저주" ← 지금 읽고 있는 글
27번이라는 번호가 있다
이 시리즈를 시작하고 나서, 매주 로또 번호를 분석하고 30개 조합을 만들고, 추첨 후 검증하는 걸 반복하고 있다. 그 과정에서 하나의 전설이 탄생했다.
27번.
1206회부터 1214회까지 9회 동안, 27번은 7번 출현했다. 출현율 78%. 정상 출현율이 13.3%(6/45)인 걸 감안하면 5.9배다.
회차 27번 당첨번호
| 1206 | ✓ | 1, 3, 17, 26, 27, 42 |
| 1207 | ✓ | 10, 22, 24, 27, 38, 45 |
| 1208 | ✓ | 6, 27, 30, 36, 38, 42 |
| 1209 | ✗ | 2, 17, 20, 35, 37, 39 |
| 1210 | ✓ | 1, 7, 9, 17, 27, 38 |
| 1211 | ✓ | 23, 26, 27, 35, 38, 40 |
| 1212 | ✗ | 5, 8, 25, 31, 41, 44 |
| 1213 | ✓ | 5, 11, 25, 27, 36, 38 |
| 1214 | ✓ | 10, 15, 19, 27, 30, 33 |
9회 중 7회. 3연속도 있고(1206~1208), 2연속도 두 번(1210~1211, 1213~1214).
이 번호를 보고 두 가지 생각이 든다:
- "HOT 번호다! 계속 넣어야 한다!"
- "이제 쉴 때 됐다. 빼자."
나는 둘 다 해봤다. 그리고 전설이 시작됐다.
"빼면 나오는 저주"의 탄생
1214회: 27번을 뺐다
"이제 쉰다" 전략. 9회 중 7회나 나왔으니 평균 회귀할 거라고 판단했다. 27번과 38번을 30개 조합에서 완전 배제.
결과: 27번 나옴. 😂
1215회: 27번을 다시 넣었다
시계열 분석(ARIMA + ETS)을 동원했다. 27번은 HOT 빈도 1위니까 당연히 넣었다.
결과: 27번 안 나옴. 전멸. 30조합 평균 적중 0.43개. 역대 최악.
1216회: 15번을 뺐다
1214~1215에서 2연속 출현한 15번을 배제. "2연속 나온 건 이제 쉰다."
결과: 15번 나옴. 3연속 출현. 😂😂
1217회: 15번을 또 뺐다
3연속이면 진짜 쉴 때 됐다고 판단.
결과: 15번 또 나옴. 4연속 출현. 😂😂😂

빼면 나오는 저주, 적중률 100%.
이걸 코드로 분석하면?
"빼면 나온다"는 진짜 패턴일까? 아니면 우연일까?
# 특정 번호의 연속 출현 확률
p_single = 6 / 45 # 13.3%
# 4연속 출현 확률 (15번처럼)
p_four_consecutive = p_single ** 4
print(f"4연속 출현 확률: {p_four_consecutive:.6f} ({p_four_consecutive*100:.3f}%)")
# 4연속 출현 확률: 0.000031 (0.003%)
# 하지만 45개 번호 중 "하나라도" 4연속 나올 확률은?
p_any_four = 1 - (1 - p_single**4) ** 45
print(f"45개 중 하나라도 4연속: {p_any_four:.4f} ({p_any_four*100:.2f}%)")
# 45개 중 하나라도 4연속: 0.0014 (0.14%)
15번이 4연속 나온 건 확률 0.003%. 극히 드물다.
하지만 45개 번호 중 "아무거나 하나라도" 4연속 나올 확률은 0.14%로, 1,216회 동안 기대값이 약 1.7회. 나올 수 있는 거다.
그리고 내가 "빼면 나온다"고 느끼는 건, 확증 편향(Confirmation Bias)이다.
- 빼고 나오면: "봐! 빼면 나와!" → 강하게 기억
- 빼고 안 나오면: "당연하지" → 기억 안 함
- 넣고 나오면: "넣었으니 당연" → 기억 안 함
- 넣고 안 나오면: "에이" → 기억 안 함
4가지 경우 중 "빼고 나온" 경우만 기억하니까, 100% 적중하는 것처럼 느껴지는 거다.
HOT 번호는 진짜 존재하는가?
27번의 최근 출현율을 윈도우 크기별로 보면 재밌는 게 보인다.

from collections import Counter
def hot_analysis(df, num, windows=[5, 10, 20, 50]):
"""번호별 윈도우 크기에 따른 출현율 변화"""
all_rounds = []
for _, row in df.iterrows():
nums = [row[f'num{i}'] for i in range(1, 7)]
all_rounds.append(nums)
total = len(all_rounds)
expected = 6/45 * 100 # 13.3%
print(f"\n{'윈도우':>10} | {'출현':>4} | {'출현율':>6} | {'vs 기대값':>8}")
print("-" * 45)
for w in windows:
recent = all_rounds[-w:]
count = sum(1 for r in recent if num in r)
rate = count / w * 100
diff = rate - expected
print(f"최근 {w:>4}회 | {count:>4} | {rate:>5.1f}% | {diff:>+7.1f}%p")
# 전체
count = sum(1 for r in all_rounds if num in r)
rate = count / total * 100
diff = rate - expected
print(f"전체 {total}회 | {count:>4} | {rate:>5.1f}% | {diff:>+7.1f}%p")
핵심 발견: 윈도우 크기에 따라 "HOT"이 완전히 달라진다.
- 최근 5회로 보면: 27번 출현율 0% (최근 5회는 안 나옴)
- 최근 10~20회로 보면: 27번 출현율 20~35% (압도적 HOT)
- 전체 1,216회로 보면: 27번 출현율 ~13.5% (기대값과 거의 동일)
27번이 "핫"했던 건 특정 구간(1206~1214)에서의 이상치(outlier)일 뿐이다.
전체로 보면 27번은 평범한 번호. 그리고 1215회부터 안 나오기 시작하면서 다시 평균으로 돌아가는 중이다.
그래도 HOT 전략이 성적은 좋았다
모순적이지만, 우리 시리즈에서 HOT 전략의 성적이 가장 좋았다.
전략 회차 평균적중 vs 랜덤
| HOT 중심 | 1210~1213 | 1.25개 | +56% |
| 이제쉰다 v1 | 1214 | 0.90개 | +12.5% |
| 시계열 합의 | 1215 | 0.43개 | -46% |
| 이제쉰다 v3 | 1216 | ~0.7개 | ~-12% |
| 랜덤 | - | 0.80개 | 0% |
HOT 전략으로 27번, 38번을 넣었을 때 평균 1.25개 적중. 랜덤 대비 56% 높다. 1211회에서는 5천원 투자로 만원을 벌기까지 했다.
데이터가 말하는 건: HOT이 낫다. 통계가 말하는 건: 다 의미 없다. (p=0.38)
이 모순이 로또의 본질이다.
38번의 조용한 퇴장
27번의 파트너였던 38번도 추적해봤다.

번호 피크 구간 피크 출현율 현재 상태
| 27 | 1206~1214 (9회) | 78% | 3회 연속 미출현 | 식어가는 중 |
| 38 | 1207~1213 (7회) | 71% | 4회 연속 미출현 | 완전히 식음 |
| 15 | 1214~1217 (4회) | 100% | 4연속 출현 중! | 현재 HOT |
HOT 번호는 영원하지 않다. 27번과 38번은 확실히 식었고, 15번이 새로운 HOT으로 떠올랐다.
그런데 여기서 딜레마가 생긴다. 15번이 "HOT이니까 넣어야 한다"고 하면 27번 때와 같은 실수를 반복하는 거다. 반대로 "4연속이니까 빼야 한다"고 하면 "빼면 나오는 저주"가 발동한다.
어떤 선택을 하든 틀릴 수 있다. 이것이 독립 시행의 본질이다.
LottoLabs의 "빈도 균형" 알고리즘
내가 만든 서비스에는 이런 알고리즘이 들어있다:
def hot_cold_balance(draws, recent_window=20, hot_count=3, cold_count=3):
"""최근 N회 빈도 기준 HOT/COLD 균형 조합"""
from collections import Counter
recent = draws[-recent_window:]
all_nums = []
for d in recent:
all_nums.extend(d)
freq = Counter(all_nums)
# HOT: 최근 빈도 상위
hot = [n for n, _ in freq.most_common(10)][:hot_count]
# COLD: 최근 빈도 하위 (또는 미출현)
all_possible = set(range(1, 46))
appeared = set(freq.keys())
cold_candidates = list(all_possible - appeared) + \
[n for n, _ in freq.most_common()[:-11:-1]]
cold = cold_candidates[:cold_count]
return sorted(hot + cold)
이 알고리즘의 "신뢰도 78%"라고 서비스에 써놨었다.
솔직히 말하면, 이 수치에 근거는 없다. 백테스트 결과 p=0.38. 통계적 유의성 없음. 78%라는 숫자는 "느낌"이었다.
이 시리즈를 쓰면서 내가 만든 서비스의 허점을 하나씩 파헤치고 있는 셈이다.
결론
HOT 번호는 존재하지만, 영원하지 않다.
- ❌ "계속 나오니까 앞으로도 나올 것이다" → 도박사의 오류
- ❌ "많이 나왔으니 이제 안 나올 것이다" → 역시 도박사의 오류
- ✅ 매 회차 모든 번호의 출현 확률은 동일하게 13.3%
- ✅ HOT은 과거의 관측일 뿐, 미래의 예측이 아니다
- ✅ "빼면 나오는 저주"는 확증 편향이다
그리고 이 모든 걸 알면서도, 나는 다음 주에 또 번호를 분석할 것이다.
왜냐하면 재밌으니까. 🎰
다음 편 예고
🔢 #7 번호마다 성격이 다르다? — 개별 번호 갭 심층 분석
5번은 74회(1년 반!) 동안 한 번도 안 나온 적이 있다. 25번의 3연속 출현 확률은 5.9%. 번호마다 정말 "성격"이 다를까?
'프로그래밍 > AI로 통계공부' 카테고리의 다른 글
| [Python] 로또 분석 서비스를 만들어봤다 #8 - 로또 합계는 정규분포다 (0) | 2026.04.28 |
|---|---|
| [Python] 로또 분석 서비스를 만들어봤다 #7 — 번호마다 성격이 있다고? (0) | 2026.04.15 |
| [Python] 로또 분석 서비스를 만들어봤다 #5 — 로또 공은 과거를 기억하지 않는다 (0) | 2026.03.22 |
| [Python] 로또 분석 서비스를 만들어봤다 #4 — "나올 때 됐다"를 1,213회 데이터로 검증해봤다 (1) | 2026.03.13 |
| [Python] 로또 분석 서비스를 만들어봤다 — 10가지 전략의 알고리즘을 공개합니다 #3 (0) | 2026.03.07 |