얼마전 유튜브에서 로또에 300회, 최대 연속 94회 당첨되었다는 사람의 방송을 시청했다. 로또는 확률이지만, 어디까지나 무작위에 의한 것인데, 어떻게 저렇게 연속으로 당첨이 될 수 있는 것일까? 유튜브의 내용을 한번 보자.
https://www.youtube.com/watch?v=Cvto5pJtfXE
간단히 말하면, 전회차 로또번호 + 일정기간 당첨된 번호가 등장한 횟수를 기준으로 적당히 배열해 매회 6장을 사는 것이 기본 규칙이었다. 그래서 한번 python 으로 나도 한번 분석해 보면 어떨까 생각했다.
우선 로또번호를 수집해야 했다. 다행히 동행복권 홈페이지에서 excel 파일로 내려받을 수 있었다. 현 시점 총 1027회까지의 로또 번호가 존재했다.
https://www.dhlottery.co.kr/gameResult.do?method=byWin
이 페이지에서 1회부터 마지막 회까지 당첨결과를 선택하고 엑셀로 내려받으면, 당첨금액을 포함한 당첨번호 목록을 내려받을 수 있다. 난 회차번호와 당첨범호 6개만 남겨두고 모두 지웠다.
그리고 데이터를 openpyxl 모듈을 이용해 배열로 만들었다. 엑셀 문서를 배열로 만드는 방법은 이전 포스팅에 있는 방식을 이용했다.
https://blogair.tistory.com/249
이제 이 데이터를 어떻게 가공해 볼 것인지를 고민해야 한다. 유튜브에서는 일단, 바로 직전회차의 번호를 꼭 다음회차 당첨을 위해 사용했다는 점을 보아, 바로 직전회차에 다음회차의 번호가 나온 횟수를 체크해 보았다. 예를들면 1027회에 나온 숫자가 1026회차에도 나온적이 있는지를 체크해 본 것이다.
import openpyxl
def excelToList(file, sheet): ... # 위에 링크된 이전 포스팅 참조
arr = excelToList("lotto.xlsx", "excel") # 엑셀 데이터 배열화
# arr 속 한 행의 배열은 회차번호, 로또번호 1, 로또번호2 .... 6 으로 구성되어 있다.
yes = 0
no = 0
for x in arr:
if x[0] != 1:
count = 0
is_number = False
for y in arr:
if x[0] > y[0]:
for z in range(1, 7):
if y[z] == x[1] or y[z] == x[2] or y[z] == x[3] or y[z] == x[4] or y[z] == x[5] or y[z] == x[6]:
is_number = True
count += 1
if count == 1:
break
if is_number == True:
yes += 1
else:
no += 1
total = yes + no
p_yes = yes * 100 / total
p_no = no * 100 / total
print(yes, no, total, round(p_yes), round(p_no))
yes = 0 윗 부분은 지난 링크에 설명되어 있을 것이고.. 중요한건 arr 변수에 로또횟차와 번호가 들어있다는 것이다.
yes = 0, no = 0
은 로또번호가 전회차에 나온 경우와 나오지 않은 경우 합계를 저장할 변수로 시작하기 전에는 0 에서 시작한다.
for x in arr:
부분은 근 arr 배열을 순서대로 x 에 넣으라는 이야기로, 엑셀시트 데이터의 한 줄이 x 에 들어가게 된다. 즉 x 에는 회차와 번호 6개 총 7개의 데이터가 들어있다.
if x[0] != 1 :
이 부분은 x[0] 즉 횟차가 1일 때에는 진행하지 않는다는 것으로 1회차 이전에는 데이터가 없기 때문에 진행할 필요가 없기 때문에 작성되었다.
count = 0
시작하기 전이므로 count 변수를 0 으로 지정했다. 이후 for 문을 돌릴 때 if count == 1: break 를 지정함으로써 1회차만 돌린 후 결과를 뽑도록 설정했다. 만약 if count == ?: break 에서 숫자를 다르게 지정할 경우 지정횟수만큼 회차를 확인하고 변경하게 될 것이다.
is_number = False
일단, 번호가 없다는 걸 가정하고, 이후 번호가 있으면 True 로 변경한다
if is_number == True:
번호가 존재하는 경우 yes 의 합을 1 증가시키고 그렇지 않을 경우 no 의 합을 1 증가시킨다.
이러한 방식으로, 데이터를 출력할 수 있다. 그래서 결과를 보면...숫자 1을 2~6으로 바꿔서 생각해본다면...
1027회 기준 전회차 숫자가 다음회차에 등장하는 확률은 62%, 2회차까지의 숫자가 재등장할 확률은 86%, 3회차까지 체크하면 94%에 달한다. 사실상 숫자 18개는 중 하나는 94% 확률로 포함된다. 숫자가 24개가 되면 98%로 증가하고, 5개는 99%, 6개는 100%이다.
이건 확률이 아닌, 현재까지의 실제 결과이지만, 확률은 확률일 뿐 확정은 아니다라고 말하고 싶다.
다음번엔 전회차 확률이 아닌, 당첨숫자가 이전에 몇회차만에 완성이 되는지 알아보고 그 평균이 어떠한지 찾아보면 좋을 것 같다. 다음 포스팅은 아래와 같은 내용으로 연재가 될지도 모르겠다.
1. 현재의 로또번호 6개가 이전에 모두 등장하기까지의 횟수 및 평균 구해보기
2. 모두 등장 평균횟차에서 당첨번호가 몇번이나 등장할까? 평균 구해보기
3. 그리고 그 평균을 이용해서 숫자 추출하기
사실 이미 해봤는데, 초기 1회까지 데이터가 나오는 경우는 제외하고... 평균 23회가 나왔다. 23회만에 모든 번호가 1번 이상 등장했다는 말이다. 그리고 23회를 기준으로 계산 결과 각 숫자는 약 3번씩 등장했고, 그 결과로 도출한 숫자는
5, 13, 17, 20, 21, 22, 23, 31, 37, 38, 44 이다.
유튜브에 나온 일본인의 경우 최신 로또당첨번호와 이렇게 3회 또는 4회 등장한 번호들로 조합을 만들어 94회 연속, 총 300회 로또에 당첨되었다고 한다. 단 1등은 못해보고 2등까지는 했다고 한다.
그래서 본인도 4번 등장하는 숫자도 추려보았다.
8, 14, 16, 25, 26, 27, 35
총 18개의 숫자가 도출되었다.
1027회 당첨번호는 14, 16, 27, 35, 39, 45 인데...
14, 16, 17, 35 는 중복이다.
즉 총 20개의 숫자를 발견했다.
5, 8, 13, 14, 16, 17, 20, 21, 22, 23, 25,26, 27, 31, 35, 37, 38, 39, 44, 45
이렇게 20개다. 6개 사기에는 충분하지 않은 숫자이다.
마침 오늘이 토요일이다. 오늘 당첨 번호에 이 숫자는 몇개가 포함될까? 20개 숫자니 최소 3개는 포함될 가능성이 있어보이는데.... 문제는 조합을 어떻게 하느냐가 아닐까 싶다.
14 / 5 / 20 / 27 / 44 / 22
16 / 8 / 21 / 31 / 45 / 23
27 / 13 / 22 / 35 / 5 / 25
35 / 14 / 23 / 37 / 8 / 26
39 / 16 / 25 / 38 / 13 / 31
45 / 17 / 26 / 39 / 20 / 35
대충 조합해보았다. 당첨확률이 궁금해진다.
일반적으로 확률게임에서 난 확률이 나쁜편이므로 사실 확률을 신봉하지 않는다.
그저 분석해보기 재미있는 자료라서 해보는 것 뿐 큰 의미를 두지 않으면 좋겠다.