こんにちは!しゅんです!
今回はベルヌーイ分布について解説していきます!
ベルヌーイ分布は確率・統計で登場する用語です。この記事ではベルヌーイ分布について図を使って分かりやすく解説していきます。
また今回はpythonを使ってベルヌーイ分布を扱っていこうと思います。
それでは解説していきましょう!
統計検定2級に関する他の記事はこちらから見れます!
ぜひ他の記事も読んでみてください!
このブログの簡単な紹介はこちらに書いてあります。
興味があったら見てみてください。
このブログでは経営工学を勉強している現役理系大学生が、経営工学に関することを色々話していきます!
ぼくが経営工学を勉強している中で感じたことや、興味深かったことを皆さんと共有出来たら良いなと思っています。
そもそも経営工学とは何なのでしょうか。Wikipediaによると
経営工学(けいえいこうがく、英: engineering management)は、人・材料・装置・情報・エネルギーを総合したシステムの設計・改善・確立に関する活動である。そのシステムから得られる結果を明示し、予測し、評価するために、工学的な分析・設計の原理・方法とともに、数学、物理および社会科学の専門知識と経験を利用する。
引用元 : 経営工学 – Wikipedia
長々と書いてありますが、要は経営、経済の課題を理系的な観点から解決する学問です。
ベルヌーイ分布ってなに?
ベルヌーイ分布を考えるために、まずはコイントスについて考えてみましょう。
コイントスとはコインを一回投げて表が出るか裏が出るかを観察することです。コインの表が出る場合を成功、裏が出る場合を失敗と仮定します。
このときコインの表が出る確率も裏が出る確率も\(\frac{1}{2}\)なので、コイントスの成功確率は\(\frac{1}{2}\)となります。
実はこれベルヌーイ試行と呼ばれるものなんです。ベルヌーイ試行とは2種類の結果のいずれかが必ずランダムに決まる操作を1回行うことを言います。コイントスで言うと2種類の結果とは表が出る(成功)か裏が出る(失敗)かということです。
ベルヌーイ試行では成功確率を\(p\)と表します。コイントスでいえば\(p= \frac{1}{2}\)となります。
確率・統計では成功と失敗をそれぞれ1と0で表すので、つまりベルヌーイ試行とは確率\(p\)で1、確率\(1-p\)で0が出るような試行というわけです。
そしてこのベルヌーイ試行によって得られた結果に基づいた確率分布のことをベルヌーイ分布というわけです。これまで長々と話してきたことを式に直してみましょう。
確率関数\(P\)を用意します。先にベルヌーイ分布の確率関数を出してからこの関数が何を言っているかを説明したいと思います。
\(P(X=1) \equiv p\)
\(P(X=0) \equiv 1-p\), \(0 \leq p \leq 1\)
まず\(P(X=1) \equiv p\) は、ベルヌーイ試行において結果が1(成功)となる確率が\(p\)だということを言っています。
同じように\(P(X=0) \equiv 1-p\) は、ベルヌーイ試行において結果が0(失敗)となる確率が\(1-p\)だということを言っています。
そして\(p\)は成功確率なので0から1の間の数字になるはずです。よって\(0 \leq p \leq 1\)という制約条件が付いていると言うわけです。
ベルヌーイ分布は二項分布の試行回数が1回バージョンだと考えることができるので\(B(1,p)\)と表します。
ベルヌーイ分布の期待値と分散
ベルヌーイ分布の期待値と分散は下のようになります。
期待値 : \(\mu = p\)
分散 : \(\sigma^2 = p(1-p)\)
期待値はその確率分布が取る値の平均を表します。分散はその確率分布が取る値にどれだけばらつきがあるかを表します。
日常で見るベルヌーイ試行の例
ベルヌーイ分布は日常でも結構見かけます。日常での具体例があった方がイメージがつかみやすいと思うのでこの章ではいくつか日常の例を紹介していきます。
コイントス
これは先ほども説明しましたがコイントスはベルヌーイ試行です。コイントスは成功確率\(p\)が\(\frac{1}{2}\)となるようなベルヌーイ試行となります。
コイントスをこれまでに説明した式で表すと以下のようになります。
確率関数 :
\(P(X=1) \equiv \frac{1}{2}\)
\(P(X=0) \equiv \frac{1}{2}\)
期待値 : \(\mu = \frac{1}{2}\)
分散 : \(\sigma^2= \frac{1}{4}\)
サイコロ
サイコロを1回投げて3,6が出る場合を成功、それ以外が出る場合を失敗としたときにこれは成功確率\(p\)が\(\frac{1}{3}\)のベルヌーイ試行となります。
この試行をこれまでに説明した式で表すと以下のようになります。
確率関数 :
\(P(X=1) \equiv \frac{1}{3}\)
\(P(X=0) \equiv \frac{2}{3}\)
期待値 : \(\mu = \frac{1}{3}\)
分散 : \(\sigma^2= \frac{2}{9}\)
ババ抜き
ババ抜きもベルヌーイ試行になります。例えば相手が5枚のカードを持っていて、その5枚の中にジョーカーが入っている場合を考えてみましょう。ジョーカーを引かないときを成功、ジョーカーを引くときを失敗と仮定するとこの試行は成功確率\(p\)が\(\frac{4}{5}\)のベルヌーイ試行となります。
この試行をこれまでに説明した式で表すと以下のようになります。
確率関数 :
\(P(X=1) \equiv \frac{4}{5}\)
\(P(X=0) \equiv \frac{1}{5}\)
期待値 : \(\mu = \frac{4}{5}\)
分散 : \(\sigma^2= \frac{4}{25}\)
ベルヌーイ試行をpythonで扱う
最後にpythonを使ってベルヌーイ試行を扱いたいと思います。プログラミングの知識が必要なので、分からなければプログラムの所は飛ばして結果だけ確認してみてください。
pythonで確率・統計を扱うときはscipyというライブラリをよく使うのでインポートしましょう。また数値計算でよく使うnumpyというライブラリもインポートしておきます。
import scipy.stats as stats
import numpy as np
scipyではベルヌーイ分布は.bernoulli(p)で作成することができます。pは成功確率です。例えばコイントスだったらp=0.5とすれば良いです。
ということでまずはp=0.5としてベルヌーイ分布を作成してみましょう。
# p = 0.5のベルヌーイ分布を作成する
p = 0.5
B = stats.bernoulli(p)
ベルヌーイ分布にはBという名前を付けました。試しに100回ベルヌーイ試行をやってみましょう。イメージ的にはコイントスを100回やって表と裏がどれだけ出るかを確かめる感じです。
ランダムにベルヌーイ試行をするには.rvs(size = 回数)でできます。試行結果はsampleに格納しておきましょう。sampleはリスト形式で成功だったら1、失敗だったら0が格納されています。
# 100回試行して結果を取得する
samples = B.rvs(size=100)
# 結果を表示する
print(samples)
ランダムに試行されるので結果は毎回異なります。1と0の数を数えてみましょう。要素の個数を数えるにはnumpyのcount_nonzeroが使えます。
# 1の数と0の数を数える
num_ones = np.count_nonzero(samples == 1)
num_zeros = np.count_nonzero(samples == 0)
# 結果を表示する
print("1の個数 :",num_ones)
print("0の個数 :",num_zeros)
ということでこのシミュレーションでは54回成功して46回失敗したようです。だいたい\(\frac{1}{2}\)の確率で成功していますね。さきほど期待値について説明しましたが、これは試行回数を増やしていったときに1が出る割合がだんだんその期待値に近づいていくということを表しています。
\(p= \frac{1}{2}\)なので1の個数の割合がだんだんと\(\frac{1}{2}\)に近づいていくはずです。試行回数を1,10,100,1000,10000,…,10000000と変えていった時に1の個数の割合がどう変わるかをpythonで調べてみましょう。
# p=0.5のベルヌーイ分布を作成する
p = 0.5
B = stats.bernoulli(p)
# 結果を格納する空リストを作成する
result = []
# 試行回数を1~10000000に変更してベルヌーイ試行をやる
for n in [1,10,100,1000,10000,100000,1000000,10000000]:
samples = B.rvs(size=n) # sizeをnとしてベルヌーイ試行を行う
num_ones = np.count_nonzero(samples == 1) # 1の個数を数える
prob = num_ones/n # nで割って1の個数の割合求める
result.append(prob) # resultに1の個数の割合を追加する
#resultを表示する
print(result)
左から順番に1,10,100,…,10000000回ベルヌーイ試行をしたときに1がの個数の割合が表示されています。
なんとなく0.5に近づいているように見えますね。横軸の試行回数、縦軸に割合を取って折れ線グラフを作成して確認してみましょう。pythonでグラフを作成するにはmatplotlibというライブラリを使います。
# matplotlibをインポートする
import matplotlib.pyplot as plt
#横軸が試行回数、縦軸が割合の折れ線グラフを作成する
n = ["1","10","100","1000","10000","100000","1000000","10000000"] # 横軸を定義する
plt.plot(n,result, marker = "o",markersize = 10, color = "blue", alpha = 0.5, label = "Measured Value") # 横軸n、縦軸resultの折れ線グラフを作成する
plt.hlines(0.5,"1", "10000000", color = "black", ls="--", label = "Expected Value") # 期待値0.5の横線を点線で表示する
plt.xlabel("Number Of Attempts") # x軸のラベルを表示する
plt.ylabel("The Percentage Of 1") # y軸のラベルを表示する
plt.yticks(np.arange(0, 1.1, 0.1)) #y軸の目盛りを設定する
plt.legend()
plt.show() # グラフを表示する
青い折れ線が先ほどのシミュレーションで得られた結果で、黒い点線が期待値0.5のラインを表しています。やっぱり試行回数を増やしていくほど期待値0.5に近づいていそうですね。
おわりに
いかがでしたか。
今回の記事ではベルヌーイ分布について解説していきました。
今後もこのような経営工学に関する記事を書いていきます!
最後までこの記事を読んでくれてありがとうございました。