ぶどう確率はどれくらいぶれるか?
お世話になっております、スログラミングです。
6号機ジャグラー(SアイムジャグラーEX-TP)が導入されて1ヶ月ほどが経ちました。
やはり今後を担う機種だからか、ネットの評判を見ても甘めに運用してるお店がちょこちょこあるようです。
とすると、ぶどうを数えてみたくなりますが、前々から疑問に思っていることがありました。
それはぶどう確率ってどのくらい荒れるの?ということです。
例えば、開始1Gでぶどうが落ちた!設定6だ!って判断する人はいないですよね。
たまたま引けただけで試行回数が足りないだけだと判断すると思います。
では、100個なら?1000個なら?
ということで今回もPythonでプログラミングして確かめてみましょう。
今回はボックスプロット(箱ひげ図)を使って、ぶどう確率がどのくらい荒れるのか?を視覚的に見えるようにしてみます。
まだ6号機ジャグラーのぶどう確率はわからないので5号機のアイムジャグラーのぶどう確率でシミュレーションしてみます。
※毎度のことですが、本内容の正確性は何も保証できませんので、ご了承ください。
今回のアジェンダはこちら。
1. ボックスプロット(箱ひげ図)とは?
ボックスプロット(箱ひげ図)は、ビッグデータからを見る時に有効なグラフです。
具体的には下図のようなグラフで、一度に様々な情報を確認することができます。
今回は、第1~3四分位に着目したいと思いますが、そもそも四分位って何?ということを説明します。
例えば、ぶどう100個取得した時のぶどう確率を11回測定したときの結果が以下の通りだったとき。
まずは、取得したデータをぶどう確率順に並べ替えます。
ここで真ん中にきた値が第2四分位となります。いわゆる中央値ですね。
次に、中央値を基準にデータを上下半分にわけます。
データの数が奇数の時は、中央値は除いて上下半分のデータの数が等しくなるようにします。
ここで下半分の真ん中にきた値が第1四分位、上半分の真ん中にきた値が第3四分位となります。
まとめると、取得データの25%、50%、75%の位置にあるデータが第1~第3四分位ですね。
また、乱暴すぎるかもしれませんが、大体の傾向を見たいなら第1四分位から第3四分位の範囲(四分位範囲)を見ればOKです。
ボックスプロットを使うと例えば、こんな比較ができます。
下図は、ぶどう確率が6.49と6.18の時で、ぶどう100個取得した時のぶどう確率と、500個取得した時のぶどう確率を100回計測したときのデータです。
(5号機のアイムジャグラーの設定5以下と設定6のぶどう確率くらい。)
両者のグラフを見比べると以下のことが推測できます。
1. ぶどう1000個数えれば結果を信じて良さそう
ぶどう1000個の時のデータを見ると、設定5以下と設定6のグラフは四分位範囲がかぶっていません。
つまり、ぶどう1000個数えればぶどう確率の設定差は見分けられそうですね。
また、グラフからざっくり数値を見ると設定6の第3四分位が6.3なので、ぶどう1000個数えたときにぶどう確率が6.3以下ならそのまま閉店まで粘ってよさそうです。
2. ぶどう100個じゃほぼ設定はわからない
ぶどう1000個の時のデータと異なり、ぶどう100個の場合は、設定5以下と設定6のグラフで四分位範囲がかぶっています。
つまり、ぶどう100個数えても設定差を見分けられる可能性は低いということですね。
3. ぶどう100個でも極端に結果が良ければ粘ってもいいかも
グラフを見ると、設定6の第1四分位は5.8~5.9くらいになっていそうです。
設定5以下の第1四分位は6.1~6.2くらいなので、ぶどう100個時点でもぶどう確率が6.0以下であればもうちょっと粘ってみてもよさそうです。
逆に、設定6の第3四分位が6.6くらい、設定5以下の第3四分位は6.8くらいなので、ぶどう100個時点でぶどう確率が7.0以上なら捨ててもよさそうです。
このようにボックスプロットを使うとビッグデータから色々なことを推測することができます。
ということで、今回紹介したデータやぶどう100~1000個の間のデータも作成して確認してみましょう。
2. サンプルの作成
今回は、5号機のアイムジャグラーを例にシミュレーションを行います。
5号機のアイムジャグラーのぶどう確率は、設定5以下で6.49、設定6で6.18と言われています。
2.1. ぶどう確率の設定
まずは、いつものようにぶどう確率の設定を行っていきます。
設定したいぶどう確率から、1~65536の範囲内で乱数抽選したときのぶどうの乱数範囲を決定していきます。
# ぶどう確率の設定
ぶどう確率_設定5以下 = 6.49
ぶどう確率_設定6 = 6.18
# 乱数範囲の設定準備
ぶどう確率_設定5以下 = round(65536 / ぶどう確率_設定5以下)
ぶどう確率_設定6 = round(65536 / ぶどう確率_設定6)
# 乱数範囲の設定(設定5以下)
ぶどう確率_設定5以下_下 = 1
ぶどう確率_設定5以下_上 = ぶどう確率_設定5以下_下 + ぶどう確率_設定5以下 - 1
# 乱数範囲の設定(設定6)
ぶどう確率_設定6_下 = 1
ぶどう確率_設定6_上 = ぶどう確率_設定6_下 + ぶどう確率_設定6 - 1
2.2. 乱数抽選とループ処理
今回は、ぶどう1000個獲得 x 1000回ループを行いたいので、二重ループ文をコーディングします。
(せっかくなので、ループ回数も1000回に増やしました。)
具体的には以下のように、for文の中にWhile文を入れて、ぶどう1000個獲得するまで続くループ処理を1000回繰り返す感じです。
#ループ処理(1000回ループする)
for loop in range(1000):
# ループ処理(ぶどうを1000個獲得するまでループする)
while ぶどう個数 <= 1000:
# ここに乱数抽選やぶどう確率算出を入れていく
ループ処理の中身を作成していきます。
↓のコードは設定5以下の場合だけですが、設定6の場合もやることは同じです。
まず乱数抽選のコーディングですが、これはいつも通りです。
1~65536の間で乱数を取得し、先ほど設定したぶどうの乱数範囲内か否かを判定します。
取得した乱数がぶどうの乱数範囲内である場合は、ぶどう個数をカウントアップしていきます。
集計部分に関しては、カウントしたぶどう個数を100で割った余りを条件に設定することで、100個刻みでのデータを保存できるようにしています。
# ループ処理(ぶどうを1000個獲得するまでループする)
while ぶどう個数_設定5以下 <= 1000:
ゲーム数 = ゲーム数 + 1
rand = random.randint(1,65536)
# 取得した乱数が設定5以下のぶどう確率の範囲内にあるか判定
if ぶどう確率_設定5以下_下 <= rand <= ぶどう確率_設定5以下_上:
# ぶどう個数をカウント
ぶどう個数_設定5以下 = ぶどう個数_設定5以下 + 1
# 100個単位で集計するために、100で割った時の余りが0の時を判定
if ぶどう個数_設定5以下 % 100 == 0:
# 獲得時のぶどう確率を配列に格納
ぶどう結果_設定5以下.append(ゲーム数 / ぶどう個数_設定5以下)
# 後のデータ整形用にぶどう何個の時のデータかをメモしておく。
ぶどう個数.append(ぶどう個数_設定5以下)
# ぶどう獲得数とゲーム数をリセット
ぶどう個数_設定5以下 = 0
ゲーム数 = 0
設定6の場合もほぼ同様なので、説明は省略します。
ループ処理全体は以下のコードになりました。
#ループ処理(1000回ループする)
for loop in range(1000):
# ループ処理(ぶどうを1000個獲得するまでループする)
while ぶどう個数_設定5以下 <= 1000:
ゲーム数 = ゲーム数 + 1
rand = random.randint(1,65536)
# 取得した乱数が設定5以下のぶどう確率の範囲内にあるか判定
if ぶどう確率_設定5以下_下 <= rand <= ぶどう確率_設定5以下_上:
# ぶどう個数をカウント
ぶどう個数_設定5以下 = ぶどう個数_設定5以下 + 1
# 100個単位で集計するために、100で割った時の余りが0の時を判定
if ぶどう個数_設定5以下 % 100 == 0:
# 獲得時のぶどう確率を配列に格納
ぶどう結果_設定5以下.append(ゲーム数 / ぶどう個数_設定5以下)
# 後のデータ整形用にぶどう何個の時のデータかをメモしておく。
ぶどう個数.append(ぶどう個数_設定5以下)
# ぶどう獲得数とゲーム数をリセット
ぶどう個数_設定5以下 = 0
ゲーム数 = 0
# ループ処理(ぶどうを1000個獲得するまでループする)
while ぶどう個数_設定6 <= 1000:
ゲーム数 = ゲーム数 + 1
rand = random.randint(1,65536)
# 取得した乱数が設定6のぶどう確率の範囲内にあるか判定
if ぶどう確率_設定6_下 <= rand <= ぶどう確率_設定6_上:
# ぶどう個数をカウント
ぶどう個数_設定6 = ぶどう個数_設定6 + 1
# 100個単位で集計するために、100で割った時の余りが0の時を判定
if ぶどう個数_設定6 % 100 == 0:
# 獲得時のぶどう確率を配列に格納
ぶどう結果_設定6.append(ゲーム数 / ぶどう個数_設定6)
# ぶどう獲得数とゲーム数をリセット
ぶどう個数_設定6 = 0
ゲーム数 = 0
3. グラフの描画
ここからグラフを描画していきます。
2. サンプルの作成のコードを実行すると、以下のようなデータが取得できているはずです。(ぶどう結果の数字はイメージ。)
今回、pylab.boxplotを用いてボックスプロットを描画していきますが、グラフを描画するためには上表のデータを整形する必要があります。
最終的には以下のようなデータ形式にする必要があります。
pylab.boxplot([100個の結果群, 200個の結果群, ・・・, 1000個の結果群], labels=['100', '200', ・・・, '1000'])
ということで、ぶどう個数ごとにデータを集めていきます。
かっこいい方法が思いつかなかったので、片っ端から泥臭く整形していきます。
途中端折っていますが、結果を入れる箱を作る→結果を格納するをひたすら作ってます。
# ボックスプロット用に結果を整形
ぶどう結果_設定5以下_100 = []
ぶどう結果_設定5以下_200 = []
・・・
ぶどう結果_設定5以下_1000 = []
ぶどう結果_設定6_100 = []
ぶどう結果_設定6_200 = []
・・・
ぶどう結果_設定6_1000 = []
# ぶどう確率を格納した配列を一つずつ確認していく
for i, j, k in zip(ぶどう個数, ぶどう結果_設定5以下, ぶどう結果_設定6):
# ぶどう100個の時のデータをまとめる
if i == 100:
ぶどう結果_設定5以下_100.append(j)
ぶどう結果_設定6_100.append(k)
# ぶどう200個の時のデータをまとめる
elif i == 200:
ぶどう結果_設定5以下_200.append(j)
ぶどう結果_設定6_200.append(k)
・
・
・
elif i == 1000:
ぶどう結果_設定5以下_1000.append(j)
ぶどう結果_設定6_1000.append(k)
このままでもグラフ描画可能ですが、ちょっとだけかっこよくするために配列を1つにまとめてきます。
# このまま大量の配列があるとグラフ描画時に面倒なので、配列をまとめる
ぶどう結果_設定5以下_箱ひげ = [ぶどう結果_設定5以下_100, ぶどう結果_設定5以下_200, ・・・,ぶどう結果_設定5以下_1000]
ぶどう結果_設定6_箱ひげ = [ぶどう結果_設定6_100, ぶどう結果_設定6_200, ・・・,ぶどう結果_設定6_1000]
まとめた配列を使用して、ボックスプロットを描画すれば完成です。
# 結果の表示
bp1 = pylab.boxplot(ぶどう結果_設定5以下_箱ひげ, labels=['100', '200', ・・・, '1000'])
bp2 = pylab.boxplot(ぶどう結果_設定6_箱ひげ, labels=['100', '200', ・・・, '1000'])
pylab.show()
4. 今回作成したコード
今回作成したコードはこちら。
グラフの色の設定や、凡例を日本語にするために多少修正しています。
# coding: UTF-8
# 乱数作成用
import random
# ボックスプロット描画用
import pylab
# ぶどう確率の設定
ぶどう確率_設定5以下 = 6.49
ぶどう確率_設定6 = 6.18
# 乱数範囲の設定準備
ぶどう確率_設定5以下 = round(65536 / ぶどう確率_設定5以下)
ぶどう確率_設定6 = round(65536 / ぶどう確率_設定6)
# 乱数範囲の設定(設定5以下)
ぶどう確率_設定5以下_下 = 1
ぶどう確率_設定5以下_上 = ぶどう確率_設定5以下_下 + ぶどう確率_設定5以下 - 1
# 乱数範囲の設定(設定6)
ぶどう確率_設定6_下 = 1
ぶどう確率_設定6_上 = ぶどう確率_設定6_下 + ぶどう確率_設定6 - 1
# 結果用の箱やカウンタの準備
ぶどう個数 = []
ぶどう結果_設定5以下 = []
ぶどう結果_設定6 = []
ぶどう個数_設定5以下 = 0
ぶどう個数_設定6 = 0
ゲーム数 = 0
カウント済_設定5以下 = 0
カウント済_設定6 = 0
#ループ処理(1000回ループする)
for loop in range(1000):
# ループ処理(ぶどうを1000個獲得するまでループする)
while ぶどう個数_設定5以下 <= 1000:
ゲーム数 = ゲーム数 + 1
rand = random.randint(1,65536)
# 取得した乱数が設定5以下のぶどう確率の範囲内にあるか判定
if ぶどう確率_設定5以下_下 <= rand <= ぶどう確率_設定5以下_上:
# ぶどう個数をカウント
ぶどう個数_設定5以下 = ぶどう個数_設定5以下 + 1
# 100個単位で集計するために、100で割った時の余りが0の時を判定
if ぶどう個数_設定5以下 % 100 == 0:
# 獲得時のぶどう確率を配列に格納
ぶどう結果_設定5以下.append(ゲーム数 / ぶどう個数_設定5以下)
# 後のデータ整形用にぶどう何個の時のデータかをメモしておく。
ぶどう個数.append(ぶどう個数_設定5以下)
# ぶどう獲得数とゲーム数をリセット
ぶどう個数_設定5以下 = 0
ゲーム数 = 0
# ループ処理(ぶどうを1000個獲得するまでループする)
while ぶどう個数_設定6 <= 1000:
ゲーム数 = ゲーム数 + 1
rand = random.randint(1,65536)
# 取得した乱数が設定6のぶどう確率の範囲内にあるか判定
if ぶどう確率_設定6_下 <= rand <= ぶどう確率_設定6_上:
# ぶどう個数をカウント
ぶどう個数_設定6 = ぶどう個数_設定6 + 1
# 100個単位で集計するために、100で割った時の余りが0の時を判定
if ぶどう個数_設定6 % 100 == 0:
# 獲得時のぶどう確率を配列に格納
ぶどう結果_設定6.append(ゲーム数 / ぶどう個数_設定6)
# ぶどう獲得数とゲーム数をリセット
ぶどう個数_設定6 = 0
ゲーム数 = 0
# ボックスプロット用に結果を整形
ぶどう結果_設定5以下_100 = []
ぶどう結果_設定5以下_200 = []
ぶどう結果_設定5以下_300 = []
ぶどう結果_設定5以下_400 = []
ぶどう結果_設定5以下_500 = []
ぶどう結果_設定5以下_600 = []
ぶどう結果_設定5以下_700 = []
ぶどう結果_設定5以下_800 = []
ぶどう結果_設定5以下_900 = []
ぶどう結果_設定5以下_1000 = []
ぶどう結果_設定6_100 = []
ぶどう結果_設定6_200 = []
ぶどう結果_設定6_300 = []
ぶどう結果_設定6_400 = []
ぶどう結果_設定6_500 = []
ぶどう結果_設定6_600 = []
ぶどう結果_設定6_700 = []
ぶどう結果_設定6_800 = []
ぶどう結果_設定6_900 = []
ぶどう結果_設定6_1000 = []
# ぶどう確率を格納した配列を一つずつ確認していく
for i, j, k in zip(ぶどう個数, ぶどう結果_設定5以下, ぶどう結果_設定6):
# ぶどう100個の時のデータをまとめる
if i == 100:
ぶどう結果_設定5以下_100.append(j)
ぶどう結果_設定6_100.append(k)
# ぶどう200個の時のデータをまとめる
elif i == 200:
ぶどう結果_設定5以下_200.append(j)
ぶどう結果_設定6_200.append(k)
# ぶどう300個の時のデータをまとめる
elif i == 300:
ぶどう結果_設定5以下_300.append(j)
ぶどう結果_設定6_300.append(k)
# ぶどう400個の時のデータをまとめる
elif i == 400:
ぶどう結果_設定5以下_400.append(j)
ぶどう結果_設定6_400.append(k)
# ぶどう500個の時のデータをまとめる
elif i == 500:
ぶどう結果_設定5以下_500.append(j)
ぶどう結果_設定6_500.append(k)
# ぶどう600個の時のデータをまとめる
elif i == 600:
ぶどう結果_設定5以下_600.append(j)
ぶどう結果_設定6_600.append(k)
# ぶどう700個の時のデータをまとめる
elif i == 700:
ぶどう結果_設定5以下_700.append(j)
ぶどう結果_設定6_700.append(k)
# ぶどう800個の時のデータをまとめる
elif i == 800:
ぶどう結果_設定5以下_800.append(j)
ぶどう結果_設定6_800.append(k)
# ぶどう900個の時のデータをまとめる
elif i == 900:
ぶどう結果_設定5以下_900.append(j)
ぶどう結果_設定6_900.append(k)
# ぶどう1000個の時のデータをまとめる
elif i == 1000:
ぶどう結果_設定5以下_1000.append(j)
ぶどう結果_設定6_1000.append(k)
# このまま大量の配列があるとグラフ描画時に面倒なので、配列をまとめる
ぶどう結果_設定5以下_箱ひげ = [ぶどう結果_設定5以下_100, ぶどう結果_設定5以下_200, ぶどう結果_設定5以下_300, ぶどう結果_設定5以下_400,ぶどう結果_設定5以下_500,ぶどう結果_設定5以下_600,ぶどう結果_設定5以下_700,ぶどう結果_設定5以下_800,ぶどう結果_設定5以下_900,ぶどう結果_設定5以下_1000]
ぶどう結果_設定6_箱ひげ = [ぶどう結果_設定6_100, ぶどう結果_設定6_200, ぶどう結果_設定6_300, ぶどう結果_設定6_400,ぶどう結果_設定6_500,ぶどう結果_設定6_600,ぶどう結果_設定6_700,ぶどう結果_設定6_800,ぶどう結果_設定6_900,ぶどう結果_設定6_1000]
# 結果の表示
bp1 = pylab.boxplot(ぶどう結果_設定5以下_箱ひげ, labels=['100', '200', '300', '400', '500', '600', '700', '800', '900', '1000'], patch_artist=True, boxprops=dict(facecolor='none', color='red'), medianprops=dict(color='red'), whiskerprops=dict(color='red'), capprops=dict(color='red'), flierprops=dict(markeredgecolor='red'))
bp2 = pylab.boxplot(ぶどう結果_設定6_箱ひげ, labels=['100', '200', '300', '400', '500', '600', '700', '800', '900', '1000'], patch_artist=True, boxprops=dict(facecolor='none', color='blue'), medianprops=dict(color='blue'), whiskerprops=dict(color='blue'), capprops=dict(color='blue'), flierprops=dict(markeredgecolor='blue'))
pylab.legend([bp1["boxes"][0], bp2["boxes"][0]], ["設定5以下", "設定6"], prop={"family":"MS Gothic"})
pylab.show()
4. 結果の確認
作成したコードを実行した結果は下図のようになりました。
結果を見ながら色々考えてみます。
(せっかくなので1. ボックスプロット(箱ひげ図)とは?での考察以外で気になった点)
※今回たまたまこの結果になっただけで、プログラムの実行毎に多少結果は変わりますし、そもそもコード自体に間違いがある可能性もあります。こんな考え方もあるのね。ぐらいのスタンスで見てください。
1. ぶどう600個数えれば結果を信じて良さそう
各ぶどう個数での四分位範囲を見ていくと、ぶどう600個数えた辺りから設定5以下と設定6の四分位範囲が被らなくなります。
ということはぶどう600個数えると、およそ設定差が見抜けるレベルの数値精度になっていると言えそうです。
ちなみにこの時の両者の境界線(設定5以下の第1四分位と設定6の第3四分位の境目)が6.3程度なので、このあたりの数値を押し引きの判断にできそうです。
2. ぶどう300個程度からぶどう確率を参考にできそう
ぶどう300個くらいから一方の第2四分位が他方の四分位範囲の外側になっています。
第2四分位付近の結果となるケースが比較的多いと思います(多分正規分布になってる。多分。。)ので、600個時点ほどではないにしろ、ある程度の設定差が反映されたぶどう確率となっているはずです。
ということで考察やデータの妥当性は置いておいて、ぶどう確率のばらつきを視覚的に表すという目的はボックスプロットを用いるとこんな感じで達成できます。
にほんブログ村







コメント
コメントを投稿