본문 바로가기
Python

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

by 아짱이아빠 2021. 1. 3. 15:26
반응형

 

1부에서 Machine Learning을 통해 다음 차수의 1 Lotto 번호 총 합 예측을 하였다.

2부에서는 예측된 합에서 6개의 Lotto 번호 조합을 찾아보도록 하겠다.

 

1부 처음에 얘기했듯이 Lotto 번호의 조합은 과거에 나온 번호들 중에서 가장 많이 나온 번호 순대로 조합을 하여 찾는 방법과 거꾸로 가장 적게 나온 번호 순대로 조합을 찾는 방법으로 한다.

소프트웨어나 컴퓨터 공학을 전공하지 않은 사람으로서 Python을 혼자 공부하면서 그동안은 대부분 다른 사람이 만들어 놓은 코드를 그대로 해보거나 약간의 수정만을 했었다.

그러나 정해진 조건에서 특정 합을 이루는 6개의 숫자 조합을 찾는 부분은 직접 코드를 짜보는 데에 의미를 두었고 남들한테는 쉬울지 몰라도 비전공자로서 이러한 단순한 알고리즘을 짜보는 것도 쉽지 않았다.

 

그럼 1부에 이어서 나머지 부분을 설명하겠다.

 

 

[4. 예측된 합을 구성하는 6개 번호 조합 구하기]

 

먼저 과거 번호가 나온 데이터를 바탕으로 번호 조합을 찾기 때문에 다운로드한 전체 Lotto 번호 데이터에서 보너스 번호를 뺀 6개 자리의 번호를 모두 뽑아본다.

모든 번호를 num_list 에 저장
모든 번호를  num_list 에 저장

 

그리고 아래의 코드처럼 Counter() 함수를 통해 “num_list”에 저장된 전체 번호를 카운트하여 가장 많이 나온 순서대로 정렬한다.

Lotto 번호 카운터
Lotto  번호 카운터

 

위에서 보다시피 결과는 Lotto 번호와 함께 나온 횟수가 같이 표현된다.

그러나 6개 번호를 추출하려면 횟수 정보는 불필요하기 때문에 아래의 코드를 통해 Lotto 번호만 남기게 하였다.

Lotto번호 카운터 정보 삭제
Lotto  번호 카운터 정보 삭제

 

위의 “common_num_k”의 데이터 타입은 list 이다.

그러나 마지막에 있는 6개 번호 조합을 찾는 알고리즘 부분에서는 list 타입의 데이터를 사용할 수 없기 때문에 다음의 코드를 통해 데이터 타입을 tuple로 바꾸어 주었고 “most”란 이름에 저장하였다.

데이터 타입을 list 에서 tuple 로 변경
데이터 타입을  list 에서  tuple 로 변경

 

다음의 코드는 가장 많이 나온 순서대로 정렬되어 있는 데이터를 바탕으로 예측된 합을 구성하는 번호 6개를 추출하는 코드이다.

가장 많이 나온 숫자 순서대로 예측된 합을 만드는 조합을 찾는 코드
가장 많이 나온 숫자 순서대로 예측된 합을 만드는 조합을 찾는 코드

 

대략적인 구조는 다음과 같다.

순서대로 숫자를 하나씩 더하며 예측된 합 “pre_sum”보다 적은 지 확인한다. 그런데 숫자 개수가 6개가 될 때까지 예측된 합이 안 만들어질 수 있기 때문에 이 부분을 방지하기 위해 예측 합보다 적은데 숫자 개수가 6개 이면 마지막 더한 값은 제외하고 다음번 숫자를 고려하도록 한다.

순서대로 더해진 합이 예측된 합보다 커지면 역시 마지막 더한 숫자는 빼고 다음 번 숫자를 고려한다.

끝으로 숫자의 합과 예측된 합이 같아지면 끝이 난다.

 

이 과정을 거쳐 나온 결과는 다음과 같다.

Lotto 예측 결과
결과

앞에서도 얘기했지만 소프트웨어나 컴퓨터 전공자가 아니고 직장에서도 소프트웨어를 직접적으로 다루는 일을 하지 않는 사람으로서 위의 코드를 짜는데도 꼬박 반나절이 걸렸던 것 같다.

List 타입의 데이터가 위의 코드 중 ‘+’ 연산을 할 때에 오류가 생겨서 tuple로 바꿨는데 솔직히 아직도 왜 안되는지 이유는 모른다.

확실히 기본기가 없다 보니 데이터 타입을 활용하는 데에 있어서 오류가 많이 생기고 이 부분을 고쳐가는 데에 있어 시간이 많이 걸렸다.

 

위의 6개 숫자 조합을 찾는 코드도 if문에 또 if문을 쓰고 효율적이지 못한 구성일 것이라 생각은 드는데 현재의 실력으로는 이 부분을 최적할 수 없다.

(혹시 팁을 주실 분이 있으시면 댓글 부탁드립니다.)

 

마지막으로 Lotto 번호가 적게 나온 순서를 바탕으로 번호 조합을 찾는 것은 Lotto 번호 데이터 정렬을 적게 나온 순서대로 정렬해서 마지막에 있는 6개 번호 추출 코드를 수행하면 된다.

적게 나온 순서대로의 정렬은 앞의 데이터 타입을 tuple로 바꿔주는 코드 부분에서 “reversed”를 추가하여 “for i in reversed(range(45))” 로 수정 후 실행하면 된다.

 

 

1부와 2부에 걸쳐 Lotto 번호를 추출하는 프로그램을 만들고 이에 대한 설명을 하였다.

 

다시 얘기하지만, Lotto는 랜덤 시스템이고 예측이 불가하다.

여기서 얘기한 Machine Learning과 번호를 추출하는 알고리즘은 Python 공부를 위해 해 본 것이며 Lotto 1등 당첨번호를 맞추는 것과는 확률적으로 거리가 아주 멀어 관련이 없다고도 볼 수 있음을 다시 말해둔다.

 

 

<내용 수정 - 2020.12.27>

위의 언급한 내용 중 번호 6개를 추출하는 로직에 오류가 있음을 확인하였다.

현재 제시된 로직으로는 예측된 합 중에서 6개 번호를 추출할 때에 중복된 번호가 추출되는 경우가 발생한다.

이를 바로 잡기위해 수정 중에 있다.

그때 까지는 해당 내용에 필터를 해두었으니 참고하기 바란다.

 

 

<업데이트 – 2021.01.03>

이전에 Machine Learning을 이용하여 예측된 합을 만족하는 6개의 숫자를 가장 많이 나온 숫자 순으로 추출하는 프로그램에 오류를 확인했었다.

오류는 동일한 숫자가 2번 이상 추출되는 경우이다.

(이 오류를 수정하면서 내가 얼마나 프로그램을 못 다루는지 여실히 느꼈다._)

 

가장 많이 나온 숫자 순으로 하나씩 숫자를 찾아가면서 정해진 합을 만족하는 6개의 숫자를 중복없이 추출하는 것이 개인적으로는 쉽지 않은 도전이었다.

앞에서 얘기한 중복이 되는 조합을 피해야 하고 6자리가 채워지지 않았는데 총 합을 만족하는 경우가 생길 때에도 그 숫자 조합이 다시 발생하지 않도록 처리해야 한다.

 

결국은 처음 20라인 정도였던 코딩은 120라인 이상으로 늘어났고 한번에 처리하지 못하여 단계적으로 만들었다.

전체 코드는 올리지 않았으나 다음과 같은 로직으로 수정하게 되었다.

Lotto 번호 추출 로직

 

1차에서 문제없이 6개 숫자가 추출 될 수 있으나,(이 경우 때문에 처음 글을 쓸 때 문제가 없는 것으로 착각했었다.) 어떤 합을 만족하려다 보면 중복 숫자가 발생을 하여 이 중복 조합이 발생치 않도록 해준다. 그러면서 숫자 6개가 채워지지 않으면서 합이 이루어지는 경우의 조합도 재발되지 않도록 처리해 준다.

 

프로그램 전공이 아니다 보니, 효율적인 구조를 갖지 못하고 문제 해결을 위한 과정들이 나열되어 있는 비효율적인 구조가 된 것 같다.

하지만 원하는 목적인 순서가 높은 숫자부터 차례로 찾아가면서 정해진 합을 만족하는 6개의 숫자를 추출할 수 있었다.

 

추가적으로 문제가 확인되면 계속 보완해갈 계획이다.

 

 

<업데이트 – 2021.05.01>

 

이 프로그램을 만들고 프로그램을 통해 얻은 숫자로 로또를 구매했으며 현재까지의 결과를 정리해 보면 다음과 같다.

 

먼저 1월 9일부터 5,000원씩 구매하여 4월말까지 총 15번의 로또 구매가 있었고(중간에 구매하지 못한 주도 있었음) 결과는 아래의 표와 같이 5등 당첨만 5번이 있었다.

실제 Lotto 적용 결과
(결과)

5,000원씩 구매하면서 5등 당첨이라도 이정도 된거 보면 나름 괜찮은 것 같기도 하고 워낙 데이터가 적어서 그냥 운이 좋았을 수도 있겠다는 생각도 든다.

프로그램이 예측한 합과 그 주의 로또 당첨번호 총합이 동일했었는지는 데이터를 모으고 비교하지 않아서 잘 모르겠다.

 

다만, 앞에서 얘기한 내용과는 좀 다르게 가장 많이 나온 숫자 순이나 가장 적게 나온 숫자 순에서 합을 만족하는 숫자를 뽑다가 언젠가부터는 가장 많이 나온 숫자 순서에서 무작위로 순서로 섞은 다음 프로그램이 예측한 합을 만족하는 숫자 조합을 뽑아 적용하였다.

이렇게 할거면 처음부터 랜덤으로 6개 숫자를 뽑는거랑 크게 다를거 없다고 할 수있으나, 그래도 머신러닝으로 다음의 로또 번호 총 합을 예측하고 이를 만족하는 숫자를 뽑는 것이니 단순하게 랜덤으로 숫자를 뽑는 것 보다는 좀더 진보한 방식이라고 나름 생각한다.  

반응형

댓글