メインコンテンツへスキップ
見出し画像

書記が数学やるだけ#587 ベータ二項モデルのベイズ統計

    実際に ベータ二項モデルで実践してみる。


    問題

    1回も当たりが出なかったからといって,当たりくじはないと断言できるのか?

    スクリーンショット 2022-10-05 8.07.52


    説明

    スクリーンショット 2022-10-05 8.08.37


    解答

    標本データしか考慮しない最尤推定量では当然0になるが,事前分布を考慮することで〜5%くらいであると予測できる。

    数学やるだけ解答#587_page-0001


    実装例を以下に示す。今回はPyMC3をメインに用いる(注意:可視化にはArviZを用いることがある)。

    import pymc3 as pm
    import arviz as az
    import numpy as np
    import scipy.stats as stats
    import matplotlib.pyplot as plt
    plt.style.use('seaborn-darkgrid')


    ベータ分布のグラフを示す。事前分布に比べ,事後分布では下方修正されていることもわかる。

    #ベータ分布(青:事前分布,赤:事後分布)
    x = np.linspace(0, 1, 1000)
    f, ax = plt.subplots(sharex=True, sharey=True)
    a = 2
    b1 = 20
    b2 = 40
    y1 = stats.beta(a, b1).pdf(x)
    y2 = stats.beta(a, b2).pdf(x)
    
    ax.plot(x, y1)
    ax.set_xlim([0,0.25])
    ax.legend(fontsize=12)
    
    ax.plot(x, y2)
    ax.set_xlim([0,0.25])
    ax.legend(fontsize=12)
    
    plt.figure()
    画像4


    実際にモデルを構築していく。

    #くじ引き,20回引いて当たりは0回
    data = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    
    #ベータ二項モデル
    with pm.Model() as model:
       #一様事前分布
       theta = pm.Beta('theta', alpha=2, beta=20)
       #標本
       y = pm.Bernoulli('y', p=theta, observed=data)
       #サンプリング
       trace = pm.sample(1000)


    結果の要約を示す。

    az.summary(trace)
    スクリーンショット 2022-10-05 8.22.06


    いくつかあるプロットで,最も重要なトレースプロットを可視化する。

    az.plot_trace(trace)
    plt.figure()
    画像6


    事後分布の計算結果を示す。ベイズ統計の利点の一つとして,確率分布を直接推測することができることがあげられる。ただその解釈をするのが容易でない難点も含む。

    az.plot_posterior(trace)
    画像7


    本記事のもくじはこちら:


    あなたへのおすすめ