본문 바로가기
Python

Python Machine Learning을 이용한 Lotto 번호 생성 프로그램 - (1)

by 아짱이아빠 2020. 12. 13. 17:57
반응형

이번에 파이썬을 이용하여 Lotto 번호 6자리를 뽑아내는 프로그램을 만들어 보았다.

 

많은 사람들이 Lotto 번호를 만드는 프로그램을 만들었으며 대부분은 random() 함수를 이용하여 난수를 생성한다.

그러나 여기서는 Machine Learning 중 XGBoost 알고리즘을 이용하고 그동안의 Lotto 번호 통계를 바탕으로 6개의 숫자를 뽑는 프로그램을 구현해 보았다.

 

Lotto 는 45개의 숫자 중 순서에 상관없이 6개의 숫자가 모두 맞아야 하기 때문에 그 확률은 1/8,145,060 이 된다.

또한, 이전 차수까지 많이 나온 숫자가 앞으로도 많이 나온다거나 아니면 앞으로는 적게 나온다거나 하지 않으므로 Lotto 1등 번호를 예측하기란 사실상 불가하다고 볼 수 있다. (어떻게 보면 다른 사람들이 많이들 했던 random() 함수를 이용한 난수 생성이 더 확률이 높을지도 모르겠다.)

그러나 쉽게 번호를 추출하기 보다는 Machine Learning도 이용하고 무언가 분석을 통해 찾은 것 같은 뿌듯함(?)이 있을 것 같아 해 보게 되었다.

그리고 무엇보다 개인의 Python 공부가 목적이고 이렇게 무언가를 만들어 보는 것이 가장 큰 도움이 되기에 해보게 되었다.

그렇기 때문에 앞으로 나오는 내용에 대해서는 그냥 재미로 봐주었으면 한다.

 

그럼 본격적으로 설명해 보도록 하겠다.

 

먼저 프로그램은 아래의 그림과 같은 구성으로 되어 있다.

 

Lotto 번호 추출 프로그램 구성
(Lotto  번호 추출 프로그램 구성 )

 

 

Lotto 당첨번호를 다운로드하여서 각 1등 당첨 번호 6개의 합들을 구한다. 그리고 Machine Learning 중 XGBoost 알고리즘을 통해 다음 차수의 번호 합을 예측한다.

예측된 합을 구성하는 6개의 번호 조합을 만드는 것은 다운로드한 데이터에서 가장 많이 나온 숫자들을 바탕으로 조합을 만들고 또한, 가장 적게 나온 숫자를 바탕으로 조합을 만든다.

가장 많이 나온 숫자 순으로 조합을 만드는 이유는 아무래도 또 나오지 않을까 하는 기대 심리에서 한 것이고 가장 적게 나온 순으로 조합을 만드는 이유는 이제까지 안 나왔으니 이제는 나올 거라는 기대 심리에서 하게 되었다. 그 외에 이유는 없다.

 

 

[1. 로또 당첨번호 다운로드]

 

Lotto 데이터 다운로드 코드
(Lotto  데이터 다운로드 코드 )

 

 

위의 코드는 인터넷 상에서 구한 것으로 이 코드를 통해 Lotto 사이트에서 당첨 번호와 당첨 금액 등이 포함된 데이터를 다운로드할 수 있다.

위 코드의 마지막에 보면 “940”는940 차수까지의 데이터를 다운로드하는 것을 의미하며 다운로드한 데이터는 “lotto_df”에 저장한다.

 

저장된 데이터는 “lotto_df.to_csv(“lotto_940.csv”, index=False)” 코드를 통해 “lotto_940”이란 이름의 CSV파일로 저장할 수 있다.

“Index=False” 는 index를 추가하지 않고 저장한다는 의미이다.

 

다음의 코드는 google drive에 저장한 Lotto 데이터를 읽어온다.

전체 작업을 google colab에서 했고 사이트에서 다운로드하여로 저장한 파일을 google drive에 넣어두고 필요할 때 불러와서 사용하면 편리하다.

 

Google Drive 에 있는 파일을 여는 코드
(Google Drive 에 있는 파일을 여는 코드 )

 

 

위 코드를 실행하면 Lotto의 데이터는 아래처럼 구성되어 있다.

 

Lotto 데이터
(Lotto  데이터 )

 

 

 

[2. 각 1등 당첨번호의 합 구하기]

 

각 1등이 된 6개 번호의 합은 위의 그림에서 Num1 ~ Num6까지를 더하면 되며 아래의 코드와 같다.

 

1 등 번호들 간의 합을 구하는 코드
(1 등 번호들 간의 합을 구하는 코드 )

 

 

각각 더해진 값에서 index를 빼고 실제 값만을 “. values”기능을 통해 뽑아서 “values”에 저장하고 결과를 보면 다음과 같다.

 

각 1 등 번호들의 합
( 각  1 등 번호들의 합 )

 

 

 

[3. XGBoost를 통한 다음 차수의 합 예측하기] 

 

다음의 코드를 통해 XGBoost를 이용하여 다음 차수의 1등 번호 6개 숫자의 합을 예측한다.

XGBoost를 적용한 이유는 이전에 주식 종가 예측 프로그램을 만들 때에 이용했던 알고리즘이고 무엇보다 유일하게 알고 있는 것이며 바로 적용할 수 있기 때문이었다.

실제로 여기서도 거의 그대로 적용하였다.

 

XGBoost 를 이용한 다음 차수의 1 등 숫자 합을 구하는 코드
(XGBoost 를 이용한 다음 차수의  1 등 숫자 합을 구하는 코드 )

 

 

XGBoost를 이용하는 코드에 대한 설명은 이전 글인 “XGBoost를 이용한 주식 예측”을 참고하고 여기서는 다루지 않겠다.

이전 주식 종가 예측에서는 XGBoost의 파라미터를 최적화하는 부분이 없었는데, 이번에는 "GridSearchCV”를 통해 파라미터 최적화 코드를 추가하였다.

이러한 부분은 인터넷을 통해 참고하여 넣었으며 내용을 잘 모르기 때문에 설명을 할 수는 없다.

(실제 최적화가 되었는지도 미지수다.)

 

다만, Lotto 데이터에서 가장 최신 날짜의 데이터를 삭제하고 예측을 수행하여 삭제했던 최신 날짜의 데이터와 거의 동일하게 될 때까지 변수를 수정하려는 노력은 하였다.

(쓸데없는 짓이지만 유일하게 해 볼 수 있는 일이기도 했다.)

 

이렇게 해서 예측된 합은142.719이며 결과의 소수점이 있는 경우에 반올림을 통해 정수로 만들어 주면 143이 된다.

 

 

1부는 여기서 끝내고 2부에서는 예측된 합이 되기 위한 6개 숫자의 조합을 찾도록 하겠다.

반응형

댓글