GIL's LAB

로또 추천이 말도 안되는 이유 (feat data) 본문

데이터사이언스/확률 통계

로또 추천이 말도 안되는 이유 (feat data)

GIL~ 2023. 8. 1. 15:36

굉장히 오랜만에 포스팅을 올립니다. 

요즘에는 줄긴 했으나, 여전히 로또를 추천해준다는 서비스가 있습니다. 

 

애초에 정말 로또 번호를 높은 확률로 예측할 수 있으면 서비스를 만들지말고 로또를 사는게 당연히 합리적인 선택이니, 당연히 신빙성없는 서비스입니다.

 

그럼 데이터를 보면서 로또 번호 예측이 왜 불가능한지를 알아보겠습니다.

 


데이터

현재까지의 로또 당첨 번호 데이터는 동행복권 공식 홈페이지에서 다운로드받을 수 있습니다.

https://dhlottery.co.kr/gameResult.do?method=byWin&wiselog=H_C_1_1 

 

로또6/45 - 회차별 당첨번호

1078회 당첨결과 (2023년 07월 29일 추첨) 당첨번호 6 10 11 14 36 38 1078회 순위별 등위별 총 당첨금액, 당첨게임 수, 1게임당 당첨금액, 당첨기준, 비고 안내 순위 등위별 총 당첨금액 당첨게임 수 1게임

dhlottery.co.kr

 

1회부터 1078회까지 데이터를 다운로드받으면 다음과 같습니다.

로또번호.xlsx
0.16MB

그러면 이제 이 데이터를 바탕으로 왜 로또 추천이 의미가 없는지 다각도로 살펴보겠습니다.

일단 필요한 모듈과 데이터를 다음과 같이 불러옵니다.

import pandas as pd
from matplotlib import pyplot as plt
from scipy.stats import *
import numpy as np
plt.style.use('ggplot')
df = pd.read_excel("로또번호.xlsx", header = 2)
df = df[[1, 2, 3, 4, 5, 6]]
win_numbers = df.apply(lambda x:list(x), axis = 1)

win_numbers는 다음과 같이 회차별 로또 번호를 포함하고 있습니다 (보너스는 제외했으나, 추가해도 분석엔 크게 지장이 없습니다)

0        [6, 10, 11, 14, 36, 38]
1         [4, 8, 17, 30, 40, 43]
2          [3, 7, 9, 33, 36, 37]
3        [1, 23, 24, 35, 44, 45]
4         [1, 6, 20, 27, 28, 41]
                  ...           
1073    [16, 24, 29, 40, 41, 42]
1074    [14, 27, 30, 31, 40, 42]
1075    [11, 16, 19, 21, 27, 31]
1076     [9, 13, 21, 25, 32, 42]
1077    [10, 23, 29, 33, 37, 40]
Length: 1078, dtype: object

유독 잘 나오는 번호가 있을 것이다?

일단 유독 잘 나오는 번호가 있는지를 알아보겠습니다.

1부터 45까지 등장 횟수를 나타내는 리스트인 occur_dist를 만들고 시각화해보겠습니다.

occur_dist = [win_numbers.apply(lambda x:v in x).sum() for v in range(1, 46)]
plt.figure(figsize = (12, 6))
plt.bar(range(45), occur_dist)
plt.xticks(range(45), range(1, 46))
plt.show()

[실행 결과]

다른 번호보다 9번이 유독 안나왔고 34번이 유독 잘 나왔습니다.

그럼 9번이 우연히 더 안 나온 것인지, 34번이 우연히 더 나온 것인지를 봐야합니다.

만약 출현 비율이 유니폼 분포를 따른다면 우연히 나온 결과라고 볼 수 있을테고, 그렇지 않다면 이제부터는 34번을 포함하는게 유리하다고 할 수 있겠네요.

 

분석은 chi-square goodness of fit test를 사용해서 진행하겠습니다.

만약 로또 번호가 완전히 유니폼하게 나온다면, 각 번호의 출현 빈도가 실제 출현 빈도의 평균과 같아야 할 것입니다.

이 점을 고려해서 expected 변수를 만들고 검정을 수행합니다.

expected = [np.mean(occur_dist)] * 45
chi_square_test_statistic, p_value = chisquare(occur_dist, expected)
print(p_value)

[실행 결과]

0.9844248969295055

 

예상한대로 p-value가 1에 가까운 것을 알 수 있습니다. 즉, 실제 데이터와 예상 데이터에는 통계적인 차이가 없다고 할 수 있으므로, 유독 잘 나오는 번호는 따로 없다고 할 수 있습니다.

 


잘 나오는 조합 배출이 있을 것이다?

사실 이것이 재밌을 것 같아서 이 포스팅을 시작했습니다. 

광고에도 강조하고 있는 것이라서요.

그러면 같이 잘 나오는 번호 조합이 있는지를 보겠습니다.

이번에도 같은 방법으로 테스트하겠습니다.

data = []
for v1 in range(1, 46):
    temp = win_numbers.loc[win_numbers.apply(lambda x:v1 in x)]
    for v2 in range(v1+1, 46):
        count = temp.apply(lambda x:v2 in x).sum()      
        data.append(count)
        
expected = [np.mean(data)] * len(data)
chi_square_test_statistic, p_value = chisquare(data, expected)
print(p_value)

[실행 결과]

0.9722417522935826

역시 특출나게 많이 나오거나 적게 나오는 조합은 없다고 보는 것이 맞다고 나오는 것을 확인할 수 있습니다.

 


데이터 분석 서비스가 필요한 분은 아래 링크로! 

https://kmong.com/gig/374194 

 

데이터사이언스 박사의 데이터 분석 서비스 드립니다. | 150000원부터 시작 가능한 총 평점 5점의 I

78개 총 작업 개수 완료한 총 평점 5점인 데이터사이언스박사의 IT·프로그래밍, 데이터 분석·시각화 서비스를 68개의 리뷰와 함께 확인해 보세요. IT·프로그래밍, 데이터 분석·시각화 제공 등 150

kmong.com

 

Comments