로또 규칙, 로또 당첨그래프로 알아보는 방법은?

2020. 4. 3. 07:00

로또는 대표적인 랜덤 확률 게임이다. 하지만, 당첨에 영향을 주는 어떤 요인이 있다고 생각하고, 로또의 규칙을 찾아보려는 시도가 많이 있다. 필자도 로또를 분석하여 당첨확률을 높일 수 있다는 애기를 믿지는 않는다. 하지만, 우연한 기회로 로또에 관심을 갖게 될 기회가 생겼다. 오늘은 로또 규칙, 로또 당첨그래프에 대해서 알아보도록 하겠다.


로또



로또를 분석할 때 가장 먼저 접근하는 방식은 어떤 번호들이 당첨되었는지 확인해보는 것이다. 이를 보기좋게 시각적으로 표현하는 방법이 있다. 로또 당첨그래프를 그려보는 것이다. 로또 당첨그래프는 1번부터 45번까지 당첨된 숫자를 x축에 놓고, 당첨된 경우만 색깔을 칠해서 보는 것이다.


파이썬을 이용해서 아래와 같이 로또 당첨그래프를 그려보았다. 신기하게도 특정번호는 여러 회 동안 반복돼서 나오기도 한다. 특정 번호가 안 나오면, 다음에 나올 확률이 높을 것 같지만 꼭 그렇지도 않은 듯 하다.


로또당첨그래프


( 로또 당첨그래프를 그려보았다 )


파이썬에서 dash 패키지를 이용해서 그려보았다. 하지만, 티스토리 블로그에 옮기는 것이 한계가 있어서 캡쳐를 해서 올렸다.


로또당첨그래프를 그리기 위해서는, 당첨 결과를 먼저 수집해야 한다. 로또 당첨 결과를 수집하는 방법은 아래 포스팅을 참조해보자.
( 참조: 회차별 로또 당첨번호 및 당첨금액 모으기 )


파이썬 코드는 아래와 같다. dash패키지에 대해서 잘 모른다면, 아래 포스팅을 참조해보자. dash에 대한 내용을 포스팅한 적은 없어서, 필자가 이번에 출간한 도서의 링크를 걸어둔다. 혹은 구글에서 검색을 통해 관련 내용을 확인할 수 있다.
( 챰조: 파이썬 데이터 분석 도서 추천, 금융 데이터를 위한 파이썬 )



import dash

import dash_core_components as dcc

import dash_html_components as html

import random

import pandas as pd

import plotly.graph_objs as go

import numpy as np

from dash.dependencies import Input, Output

import json

import sqlite3


external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)


x_tick_vals = np.arange(0.5,45.5,1)

x_tick_text = ["    "+str(x) for x in list(range(1,46))]


class LottoNum():


    def load_lotto(self):

        conn = sqlite3.connect("./data/lotto.db")

        lotto = pd.read_sql("SELECT * FROM lent", conn)

        lotto.index = lotto["drwNo"]

        df_1 = lotto.stack()

        df_1 = df_1.reset_index(drop=False)

        df_1.columns = ["level_0", "level_1", "val"]

        df_1 = df_1[df_1["level_1"].str.find("rwtNo") > 0]


        df_1["is"] = 1

        df_1["no"] = (df_1["level_0"]) * -1

        df_1.columns=["no","cl_nm","value","is","no_minus"]


        self.df_stack = df_1.sort_values(["no", "value"], ascending=[False,True])


        return 0



    def get_num(self,n):

        self.df_get = self.df_stack[(self.df_stack["no"]<=n) & (self.df_stack["no"]>=n-20)]

        y_tick_vals = list(set(self.df_get["no_minus"]))

        y_tick_text = list(set(self.df_get["no"]))


        y_tick_vals.append("0")

        y_tick_text.sort(reverse=True)

        y_tick_text.append(" ")


        for i in range(1, 46):

            temp = pd.DataFrame([{"no": 0, "cl_nm": "drawtNo1", "value": i, "is": 1, "no_minus": " "}])

            self.df_get = pd.concat([self.df_get, temp], 0)


        max_no = self.df_stack["no"].max()


        return self.df_get, y_tick_vals, y_tick_text, max_no


lotto = LottoNum()

lotto.load_lotto()

df_get, y_tick_vals, y_tick_text, max_no = lotto.get_num(100)


app = dash.Dash()


app.layout = html.Div(children=[

    html.H1(children='로또 당첨 그래프'),

    html.Div(children='''

        회차별 나온 당첨번호 흐름을 알 수 있습니다.

    '''),

    dcc.Graph(id='graph'),

    html.Div(id="my-div", children="당첨 회차"),

    dcc.Slider(id="slider", min=1, max=max_no, value=max_no,),

])


@app.callback(

    [Output(component_id="graph", component_property="figure"),

     Output(component_id="my-div", component_property="children"),],

    [Input(component_id="slider", component_property="value")]

)

def update_output_div(input_value):

    temp, y_tick_vals, y_tick_text, max_no = lotto.get_num(input_value)

    temp["no"].loc[temp["no"]==0] = None

    text = "{}회 ~ {}회".format(y_tick_text[len(y_tick_text)-2], y_tick_text[0])


    return {

        'data': [go.Heatmap(x=temp["value"].astype(int), y=temp["no_minus"], z=temp["is"], zmid=0.5,

                 colorscale=[(0,"white"), (1,"green")],

                 colorbar = dict(tickmode="array", tickvals=[0,1], ticktext=["", "당첨"])

                            )],

        'layout':

            go.Layout(xaxis=dict(dtick=1, tick0=0.5, tickmode="array",

                                 tickvals=x_tick_vals, ticktext=x_tick_text,

                                 tickangle=0),

                      yaxis=dict(dtick=1, tickvals=y_tick_vals, ticktext= y_tick_text)

    )

    }, text


if __name__ == '__main__':

    app.run_server(debug=True)




특정번호가 연속으로 나오지 않을 것 같지만, 884회부터 887회까지 계속 45번이 당첨됐다. 오히려 최근에 나오던 번호 근처에서 나오는 듯 하기도 하다. 10번과 11번은 이 기간동안 한 번도 나오지 않았다.


당첨확률을_높이는_만화로또



이외에도 당첨 번호를 가지고 하는 여러가지 분석들이 있는데, 유용하게  사용할 수 있을지는 잘 모르겠다. 이 책의 저자도 이 방법으로 당첨이 되었다고 하지는 않았다. 보통 여러가지 기준을 가지고 당첨번호를 분류하는 방법들이 있었다.

댓글()
  1. Favicon of https://captainkorea83.tistory.com BlogIcon 그랜드슬램83 2020.04.03 08:10 신고 댓글주소  수정/삭제  댓글쓰기

    흥미롭네요. 잘 보고 갑니다.^^

  2. Favicon of https://false-nine.tistory.com BlogIcon east9river 2020.04.03 10:07 신고 댓글주소  수정/삭제  댓글쓰기

    분석 잘해서 로또 당첨 한번 됐으면 좋겠습니다...

  3. Favicon of https://jjang861212.tistory.com BlogIcon 두콩이아빠 2020.04.03 23:02 댓글주소  수정/삭제  댓글쓰기

    관리자의 승인을 기다리고 있는 댓글입니다

  4. Favicon of https://moonflower12.tistory.com BlogIcon 달빛의 꽃 2020.04.10 23:18 댓글주소  수정/삭제  댓글쓰기

    관리자의 승인을 기다리고 있는 댓글입니다

  5. Favicon of https://amag365.tistory.com BlogIcon 노마리 2020.04.22 08:41 댓글주소  수정/삭제  댓글쓰기

    관리자의 승인을 기다리고 있는 댓글입니다