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

목차

    2020. 4. 3. 07:00

    로또
    로또

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

     

     

    1. 로또 당첨 그래프

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

     

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

     

    로또-당첨-그래프
    로또-당첨-그래프

     

     

    파이썬에서 dash 패키지를 이용해서도 그려보았습니다. 하지만 티스토리 블로그에 옮기는 것이 한계가 있어서 캡처를 해서 올립니다. 로또당첨그래프를 그리기 위해서는, 당첨 결과를 먼저 수집해야 합니다. 로또 당첨 결과를 수집하는 방법은 이미 검색되는 내용이 많아 생략합니다.

     

    로또-번호-추천
    로또-번호-추천

     

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

     

    필자의 블로그는 복붙이 막혀 있어 파일로도 코드를 올립니다.

     

    lotto_graph.py
    0.00MB

     

    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번은 이 기간 동안 한 번도 나오지 않았습니다.

     

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

     

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