📊

【統計検定準1級】ベルヌーイ分布

2024/07/20に公開

はじめに

この記事では、統計検定準1級取得に向けて学習したことをまとめていきます。
工学系の数学ではなく数理あるあるの、論述ゴリゴリな解答になっていると思いますのであらかじめご了承ください。
注意:さらに計算過程は数学文化の『省略の美』を無視してエレファントに書いています。

【リンク紹介】
統計検定準1級のまとめ記事一覧
これまで書いたシリーズ記事一覧

学習書籍について

この記事では「統計学実践ワークブック」を中心に、学んだことをまとめていきます。記事を読んで本格的に勉強してみたいなと思った方は、是非ご購入を検討なさってください。


参考書籍について

統計実践ワークブックは、大量の知識項目と問題が収められている反面、計算過程や知識背景が大きく省略されているため、知識体系をきちんと学ぶ参考書として東京大学から出版されている名著「統計学入門」を使っています。
※ワークブックとしては素晴らしい質だと思いますが、どうしてもその内容量とページ数の都合上、問題のない範囲で削除されているということです。人によっては1冊で問題ない方もおられると思いますが、私には無理でした。


ベルヌーイ試行

次の試行を、ベルヌーイ試行(Bernoulli trial)という。
①1回の試行結果は2種類のみ。
 ここでは一方の結果を「成功」といい、もう一方の結果を「失敗」ということとする。
②毎回の試行において、成功の確率はp成功確率という)であり、失敗の確率は1 - pである。
③毎回の試行は独立である。
④試行をn回繰り返すとする。このとき、何回成功の結果が起こるかに関心があるものとする。

ベルヌーイ分布

ベルヌーイ試行に対して確率変数Xが離散型であるとし、成功のとき1、失敗のとき0をとるとする。このとき、Xの確率が

\begin{alignat*}{2} P(X = x) &= p^x (1 - p)^{1 - x} \hspace{5mm} (x = 0, 1) \end{alignat*}

であるとき、この確率関数p^x (1 - p)^{1 - x}を(成功確率pの)ベルヌーイ分布(Bernoulli distribution)といい、Bin(1, p)と表す。

グラフの描画

コードはこちら

参考資料→Pythonで理解する統計解析の基礎
※参考にはしていますが表記は大分変更しています。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from scipy.special import comb # 組み合わせ関数

# 表示桁数を小数点以下第3位に設定
%precision 3

# [Jupyter notebook only]
# グラフ表示を非インタラクティブモード(jupyter notebook内に表示)に設定
# インタラクティブモードだと別ウィンドウで表示される
%matplotlib inline

"""""""""""""""""""""""""""""""""""""""""""""""""""
関数名:Bern(p)
機 能:ベルヌーイ分布
引 数:成功確率p
戻り値:確率変数と確率関数(X, f)
"""""""""""""""""""""""""""""""""""""""""""""""""""

def Bern(p):
    X = np.array([0, 1])

    def f(x):
        if x in X:
            return (p**x) * ((1 - p)**(1 - x))
        else:
            return 0

    return X, f

p = 0.3        # 成功確率
Xf = Bin(n, p) # 確率変数とその確率関数の値

check_prob(Xf)

plot_prob(Xf)
基本関数
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 表示桁数を小数点以下第3位に設定
%precision 3

# [Jupyter notebook only]
# グラフ表示を非インタラクティブモード(jupyter notebook内に表示)に設定
# インタラクティブモードだと別ウィンドウで表示される
%matplotlib inline

# グラフの線の種類
linestyles = ['-', '--', ':']

"""""""""""""""""""""""""""""""""""""""""""""""""""
関数名:E(Xf, g = lambda x: x)
機 能:確率変数(確率変数の関数)の期待値を返す
引 数:確率変数と確率関数X(タプル)
       確率変数Xの関数g(初期値:恒等関数)
戻り値:期待値
"""""""""""""""""""""""""""""""""""""""""""""""""""

def E(Xf, g = lambda x: x):
    X = Xf[0]    # 確率変数
    f = Xf[1]    # 確率関数
    
    expection = np.sum([g(x_k) * f(x_k) for x_k in X])
    
    return expection

"""""""""""""""""""""""""""""""""""""""""""""""""""
関数名:V(Xf, g = lambda x: x)
機 能:確率変数(確率変数の関数)の分散を返す
引 数:確率変数と確率関数X(タプル)
       確率変数Xの関数g(初期値:恒等関数)
戻り値:分散
"""""""""""""""""""""""""""""""""""""""""""""""""""

def V(Xf, g = lambda x: x):
    X = Xf[0]    # 確率変数
    f = Xf[1]    # 確率関数
    expection = E(Xf, g)
    
    variance = np.sum([(g(x_k) - expection)**2 * f(x_k) for x_k in X])
    
    return variance

"""""""""""""""""""""""""""""""""""""""""""""""""""
関数名:check_prob(Xf)
機 能:確率変数が確率の性質を満たしているかを確認する
引 数:確率変数と確率関数(タプル)
戻り値:なし
"""""""""""""""""""""""""""""""""""""""""""""""""""

def check_prob(Xf):
    X = Xf[0]    # 確率変数
    f = Xf[1]    # 確率関数
    
    prob = np.array([f(x_k) for x_k in X])
    assert np.all(prob >= 0), '負の確率があります'
    
    prob_sum = np.round(np.sum(prob), 6)
    assert prob_sum == 1, f'確率の和が{prob_sum}になりました'

    print(f'期待値は{E(Xf):.4}')
    print(f'分散は{V(Xf):.4}')

"""""""""""""""""""""""""""""""""""""""""""""""""""
関数名:plot_prob(Xf)
機 能:確率関数と期待値を図示する
引 数:確率変数と確率関数X(タプル)
戻り値:なし
"""""""""""""""""""""""""""""""""""""""""""""""""""

def plot_prob(Xf):
    X = Xf[0]    # 確率変数
    f = Xf[1]    # 確率関数
    prob = np.array([f(x_k) for x_k in X])

    fig = plt.figure(figsize = (10, 6))
    ax  = fig.add_subplot(1, 1, 1)

    # 棒グラフ
    ax.bar(X, prob, label = 'prob', color = '#006C4F')
    
    # 縦線
    ax.vlines(E(Xf), 0, 1, label = 'expection', color = '#ee7800')

    # グラフ設定
    ax.set_xticks(np.append(X, E(Xf))) # x目盛値
#   ax.set_ytickx()                    # y目盛値  
#   ax.set_xlim()                      # x軸の範囲
    ax.set_ylim(0, prob.max() * 1.2)   # y軸の範囲
#   ax.xlabel()                        # x軸ラベル
#   ax.ylabel()                        # y軸ラベル    
    ax.legend()                        # 凡例

    # 描画
    plt.show()

ベルヌーイ分布の期待値

E[X]X期待値

E[X] = p

ベルヌーイ分布の分散

V[X]X分散

V[X] = p(1 - p)

ベルヌーイ分布の確率母関数

G(s) = E[s^X]X確率母関数

\begin{alignat*}{2} G(s) &= E[s^X] \\ &= ps + (1 - p) \end{alignat*}

参考資料

\bf{\textcolor{red}{記事が役に立った方は「いいね」を押していただけると、すごく喜びます \ 笑}}
ご協力のほどよろしくお願いします。

Discussion