프로그래밍/AI로 통계공부

[Python] 로또 분석 서비스를 만들어봤다 #7 — 번호마다 성격이 있다고?

Tiboong 2026. 4. 15. 23:19
728x90

⚠️ 이 글은 통계 분석 교육 목적이며, 로또 당첨을 보장하지 않습니다. 모든 조합의 당첨 확률은 동일하게 1/8,145,060입니다.


시리즈 링크


번호에 "성격"이 있을까?

#6에서 27번의 전설을 다뤘다. 9회 중 7회 출현, 빼면 나오는 저주. 27번은 확실히 뭔가 "성격"이 있는 것처럼 느껴졌다.

그래서 이번에는 다른 번호들도 파봤다. 1,200회 넘는 데이터에서 번호마다 정말 다른 패턴이 있는지.

결론부터 말하면 — 있는 것처럼 보이지만, 전부 우연이다.

근데 그 "우연의 패턴"이 생각보다 극적이어서 재밌다.


6개 번호의 프로필

1,200회 넘는 데이터에서 뽑은 번호별 "성격 카드"다.

🏔 5번 — 은둔자 (153회 출현, 45개 중 37위)

def gap_analysis(draws, target):
    appearances = []
    for i, nums in enumerate(draws):
        if target in nums:
            appearances.append(i)
    
    gaps = [appearances[i] - appearances[i-1] 
            for i in range(1, len(appearances))]
    
    return {
        'avg_gap': sum(gaps) / len(gaps),
        'max_gap': max(gaps),
        'consecutive': sum(1 for g in gaps if g == 1) / len(gaps) * 100
    }

result = gap_analysis(all_draws, 5)
# avg_gap: 7.8, max_gap: 74, consecutive: 19.7%

 

5번은 전체 1,218회에서 153회 출현. 45개 중 37위로 하위권이다. 최대 갭은 74회. 약 17개월 동안 한 번도 안 나온 것이다.

74회 동안 매주 로또를 사면서 5번을 넣었다면, 74주 연속으로 5번은 빗나간 거다. 그 기간 동안 "5번 나올 때 됐다"고 생각했을 테지만, 5번 공은 그런 생각을 모른다.

 

그런데 5번의 연속 출현률은 19.7%로 기대값(13.3%)보다 높다. 심지어 최장 4연속 출현 기록도 있다. 한번 나오면 다음에도 나올 확률이 꽤 있는 건데, 한번 잠적하면 74회나 안 나온다. 극과 극의 번호다.

👑 27번 — 전설 (180회 출현, 역대 2위!)

  • 평균 갭: 6.8회 (짧다! 자주 나온다)
  • 최대 갭: 44회
  • 연속출현: 16.8% (기대값의 1.3배)
  • 최장 연속: 4연속

27번은 역대 전체 2위다. 1위 34번(181회)에 겨우 1회 차이. 우리가 "HOT이다" "이제 쉰다"로 난리 쳤던 27번은 원래부터 진짜 HOT 번호였다. 한번 나오면 연달아 나오고, 빠져도 비교적 빨리 돌아온다. 1206~1214 구간에서 9회 중 7회 나온 건 이 성격의 극대화된 버전이었다.

🐺 25번 — 외로운 늑대 (150회 출현, 40위)

  • 연속출현: 12.1%
  • 3연속: 0.7% (거의 없다!)
  • 최대 갭: 54회 (1년 넘게 잠적) 25번은 연속으로 잘 안 나온다. 3연속 출현이 0.7%밖에 안 된다. 150번 나오는 동안 3연속은 거의 없었다는 뜻이다. 게다가 최대 갭이 54회 — 1년 넘게 잠적한 적도 있다. 나왔다 하면 혼자 나오고 오래 사라진다. "외로운 늑대"라는 별명이 딱이다.

🧊 36번 — 독립주의자 (162회 출현, 27위)

  • 연속출현: 9.9% (전체 최저 수준!)
  • 최장 연속: 3연속
  • 최대 갭: 35회

36번은 독립심이 최강이다. 나온 다음 회에 또 나올 확률이 9.9%밖에 안 된다. 기대값(13.3%)보다도 낮다. "한번 나왔으니 다음에도 넣자"는 전략이 가장 안 통하는 번호다.

📋 11번 — 성실한 직장인 (164회 출현, 23위)

  • 최대 갭: 41회
  • 연속출현: 12.9%

11번은 164회 출현으로 딱 평균. 화려하진 않지만 최대 갭이 41회로 다른 은둔형 번호(5번 74회, 25번 54회)에 비하면 꾸준히 얼굴을 비춘다. 성실한 직장인 같은 번호다.

☠️ 15번 — 저주의 주인공 (166회 출현, 20위 = 딱 평범)

  • 연속출현: 15.8% (평균 이상)
  • 역대 최장 연속: 4연속 (1214~1217)
  • 전체 출현: 166회 (20위)

이 시리즈를 따라온 독자라면 15번을 잊을 수 없을 것이다. 1214회부터 1217회까지 4연속 출현. 우리가 "이제 쉰다"로 배제할 때마다 나타났고, 1218회에서 드디어 쉬었다.

그런데 전체 순위를 보면 20위. 45개 중 딱 중간이다. 180회 출현한 27번(2위)이나 181회의 34번(1위)에 비하면 그냥 평범한 번호다.

1,218회 역사에서 15번의 4연속은 이번이 처음이다. 평범한 번호가 특정 구간에서 폭발한 것뿐이다.


전체 1,218회 번호별 출현 순위

먼저 전체 그림을 보자.

1위 34번(181회)부터 꼴찌 9번(133회)까지 48회 차이. 기대값은 162.4회인데, 대부분의 번호가 150~175 범위에 몰려있다.

15번(금색)은 166회로 딱 중간에 서있다. 4연속의 저주로 이름을 떨쳤지만, 전체로 보면 그냥 평범한 20위.

반면 27번(보라)은 180회로 진짜 우뚝 솟아있다. 전설은 이유가 있었다.


연속 출현률 비교

6개 번호의 연속 출현률을 나란히 놓으면:

# 연속 출현 확률 계산
def consecutive_rate(draws, target):
    prev = False
    total_appear = 0
    consecutive = 0
    
    for nums in draws:
        curr = target in nums
        if curr:
            total_appear += 1
            if prev:
                consecutive += 1
        prev = curr
    
    return consecutive / total_appear * 100 if total_appear > 0 else 0

for num in [36, 25, 11, 5, 27, 15]:
    rate = consecutive_rate(all_draws, num)
    print(f"{num}번: {rate:.1f}%")
# 36번: 9.9%
# 25번: 12.1%
# 11번: 12.9%
# 5번: 19.7%
# 27번: 16.8%
# 15번: 15.8%

36번(9.9%)과 27번(16.8%) 사이에 약 7%p 차이가 있다. 같은 로또인데 번호마다 연속 출현 성향이 이렇게 다를 수 있을까?


그런데 이것도 우연이다

여기서 핵심적인 질문: "이 차이가 통계적으로 유의미한가?"

답은 "아니오"다.

from scipy import stats

# 36번의 연속출현률 9.9%가 기대값 13.3%와 유의하게 다른지?
# 이항 검정 (binomial test)
n_appearances = 160  # 약 160회 출현
n_consecutive = int(160 * 0.099)  # 약 16번 연속
expected_rate = 6/45  # 13.3%

result = stats.binom_test(n_consecutive, n_appearances, expected_rate)
print(f"36번 연속출현 p-value: {result:.4f}")
# p-value: 0.15 → 유의하지 않음!

 

p-value가 0.15 수준. 통계적 유의성의 기준(0.05)을 한참 못 미친다.

1,200회는 많아 보이지만, 개별 번호로 보면 출현 횟수가 약 160회. 160번의 시행에서 연속 확률이 9.9%냐 25%냐는 충분히 우연으로 설명 가능한 범위다.

마치 동전을 160번 던져서 "이 동전은 앞면이 55%야!" 라고 하는 것과 같다. 160번이면 55%도 나올 수 있다.


실전에서의 교훈

"성격"을 믿고 전략을 짜면?

우리가 실제로 해봤다:

  • 27번이 "정이 많다"고 → 계속 넣음 → 1215에서 안 나옴
  • 36번이 "연속 안 한다"고 → 연속 나온 후 뺌 → 의미 없음
  • 15번이 "4연속이니 쉴 거다"고 → 1217까지 4연속 나옴

번호의 "성격"은 과거의 관측이지, 미래의 예측이 아니다.

5번이 74회 잠적한 "은둔자"라고 해서, 다음에 또 74회 잠적할 거라는 보장이 없다. 27번이 "정이 많다"고 해서, 다음 주에도 나올 거라는 보장이 없다.

그래도 쓸모가 있다면?

번호별 갭 분석이 예측에는 쓸모 없지만, 위험 관리에는 참고할 수 있다.

예를 들어 25번의 3연속 확률이 0.7%라는 건, 25번이 2연속 나온 상태에서 "3연속 갈까?"를 판단할 때 참고 정보가 된다. 예측은 못 하지만, 0.7%라는 숫자를 알고 베팅하는 것과 모르고 베팅하는 건 심리적으로 다르다.

 

정보가 있으면 결정이 편하다. 결과가 달라지지는 않지만.

내 서비스에 넣은 "패턴 유사성" 알고리즘

LottoLabs (https://www.lottolabs.ai.kr)에는 이런 코드가 들어있다:

def pattern_similarity(draws, recent_window=10):
    """최근 N회의 홀짝/고저/연번 패턴과 유사한 조합 생성"""
    recent = draws[-recent_window:]
    
    # 최근 패턴 평균
    avg_odd = np.mean([sum(1 for n in d if n % 2 == 1) for d in recent])
    avg_high = np.mean([sum(1 for n in d if n > 22) for d in recent])
    avg_consec = np.mean([count_consecutive(d) for d in recent])
    
    # 패턴 매칭 조합 생성
    candidates = generate_random(1000)
    scored = []
    for c in candidates:
        odd = sum(1 for n in c if n % 2 == 1)
        high = sum(1 for n in c if n > 22)
        consec = count_consecutive(c)
        
        score = abs(odd - avg_odd) + abs(high - avg_high) + abs(consec - avg_consec)
        scored.append((score, c))
    
    return sorted(scored)[:6]

 

서비스에 "신뢰도 65%"라고 써놨다.

 

이번 시리즈를 쓰면서 깨달은 건, 이 65%도 근거 없는 숫자라는 거다. 패턴 매칭은 과거의 패턴이 미래에 반복된다는 가정인데, #4에서 p=0.38로 증명했듯이 그런 가정은 성립하지 않는다.


결론

번호마다 "성격"이 있는 것처럼 보인다. 하지만 전부 우연의 패턴이다.

  • ✅ 5번은 74회 잠적한 적 있다. 사실이다. (153회 출현, 37위)
  • ✅ 27번은 연속 출현률이 16.8%다. 사실이다. (180회 출현, 역대 2위)
  • ✅ 36번은 연속을 잘 안 한다. 사실이다. (9.9%, 최저 수준)
  • ✅ 15번은 4연속 출현했다. 사실이다. (하지만 전체 20위 = 그냥 평범)
  • ❌ 하지만 이 패턴이 미래에도 반복될 거라는 보장은 없다.

1,200회의 데이터에서 45개 번호를 분석하면, 누구든 "가장 많이 나온 번호"와 "가장 적게 나온 번호"가 있을 수밖에 없다. 누구든 "가장 긴 공백"과 "가장 짧은 공백"이 있을 수밖에 없다.

 

이건 번호의 성격이 아니라, 표본 크기의 한계다.

 

동전을 100번 던져서 "이 동전은 앞면 53%, 뒷면 47%야!"라고 하는 것과 같다. 1,000번 더 던지면 비율은 50%에 가까워진다. 하지만 특정 구간에서의 편차는 항상 존재한다.

 

로또 번호에는 성격이 없다. 있는 것처럼 보이는 건 우리 뇌가 패턴을 찾으려는 본능 때문이다.

 

그리고 그 본능 때문에 이 시리즈가 재밌는 것이기도 하다 ㅋㅋㅋㅋㅋ


다음 편 예고

📊 #8 40번대는 왜 적게 나올까? — 구조적 확률의 비밀

40번대(40~45)가 3개 이상 나온 회차는 역대 1,216회 중 단 2.5%. 4개 이상은 856회에 딱 1번. 이건 우연이 아니라 수학이다.

 

728x90