얼마 전,
토스 앱을 켜서 새로고침을 했더니 계좌 잔액이 2억 몇천만 원이 생기는 꿈을 꿨다.
아무래도 전 날에 복권 이야기를 하다가 자서 그런 거 같지만,
다음 날 공부도 하기 싫고 데이터 분석 연습이라도 해보고 싶어서
1122회 차까지 나온 복권 정보들을 이용해 복권 번호를 랜덤으로 추출하는 코드를 짜보기로 결심했다.
📕 1. 사전 준비
[ beautifulsoup4 설치 ]
먼저 웹 스크래핑을 쉽게 하기 위해 beautiffulsoup4를 설치해 줬다.
[ requests 설치 ]
파이썬에서 HTTP 요청과 응답을 처리하기 위해 requests 설치
[ lxml 설치 ]
XML 및 HTML 문서를 파싱 하기 위해 lxml을 추가로 설치해 주었다.
[ pandas 사용 ]
크롤링한 데이터 분석은
빅데이터분석기사를 응시할 때 실제로 사용했던 pandas 라이브러리를 이용해 진행했다.
판다스는 미리 설치되어 있어 추가로 설치하지 않았는데, 없다면 아래 명령어를 입력해 설치해줘야 한다.
pip install pandas
📕 2. 특정 회차까지의 로또 실제 당첨 번호 가져오기
동행복권에서는 실제 당첨된 로또 번호를 제공해 주는 API가 있는데,
요청 링크는 아래와 같다. 맨 뒤의 861이 적힌 곳에 특정회차를 검색하면
https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=861
위와 같이 drwtNo1 ~ drwtNo6와 같은 변수로 해당 회차에 대한 로또 번호들이 제공된다.
회차 번호만 넣으면 그 회차에 대한 데이터를 모두 담는 함수를 만들었고,
1회 차부터 가장 최근에 진행된 회차까지 반복문을 돌리며
1회부터 가장 최신 회차까지의 데이터들을 모두 담은 후에
pandas의 데이터프레임으로 변환한 뒤, csv 파일로 저장해 두었다.
📕 3. 가장 최신 회차 정보 찾기
가장 최근에 진행된 로또가 몇 회 차인지 알아야 처음부터 끝까지 데이터 크롤링을 해올 수 있기에,
복권 메인 페이지를 크롤링해서 가장 최신 회차 정보를 알아냈다.
복권 메인페이지에 접속하게 되면 왼쪽 중간에 최근 회차 당첨결과가 나와있기 때문에
F12를 눌러 HTML 파일을 분석하면 찾을 수 있다.
위 코드의 3번째 줄을 보면 <strong id="lottoDrwNo"> 1122 </strong> 이란 코드가 있는데,
저 strong으로 감싸진 곳이 최신 회차 정보이기 때문에
우리는 코드를 실행해 저 숫자를 파싱 하면 된다.
그래서 최신 회차 정보를 찾아오는 함수를 따로 만들어
태그가 strong이고 id가 lottoDrwNo인 것을 html에서 찾아서 리턴했다.
📕 4. 각 로또 번호의 추첨 빈도 계산
위의 2번과 3번 과정을 거치면 아래와 같은 csv 파일이 생성되게 된다.
즉, 1회 차부터 최근 회차까지의 모든 복권 정보가 담긴 파일을 만들 수 있다.
이 데이터들을 가지고 내가 원했던 건,
가장 많이 나오는 로또 번호 20개를 뽑아서 그중 6개를 랜덤으로 뽑아내는 것이었다.
그렇기 때문에 다른 파이썬 파일을 만들어서
먼저, 각 로또 번호의 빈도수를 모두 계산하고 빈도 기준으로 내림차순 한 뒤에 csv파일을 저장했다.
이런 식으로 로또 번호 숫자와 빈도가 내림차순으로 정렬되게 된다.
내가 생각한 것보다도 의외로 각 번호마다 추첨 횟수가 차이가 있었다.
이게 상위 26번까지라 19밖에 차이가 안 나지만,
추첨 빈도 1등과 45등을 비교하면 생각보다 많은 차이가 나는 것을 알 수 있었다.
📕 5. 상위 20개 중 6개 숫자 랜덤 추출
위에서 추출한 데이터들 중. head(20)을 이용해 상위 20개만 추출하고
numpy의 random 메서드를 사용해서 상위 20개 중 랜덤으로 6개를 추출하는 코드를 짰다.
코드를 실행하면 다음과 같은 6개의 랜덤 번호가 나오게 된다.
📕 6. 느낀 점
빅분기 실기 응시 후에,
개인적으로 데이터를 다뤄볼 일이 없었는데
매우 간단하고 간단한 데이터지만 이런 데이터라도 다뤄보는 건 상당히 흥미로운 일인 것 같다.
코드를 짜고 신나서 로또 구매를 했었고
까먹고 있다가 방금 확인을 했는데
아무래도 블로그 주인장이 여기서 아직까지 글을 쓰고 있는 걸 보면
결과는 알려주지 않아도 될 듯하다.
다음번에는 좀 더 많고 어려운 데이터들을 모아서 한 번 다뤄봐야겠다.
혹은 이 코드를 좀 더 정교화해 봐야지.
복권 구매에 대한 책임은 전적으로 본인에게 있으며,
이 코드를 참고한다고 해서
당첨 확률이 올라가는 것도 아니니
그저 재미로만 봐주시면 감사하겠습니다 !