【Python】ロト6に出やすい数字があるのかシミュレーションしてみた
なにか儲け話ってないかなー
結局ボートレースの機械学習は失敗に終わったしなにか別のことをしたいなー
と話していたときに職場の人が提案してきたのは
ロト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等までの当せんが決まります。
抽選の様子の動画も配信されています。 数字選択式宝くじ抽せん会 ライブ中継【宝くじ公式サイト】
当選金額は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つ選び、そのすべてが抽選された数字と一致する必要があります。
なので となります。
2等は選んだ6つの数字のうち5つが一致し、残りの1つはボーナス数字と一致する必要があります。
6のなかから5つ一致していればいいので 、ボーナス数字は1通りしかないので 、
乗法定理によりとなります。
3等は6つの数字のうち5つ一致している必要があるので 、残りの1つは37個のはずれからえらばれるので
です。
4等は選んだ6つの数字のうち4つ一致している必要があるので、残りの2つは37個のはずれから選ばれるので
です。
5等は6つの数字のうち3つ一致している必要があるので、残りの3つははずれから選ばれるので
です。
pythonで当選確率の計算
pythonで組み合わせを計算するにはscipy
のcomb
メソッドを使います。
組み合わせは英語でcombinationです。
from scipy import special one = special.comb(43,6,exact=True) print(one) >>6096454
階乗はmath
のfactorial
メソッドを使います。
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')
こう見ると多少出現率に違いがあるように見えますね。
どの数字が何回出ているのか表示してみます。
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つ取りだす場合の確率は
1つ減って42の球から1つ取りだす場合の確率は
さらに1つ減って41の球から1つ取りだす場合の確率は
さらに1つ減って40の球から1つ取りだす場合の確率は
さらに1つ減って39の球から1つ取りだす場合の確率は
さらに1つ減って38の球から1つ取りだす場合の確率は
1回目の抽選で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
は辞書のようにkey
とvalues
で返ってきます。
変数x
は開催回数でコード書いた時点では1377回目の抽選が行われたところだったのでx=1377にしてあります。
変数n
は1377回を何回シミュレーションするかです。
試しに10000回やってみました。
長いので途中の結果は省略します。
----------1回目---------- 最大値232 最小値163 差69 ----------2回目---------- 最大値214 最小値163 差51 . . . ----------結果---------- 最大値 : 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ほどになりました。
僕の予想では差はどんどん小さくなるもんだと思っていたんですけど違うみたいですね。
じゃなんでこんなことやったのかって自分でも疑問に思うんですけど面白かったのでよしとしましょう。
確率と統計をもっと勉強せねば!
結果、なにかっても一緒
宝くじは愚か者に課せられた税金って経済学者が言っていたのを思い出しました。
飛鳥新社 (2017-10-25)
売り上げランキング: 1,728