brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Jul 24. 2024

Python : 1 / 8145060 (4)

#노답로또 #고민된다 #어느것을고를까요

로또 분석을 이어가는 와중에 한가지 문제가 발생했다.


우선 지난번 코드를 살짝 고쳐봤다.


import numpy as np


all_combinations # 총 조합 개수: 8145060, 모든 조합의 리스트

# history_data # 1129회차 까지의 1등 당첨번호 리스트


history_data = df_final.select(pl.col('당첨번호')).to_numpy()

history_data = history_data.reshape(-1, len(history_data))[0]

history_data = [i[:-1] for i in history_data] # 6자리 당첨번호만 추출


history_data_list = [tuple(row) for row in history_data]

history_data_set = set(history_data_list)


class Lotto:

    def __init__(self, i, v):

        self.lotto_all_combi = i

        self.lotto_all_history = v


    def __repr__(self):

        return f"Lotto({self.lotto_all_combi} : {self.lotto_all_history})"


matching_indices = []

for i, row in enumerate(all_combinations):

    if tuple(row) in history_data_set:

        matching_index_in_history = history_data_list.index(tuple(row)) + 1

        # matching_indices.append((i, matching_index_in_history))

        matching_indices.append(Lotto(i, matching_index_in_history))


matching_indices.sort(key=lambda x: (x.lotto_all_history, x.lotto_all_combi))

repr(matching_indices)



플로팅을 위한 코드는,


import numpy as np

import matplotlib.pyplot as plt


np.random.seed(0)

x_val = np.array([i.lotto_all_history for i in matching_indices][-20:]) 

y_val = np.array([i.lotto_all_combi for i in matching_indices][-20:])


x = np.arange(1, len(x_val) + 1)


# 그래프 생성

plt.figure(figsize=(15, 10))

plt.scatter(x, y_val, linewidth=1)


plt.title('Distribution of Values')

plt.xlabel('seq')

plt.ylabel('idx')

plt.xlim(1, len(x_val) + 1)

plt.ylim(0, len(all_combinations))


plt.yticks(

    y_val,

    [f'{i/1000000:.1f}M' for i in y_val]

)


# 그리드 추가

plt.grid(True, linestyle='-', alpha=0.7)


plt.tight_layout()

plt.show()



결과는!

최근 20개의 당첨번호 분포를 보았다.

오케이! 여기까진 그래도 눈에 뭔가 좀 보이는 것 같은데...


최근 50개로 늘려서 보면,

뭐... 대중이 없다... 막무가네(?) 느낌이다.


저기 3,100,000 ~ 4,100,000 index 사이에서 좀 공백이 보이긴 하는데 이 또한 단순한 시각적 정보일 뿐이고, 크게 보았을 땐 규칙따위는 없다. 당연하게도.


또 하나 발견한 사실은 실제로 로또 당첨번호는 한 번도 같은 Index 위치의 값이 나온적이 아직은 없다!


그렇다면,

다음 당첨번호는 어떤 index를 골라야 가능성이 높을까?


아직 안나온 나머지 8,145,060 - 1,129 = 8,143,931 개에서 고르면 될까?


확률은 조금 줄여줬지만 불확실성 계수가 존재함으로 이 또한 완벽하지 못하다!


지금까지 쓴 내용을 보면 로또에 진심같아 보이겠지만 아니다!!

진지한 컨셉으로 글을 쓰고 있는 것 뿐이다...


통계는 확률로 이야기한다.

불확실을 줄이고 이길 수 있는 방향에 배팅을 해야한다.


그래서!

두가지 전략을 준비했다.


첫째,

가장 많은 당첨번호가 선택된 index 범위에서 아직 선택되지 못한 index 번호를 고른다!

예를 들어, 6,000,000 ~ 7,000,000 번대의 index 가 선택된 분포가 크다면

그 안에서 아직 선택되지 못한 번호를 5개 정도 뽑아서 한게임 걸어보는 것이다.


두번째,

위에 언급한 내용과 비슷하게 아직 선택되지 못한 미지의 영역에서 5개 정도 뽑고 배팅한다.


뭐 사실 막(!) 신기하고 기발한 아이디어가 떠오르진 않는다...


다음번에는

random seed 값의 분포를 무작위성으로 바꿔서 뽑아보고!

당첨번호 Index 의 위치와 가장 유사한 random seed 가 무엇이 있을지 알아보려고 한다.


이것도 안되면 바로 GPT 모델을 소환해야겠다!

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari