로또 이전 회차 번호 출현
로또 당첨번호 번호가 이전 회차 당첨번호와 연관이 있을까?
이전회차 번호들이 해당 회차에 다시 얼마나 출현하는지 확인 해보고싶어서 파이썬을 이용해서 통계를 내보았다.
해당 글은 이전에 작성한 로또 분석글들과 코드를 같이 사용한다.
사전에 몽고디비에 로또 정보를 INSERT하고 SELECT를 진행하는 함수들이 작성 완료되어 있어야한다.
몽고디비 INSERT : http://myjamong.tistory.com/58
로또정보 SELECT : http://myjamong.tistory.com/60
코드 작성 중 누락된 부분은 이전 글에서 확인한다.
몽고디비 연결 & 필요한 데이터 SELECT
몽고DB 연결,
하나의 지정회차 로또 당첨 정보 그리고 지정회차 이전 N회 당첨정보를 읽어오는 함수를 사용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # 몽고디비 연결 및 데이터프레임으로 def connect_mongodb_data_to_frame(func, params): try: # db connection conn = MongoClient('localhost') db = conn.lotto_db collection = db.lotto df = func(collection, params) except errors.ConnectionFailure: print("Connection Err") finally: conn.close() return df # 지정회차 로또 당첨 정보 def get_episode(collection, params): episode = collection.find({'drwNo': params['episode']}) df = sort_and_get_nums(episode) return df # episode회차 이전 num회 당첨 정보 def get_assigned_before_episodes(collection, params): diff = params['episode'] - params['before_num'] if diff < 1: diff = 1 print('음수가 발생하였습니다. 1회부터 시작입니다.') assignend_episodes = collection.find({'drwNo': {'$gte': diff, '$lt': params['episode']}}) df = sort_and_get_nums(assignend_episodes) return df | cs |
당첨번호 가공 단계
읽어온 당첨번호 회차에 대해,
번호가 몇번 출현했는지 빈도수로 테이블과 막대그래프로 표시하기 위해 사용되었던 함수이다.
리스트로 된 정보를 반환하고 보기 쉽게 Dataframe에 넣어 다시 반환하는 함수를 사용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # 로또 빈도수 별 당첨번호, 빈도수, 빈도별 번호 Count def get_frequency_lists(df): # 로또 번호만 확인 num_with_no_bonus = df.loc[:, 'drwtNo1': 'drwtNo6'] # 1~6번호를 하나의 Series로 full_value = Series() for idx in num_with_no_bonus: full_value = full_value.append(num_with_no_bonus[idx]) # 1~6번호의 count 값이 들어 있는 Series full_value_count = full_value.value_counts() # 각 빈도수 별 번호 집합(Number) number_list = [] # 빈도수 List freq_list = [] # 빈도별 번호 갯수List(표 Y값 Array) freq_number_count_list = [] for value in full_value_count.unique(): temp_df = full_value_count[full_value_count == value] temp_df.index.values.sort() number_list.append(temp_df.index.values) freq_list.append(value) freq_number_count_list.append(temp_df.count()) return number_list, freq_list, freq_number_count_list def get_frequency_lists_to_df(df): number_list, freq_list, freq_number_count_list = get_frequency_lists(df) data = { 'frequency': freq_list, 'numbers': number_list, 'count': freq_number_count_list } freq_df = DataFrame(data) print(freq_df) return freq_df | cs |
예측회차 번호 빈도수 확인
몽고DB에서 읽어온 데이터에서 예측회차 번호가 빈도수가 얼마나 나온 번호인지 확인하는 작업이다.
이전 1개 회차 뿐만 아니라 여러개의 회차에 대해서 비교가 가능하다.
EX)
당첨번호가 1, 2, 3, 4, 5, 6 이다.
각 번호에 대해 이전 30회차 데이터에서
1 : 3번
2 : 4번
3 : 0번
4 : 2번
5 : 3번
6 : 3번
이라면
당첨번호 [1, 2, 4, 5, 6]
2번 : 1
3번 : 3
4번 : 1
이런식으로 데이터를 가공해서 반환한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # df 데이터 에서 빈도수 별 숫자의 Count에서 win_episode의 숫자들이 몇 빈도수에 해당하는지 count and 번호 return def get_win_numbers_in_frequency_lists(df, win_episode): # 확인할 회차 데이터 불러오기 win_lotto_data = connect_mongodb_data_to_frame(get_episode, {'episode': win_episode}) win_lotto_data_no_bonus = win_lotto_data.loc[:, 'drwtNo1':'drwtNo6'].iloc[0] freq_df = get_frequency_lists_to_df(df) # 빈도수가 자체로 들어가 있는 리스트 freq_raw_list = [] # 빈도수 포함 당첨 번호 win_num_in_freq_list = [] # 당첨 번호가 빈도수 몇에 위치하는지 확인 for win_num in win_lotto_data_no_bonus: for row_index in range(len(freq_df.index)): if win_num in freq_df['numbers'].iloc[row_index]: freq_raw_list.append(freq_df.iloc[row_index]['frequency']) win_num_in_freq_list.append(win_num) continue # 빈도수 별 Count freq_list_count = Series(freq_raw_list).value_counts() freq_list_count.index.name = 'frequency' freq_list_count.name = 'count' return freq_list_count, win_num_in_freq_list | cs |
이전 1개회차와 비교 및 출력
따로 그래프나 테이블로 시각화하지 않고 콘솔에 바로 수치만 확인할 수 있게끔 작업을 했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # start_episode 에서 end_episode 까지 EX) 1~4 -> 1,2 | 2,3 | 3,4 이렇게 3경우를 확인 def analysis_check_numbers_with_before_episode(start_episode, end_episode): count = 0 count1 = 0 count2 = 0 count3 = 0 count4 = 0 count5 = 0 count6 = 0 count0 = 0 for episode in range(start_episode + 1, end_episode + 1): df = connect_mongodb_data_to_frame( get_assigned_before_episodes, { 'episode': episode, 'before_num': 1 } ) freq_list_count, win_num_in_freq_list = get_win_numbers_in_frequency_lists(df, episode) freq_size = len(win_num_in_freq_list) if freq_size > 0: count += 1 if freq_size == 1: count1 += 1 elif freq_size == 2: count2 += 1 elif freq_size == 3: count3 += 1 elif freq_size == 4: count4 += 1 elif freq_size == 5: count5 += 1 elif freq_size == 6: count6 += 1 else: count0 += 1 print("count : ", count) print("count1 : ", count1) print("count2 : ", count2) print("count3 : ", count3) print("count4 : ", count4) print("count5 : ", count5) print("count6 : ", count6) print("count0 : ", count0, '\n') print(start_episode, '회 부터 ', end_episode, '회 까지 이전회차 출현 비율') print('이전회차 번호 1개 출현 비율 : %.2f' % (count1 / (end_episode - start_episode) * 100.0) + '%') print('이전회차 번호 2개 출현 비율 : %.2f' % (count2 / (end_episode - start_episode) * 100.0) + '%') print('이전회차 번호 3개 출현 비율 : %.2f' % (count3 / (end_episode - start_episode) * 100.0) + '%') print('이전회차 번호 4개 출현 비율 : %.2f' % (count4 / (end_episode - start_episode) * 100.0) + '%') print('이전회차 번호 5개 출현 비율 : %.2f' % (count5 / (end_episode - start_episode) * 100.0) + '%') print('이전회차 번호 6개 출현 비율 : %.2f' % (count6 / (end_episode - start_episode) * 100.0) + '%') print('이전회차 번호 0개 출현 비율 : %.2f' % (count0 / (end_episode - start_episode) * 100.0) + '%') print('이전회차 번호 출현 비율 : %.2f' % (count / (end_episode - start_episode) * 100.0) + '%') | cs |
결과
생각보다 높은 수치의 결과나 나왔다.
1회 부터 842회까지
이전회차의 당첨번호가 한개라도 해당 회차에 출현한 비율은 62.19%다.
최근 추세를 확인하기 위해 최근 50회, 30회, 20회 표본 데이터를 계속 줄여나갔을때 오히려 출현빈도가 증가되고 있다.
심지어 최근 5회는 100확률로 이전 회차 번호가 나왔다.
로또리치 번호 추천
로또리치 수동 1등 107명 배출! 한국 로또 역사상 최대 성과! 번호가 인생을 바꿉니다.
댓글0