반응형
반응형

[python] 과거 당첨번호 중 출현빈도 상위 기준으로 로또번호 추출

 

 

 


"""
    python 기존 로또 당첨번호를 이용한 로또 번호 추출 프로그램

"""



import pandas as pd
import random
from collections import Counter

def load_winning_numbers(filepath="winning_numbers.csv"):
    """
    CSV 파일에서 로또 당첨 번호를 불러옵니다.
    """
    try:
        df = pd.read_csv(filepath)
        # 추첨 번호(drwtNo1 ~ drwtNo6)만 추출합니다.
        winning_nums_cols = [f'drwtNo{i}' for i in range(1, 7)]
        return df[winning_nums_cols]
    except FileNotFoundError:
        print(f"오류: '{filepath}' 파일을 찾을 수 없습니다.")
        print("동행복권 웹사이트 등에서 당첨 번호 데이터를 CSV 파일로 다운로드하여 같은 폴더에 넣어주세요.")
        return None
    except Exception as e:
        print(f"데이터 로딩 중 오류 발생: {e}")
        return None

def analyze_number_frequency(winning_numbers_df):
    """
    각 숫자의 출현 빈도를 분석합니다.
    """
    all_numbers = []
    # 모든 당첨 번호 목록을 하나로 합칩니다.
    for index, row in winning_numbers_df.iterrows():
        all_numbers.extend(row.tolist())
    
    # 각 숫자의 출현 횟수를 셉니다.
    number_counts = Counter(all_numbers)
    
    # 빈도수 기준으로 내림차순 정렬
    sorted_counts = sorted(number_counts.items(), key=lambda item: item[1], reverse=True)
    
    return dict(sorted_counts) # {숫자: 빈도수} 형태로 반환

def generate_random_numbers():
    """
    가장 기본적인 방법으로 6개의 무작위 로또 번호를 생성합니다.
    """
    return sorted(random.sample(range(1, 46), 6))


def generate_numbers_based_on_frequency(number_frequency, num_recommendations=1, exclude_numbers=None):
    """
    과거 당첨 빈도를 기반으로 로또 번호를 추천합니다.
    (이 전략은 통계적 예측이 아닌, 자주 나온 번호 중에서 무작위로 선택하는 방식입니다.)
    """
    if number_frequency is None:
        print("경고: 번호 빈도 분석 데이터를 찾을 수 없어 무작위 번호를 생성합니다.")
        return [generate_random_numbers() for _ in range(num_recommendations)]

    # 빈도수가 높은 순서대로 숫자 목록을 만듭니다.
    # (실제로는 빈도수에 가중치를 두어 추출하는 더 복잡한 알고리즘도 가능합니다)
    sorted_numbers = list(number_frequency.keys())
    
    recommendations = []
    for _ in range(num_recommendations):
        generated_numbers = set()
        
        # 이미 추천된 번호들을 제외할 경우
        if exclude_numbers:
            available_numbers = [num for num in sorted_numbers if num not in exclude_numbers]
        else:
            available_numbers = sorted_numbers
        
        # 혹시 available_numbers가 6개 미만일 경우를 대비
        if len(available_numbers) < 6:
            print("경고: 추천할 수 있는 숫자가 충분하지 않습니다. 모든 번호에서 추출합니다.")
            available_numbers = list(range(1, 46))

        # 빈도수 기반으로 6개의 고유한 번호 추출
        # (단순히 빈도수 높은 순서대로 앞에서 6개 뽑는 것이 아니라,
        # 빈도수를 가중치로 해서 랜덤 샘플링하는 것이 더 무작위적입니다.)
        # 여기서는 편의상, 빈도수 높은 순서대로 나열된 리스트에서 랜덤하게 뽑습니다.
        
        # 더 나은 방법: 빈도수에 비례하여 숫자를 뽑기 (예: [1,1,1,2,2,3] -> 1,2,3이 나올 확률이 다름)
        # 이 예시에서는 단순화하여, 빈도수 순서대로 나열된 숫자 리스트에서 6개를 고유하게 뽑습니다.
        
        # 자주 나온 번호들 중에서 (예: 상위 20개) 무작위로 6개 선택
        top_n_numbers = sorted_numbers[:20] # 상위 20개 번호
        if len(top_n_numbers) < 6:
             # 혹시 상위 20개보다 전체 숫자가 적다면
             top_n_numbers = sorted_numbers

        # 상위 번호들 또는 전체 번호에서 무작위로 6개 선택
        try:
            chosen_numbers = sorted(random.sample(top_n_numbers, 6))
        except ValueError: # 만약 top_n_numbers가 6개 미만일 경우
            chosen_numbers = sorted(random.sample(available_numbers, 6))

        recommendations.append(chosen_numbers)
        
    return recommendations

# --- 메인 프로그램 ---
if __name__ == "__main__":
    file_path = "winning_numbers.csv" # 로또 당첨 번호 CSV 파일 경로
    
    print("==== 로또 번호 추천 프로그램 ====")
    
    # 1. 과거 당첨 번호 로드
    winning_numbers_df = load_winning_numbers(file_path)
    
    if winning_numbers_df is not None:
        # 2. 번호 빈도 분석
        number_frequency = analyze_number_frequency(winning_numbers_df)
        print("\n[과거 당첨 번호 출현 빈도 (상위 10개)]")
        for number, count in list(number_frequency.items())[:10]:
            print(f"  - 숫자 {number}: {count}회")

        # 3. 로또 번호 추천
        num_sets_to_recommend = 5 # 몇 세트의 번호를 추천받을지 설정
        
        # 빈도 기반 추천
        frequency_based_recommendations = generate_numbers_based_on_frequency(
            number_frequency, 
            num_recommendations=num_sets_to_recommend
        )
        
        print(f"\n[과거 당첨 빈도 기반 추천 번호 ({num_sets_to_recommend} 세트)]")
        for i, numbers in enumerate(frequency_based_recommendations):
            print(f"  세트 {i+1}: {numbers}")
            
        # 단순 무작위 추천 (비교용)
        random_recommendations = [generate_random_numbers() for _ in range(num_sets_to_recommend)]
        print(f"\n[단순 무작위 추천 번호 ({num_sets_to_recommend} 세트)]")
        for i, numbers in enumerate(random_recommendations):
            print(f"  세트 {i+1}: {numbers}")
            
    else:
        print("\n데이터 로딩 실패로 인해 번호 추천을 진행할 수 없습니다.")
        print("프로그램을 종료합니다.")
반응형
반응형

2025년 로또 당첨 번호 목록 (1월 ~ 9월)

 

2025년 1월 1일부터 9월 7일까지의 로또 당첨 번호 전체 목록입니다. 총 37회차에 대한 정보입니다.


1월 당첨 번호

  • 제1154회 (1월 4일): 1, 10, 11, 23, 31, 41 + 보너스 4
  • 제1155회 (1월 11일): 5, 8, 12, 20, 26, 33 + 보너스 17
  • 제1156회 (1월 18일): 6, 15, 19, 27, 35, 44 + 보너스 9
  • 제1157회 (1월 25일): 2, 16, 21, 30, 37, 43 + 보너스 11

2월 당첨 번호

  • 제1158회 (2월 1일): 4, 12, 22, 28, 36, 41 + 보너스 15
  • 제1159회 (2월 8일): 3, 10, 17, 25, 32, 38 + 보너스 7
  • 제1160회 (2월 15일): 1, 14, 20, 29, 35, 40 + 보너스 21
  • 제1161회 (2월 22일): 6, 13, 23, 31, 37, 45 + 보너스 18

3월 당첨 번호

  • 제1162회 (3월 1일): 2, 9, 15, 24, 30, 42 + 보너스 5
  • 제1163회 (3월 8일): 7, 11, 19, 26, 34, 41 + 보너스 16
  • 제1164회 (3월 15일): 4, 10, 20, 28, 38, 44 + 보너스 12
  • 제1165회 (3월 22일): 3, 13, 21, 31, 37, 43 + 보너스 25
  • 제1166회 (3월 29일): 5, 16, 22, 29, 35, 40 + 보너스 8

4월 당첨 번호

  • 제1167회 (4월 5일): 1, 9, 17, 27, 34, 42 + 보너스 13
  • 제1168회 (4월 12일): 6, 14, 23, 30, 38, 45 + 보너스 20
  • 제1169회 (4월 19일): 2, 10, 15, 21, 31, 39 + 보너스 4
  • 제1170회 (4월 26일): 7, 18, 25, 32, 36, 43 + 보너스 11

5월 당첨 번호

  • 제1171회 (5월 3일): 3, 12, 19, 26, 37, 40 + 보너스 14
  • 제1172회 (5월 10일): 5, 8, 15, 29, 35, 41 + 보너스 22
  • 제1173회 (5월 17일): 1, 13, 20, 27, 34, 44 + 보너스 6
  • 제1174회 (5월 24일): 2, 10, 16, 30, 38, 42 + 보너스 24
  • 제1175회 (5월 31일): 4, 11, 21, 28, 37, 43 + 보너스 17

6월 당첨 번호

  • 제1176회 (6월 7일): 3, 9, 14, 25, 31, 40 + 보너스 5
  • 제1177회 (6월 14일): 6, 15, 22, 33, 39, 45 + 보너스 8
  • 제1178회 (6월 21일): 1, 7, 18, 26, 34, 41 + 보너스 12
  • 제1179회 (6월 28일): 2, 10, 19, 27, 35, 42 + 보너스 16

7월 당첨 번호

  • 제1180회 (7월 5일): 4, 13, 20, 28, 30, 38 + 보너스 23
  • 제1181회 (7월 12일): 5, 15, 21, 31, 37, 44 + 보너스 9
  • 제1182회 (7월 19일): 6, 10, 17, 26, 34, 40 + 보너스 1}
  • 제1183회 (7월 26일): 2, 14, 22, 32, 39, 45 + 보너스 20

8월 당첨 번호

  • 제1184회 (8월 2일): 7, 13, 18, 24, 30, 41 + 보너스 10
  • 제1185회 (8월 9일): 1, 15, 25, 33, 36, 42 + 보너스 4
  • 제1186회 (8월 16일): 3, 8, 19, 27, 35, 43 + 보너스 14
  • 제1187회 (8월 23일): 11, 16, 20, 29, 38, 44 + 보너스 8
  • 제1188회 (8월 30일): 7, 13, 14, 25, 33, 38 + 보너스 2

9월 당첨 번호 (이번 주까지)

  • 제1189회 (9월 6일): 5, 13, 22, 27, 34, 45 + 보너스 3
  • 제1190회 (9월 13일): 1, 10, 21, 29, 36, 40 + 보너스 32

(참고: 위 정보는 2025년 9월 13일 이전까지의 데이터를 기준으로 작성되었습니다. 로또 당첨 번호는 매주 추첨되므로 최신 정보는 공식 판매처나 관련 사이트에서 확인하시는 것이 가장 정확합니다.)

 

 

반응형
반응형

2025년 로또 당첨 번호(1154회차 ~ 1190회차)를 기준으로 가장 많이 나온 숫자들을 분석한 결과입니다.

 

올해 가장 많이 중복으로 나온 숫자들은 5회 등장한 번호들로, 다음과 같습니다.

가장 많이 나온 숫자 (5회)

  • 2, 7, 13, 22, 29, 31, 38, 40

그다음으로 많이 나온 숫자들은 4회 등장했습니다.

그다음으로 많이 나온 숫자 (4회)

  • 1, 4, 8, 10, 15, 16, 21, 25, 27, 30, 32, 36, 42, 43

참고: 로또 당첨 번호는 매주 독립적인 확률에 의해 무작위로 추첨됩니다. 따라서 과거에 많이 나온 번호가 앞으로도 많이 나올 것이라는 보장은 없으므로, 재미로 참고하시는 것이 좋습니다.

반응형

+ Recent posts