일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 사이킷런
- 데이터분석
- 하이퍼 파라미터 튜닝
- 파라미터 튜닝
- 주가데이터
- 데이터 사이언스
- 판다스
- AutoML
- 이력서 첨삭
- 머신러닝
- 코딩테스트
- 커리어전환
- 대학원
- 파이썬
- 데이터 사이언티스트
- sklearn
- 데이터사이언스학과
- 주요 파라미터
- 퀀트 투자 책
- 주식데이터
- 베이지안 최적화
- 경력 기술서
- 자기소개서
- pandas
- 경력기술서 첨삭
- 데이터사이언티스트
- 데이터사이언스
- 하이퍼 파라미터
- 퀀트
- 랜덤포레스트
- Today
- Total
GIL's LAB
로또 추천이 말도 안되는 이유 (feat data) 본문
굉장히 오랜만에 포스팅을 올립니다.
요즘에는 줄긴 했으나, 여전히 로또를 추천해준다는 서비스가 있습니다.
애초에 정말 로또 번호를 높은 확률로 예측할 수 있으면 서비스를 만들지말고 로또를 사는게 당연히 합리적인 선택이니, 당연히 신빙성없는 서비스입니다.
그럼 데이터를 보면서 로또 번호 예측이 왜 불가능한지를 알아보겠습니다.
데이터
현재까지의 로또 당첨 번호 데이터는 동행복권 공식 홈페이지에서 다운로드받을 수 있습니다.
https://dhlottery.co.kr/gameResult.do?method=byWin&wiselog=H_C_1_1
1회부터 1078회까지 데이터를 다운로드받으면 다음과 같습니다.
그러면 이제 이 데이터를 바탕으로 왜 로또 추천이 의미가 없는지 다각도로 살펴보겠습니다.
일단 필요한 모듈과 데이터를 다음과 같이 불러옵니다.
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
역시 특출나게 많이 나오거나 적게 나오는 조합은 없다고 보는 것이 맞다고 나오는 것을 확인할 수 있습니다.
데이터 분석 서비스가 필요한 분은 아래 링크로!
'데이터사이언스 > 확률 통계' 카테고리의 다른 글
scipy를 이용한 확률 분포 샘플링 (0) | 2022.08.14 |
---|---|
반복측정 분산분석과 그리드 서치: 가장 중요한 파라미터 찾기 (0) | 2022.01.07 |