본문 바로가기
Python/Python 실전

[로또 분석] 이전 회차 번호 출현 비율? :: 마이자몽

by 🌻♚ 2019. 1. 20.

로또 이전 회차 번호 출현

로또 당첨번호 번호가 이전 회차 당첨번호와 연관이 있을까?
이전회차 번호들이 해당 회차에 다시 얼마나 출현하는지 확인 해보고싶어서 파이썬을 이용해서 통계를 내보았다.

해당 글은 이전에 작성한 로또 분석글들과 코드를 같이 사용한다.
사전에 몽고디비에 로또 정보를 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명 배출! 한국 로또 역사상 최대 성과! 번호가 인생을 바꿉니다. 




아래 배너를 통해 확인하세요!


로또리치 수동 1등 107명 배출! 한국 로또 역사상 최대 성과! 번호가 인생을 바꿉니다.


댓글0