본문 바로가기
Python/Python 실전

[로또 분석] 로또 당첨번호 빈도수 시각화 :: 마이자몽

by 🌻♚ 2019. 1. 14.

당첨번호 빈도수 시각화

로또 분석을 어떤 방법으로 접근해야하는지 고민을 해보면 가장 먼저 어떤 숫자가 몇번 나왔는지가 알고 싶을 것이다.
이전 글에서 원하는 데이터를 가공 했다면, 이번 글에서는 가공된 데이터를 이용해서 시각화를 진행해 볼려고 한다.
시각화는 막대그래프 하나와 테이블 하나를 만들것이다.

-테이블
해당 데이터에 어떤 번호가 몇번 등장했는지 확인

-막대 그래프
출현 빈도수(X) 대 번호 갯수(Y)

해당 글의 코드는 몽고DB에 로또 데이터 추가(http://myjamong.tistory.com/58)와
로또 데이터 가공(http://myjamong.tistory.com/60)을 진행한 후 작성한 코드이다.


모듈 import

1
2
3
4
5
6
7
from pymongo import MongoClient
from pymongo import errors
from pandas import DataFrame
from pandas import Series
from matplotlib import pyplot as plt
from matplotlib import font_manager as fm
import numpy as np
cs




pyplot 한글 깨짐 해결

pyplot을 사용할때  Label이나 Title부분에 한글이 깨진다.
깨지는 한글을 해결하기 위해 한글이 인식되는 폰트 경로를 미리 설정한다.
1
2
path = '/Library/Fonts/NanumSquareBold.ttf'
fontprop = fm.FontProperties(fname=path, size=15)
cs





데이터 시각화 함수

몽고DB에서 읽은 데이터를 표에 맞는 데이터 형식으로 한번 더 가공하고
시각화 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
def analysis_by_frequency(df):
    global fontprop
 
    # 확인하고자 하는 회차
    last_episode = max(df['drwNo']) + 1
 
    # 로또 번호만 확인
    num_with_no_bonus = df.loc[:, 'drwtNo1''drwtNo6']
 
    # 1~6번호를 하나의 Series로
    full_value = Series()
    for idx in num_with_no_bonus:
        full_value = full_value.append(num_with_no_bonus[idx])
 
    # 1~6번호의 count 값이 들어 있는 Series
    full_value_count = full_value.value_counts()
 
    # 테이블 형식으로 빈도수 당첨 번호 표
    plt.subplot(211)
 
    # 테이블에 들어갈 행List
    cell_text = []
 
    # 빈도별 번호 갯수List
    number_length = []
 
    for value in full_value_count.unique():
        temp_df = full_value_count[full_value_count == value]
        temp_df.index.values.sort()
        number_length.append(temp_df.count())
        cell_text.append([value, temp_df.index.values])
 
    columns = ['Frequency''Number']
    plt.title('빈도수 당첨번호 표', fontproperties=fontprop)
    plt.axis('off')
    plt.table(cellText=cell_text, colLabels=columns, loc='center')
 
    # 막대 그래프로 당첨번호가 출현한 횟수 번호가 몇개 인지 확인
    plt.subplot(212)
 
    # 빈도수 인덱스로 정렬
    freq_count = full_value_count.value_counts().sort_index()
    y = freq_count.values
    x = np.arange(len(y))
    x_label = freq_count.index.values
    plt.title('%s회 이전 %s회 로또 빈도' % (last_episode, len(num_with_no_bonus)), fontproperties=fontprop)
    plt.bar(x, y)
    plt.xticks(x, x_label)
    plt.yticks(np.arange(max(number_length) + 1))
    plt.xlabel('출현 빈도수', fontproperties=fontprop)
    plt.ylabel('번호 갯수', fontproperties=fontprop)
    plt.subplots_adjust(hspace=0.5)
    plt.show()

cs





main 실행 함수

데이터 가공 함수와 시각화 함수로 원하는 결과를 출력한다.
예측하려는 회차를 check_episode에 대입하여 콘솔창으로 데이터를 미리 출력하고
before_episode에 해당 회차 이전  n개 회차에 대한 데이터를 통계내어 시각화한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if __name__ == '__main__':
    check_episode = 841
    before_episode = 30
    
    # 예측하는 회차 번호
    lotto_data = connect_mongodb_data_to_frame(get_episode, {'episode': check_episode})
    print(lotto_data)
 
    lotto_data = connect_mongodb_data_to_frame(
        get_assigned_before_episodes,
        {
            'episode': check_episode,
            'before_num': before_episode
        }
    )
    analysis_by_frequency(lotto_data)

cs




시각화 결과

위의 코드를 이용하여 한눈으로 빈도수를 확인할 수 있다.



로또리치 당첨 번호

로또리치 수동 1등 107명 배출! 한국 로또 역사상 최대 성과! 번호가 인생을 바꿉니다. 


아래 배너를 통해 확인해주세요!




로또리치 수동 1등 107명 배출! 한국 로또 역사상 최대 성과! 번호가 인생을 바꿉니다.

댓글0