1. 프로젝트 소개

LottoLab은 역대 로또 6/45 당첨 번호를 수집하고, 통계 분석과 다양한 예측 알고리즘을 활용해 다음 회차의 당첨 번호를 추천하는 개인 프로젝트다

물론 로또 추첨은 기본적으로 각 회차가 독립적인 확률 사건이다. 정상적인 추첨 환경에서는 이전 회차의 당첨 번호가 다음 회차의 당첨 확률에 영향을 미치지 않는다. 그저 재미로 출발한 질문에 재미로 만드는 프로젝트이다

단순히 무작위로 번호 6개를 생성하는 것을 넘어, 과거 당첨 결과에서 나타나는 통계적 특징을 분석하고 이를 바탕으로 여러 예측 모델을 구현하는 것을 목표로 한다

따라서 과거 데이터를 많이 분석하거나 복잡한 알고리즘을 사용한다고 해서 당첨 확률이 높아진다고 보장할 수는 없다

이 프로젝트는 이러한 한계를 전제로, 과거 데이터만으로 로또 번호를 얼마나 그럴듯하게 예측할 수 있을까? 라는 질문에서 출발한다

나아가 실제 당첨 결과가 통계적으로 얼마나 무작위에 가까운지 확인한다


2. 개발 동기

평소 취미 삼아 매주 로또를 구매하고 있다

당첨 번호를 고를 때마다 어떤 번호를 선택할지 고민하게 되는데, 문득 단순히 무작위로 번호를 고르는 대신 과거 당첨 결과를 분석해서 다음 회차의 번호를 추천하는 프로그램을 만들어 보면 어떨까 하는 생각이 들었다

물론 로또는 독립 시행이기 때문에 이전 당첨 결과를 분석한다고 다음 회차의 당첨 확률이 높아지는 것은 아니다. 특정 번호가 오랫동안 나오지 않았다고 해서 다음 회차에 등장할 확률이 높아지는 것도 아니다

그럼에도 수십 년 동안 쌓인 당첨 번호 데이터를 분석하고, 나름의 근거를 가진 알고리즘으로 번호를 추천한다면 단순히 번호를 무작위로 선택하는 것보다 재미있을 것 같았다

처음에는 단순한 번호 추천 프로그램을 생각했지만, 구체적인 구현 방법을 고민하면서 프로젝트의 범위가 조금씩 확장되었다

과거 당첨 번호를 수집하고, 번호별 출현 빈도와 통계적 특징을 분석하며, 여러 예측 알고리즘을 만들어 실제 당첨 결과와 비교해 보는 것이다

여기에 머신러닝 모델까지 적용해 보면 무작위로 번호를 선택하는 방식과 비교해 어떤 차이가 나타날지도 궁금해졌다

결국 단순히 로또 번호를 추천하는 프로그램에서 출발해, 데이터 수집부터 통계 분석, 예측 모델 개발, 성능 검증까지 직접 구현하는 프로젝트로 발전하게 되었다

무엇보다 이 프로젝트는 높은 당첨 확률을 보장하는 프로그램을 만들기 위한 것이 아니라, 평소 관심 있던 주제를 활용해 Python과 데이터 분석, 통계학, 머신러닝을 AI와 함께 공부하고 적용해 보는 데 의미가 있다


3. 개발 환경 및 사용 기술

LottoLab은 Python을 중심으로 개발하며, 데이터 수집과 저장, 통계 분석, 예측 모델 구현, 결과 시각화까지 단계적으로 기능을 확장할 계획이다

구분기술 및 도구용도
개발 언어Python데이터 처리 및 알고리즘 구현
개발 환경Visual Studio Code코드 작성 및 디버깅
버전 관리Git, GitHub소스코드 관리 및 개발 기록
데이터 수집Requests로또 당첨 결과 API 요청
데이터베이스SQLite역대 당첨 번호 저장 및 관리
데이터 분석Pandas, NumPy데이터 가공 및 수치 계산
통계 분석SciPy통계적 검정 및 확률 분포 분석
머신러닝scikit-learn예측 모델 구현 및 평가
데이터 시각화Matplotlib, Plotly분석 결과와 예측 성능 시각화
사용자 인터페이스Streamlit분석 결과 조회 및 번호 추천 기능 제공

현재는 Python, Requests, SQLite를 이용한 데이터 수집 및 저장 기능을 중심으로 개발하고 있다. 나머지 기술은 필요한 기능을 구현하는 단계에서 도입할 예정이다

3.1 데이터 출처

로또 당첨 결과는 동행복권 공식 웹사이트에서 제공하는 데이터를 사용한다. 웹사이트 내부에서 사용되는 JSON 응답을 활용해 회차별 추첨일, 당첨 번호 6개, 보너스 번호를 수집한다

현재 확인한 API는 다음과 같다

  • https://www.dhlottery.co.kr/lt645/selectPstLt645Info.do

이 API에서는 특정 회차 조회뿐 아니라 전체 회차 조회도 가능함을 확인했다.

다만 개발자를 위해 공식적으로 문서화된 공개 API는 아니므로, 향후 웹사이트 변경에 따라 요청 방식이나 응답 구조가 달라질 수 있다


4. 프로젝트 주요 기능

LottoLab은 크게 데이터 수비, 통계 분석, 무작위성 검정, 번호 예측, 성능 평가, 번호 추천 및 시각화 기능으로 구성할 계획이다

4.1 로또 당첨 번호 수집 및 관리

모든 분석의 기반이 되는 역대 로또 당첨 번호를 수집하고 관리하는 기능이다. 동행복권 웹사이트에서 당첨 결과를 가져와 SQLite 데이터베이스에 저장한다

주요 기능

  • 역대 로또 6/45 당첨 번호 일괄 수집
  • 최신 회차 자동 확인 및 데이터 갱신
  • 회차별 추첨일, 당첨 번호, 보너스 번호 저장
  • 당첨 번호의 범위 및 중복 검증
  • 데이터베이스의 중복 및 누락 회자 확인
  • 누락된 회차의 개별 재수집

수집한 데이터는 이후 모든 통계 분석과 예측 모델의 공통 데이터셋으로 활용한다

4.2 당첨 번호 통계 분석

역대 당첨 결과를 이용해 번호별 출현 빈도와 다양한 통계적 특징을 분석한다

주요 기능

  • 1~45번 번호별 출현 횟수 및 비율 분석
  • 특정 기간 또는 최근 N회 기준 출현 빈도 분석
  • 홀수와 짝수의 구성 비율 분석
  • 당첨 번호 합계 및 분포 분석
  • 연속 번호 출현 패턴 분석
  • 번호 구간별 출현 분포 분석
  • 번호 조합 및 동시 출현 빈도 분석

이를 통해 실제 당첨 결과에서 어떤 특징이 관찰되는지 확인하고, 분석 결과를 그래프와 표로 시각화할 예정이다. 다만 과거에 자주 등장한 번호가 앞으로도 자주 등장한다는 의미는 아니며, 통계적 특징과 미래 예측 가능성은 구분해서 해석한다

4.3 무작위성 및 통계적 편향 검정

로또 추첨이 공정하고 무작위로 이루어진다는 가정과 실제 당첨 결과가 얼마나 일치하는지 확인하는 기능이다

주요 기능

  • 번호별 출현 빈도의 균등성 검정
  • 기대 출현 횟수와 실제 출현 횟수 비교
  • 카이제곱 검정 등 통계적 가설 검정
  • 회차 간 출현 패턴 및 상관관계 분석
  • 시뮬레이션을 통한 실제 데이터와 무작위 데이터 비교

단순히 특정 번호가 많이 등장했다는 사실만으로 추첨에 편향이 있다고 판단하지 않고, 통계적 유의성과 표본 크기 등을 함께 고려할 계획이다

또한 여러 통계 검정을 반복할 때 우연히 유의한 결과가 나타날 수 있다는 점도 고려한다

4.4 로또 번호 예측 모델

수집한 데이터를 기반으로 다양한 번호 예측 알고리즘을 구현한다

주요 기능

  • 균등 무작위 번호 생성 모델
  • 과거 출현 빈도 기반 모델
  • 최근 회차에 가중치를 적용한 모델
  • 베이지안 확률 모델
  • 머신러닝 기반 예측 모델
  • 여러 모델의 결과를 결합하는 모델

각 모델은 과거 데이터에서 특정한 특징이나 규칙을 학습하고, 다음 회차에 대한 번호별 점수 또는 추천 조합을 생성하도록 생성하도록 설계할 예정이다

여기서 중요한 것은 복잡한 모델을 만드는 것 자체가 아니라, 그 모델이 단순한 무작위 선택보다 실제로 더 나은 결과를 보이는지 확인하는 것이다

4.5 예측 모델 성능 평가 및 백테스트

예측 모델이 실제로 얼마나 유효한지 검증하기 위한 기능이다

과거 데이터를 이용해 특정 회차 이전의 정보만으로 해당 회차의 당첨 번호를 예측하고, 실제 결과와 비교하는 백테스트를 진행한다

주요 기능

  • 과거 회차를 이용한 시간 순서 기반 백테스트
  • 예측 번호와 실제 당첨 번호의 일치 개수 측정
  • 모델별 평균 적중 개수 및 적중 분포 비교
  • 균등 무작위 모델과 예측 모델의 성능 비교
  • 학습 데이터와 평가 데이터 분리
  • 모델별 성능 변화 시각화

미래의 당첨 결과가 과거 예측 과정에 포함되는 데이터 누수(Data Leakage)를 방지하고, 가능한 한 실제 사용 환경과 동일한 조건에서 평가할 예정이다

4.6 로또 번호 추천 및 시각화

최종적으로 사용자가 여러 분석 모델의 결과를 확인하고, 원하는 방식으로 로또 번호를 추천받을 수 있는 인터페이스를 구현할 계획이다

주요 기능

  • 예측 모델별 추천 번호 생성
  • 번호별 추천 점수 및 분석 결과 표시
  • 추천 번호 조합의 통계적 특징 확인
  • 모델별 예측 성능 비교
  • 역대 당첨 번호 및 통계 그래프 조회
  • 추천 조합의 조건 설정

추가로 당첨 확률을 높이는 것과는 별개로, 사람들이 선호할 가능성이 높은 번호 조합을 피하는 방법도 연구할 예정이다

예를 들어 생일에 자주 사용되는 1~31번에 편중된 조합이나 단순한 숫자 패턴을 피하는 방식이다. 이는 1등에 당첨될 확률을 높이기 위한 것이 아니라, 당첨되었을 때 다른 당첨자와 상금을 나누게 될 가능성을 줄일 수 있는지 살펴보는 접근이다

다만 실제 구매자들의 번호 선택 데이터가 없다면 이러한 효과를 정확히 평가하기 어렵다는 한계가 있다


5. 개발 진행 방식

프로젝트는 각 기능을 단계적으로 구현하고 검증하는 방식으로 진행할 예정이다

우선 데이터 수집 및 저장 시스템을 구축한 다음, 수집한 데이터를 이용해 기초 통계 분석을 진행한다. 이후 무작위성 검정과 예측 모델을 구현하고, 백테스트를 통해 실제 성능을 평가한다

마지막으로 분석 결과와 번호 추천 기능을 사용할 수 있는 인터페이스를 개발할 계획이다

각 개발 단계에서는 구현한 기능뿐 아니라 해당 방법을 선택한 이유, 핵심 코드의 작동 원리, 실제 실행 결과 등을 정리해 블로그에 기록하고, 소스코드는 GitHub에 공개할 예정이다


6. 기대 효과 및 목표

LottoLab의 최종 목표는 로또 1등 당첨 번호를 정확하게 맞히는 알고리즘을 개발하는 것이 아니다. 로또 추첨이 독립적이고 공정하게 이루어진다면 어떤 번호 조합을 선택하더라도 1등에 당첨될 확률은 동일하다. 그럼에도 과거 데이터를 분석하고, 여러 예측 알고리즘을 구현하며, 실제 결과와 비교하는 과정에는 충분한 학습 가치가 있다고 생각한다

이 프로젝트를 통해 다음과 같은 경험을 쌓는 것이 목표다

  • Python을 이용한 실제 데이터 수집 및 처리
  • SQLite 기반 데이터베이스 설계 및 관리
  • 확률과 통계 개념의 실제 데이터 적용
  • 머신러닝 모델의 설계와 성능 평가
  • 데이터 시각화 및 사용자 인터페이스 개발
  • Git과 GitHub를 이용한 프로젝트 관리 및 개발 기록

무엇보다 단순히 그럴듯한 결과를 보여주는 프로그램이 아니라, 어떤 근거로 번호를 추천했고 그 결과가 실제로 얼마나 유효했는지 확인할 수 있는 프로그램을 만들고 싶다

과연 복잡한 예측 알고리즘이 단순한 무작위 번호 선택과 비교해 어떤 결과를 보여줄까?

그 궁금증을 직접 실험해 보는 것이 LottoLab의 출발점이다