サイトマップ

Pythonで学ぶ! ベイズ統計 第4回

Pythonで学ぶ! ベイズ統計 第4回

ここまでは、ベイズの定理と、ベイズ更新の例を紹介した
今回は、ベイズ統計の肝になる「確率分布」を紹介する
後半のPyMC3を使ってMCMCを使う上でもある程度の知識は必要

ポワソン分布

 \displaystyle
f(x | \lambda) = \frac{\lambda ^x e^{-\lambda}}{x!}

変数が x、パラメータが \lambda の分布になる

特徴としては、
- 平均値が  \lambda
- 分散も  \lambda

使用用途としては、「個数」のカウントによく使われる
もともとが2項分布の確率から来ているらしく
「コインを10個投げて表の出る個数」とか、
「1万回に1回事故が起こる交差点に合計1000台の車が通った場合に何回事故が起こるか」
といった、「個々の事象の発生確率」と「合計の試行回数」から「発生回数の確率分布」を得る場合に使用される模様
そのため、変数 xは0、または、正の整数になる

グラフで表現すると下図になる

import matplotlib.pyplot as plt
import numpy as np

from scipy import stats

lambda_ = 1.6
x = np.arange(10)
data = stats.poisson.pmf(x, lambda_)

fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111)
ax.plot(x, data, 'o-')
ax.set_xlim(-0.5, 9.5)
ax.grid()

乱数で生成すると下図になる

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

lambda_ = 1.6
np.random.seed(1)
data = pd.Series(np.random.poisson(lambda_, size=1000))

fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111)
data.plot(ax=ax, kind="hist", density=True, bins=10, range=[-0.5, 9.5], rwidth=0.6, alpha=0.5)
ax.set_xlim(-0.5, 9.5)
ax.grid()

ガンマ分布

 \displaystyle
g(x | \alpha, \beta) = \frac{\beta ^{\alpha} x^{\alpha - 1} e^{- \beta x}}{\Gamma(\alpha)}

変数が x、パラメータが \alpha, \beta の分布になる

特徴としては、
- 平均値が  \alpha / \beta
- 分散も  \alpha / \beta ^2

使用用途としては、ポワソン分布の小数点バージョンのイメージ
先ほどのポワソン分布の \lambdaの分布などによく使われる
例えば、「ある交差点での年間の事故の回数の分布」はポワソンで表し、
「全国の交差点の年間の事故の平均回数( \lambda)の分布」をガンマ分布で表す、など

グラフで表現すると下図になる

import matplotlib.pyplot as plt
import numpy as np

from scipy import stats

x = np.arange(0, 10, step=0.01)

fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111)
data = stats.gamma.pdf(x, 1.6, scale=1.0/1.0)
ax.plot(x, data, '-', label=r'$\alpha =1.6, \beta =1.0$')
data = stats.gamma.pdf(x, 3.2, scale=1.0/1.0)
ax.plot(x, data, '-', label=r'$\alpha =3.2, \beta =1.0$')
data = stats.gamma.pdf(x, 1.6, scale=1.0/2.0)
ax.plot(x, data, '-', label=r'$\alpha =1.6, \beta =2.0$')
data = stats.gamma.pdf(x, 3.2, scale=1.0/2.0)
ax.plot(x, data, '-', label=r'$\alpha =3.2, \beta =2.0$')
ax.set_xlim(-0.5, 9.5)
ax.grid()
ax.legend()

乱数で生成すると下図になる

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

alpha = 1.6
beta = 1.0
np.random.seed(1)
data = pd.Series(np.random.gamma(alpha, scale=1.0/beta, size=1000))

fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111)
data.plot(ax=ax, kind="hist", density=True, bins=20, range=[-0.25, 9.75], rwidth=0.6, alpha=0.5)
data.plot(ax=ax, kind="kde", bw_method=0.3)
ax.set_xlim(-0.5, 9.5)
ax.grid()

参考文献

この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください