일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래머스
- ChatGPT
- 파이썬
- github
- Kaggle
- gs25
- Git
- ubuntu
- 더현대서울 맛집
- 금융문자분석경진대회
- programmers
- 자연어처리
- 맥북
- 편스토랑
- dacon
- 편스토랑 우승상품
- 백준
- 코로나19
- 우분투
- Docker
- hackerrank
- 데이콘
- SW Expert Academy
- AI 경진대회
- Baekjoon
- 캐치카페
- Real or Not? NLP with Disaster Tweets
- PYTHON
- 프로그래머스 파이썬
- leetcode
- Today
- Total
솜씨좋은장씨
[Python]역대 로또 당첨 번호 csv로 저장하고 분석해보기! (feat.나눔로또API) 본문
로또, 다들 살면서 한번쯤은 구매하고 당첨 번호 발표일까지 당첨이 되면 무엇을 할까 고민하며 행복해 본 적이 있을 겁니다.
저도 가끔 구매 해보고 있지만 항상 결과는 역시나 였습니다.
그러던 중 그동안의 당첨번호를 분석해보면 무언가 나오지 않을까..? 로또 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에 저장하는 것과 여러가지 분석 예측에 관련된 실습도 해보려합니다.
읽어주셔서 감사합니다~
'Programming > Python' 카테고리의 다른 글
[Python] 마스크 재고 API와 텔레그램으로 나만의 마스크 재고 알리미를 만들어보자! (1) | 2020.03.15 |
---|---|
[Python] 공공api를 활용하여 내 주변 공적 마스크 판매처와 마스크 재고를 지도에 시각화해보자! (7) | 2020.03.14 |
설날 귀성/귀경시간을 예측해보자! - 01 데이터 수집 및 시각화를 통한 최적, 혼잡시간대 추측해보기 (0) | 2020.01.14 |
[Python]Mac에서 Python을 활용하여 wav파일을 mp3파일로 변환하기! (0) | 2019.11.19 |
[Python]인스타그램 크롤링을 통해 #흑당버블티 분석해보기! (43) | 2019.10.09 |