본문 바로가기

파이썬

로또번호 분석 & 제조기

올해도 어김없이 새해가 밝았습니다. 저는 새해 첫날을 특별한 이벤트 없이 가족과 함께 고요하게 보냈네요. 

이제 한살 더 먹는것이 이제 점점 무덤덤하고 무상 하지만, 새해만큼은 우리가족이 작년보다 더 건강하고 행복하고 발전되기를 기대하게 됩니다. 여러분들 모두도 올해 대박나고 행복하시길 기원합니다!

 

올해는 블로그활동을 좀 더 힘차고 왕성하게 할 생각입니다.(작심삼일) 팍!팍!팍! 기운을 내고,

그 시작으로 대박기원 '로또번호 분석과 제조'에 대한 얘기를 해볼게요!

 

먼저 이론를 간략히 정리하면,

정규 분포(normal distribution) 또는 가우스 분포(Gaussian distribution)는 연속 확률 분포의 하나이다. 정규분포는 수집된 자료의 분포를 근사하는 데에 자주 사용된다.정규분포는 2개의 매개 변수 평균 μ (mu) 과 표준편차 δ (sigma) 에 대해 모양이 결정되고, 이때의 분포를 N(μ, δ2)로 표기한다. 특히, 평균이 0이고 표준편차가 1인 정규분포 N(0,1)을 표준 정규 분포(standard normal distribution)라고 한다.

N(μ, δ2) = 1 / ( 2π*δ2) * exp[-1/2*(x-μ)22]

누적분포함수(cumulative distribution function, 약자 cdf)는 주어진 확률 변수가 특정 값보다 작거나 같은 확률을 나타내는 함수이다.

erf (error function) : 2/√π * ∫0z exp(-t2)dt

erfc (Complementary error function) : 2/√π * ∫zoo exp(-t2)dt  =  1 - erf(z)

BER (bit error ratio, 비트오류율) : 수신된 비트의 수에 대해 전달되는 과정에서 오류가 발생한 비트의 수

     (ex) BPSK의 BER = 1/2 * erfc(√(Eb/N0))

 

(컨셉) 많은 통계자료를 확보하고, 로또번호 출현 횟수와 시기(회차)가 확률적으로 드물게 나타는 번호일수록 임의로 가중치를 더 주어 랜덤추첨해 보려 합니다. 정답은 없으므로 로또번호 출현 횟수와 시기 2가지를 조합해 강제로 정규확률분포를 적용해서 확률 찾음

 

다음은 컨셉을 구현한 소스코드입니다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy.special import erf

df = pd.read_csv('lotto.csv', index_col=0)

tbl = pd.DataFrame(np.zeros(45, dtype=int), index=range(1,46), columns=['hit'])   # count
tbl['last'] = pd.to_datetime('2002-12-07')   # dti.date.today()

for x in zip(df.index, df.values) :
    tbl.loc[x[1][1:],'hit'] += 1
    tbl.loc[x[1][1:],'last'] = x[0]   # x[1][0]

hit_m , last_m = tbl.mean(axis=0)['hit'], tbl.mean(axis=0)['last']
hit_std , last_std = tbl.std()['hit'], tbl.std()['last']

tbl['hit_n']=(tbl['hit'] - hit_m)/hit_std
tbl['last_n']=(tbl['last'] - last_m)/last_std
tbl['n'] = (tbl['hit_n'] + tbl['last_n'])/2
tbl = tbl.sort_values(by='n', ascending=True)
tbl['p']= 1 - norm.cdf(list(tbl['n']),0,1)
tbl['p'] /= sum(tbl['p'])
xs = np.random.choice(tbl.index, 6, p=tbl['p'], replace=False)

ax = tbl.plot(y='n', kind='bar')
ax.text(15, -1.5, list(xs), fontsize=20)
for x in xs : ax.plot([np.where(tbl.index==x)[0][0], np.where(tbl.index==x)[0][0]], [0, tbl['n'][x]], 'r-')

plt.show(block=False)

 

물론 웹에서 로또번호 스크랩하면 좀 더 편할테지만, 코드가 깔끔하지 못하고 복잡해보여 다음기회에 블로그 할게요.

다만 아래 csv파일을 첨부하여 일단은 약간은 수동으로 업데이트 유지보수 해주면 됩니다.

lotto.csv
0.04MB

 

그럼 최종적으로 분석하여 얻은 이번주 로또번호를 감히 공개하겠습니다. 짜~ 잔!!! 

 

로또번호 분석 (x축 번호 순은 드물고 희박한 번호(가중치↑) → 평균적 흔한 번호(가중치↓))

오늘이 당장 로또추첨인데 부자될 즐거운 상상들 하시고,,, 이제 기다리기만 하면 되겠군요.ㅎㅎㅎ

 

여러분 새해 복 팡팡팡 많이 받으세용~~!!!

 

---------------------------- 2023.01.15. 로또추첨 후기 ----------------------------

에효,,, 1자리 맞췄네요. 역시 인생은 예측이 안되요...