二項分布でレアポケモンのゲット率を計算する

どうも、初代ポケモン世代です。リリースされてからずっと Pokemon Go にはまっています。

トレーナーレベルは36で第三世代あつめも道半ば、という進捗ですが、この度初めて私のもとに「Exレイドパス」が届きました!!
伝説のポケモン「ミュウツー」に戦いを挑むための “Exclusive” な招待状で、ポケモントレーナーは抽選で手にすることが出来ます。

物理的な時間と場所を指定されて、バトルに参加する権利を得られるのですが、招待してもらえる確率がかなり低いのと、指定された日時が平日だったりすると、「せっかく当選したのに予定が。。。」なんてこともあります。しかも、挑戦して勝利できたからと言って、必ずゲットできるわけではないという厳しさ。。。

そんな条件の中、指定されたのは 3月10日(土)のお休みで、場所も生活圏内!ありがたや!!

次にいつ招待状が来るか分からないので何としてもゲットしたい。ということで、ゲットチャレンジでミュウツーをゲットできる確率をマジメに計算してみました。

「ミュウツーにボールを投げてゲットできるかどうか」は ベルヌーイ試行 なので、「二項分布」を用いて確率を計算します。理論的な理解は以下の通りです。

二項分布

P = ある事象が発生する確率がqの時、N回中のy回でその事象が発生する確率:

\[ P(y\:|\:N,q) = {N \choose y}q^y\left(1-q\right)^{N-y} \]

二項分布についての詳細は こちら のサイトが分かりやすいです。

計算したい問題を言い換えると、

「ある確率で成功する事象を〇〇回繰り返したとき、少なくとも1回は成功する確率は?」

となります。ここで、準備したい情報は「1回ボールを投げた時のミュウツーのゲット率(q)」と「プレミアボールを投げる回数(n)」です。

まずは「1回ボールを投げた時のミュウツーのゲット率(q)」を確認します。
こちら のサイトによると、ミュウツーのベースゲット率は「6%」とのこと。

ボールを投げるすべてのタイミングで「エスパータイプ金メダル」、「金のズリのみ」、「カーブボール」、「グレートスロー」の組合せを仮定すると、
こちら のサイトによれば、「34.75%」。

これが一番ありえそうな状況なので、二項分布のパラメーターには「1回ボールを投げた時のミュウツーのゲット率(q)」には「34.75%」を代入します。

次にプレミアボールを投げる回数ですが、ここでは10個と仮定しましょう。「プレミアボールを投げる回数(n)」には「10」を代入します。

獲得したプレミアボールを連続で投げて、そのうちに少なくとも1回ゲット出来れば良いので、「全投でゲットできない場合」の余事象、つまり 「1 – 全投でゲットできない場合の確率」 を次のように計算します。

\[ 1 – {10 \choose 1} (0.3475)^{0}\left(1 – 0.3475\right)^{10-0}  \]

これをPythonで計算すると、(※実行環境はJupyter)

#ライブラリのインポート
from scipy.stats import binom

premier_ball = 10
single_get_rate = 0.3475

#ボールの投球数だけ試行する場合の確率分布
rv = binom(premier_ball, single_get_rate)

#少なくとも1回はゲットできる確率(=すべて逃す場合の余事象)
result = 1 - rv.pmf(0)

#結果を表示
print('約 %s %%' % round((result * 100),2))

プレミアボールを10個投げた時に少なくとも1回はゲットできる確率は “約 98.60 %” !!という計算結果になりました。

思ってたよりも高い。。(ゴクリ)

 

もう少し細かく計算してみます。「エスパータイプ金メダル」、「金のズリのみ」の条件はクリアしている方が大半かと思いますので、
条件が変化しやすい「カーブボール」判定、「スロー」判定毎にプレミアボールの投球数でどのように確率が推移するかをグラフに示します。

先ほどのサイト より、各条件下で1球だけプレミアボールが当たった場合の確率は以下の通りなので、

Curve Normal Nice Great Excellent
Non-curve 15.42% 17.52% 22.21% 26.64%
Curve 24.77% 27.92% 34.75% 40.94%

Retrieved from https://pokemongohub.net/.

Pythonでそれぞれの確率を可視化します。(※実行環境はJupyter)

#ライブラリのインポートと設定
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom
from matplotlib.font_manager import FontProperties
plt.style.use('ggplot')
%config InlineBackend.figure_format = 'retina'

#作図サイズとフォント設定
fig, ax1 = plt.subplots(figsize=(16, 6.5))
fp = FontProperties(size = 12)

#ボール1投目からカウントして、13投目まで(0は含まない)の配列を作成
x = np.arange(1, 14)
    
#条件ごとのボールの投球数だけ試行する場合の確率分布
excellent_curve = binom(x, 0.4094)
great_curve = binom(x, 0.3475)
nice_curve = binom(x, 0.2792)
normal_curve = binom(x, 0.2477)
excellent_non_curve = binom(x, 0.2664)
great_non_curve = binom(x, 0.2221)
nice_non_curve = binom(x, 0.1752)
normal_non_curve = binom(x, 0.1542)
base_get_rate = binom(x, 0.06)

#少なくとも1回はゲットできる確率(=すべて逃す場合の余事象)をプロット
ax1.plot(x, (1 - excellent_curve.pmf(0)) * 100, 'r-', lw = 1, label = 'Excellent w/ curve')
ax1.plot(x, (1 - great_curve.pmf(0)) * 100, 'y-', lw = 1, label = 'Great w/ curve')
ax1.plot(x, (1 - nice_curve.pmf(0)) * 100, 'g-', lw = 1, label = 'Nice w/ curve')
ax1.plot(x, (1 - normal_curve.pmf(0)) * 100, 'b-', lw = 1, label = 'Normal w/ curve')
ax1.plot(x, (1 - excellent_non_curve.pmf(0)) * 100, 'r--', lw = 1, label = 'Excellent w/out curve')
ax1.plot(x, (1 - great_non_curve.pmf(0)) * 100, 'y--', lw = 1, label = 'Great w/out curve')
ax1.plot(x, (1 - nice_non_curve.pmf(0)) * 100, 'g--', lw = 1, label = 'Nice w/out curve')
ax1.plot(x, (1 - normal_non_curve.pmf(0)) * 100, 'b--', lw = 1, label = 'Normal w/out curve')
ax1.plot(x, (1 - base_get_rate.pmf(0)) * 100, 'k--', lw = 1, label = 'Base')

#その他グラフの調整
ax1.set_axisbelow(True)
ax1.grid(color='grey', linestyle='-', alpha = 0.3)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.legend(loc=4, prop=fp)
ax1.set_xlabel('Premier Ball')
ax1.set_ylabel('Cumulative Catch Rate (%)')
ax1.set_title("Mewtwo Get Challenge w/ Gold Medal & Golden Razz Berry")

結果は以下のようになりました。

「赤: Excellent スロー」、「黄: Great スロー」、「緑: Nice スロー」、「青: Normal スロー」 で、点線がそれぞれのカーブ無しの確率を示します。(黒の点線は、金メダルも金ズリもカーブも無しで、Normal スローの時)

カーブボールの効果って割と高いんですね。

※ここで計算している確率はミュウツーにプレミアボールを「当てた」回数です。対象はジャンプや威嚇をしてきます。投げるのに失敗して実際には獲得したプレミアボールよりも試行回数は少なくなるので、その点は注意してください。

条件さえそろえば、かなりの高確率で捕まえられるようになっているようです。が、幼いころから思い入れのあるポケモン。何としても捕まえたい。。。
計算してみましたが、結局安心できません(笑)

当日の結果は追ってご報告いたします!

【2018/3/10 追記】
無事、カーブ + グレートスロー (=34.75%)で一発ゲット出来ました!しかも攻撃HPマックスの高個体値!あ~よかったよかった。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です