올해도 어김없이 새해가 밝았습니다. 저는 새해 첫날을 특별한 이벤트 없이 가족과 함께 고요하게 보냈네요.
이제 한살 더 먹는것이 이제 점점 무덤덤하고 무상 하지만, 새해만큼은 우리가족이 작년보다 더 건강하고 행복하고 발전되기를 기대하게 됩니다. 여러분들 모두도 올해 대박나고 행복하시길 기원합니다!
올해는 블로그활동을 좀 더 힘차고 왕성하게 할 생각입니다.(작심삼일) 팍!팍!팍! 기운을 내고,
그 시작으로 대박기원 '로또번호 분석과 제조'에 대한 얘기를 해볼게요!
먼저 이론를 간략히 정리하면,
정규 분포(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-μ)2/δ2]
누적분포함수(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파일을 첨부하여 일단은 약간은 수동으로 업데이트 유지보수 해주면 됩니다.
그럼 최종적으로 분석하여 얻은 이번주 로또번호를 감히 공개하겠습니다. 짜~ 잔!!!
오늘이 당장 로또추첨인데 부자될 즐거운 상상들 하시고,,, 이제 기다리기만 하면 되겠군요.ㅎㅎㅎ
여러분 새해 복 팡팡팡 많이 받으세용~~!!!
---------------------------- 2023.01.15. 로또추첨 후기 ----------------------------
에효,,, 1자리 맞췄네요. 역시 인생은 예측이 안되요...
'파이썬' 카테고리의 다른 글
지구에서 최단 비행경로, 위성궤도 시각화 (0) | 2023.04.10 |
---|---|
파이썬으로 별 이름표 붙이기(별주석) (0) | 2022.06.14 |
GPIB를 이용한 네트워크 분석기 활용 (0) | 2022.05.08 |
파이썬 GUI 실행파일 만들기(전력변환기) (0) | 2021.12.03 |
파이썬으로 별자리판 만들기(1) (0) | 2021.01.15 |