본문 바로가기

카테고리 없음

[파이썬] pandas melt(), value_counts(): 역대 로또 당첨번호 빈도 세기 예제

로또 사는 친구를 보니 문득 두 가지 사소한 궁금증이 생겼습니다.

1) 역대 로또 당첨번호 중 가장 많이 나온 숫자는 뭘까

2) 당첨 번호 구간별 출현 비중은 어떨까

매번 추첨 행위가 독립 시행이기 때문에 서로 아무 상관 관계도 없는 건 알지만, 재미 삼아해 해 봤습니다.

 

역대 로또 당첨결과 데이터 수집하기

로또 사업자인 동행복권 사이트에 들어가 보니 엑셀 다운로드 기능을 제공하고 있습니다. 따로 제공 안 하면 이거 스크래핑을 900번 정도 해야 하나 싶었는데 다행입니다.

 

 

엑셀 데이터 살펴보기

깔끔한 테이블 형태의 데이터를 기대했지만 템플릿(서식) 형태의 파일입니다. 이렇게 생긴 데이터를 가지고도 당첨 번호를 셀 수는 있겠지만 노가다를 해야 할 것 같습니다. 노가다는 제 취향이 아니기 때문에 pandas melt() 메서드를 이용해서 데이터를 녹이겠습니다.

 

엑셀 데이터를 판다스에서 불러오기 좋게 아래와 같이 정리한 후 저장하겠습니다. 보너스 번호는 제외했습니다.

 

판다스에서 엑셀 읽기

import pandas as pd
df = pd.read_excel('excel.xlsx')
df

 

pd.melt() 사용하기

melt() 메서드는 데이터프레임을 unpivot하여 wide-format에서 long-format 형태로 변환시킵니다.

melted_df = pd.melt(df, id_vars=['회차', '추첨일'], value_vars=[1, 2, 3, 4, 5, 6], var_name='추출순서' , value_name='당첨번호')

 

value_counts() 사용하기

wide-format 형태였던 당첨번호 데이터가 long-format 형태로 정리되었으니 value_counts()를 이용하면 손쉽게 각 번호의 빈도를 셀 수 있습니다.

frequency = melted_df['당첨번호'].value_counts()
frequency.head(10)

1회부터 894회까지 보너스 번호를 제외한 당첨번호 중에서 역대 가장 많이 나온 번호는 34번으로 총 141회 나왔다는 사실을 알게되었습니다. 

 

 

- 이 글의 코드는 아나콘다(Anaconda3)가 설치된 주피터 노트북에서 작성되었습니다.