二項分布を使って作業を失敗する数を考える


1. 概要

何か作業をしてどれくらい成功するのかを考えてみる。
二項分布を学んだ時に例題で出てきたコインの裏表のどちらが出るとかじゃなくて、
実際に使えそうなシチュエーションを考えてみました。

最初に1人の作業者がどの程度作業に成功するのかを求めて、
その後、2人の作業者を比べてどちらが成功しやすいのかを比べてみます。

2. 1人の作業者の作業成功確率を考える

2.1. 前提

以下のデータがあるとする。
- 平均的に2000回作業する。
- 成功する確率は95%

2.2. どれくらい成功するのか

from scipy.stats import binom
import numpy as np
from matplotlib import pyplot as plt

# 作業回数
x_A = 2000

# 作業を成功する確率
p_A = 0.95

# 平均と分散を出す
mean, vari = binom.stats(x_A, p_A)

# 分散の平方根を出すためsqrtを使う。
print("平均で{}回±{} 作業が成功します。".format(mean, np.sqrt(vari)))

以下が出力されるはず。
平均で1900.0回±9.746794344808968 作業が成功します。

2.2.1. グラフにしてみる

2000回作業して、1900回くらい成功する確率が高いというのが分かるグラフ。

n = range(2000+1)
Y = binom.pmf(n, x_A, p_A)
plt.plot(n, Y, marker="o")

3. 人を比べてみる

AさんとBさんの作業データは以下の通り。
この状態で150回ちょうど成功する確率が高いのはどちらだろう。

  • Aさん
    作業回数 = 200
    成功確率 = 0.75

  • Bさん
    作業回数 = 185
    成功確率 = 0.7

# 試行回数
n = 150

x_A = 200
p_A = 0.75

x_B = 185
p_B = 0.7

Y_A = binom.pmf(n, x_A, p_A)
Y_B = binom.pmf(n, x_B, p_B)
print("Aさんの成功確率は{}です".format(Y_A))
print("Bさんの成功確率は{}です".format(Y_B))

以下のように出力されるはずです。
Aさんの成功確率は0.06502948265901858です
Bさんの成功確率は0.0002032290967014346です

Aさんのほうがすごく成功しそうです。でも、そんなに差があるとは思えません。

これは150回ちょうど成功する確率だからです。
140回でも151回でもなく、少なくとも150回成功するというわけでもなく、
150回丁度成功する確率を求めているのでこうなります。

3.1. グラフにしてみる

Aさんの線の色を緑にしておきます。

plt.plot(n, Y_B)
plt.plot(n, Y_A, color="g")

Bさんは130くらいに山があります。Aさんは150回が山の頂上付近っぽいです。

3.2. 150回までの成功確率を足し合わせる。

では、150回までの成功確率を足し合わせるとどうなるかを見てみます。
nの部分を以下のように書き換えてもう一度実行します。

n = range(150+1)

そうすると、

Aさんの成功確率は[3.87259191e-121 2.32355515e-118 6.93581212e-116 1.37329080e-113
 2.02903716e-111 2.38614770e-109 2.32649400e-107 1.93431359e-105
 1.39995946e-103 8.95974053e-102 5.13393132e-100 2.66030987e-098
 1.25699641e-096 5.45343059e-095 2.18526754e-093 8.12919526e-092
 2.81981461e-090 9.15610390e-089 2.79261169e-087 8.02508412e-086
 2.17881034e-084 5.60265515e-083 1.36755719e-081 3.17511104e-080
(後略

と出たと思います。
150回までの1回やった時、2回やった時...という場合の確率が全部出ています。
なので、これを足し合わせると150回までの確率がでそうです。
以下のコードで足し合わせると、

print("Aさん", Y_A.sum())
print("Bさん", Y_B.sum())

以下のように表示されます。

Aさん 0.5271236581201976
Bさん 0.9997782710409081

150回までだと、Bさんのほうが上手くいきそう!
ただ、160回くらいにすると以下のようになり、上述のような顕著な差は無くなってきます。

Aさん 0.9594957905805787
Bさん 0.9999999570698379

3.3. 備考

pmf を cdf に変更すると指定の数までの確率を足し合わせてくれます。

n = 150

x_A = 200
p_A = 0.75

x_B = 185
p_B = 0.7

Y_A = binom.cdf(n, x_A, p_A)
Y_B = binom.cdf(n, x_B, p_B)
print("Aさんの成功確率は{}です".format(Y_A))
print("Bさんの成功確率は{}です".format(Y_B))

結果

Aさんの成功確率は0.5271236581203135です
Bさんの成功確率は0.9997782710407805です