관리 메뉴

솜씨좋은장씨

[Python]역대 로또 당첨 번호 csv로 저장하고 분석해보기! (feat.나눔로또API) 본문

Programming/Python

[Python]역대 로또 당첨 번호 csv로 저장하고 분석해보기! (feat.나눔로또API)

솜씨좋은장씨 2020. 1. 18. 12:36
728x90
반응형

로또, 다들 살면서 한번쯤은 구매하고 당첨 번호 발표일까지 당첨이 되면 무엇을 할까 고민하며 행복해 본 적이 있을 겁니다.

 

저도 가끔 구매 해보고 있지만 항상 결과는 역시나 였습니다.

 

그러던 중 그동안의 당첨번호를 분석해보면 무언가 나오지 않을까..? 로또 API를 가지고 데이터를 수집하여 한 번 해보기로했습니다.

 

이 글에서는

 

Python과 로또 API 그리고 여러 라이브러리를 활용하여

 

1회부터 894회 까지 역대 로또 당첨번호 중 어떤 번호가 가장 많이 또는 가장 적게 등장했는지

 

가장 높았던 당첨금은 얼마였는지, 가장 많은 사람이 당첨되었을 때는 언제였는지 한번 알아보려 합니다.

 

사용 라이브러리 : requests, json, pandas, tqdm, collections

 

나눔로또에서 제공하는 API를 사용하여 데이터를 받아오기 위해서 requests라이브러리를

 

넘어오는 데이터가 json형식이므로 json라이브러리를

 

받은 데이터를 가공한 뒤 DataFrame형식으로 만들어주기위해 pandas라이브러리를

 

반복문의 진행이 어느정도 되었는지 얼마나 걸릴지 볼 수 있는 tqdm라이브러리를 import 해주었습니다.

 

API활용하여 데이터 받아오기

import pandas as pd
import requests
from tqdm import tqdm
import json

def getLottoWinInfo(minDrwNo, maxDrwNo):
    drwtNo1 = []
    drwtNo2 = []
    drwtNo3 = []
    drwtNo4 = []
    drwtNo5 = []
    drwtNo6 = []
    bnusNo = []
    totSellamnt = []
    drwNoDate = []
    firstAccumamnt = []
    firstPrzwnerCo = []
    firstWinamnt = []
    
    for i in tqdm(range(minDrwNo, maxDrwNo+1, 1)):
        req_url = "http://www.nlotto.co.kr/common.do?method=getLottoNumber&drwNo=" + str(i)
        
        req_lotto = requests.get(req_url)
        
        lottoNo = req_lotto.json()
        
        drwtNo1.append(lottoNo['drwtNo1'])
        drwtNo2.append(lottoNo['drwtNo2'])
        drwtNo3.append(lottoNo['drwtNo3'])
        drwtNo4.append(lottoNo['drwtNo4'])
        drwtNo5.append(lottoNo['drwtNo5'])
        drwtNo6.append(lottoNo['drwtNo6'])
        bnusNo.append(lottoNo['bnusNo'])
        totSellamnt.append(lottoNo['totSellamnt'])
        drwNoDate.append(lottoNo['drwNoDate'])
        firstAccumamnt.append(lottoNo['firstAccumamnt'])
        firstPrzwnerCo.append(lottoNo['firstPrzwnerCo'])
        firstWinamnt.append(lottoNo['firstWinamnt'])
        
        lotto_dict = {"추첨일":drwNoDate, "Num1":drwtNo1, "Num2":drwtNo2, "Num3":drwtNo3, "Num4":drwtNo4, "Num5":drwtNo5, "Num6":drwtNo6,
                      "bnsNum":bnusNo, "총판매금액":totSellamnt, "총1등당첨금":firstAccumamnt, "1등당첨인원":firstPrzwnerCo, 
                      "1등수령액":firstWinamnt}
        
    df_lotto = pd.DataFrame(lotto_dict)
        
    return df_lotto

언제부터 언제까지의 데이터를 볼 것인지 함수에 변수로 받았으며 그 변수를 가지고

 

반복문을 활용하여 각 회차별로 데이터를 json으로 받아왔으며

 

그 받아온 데이터를 각각의 키 값으로 추출한 후 각각의 list에 저장한 뒤에

 

pandas의 DataFrame형식으로 변환하여 return해주는 함수를 만들어주었습니다.

 

먼저 위에서 만든 함수를 가지고 데이터를 받아와 DataFrame을 만들어 주었습니다.

 

데이터를 통하여 2002년 12월 7일 처음 추첨이 시작된 것을 알 수 있었습니다.

 

당첨인원은 초반에 아예 없거나 1명과 같이 많이 나오지 않았던 것도 볼 수 있었습니다.

 

받아온 데이터 csv로 저장하기

지금 만든 데이터 프레임을 계속 API를 호출하여 만들수 없으니 추후 또 이 데이터를 사용하기 위해서

 

to_csv메소드를 활용하여 csv파일형식으로 저장하여 줍니다.

lotto_df.to_csv("lotto_win_info.csv", index=False)

여기서 index=False라고 지정해 주지 않으면 현재 DataFrame의 index가 csv에 Unnamed :0이라는 column명으로 열이 하나 생성되기 때문에 그것을 방지하기 위하여 적어주었습니다.

저장시킨 csv파일은 추후

pd.read_csv("lotto_win_info.csv")

pandas의 read_csv메소드를 활용하여 데이터를 불러와 사용하면 됩니다.

 

데이터 분석해보기

당첨번호 중 가장 많이 나온 번호

당첨번호 중에 가장 많이 나온 번호를 파악해보기 위해서 먼저 Num1~Num6 열의 데이터를 하나의 list로 만들어 주었습니다.

num_list = list(lotto_df['Num1']) + list(lotto_df['Num2']) + list(lotto_df['Num3']) + list(lotto_df['Num4']) + list(lotto_df['Num5']) + list(lotto_df['Num6'])

그럼 그동안 나왔던 당첨번호 첫번째 번호부터 여섯번째 번호까지의 데이터가 하나의 list로 만들어지게됩니다.

 

그럼 collections의 Counter를 활용하면 어떤 번호가 가장 많이 등장했었는지 코드 몇줄로 확인해 볼 수 있습니다.

from collections import Counter
count = Counter(num_list)
common_num_45 = count.most_common(45)

Counter(num_list)를 하게 되면 num_list 안에 들어있는 데이터를 카운트 빈도수를 구하여

 

list의 데이터을 키값으로 각각의 데이터가 몇번씩 나왔는지 저장하여

 

Counter Dictionary형태로 return 해줍니다.

 

여기서 count.most_common(45)를 하게되면 가장 빈도수가 높은 순서대로

 

(데이터 값, 빈도수) tuple 45개가 담긴 list를 return해줍니다.

 

 

위의 방법을 통하여 가장 많이 당첨번호로 등장한 숫자 10개만 뽑아보면

순위 당첨번호 빈도수
1 34 141
2 43 132
3 17 131
4 27 131
5 40 130
6 18 128
7 45 128
8 14 127
9 1 127
10 12 127

 

당첨번호 중 가장 적게 나온 번호

반대로 당첨번호 중 가장 적게 나온 번호 10개를 알아보았습니다.

순위 당첨번호 빈도수
1 9 93
2 22 97
3 32 104
4 23 105
5 35 108
6 41 109
7 30 109
8 29 109
9 28 111
10 6 111

 

이번엔 만들어 둔 DataFrame을 sort 메소드를 통하여 얻은 결과를 보면

 

가장 1등 당첨금 수령액이 높았던 날 Top 10

lotto_df.sort_values(by=['1등수령액'], axis=0, ascending=False).head(10)

1등수령액 열을 기준으로 내림차순 정렬을 통해 얻은 결과 중 상위 10개의 데이터만 확인해보았습니다.

초반에 당첨자가 적었던 2003년~2004년 사이에 당첨된 사람들이었고

 

가장많이 받은 사람이 400억 10명 중 적게 받은 사람이 142억 인 것을 볼 수 있었습니다.

 

가장 1등 당첨자가 많았던 날 Top 10

lotto_df.sort_values(by=['1등당첨인원'], axis=0, ascending=False).head(10)

1등 당첨금 열을 기준으로 내림차순 정렬을 통해 얻은 결과 중 상위 10개의 데이터만 확인해보았습니다.

1등한 사람이 가장 많았을때는 총 30명 이었습니다.

 

1인당 수령액은 4억인 것을 알 수 있었습니다.

 

앞으로 이 데이터를 mongoDB등과 같은 DB에 저장하는 것과 여러가지 분석 예측에 관련된 실습도 해보려합니다.

 

읽어주셔서 감사합니다~

Comments