1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

二項分布でPayPay支払い無料になる確率を回数ごとに比べてみた。

Last updated at Posted at 2018-12-24

もうキャンペーン自体は終わりましたが...

PayPayが無料になる確率=10%
これを二項分布の公式をもとに複数回くじを引いたときに
回数ごとに少なくとも1回は当たりを引ける確率をプログラムして求めてみました。
PayPayが無料になる確率=10%ということは
PayPayが無料にならない確率=90%なので、
離散確率の合計値から0回のみ当たりが出た確率を引けばよいのです。
練習のため既存メソッドは使用していません。

こちらの公式を参考にしました。

コード

"""
まずは10回トライしてみた場合のあたりを少なくとも一回引く確率について
"""

import matplotlib.pyplot as plt


def print_extend(str, num):
    print(f"[{str}]回出る確率は {num} です。")


def combination(n, r):
    ans = 1
    if r != 0:
        mul_n = n
        mul_r = r

        for num in range(r - 1):
            n -= 1
            mul_n *= n
            r -= 1
            mul_r *= r
        ans = mul_n / mul_r
    return ans


def berno(n, k, p):
    c = combination(n, k)
    ans = c * p ** k * (1 - p) ** (n - k)

    return ans


def berno_print(n, p):
    y_axis = []
    for i in range(n + 1):
        y_axis.append(berno(n, i, p))
        print_extend(i, berno(n, i, p))


def berno_plot(n, p):
    y_axis = []
    x_axis = []
    for i in range(n + 1):
        y_axis.append(berno(n, i, p))
        x_axis.append(i)

    fig, axe = plt.subplots()
    axe.set_title("berno_plot")
    axe.set_xlabel('k')
    axe.set_ylabel('probability')
    axe.grid()
    axe.plot(x_axis, y_axis)
    plt.xticks(x_axis)
    plt.savefig("berno_plot.png")
    plt.show()


berno_print(10, 0.1)
berno_plot(10, 0.1)

"""
実行結果

[0]回出る確率は 0.3486784401000001 です。
[1]回出る確率は 0.3874204890000001 です。
[2]回出る確率は 0.19371024450000007 です。
[3]回出る確率は 0.05739562800000002 です。
[4]回出る確率は 0.011160261000000003 です。
[5]回出る確率は 0.0014880348000000005 です。
[6]回出る確率は 0.00013778100000000007 です。
[7]回出る確率は 8.748000000000003e-06 です。
[8]回出る確率は 3.6450000000000023e-07 です。
[9]回出る確率は 9.000000000000004e-09 です。
[10]回出る確率は 1.0000000000000006e-10 です。
"""

berno_plot.png

ここでは10回の試行のうち0回出る確率が
約34.87%なので65.13%の確率で無料になるということですね。意外と低いです。

10回、20回、30回〜100回試行における確率を計算してみます。一つ一つやっていては面倒なのでforで回します。


sum_list=[]
for num in np.linspace(0, 100, 11):
    total=(1 - berno(num, 0, 0.1)) * 100
    sum_list.append(total)
    print(int(num), "回試行時少なくとも1回当たる確率", total, "%")

fig, axe = plt.subplots()
axe.set_xlabel('k/10')
axe.set_ylabel('probability')
axe.grid()
axe.plot(sum_list)
plt.savefig("berno_total_plot.png")
plt.show()
"""
実行結果

0 回試行時少なくとも1回当たる確率 0.0 %
10 回試行時少なくとも1回当たる確率 65.13215599 %
20 回試行時少なくとも1回当たる確率 87.84233454094307 %
30 回試行時少なくとも1回当たる確率 95.76088417247838 %
40 回試行時少なくとも1回当たる確率 98.52191170585654 %
50 回試行時少なくとも1回当たる確率 99.484622479268 %
60 回試行時少なくとも1回当たる確率 99.82029897000857 %
70 回試行時少なくとも1回当たる確率 99.93734212517822 %
80 回試行時少なくとも1回当たる確率 99.97815254994717 %
90 回試行時少なくとも1回当たる確率 99.99238226519542 %
100 回試行時少なくとも1回当たる確率 99.99734386011124 %

"""

berno_total_plot.png

少なくとも30回試行すれば95%圏内に入ることがわかりました。


コンビニなどの決済では大丈夫でも家電で狙うには意外とシビアな確率だったんですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?