僕の世界観を変えてみる

文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。仲良くやろうよ。

【Python】ロト6に出やすい数字があるのかシミュレーションしてみた

f:id:htmllifehack:20190512002810p:plain
title

なにか儲け話ってないかなー

結局ボートレースの機械学習は失敗に終わったしなにか別のことをしたいなー

と話していたときに職場の人が提案してきたのは

ロト6

曰くロト6には法則があって4つの数字までは合わせることができるらしい(笑)

そんなわけないやろ(笑)とその時は一蹴してみたけどなるほど。

実に面白い

勉強がてらロト6の確率を見ていこうじゃないか!

※これからお話しする内容をもとにに損害が発生した場合も当ブログでは一切責任を負いません。 ご了承の上先にお進みください。

ロト6をさらっと説明

ロト6は1~43の数字から6つ選択し、ロト専用の抽選機により選ばれた数字といくつ一致しているかで当選金額がきまる宝くじです。

抽選機は7つの数字を抽出し、うち6つを本数字、1つをボーナス数字と2種類にわけられます。

1等は6つの数字すべてが一致、3等は6つのうち4つが一致、4等が6つのうち3つが一致する必要があり、ここでの数字は本数字になります。

2等の場合のみ6つのうち5つの数字が一致し、さらにボーナス数字も一致する必要があります。

抽せんは、ロト専用抽せん機「電動攪拌式遠心力型抽せん機(愛称:夢ロトくん)」を使って行われます。 「夢ロトくん」によって抽せんされた6個の「本数字」と1個の「ボーナス数字」が、自分が選んだ数字といくつ一致しているかで、1等から5等までの当せんが決まります。

ロト6(LOTO6)ってどんな宝くじ?|宝くじ商品のご案内【宝くじ公式サイト】

抽選の様子の動画も配信されています。 数字選択式宝くじ抽せん会 ライブ中継【宝くじ公式サイト】

当選金額は1等2億円、2等約1,000万円、3等30万円、4等6,800円、5等1,000円(原則固定)です。

当せん金額(理論値)は、1等2億円、2等約1,000万円、3等30万円、4等6,800円、5等1,000円(原則固定)です。

ただし当せん金額は、発売額と当せん口数により毎回変動します。

ロト6は、1口200円で購入できます。

ロト6(LOTO6)ってどんな宝くじ?|宝くじ商品のご案内【宝くじ公式サイト】

当選確率

1等は1~43の数字の中から6つ選び、そのすべてが抽選された数字と一致する必要があります。

なので \normalsize {} _{43} C_6 = \frac{6!} {6!(43-6)!} = \frac{1}{6096454} となります。

2等は選んだ6つの数字のうち5つが一致し、残りの1つはボーナス数字と一致する必要があります。

6のなかから5つ一致していればいいので  \normalsize {}_6 C_5 =6、ボーナス数字は1通りしかないので  \normalsize {}\ _1 C_1 =1

乗法定理により \normalsize \frac{{}_6 C_5 \times {}_1 C_1}{6096454} = \frac{6}{6096454}となります。

3等は6つの数字のうち5つ一致している必要があるので  \normalsize {}_6 C_5 = 15、残りの1つは37個のはずれからえらばれるので \normalsize {} _{37} C_1 = 37

 \normalsize \frac{{}_6 C_5 \times {}_{37} C_1}{6096454} = \frac{222}{6096454}です。

4等は選んだ6つの数字のうち4つ一致している必要があるので \normalsize {} _6 C_4 = 15、残りの2つは37個のはずれから選ばれるので \normalsize {}_{37} C_2 =666

 \normalsize \frac{{}_6 C_4 \times {}_{37} C_2}{6096454} = \frac{9990}{6096454}です。

5等は6つの数字のうち3つ一致している必要があるので \normalsize {}_6 C_3 = 30、残りの3つははずれから選ばれるので \normalsize {}_{37} C_3 = 7770

 \normalsize \frac{{}_6 C_3 \times {}_{37} C_3}{6096454} =\frac{155400}{6096454}です。

pythonで当選確率の計算

pythonで組み合わせを計算するにはscipycombメソッドを使います。

組み合わせは英語でcombinationです。

from scipy import special

one = special.comb(43,6,exact=True)
print(one)
>>6096454

階乗はmathfactorialメソッドを使います。

import math

print(math.factorial(6))
>>720

math.factorialを使って組み合わせを計算する関数を作ってみます。

import math

def comb(n, r):
    return math.factorial(n) // (math.factorial(r)*(math.factorial(n-r)))
domb(43,6)
>>6096454

ロト6に出やすい数字出にくい数字はあるか

宝くじと比べたらまだマシですが、確率は結構低いです。

ただ当たれば最高6億もらえるので当てたいって人は多いですよね。

職場の人もきっとその類です。

とりあえず過去の当選番号をグラフにしてみましょう。

1377回までの結果を拾ってきました。

import matplotlib.pyplot as plt
import numpy as np
from collections import Counter

#numは過去の当選番号をリストにしたもの
#Counterメソッドを使い1~43の数字がいくつでたのか数える
cnt = Counter(num)

%matplotlib inline

plt.figure(figsize=(20,7))
x = [x for x in cnt.values()]
y = [y for y in cnt.keys()]


plt.grid(True)
plt.xticks(np.arange(1,44))
plt.yticks(np.arange(0,250,10))
plt.xlim(0,44)
plt.bar(y,x, color='skyblue')
plt.savefig('loto6.png')

f:id:htmllifehack:20190510010223p:plain
過去の当選番号を可視化

こう見ると多少出現率に違いがあるように見えますね。

どの数字が何回出ているのか表示してみます。

print(sorted(cnt.items(),key=lambda x:x[1], reverse=False))

>>(9, 170), (29, 174), (7, 175), (17, 176), (41, 177), (34, 179), (40, 179), (13, 181), (1, 183), (33, 183), (26, 184), (11, 185), (35, 186), (24, 188), (32, 189), (18, 190), (42, 190), (4, 190), (5, 191), (16, 192), (21, 192), (25, 192), (14, 192), (2, 195), (3, 195), (30, 197), (43, 197), (20, 198), (36, 198), (28, 198), (22, 198), (19, 199), (31, 200), (8, 201), (12, 203), (39, 203), (15, 204), (37, 204), (10, 205), (23, 205), (38, 207), (27, 208), (6, 215

左が本数字、右が出現回数です。

出現率が高い数字は6番の215回、逆に低い数字は9番の170回。

差は45回でした。

では、それぞれの数字が1回あたりどのくらいの確率ででるのか計算してみます。

for i in range(1,44):
    print(str(i) + "の出現率 : " + str(cnt[i]/1377))

1~43の数字が出現した回数を開催回数の1377でわります。

1の出現率 : 0.13217138707334786
2の出現率 : 0.14161220043572983
3の出現率 : 0.14161220043572983
4の出現率 : 0.13798111837327523
5の出現率 : 0.13870733478576616
6の出現率 : 0.15613652868554828
7の出現率 : 0.1270878721859114
8の出現率 : 0.14596949891067537
9の出現率 : 0.12345679012345678
10の出現率 : 0.14814814814814814
11の出現率 : 0.13435003631082063
12の出現率 : 0.14742193173565724
13の出現率 : 0.13144517066085692
14の出現率 : 0.1394335511982571
15の出現率 : 0.14742193173565724
16の出現率 : 0.1394335511982571
17の出現率 : 0.12781408859840232
18の出現率 : 0.13798111837327523
19の出現率 : 0.14451706608569354
20の出現率 : 0.1437908496732026
21の出現率 : 0.1394335511982571
22の出現率 : 0.1437908496732026
23の出現率 : 0.14887436456063907
24の出現率 : 0.13580246913580246
25の出現率 : 0.1394335511982571
26の出現率 : 0.1336238198983297
27の出現率 : 0.15105301379811184
28の出現率 : 0.1437908496732026
29の出現率 : 0.12636165577342048
30の出現率 : 0.1430646332607117
31の出現率 : 0.14524328249818447
32の出現率 : 0.13725490196078433
33の出現率 : 0.1328976034858388
34の出現率 : 0.1299927378358751
35の出現率 : 0.13435003631082063
36の出現率 : 0.1437908496732026
37の出現率 : 0.14814814814814814
38の出現率 : 0.1503267973856209
39の出現率 : 0.14742193173565724
40の出現率 : 0.1299927378358751
41の出現率 : 0.12854030501089325
42の出現率 : 0.13798111837327523
43の出現率 : 0.14233841684822077

比率でみれば度の数字の出現率も変わらないことがわかりますね。

どの数字を選べばよいのか

出現した数を多い順に7つ取り出すと、6,27,38,23,10,37,15です。

出現回数の多いこの7つの数字を選べばよいと書かれていますがよく考えてみてください。

本当に抽出機がランダムで球を抽選しているのだとしたら数字の出現率はすべて同じなわけです。

43の球から1つ取りだす場合の確率は \normalsize {}_{43} C_1 = \frac{1}{43} = 2.325

1つ減って42の球から1つ取りだす場合の確率は \normalsize {}_{42} C_1 = \frac{1}{42} =2.380

さらに1つ減って41の球から1つ取りだす場合の確率は \normalsize{}_{41} C_1 = \frac{1}{41} =2.439

さらに1つ減って40の球から1つ取りだす場合の確率は \normalsize {}_{40} C_1 = \frac{1}{40} =2.5

さらに1つ減って39の球から1つ取りだす場合の確率は \normalsize {}_{39} C_1 = \frac{1}{39} =2.564

さらに1つ減って38の球から1つ取りだす場合の確率は \normalsize {}_{38} C_1 = \frac{1}{38} =2.631

1回目の抽選で1が出る確率も43が出る確率も試行回数を増やせば \frac{1}{43}になります。(大数の法則)

ということは1377回やっている時点で6が一番出現回数が高かったとしても次回の抽選で6が出やすいなんてことはないはずです。

どちらかというと平均に回帰するので出現回数が少ない9、29、27、17、41、34あたりの数字の方が出そうじゃないですか?

※これはあくまでデータを見ているだけで予測しているわけではありません。 この情報をもとに損害が発生した場合も当ブログでは一切責任を負いません。

 ロト6をシミュレーションしてみる

本当にランダムだと仮定してPythonでロト6をシミュレーションしてみます。

import numpy as np
import random
from collections import Counter

def simu(n):
    max_ = []
    min_ = []
    diff = []
    for i in range(1,n+1):
        x = 1377

        result = []
        num = np.arange(1,44)
        for j in range(x):
            result.extend(random.choices(num, k=6))

        loto = Counter(result)

        print('----------'+str(i)+'回目----------')
        maxvalue = max(loto.values())
        minvalue = min(loto.values())
        max_.append(maxvalue)
        min_.append(minvalue)
        diff.append(maxvalue - minvalue)
        print("最大値" + str(maxvalue))
        print("最小値" + str(minvalue))
        print("差" + str(maxvalue - minvalue))
    print("--------------------------------------")
    print("最大値 : " + str(np.mean(max_)))
    print("最小値 : " +str(np.mean(min_)))
    print("差 : " + str(np.mean(diff)))

13行目で1~43までの数字をリストnumに代入します。

15行目のrandom.choices(num, k=6)で1~43の数字をランダムに6つ抽出してresultという名前のリストに代入します。

17行目で1377回繰り返した結果1~43の数字がそれぞれいくつずつ抽選されたのかをcollectionsのCounterを使用して数えます。

Counterは辞書のようにkeyvaluesで返ってきます。

変数xは開催回数でコード書いた時点では1377回目の抽選が行われたところだったのでx=1377にしてあります。

変数nは1377回を何回シミュレーションするかです。

試しに10000回やってみました。

長いので途中の結果は省略します。

----------1回目----------
最大値232
最小値16369
----------2回目----------
最大値214
最小値16351
.
.
.
----------結果----------
最大値 : 223.2258
最小値 : 162.4196
差 : 60.8062

結果、出現回数が多い数字の平均が223.2258回、逆に出現回数が少ない数字の平均が162.4196回

その差が60.8062でした。

実際のロト6で一番出ている数字は6が215回、出現回数が少ない数字は9の170回です。

その差は45なのでもしかしたら60くらいまで差が開くかもしれませんね。

まとめ

1377回を何回もシミュレーションしたところで意味はないので仮に1400回までを10000回繰り返したらどのくらいの差がでるのか試してみました。

最大値 : 226.5339
最小値 : 165.4182
差 : 61.1157

結果は御覧の通りそこまで差は開いていませんね。

ちなみに10000回目のロト6を10000回繰り返してみたら差は160ほどになりました。

僕の予想では差はどんどん小さくなるもんだと思っていたんですけど違うみたいですね。

じゃなんでこんなことやったのかって自分でも疑問に思うんですけど面白かったのでよしとしましょう。

確率と統計をもっと勉強せねば!

結果、なにかっても一緒

宝くじは愚か者に課せられた税金って経済学者が言っていたのを思い出しました。

残酷すぎる成功法則  9割まちがえる「その常識」を科学する
エリック・バーカー
飛鳥新社 (2017-10-25)
売り上げランキング: 1,728