파이썬으로 크롤링 한 데이터를 분석해보는 예제를 보겠습니다.
예제 내용은 로또 번호를 크롤링 해 1등 당첨 번호가 가장 많이 나온 숫자를 분석하겠습니다.
로또 번호 크롤링은 API를 제공하고 있기 때문에 간단하게 데이터를 수집할 수 있습니다.
본론으로 들어가 로또 번호를 취득해 가장 많이 나온 1등 번호를 알아보겠습니다.
import requests
from tqdm import tqdm
import json
import matplotlib.pyplot as plt
from collections import Counter
import numpy as np
minDrwNo = 1 #취득하고 싶은 회차 시작
maxDrwNo = 919 #취득하고 싶은 회차 종료
drwtNo1 = [] #1등 첫번째 번호
drwtNo2 = [] #1등 두번째 번호
drwtNo3 = [] #1등 세번째 번호
drwtNo4 = [] #1등 네번째 번호
drwtNo5 = [] #1등 다섯번째 번호
drwtNo6 = [] #1등 여섯번째 번호
bnusNo = [] #1등 보너스 번호
drwNoDate = [] #로또 추첨일
# 지정한 시작 회차 부터 종료 회차 까지 취득
for i in tqdm(range(minDrwNo, maxDrwNo + 1, 1)):
# 1등 번호를 취득
req_url = "https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=" + str(i)
req_lotto = requests.get(req_url)
lottoNo = req_lotto.json()
drwNoDate.append(lottoNo['drwNoDate']) # 로또 추첨일
drwtNo1.append(lottoNo['drwtNo1']) #1등 첫번째 번호 저장
drwtNo2.append(lottoNo['drwtNo2']) #1등 두번째 번호 저장
drwtNo3.append(lottoNo['drwtNo3']) #1등 세번째 번호 저장
drwtNo4.append(lottoNo['drwtNo4']) #1등 네번째 번호 저장
drwtNo5.append(lottoNo['drwtNo5']) #1등 다섯번째 번호 저장
drwtNo6.append(lottoNo['drwtNo6']) #1등 여섯번째 번호 저장
bnusNo.append(lottoNo['bnusNo']) #1등 보너스 번호 저장
# 로또 1등 번호를 하나의 리스트로 머지
# 보너스 번호를 포함해 분석 하고 싶은 경우
# drwtNo6뒤에 bnusNo를 추가
h = np.hstack((drwtNo1,drwtNo2,drwtNo3,drwtNo4,drwtNo5,drwtNo6))
cnt = Counter(h)
# 결과 출력
print(sorted(cnt.items(),key=lambda x:x[1], reverse=False))
결과
[(9, 94), (22, 103), (32, 107), (23, 109), (41, 110), (29, 111), (30, 111), (35, 113), (28, 114), (6, 116), (25, 118), (42, 119), (16, 120), (2, 120), (3, 120), (36, 120), (44, 121), (7, 122), (24, 122), (15, 122), (38, 123), (8, 124), (4, 124), (26, 124), (21, 124), (31, 124), (10, 125), (11, 125), (5, 127), (37, 127), (13, 128), (19, 128), (20, 128), (33, 128), (1, 129), (45, 130), (14, 131), (12, 131), (39, 131), (40, 132), (17, 133), (18, 133), (43, 134), (27, 136), (34, 143)]
콤마를 기준으로 왼쪽에 표시된 숫자는 1등 번호 그리고 오른쪽에 표시된 숫자는 1등으로 나온 횟수입니다.
1등으로 가장 많이 나온 번호는 34이고 횟수는 143번입니다.
가장 적게 나온 번호는 9이고 횟수는 94번입니다.
가장 많이 나온 번호와 가장 적게 나온 번호의 횟수 차이는 49회입니다.
많이 나온 번호 10개와 적게 나온 번호 10개
1등 번호 상위 | 회수 | 1등 번호 하위 | 회수 |
---|---|---|---|
34 | 130 | 9 | 94 |
27 | 131 | 22 | 103 |
43 | 131 | 32 | 107 |
18 | 131 | 23 | 109 |
17 | 132 | 41 | 110 |
40 | 133 | 29 | 111 |
39 | 133 | 30 | 111 |
12 | 134 | 35 | 113 |
14 | 136 | 28 | 114 |
45 | 143 | 6 | 116 |
소스를 살펴보겠습니다.
minDrwNo와 maxDrwNo 변수에는 취득하고 싶은 로또 회차를 지정합니다.
지정한 로또 회차 1등 번호를 모두 취득해옵니다.
반복문을 사용해 지정한 회차를 취득합니다.
req_url 변수에는 로또 정보를 취득해올 URL 주소를 입력합니다.
지정한 URL을 requests.get() 를 사용해 정보를 취득합니다.
취득한 정보에는 1등 번호부터 추첨일, 당첨 금액 등 데이터가 있습니다.
이번에는 1등 번호만 취득해 분석을 하였습니다.
번호를 하나씩 취득해 np.hstack()로 하나의 리스트로 만들었습니다.
Counter 메서드를 사용해 1부터 45까지 번호가 몇 개씩 있는지 계산을 합니다.
마지막으로 계산한 데이터를 출력해 1등 번호를 나온 숫자를 확인했습니다.
현재 데이터를 취득한 시점에서 로또는 919회 까지 추첨을 진행했습니다.
이번에는 919회 까지 1등 당첨번호들이 나온 확률이 어떻게 되는지 알아보겠습니다.
import requests
from tqdm import tqdm
import json
import matplotlib.pyplot as plt
from collections import Counter
import numpy as np
minDrwNo = 1 #취득하고 싶은 회차 시작
maxDrwNo = 919 #취득하고 싶은 회차 종료
drwtNo1 = [] #1등 첫번째 번호
drwtNo2 = [] #1등 두번째 번호
drwtNo3 = [] #1등 세번째 번호
drwtNo4 = [] #1등 네번째 번호
drwtNo5 = [] #1등 다섯번째 번호
drwtNo6 = [] #1등 여섯번째 번호
bnusNo = [] #1등 보너스 번호
drwNoDate = [] #로또 추첨일
# 지정한 시작 회차 부터 종료 회차 까지 취득
for i in tqdm(range(minDrwNo, maxDrwNo + 1, 1)):
# 1등 번호를 취득
req_url = "https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=" + str(i)
req_lotto = requests.get(req_url)
lottoNo = req_lotto.json()
drwNoDate.append(lottoNo['drwNoDate']) # 로또 추첨일
drwtNo1.append(lottoNo['drwtNo1']) #1등 첫번째 번호 저장
drwtNo2.append(lottoNo['drwtNo2']) #1등 두번째 번호 저장
drwtNo3.append(lottoNo['drwtNo3']) #1등 세번째 번호 저장
drwtNo4.append(lottoNo['drwtNo4']) #1등 네번째 번호 저장
drwtNo5.append(lottoNo['drwtNo5']) #1등 다섯번째 번호 저장
drwtNo6.append(lottoNo['drwtNo6']) #1등 여섯번째 번호 저장
bnusNo.append(lottoNo['bnusNo']) #1등 보너스 번호 저장
# 로또 1등 번호를 하나의 리스트로 머지
# 보너스 번호를 포함해 분석 하고 싶은 경우
# drwtNo6뒤에 bnusNo를 추가
h = np.hstack((drwtNo1,drwtNo2,drwtNo3,drwtNo4,drwtNo5,drwtNo6))
# 1부터 45까지 번호가 몇개씩 있는지 계산
cnt = Counter(h)
# 확률 계산
for i in range(1,46):
print(str(i) + " 번호 확률 : " + str(cnt[i]/919))
결과
1 번호 확률 : 0.14036996735582155
2 번호 확률 : 0.1305767138193689
3 번호 확률 : 0.1305767138193689
4 번호 확률 : 0.13492927094668117
5 번호 확률 : 0.1381936887921654
6 번호 확률 : 0.12622415669205658
7 번호 확률 : 0.13275299238302501
8 번호 확률 : 0.13492927094668117
9 번호 확률 : 0.10228509249183895
10 번호 확률 : 0.13601741022850924
11 번호 확률 : 0.13601741022850924
12 번호 확률 : 0.1425462459194777
13 번호 확률 : 0.13928182807399347
14 번호 확률 : 0.1425462459194777
15 번호 확률 : 0.13275299238302501
16 번호 확률 : 0.1305767138193689
17 번호 확률 : 0.14472252448313383
18 번호 확률 : 0.14472252448313383
19 번호 확률 : 0.13928182807399347
20 번호 확률 : 0.13928182807399347
21 번호 확률 : 0.13492927094668117
22 번호 확률 : 0.11207834602829161
23 번호 확률 : 0.11860718171926006
24 번호 확률 : 0.13275299238302501
25 번호 확률 : 0.12840043525571274
26 번호 확률 : 0.13492927094668117
27 번호 확률 : 0.14798694232861806
28 번호 확률 : 0.12404787812840043
29 번호 확률 : 0.12078346028291621
30 번호 확률 : 0.12078346028291621
31 번호 확률 : 0.13492927094668117
32 번호 확률 : 0.11643090315560392
33 번호 확률 : 0.13928182807399347
34 번호 확률 : 0.15560391730141457
35 번호 확률 : 0.12295973884657237
36 번호 확률 : 0.1305767138193689
37 번호 확률 : 0.1381936887921654
38 번호 확률 : 0.1338411316648531
39 번호 확률 : 0.1425462459194777
40 번호 확률 : 0.14363438520130578
41 번호 확률 : 0.11969532100108814
42 번호 확률 : 0.1294885745375408
43 번호 확률 : 0.1458106637649619
44 번호 확률 : 0.13166485310119697
45 번호 확률 : 0.14145810663764963
1회부터 919회까지 확률이기 때문에 cnt[i]/919 나누기 919를 했습니다.
확률로 확인해보니 차이가 별로 없어 보이기도 하네요.
분석한 데이터를 파일로 저장할 수도 있고 그래프로 표시를 할 수도 있습니다.
마지막으로 이번에는 분석한 데이터를 그래프로 표시하는 방법을 보겠습니다.
import requests
from tqdm import tqdm
import json
import matplotlib.pyplot as plt
from collections import Counter
import numpy as np
minDrwNo = 1 #취득하고 싶은 회차 시작
maxDrwNo = 919 #취득하고 싶은 회차 종료
drwtNo1 = [] #1등 첫번째 번호
drwtNo2 = [] #1등 두번째 번호
drwtNo3 = [] #1등 세번째 번호
drwtNo4 = [] #1등 네번째 번호
drwtNo5 = [] #1등 다섯번째 번호
drwtNo6 = [] #1등 여섯번째 번호
bnusNo = [] #1등 보너스 번호
drwNoDate = [] #로또 추첨일
# 지정한 시작 회차 부터 종료 회차 까지 취득
for i in tqdm(range(minDrwNo, maxDrwNo + 1, 1)):
# 1등 번호를 취득
req_url = "https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=" + str(i)
req_lotto = requests.get(req_url)
lottoNo = req_lotto.json()
drwNoDate.append(lottoNo['drwNoDate']) # 로또 추첨일
drwtNo1.append(lottoNo['drwtNo1']) #1등 첫번째 번호 저장
drwtNo2.append(lottoNo['drwtNo2']) #1등 두번째 번호 저장
drwtNo3.append(lottoNo['drwtNo3']) #1등 세번째 번호 저장
drwtNo4.append(lottoNo['drwtNo4']) #1등 네번째 번호 저장
drwtNo5.append(lottoNo['drwtNo5']) #1등 다섯번째 번호 저장
drwtNo6.append(lottoNo['drwtNo6']) #1등 여섯번째 번호 저장
bnusNo.append(lottoNo['bnusNo']) #1등 보너스 번호 저장
# 로또 1등 번호를 하나의 리스트로 머지
# 보너스 번호를 포함해 분석 하고 싶은 경우
# drwtNo6뒤에 bnusNo를 추가
h = np.hstack((drwtNo1,drwtNo2,drwtNo3,drwtNo4,drwtNo5,drwtNo6))
# 1부터 45까지 번호가 몇개씩 있는지 계산
cnt = Counter(h)
# 로또 분석 번호를 그래프로 표시
plt.rcParams['figure.figsize'] = (8, 6)
plt.rcParams["font.size"] = 15
plt.figure(figsize=(20,7))
x = [x for x in cnt.values()]
y = [y for y in cnt.keys()]
plt.grid(True)
plt.xticks(np.arange(1,46))
plt.yticks(np.arange(0,250,10))
plt.xlim(0,46)
plt.bar(y,x, color='skyblue')
plt.show()
결과
결과가 그래프로 표시되었습니다.
분석 내용을 그래프로 표시하니 보기에 편리합니다.
크롤링을 이용해 로또 데이터를 수집하고 1등으로 가장 많이 나온 번호를 분석해보는 예제를 살펴봤습니다.
데이터를 수집하고 분석하는 것도 재미있네요.
댓글