ブログ

Pythonを用いた二項分布の極限のプログラミング 〜ポアソンの小数の法則、中心極限定理 etc〜

数式だけの解説ではわかりにくい場合もあると思われるので、統計学の手法や関連する概念をPythonのプログラミングで表現します。当記事では二項分布の極限を取扱う際に出てくるポアソンの小数の法則と中心極限定理(Central Limit Theory)に関して取り扱います。

・Pythonを用いた統計学のプログラミングまとめ
https://www.hello-statisticians.com/stat_program

二項分布

問題設定と二項分布の確率関数

二項分布ではコイン投げのような2値を取るベルヌーイ試行を一定の確率$p$で$n$回繰り返しを行なった際に、確率pの事象が観測される回数を確率変数Xで表し、$X=k, k=0,1,2,…,n$の確率を考える。この確率関数を$P(X=k)$のように表すとき、$P(X=k)$は下記のような式で表すことができる。
$$
\large
\begin{align}
P(X=k) = {}_{n} C_{k} p^{k} (1-p)^{n-k}
\end{align}
$$

ベルヌーイ試行を確率$p$で$n$回繰り返す際に対応する二項分布は$Bin(n,p)$で表されることが多い。

確率分布の描画

$$
\large
\begin{align}
P(X=k) = {}_{n} C_{k} p^{k} (1-p)^{n-k}
\end{align}
$$
二項分布$Bin(n,p)$の確率関数は上記のように表される。式の形だけでは難しく見えるので以下具体的な$n$と$p$の値を元に二項分布の確率関数に基づく描画を行う。

import math
import numpy as np
import matplotlib.pyplot as plt

def comb(n,r):
    res = math.factorial(n)/(math.factorial(n-r)*math.factorial(r))
    return float(res)

n = np.array([10., 10., 10., 20.])
p = np.array([0.5, 0.1, 0.7, 0.5])

for i in range(n.shape[0]):
    x = np.arange(0,n[i]+1,1)
    y = np.zeros(n[i]+1)
    for j in range(x.shape[0]):
        y[j] = comb(n[i],j) * p[i]**j * (1-p[i])**(n[i]-j)
    plt.subplot(2,2,i+1)
    plt.title("(n,p): ({:.0f},{:.1f})".format(n[i],p[i]))
    plt.bar(x,y,color="limegreen")

plt.show()

・実行結果

二項分布の確率分布は上記のように描画を行うことができる。二項分布では確率変数$X$に対して$E[X]=np$が成立するが、どの分布でも$np$が概ね平均を表すであろうことは読み取れる。$p$を大きくするにつれて平均が右にシフトすることもわかる。

また、$n$の数が大きくなると確率変数の取りうる範囲が大きくなることもわかる。当記事では$n$の極限を考えるので、右下の図で表したように$n$が大きくなると確率変数の取り得る値が多くなり、取り扱いが段々と難しくなることは抑えておくと良い。

ポアソンの小数の法則

問題設定

基本的には「二項分布」で取り扱った問題設定と同様だが、$n=1000, p=0.002$のように$n$が大きい一方で$p$が小さい分布に関して考える。ここで$np$を概ね一定とみなし、$\lambda=np$とおく。

二項分布を用いる際の課題

$n=1000, p=0.002$の際の二項分布に関して考える。二項分布の基本的な考え方に基づいて考えると、確率変数$X$に対して$0$〜$1000$の値を考えれば良いので、以下この考え方に基づいて計算を行う。

import math
import numpy as np
import matplotlib.pyplot as plt

def comb(n,r):
    res = math.factorial(n)/(math.factorial(n-r)*math.factorial(r))
    return float(res)

n = 1000
p = 0.002

x = np.arange(0,n+1,1)
y = np.zeros(n+1)
display_num = np.array([10,20,50,100])

# 計算に時間がかかる場合はnを小さく変更してください
for i in range(x.shape[0]):
    y[i] = comb(n,i) * p**i * (1-p)**(n-i)

for i in range(4):
    plt.subplot(2,2,i+1)
    plt.title("X: 0-{:.0f}".format(display_num[i]))
    plt.bar(x[:(display_num[i]+1)],y[:(display_num[i]+1)],color="limegreen")

plt.show()

・実行結果

実行結果より、大半の確率が$X=0$から$X=10$までに対応することが読み取れる。これは$E[X]=np=2$であることからも理解することができる。display_numで表示する変数の数を切り替えることで、$X=0$から$X=10$に確率が偏ることが理解しやすいと思われる。

また、計算にあたっては$1000$乗を計算していることで計算負荷が大きくなったり、桁数のエラーなどが生じたりする場合がある。このように$n$が大きくなるにつれて二項分布をそのまま用いるだけでは計算が多い一方で得るものが少ない。

このような二項分布の課題に対し、考えられたのが「ポアソンの小数の法則」に基づいて導出される「ポアソン分布」である。次項で「ポアソン分布」を用いた「二項分布の近似」とその誤差に関して確認を行う。

ポアソン分布の描画と二項分布との近似誤差

前項では$n=1000, p=0.002$のように$n$が大きい一方で$p$が小さい場合に二項分布の取り扱いにおける課題の確認を行なった。この解決にあたっては「ポアソンの小数の法則」に基づく「ポアソン分布」が用いられることが多い。
$$
\large
\begin{align}
P(X=k) &= \frac{\lambda^{k} e^{-\lambda}}{k!} \\
\lambda &= np
\end{align}
$$
「ポアソン分布」の確率関数は上記のように表される。

「ポアソンの小数の法則」を用いた導出に関しては「ポアソン分布の演習」で詳しく取り扱ったのでここでは省略し、ポアソン分布の描画を行う。

import math
import numpy as np
import matplotlib.pyplot as plt

n, p = 1000, 0.002
lamb = n*p

x = np.arange(0,11,1)
y = np.zeros(11)

for i in range(x.shape[0]):
    y[i] = lamb**i * np.e**(-lamb) / math.factorial(i)

plt.bar(x,y,color="limegreen")
plt.show()

・実行結果

実行結果を確認すると、二項分布と概ね同様の結果が得られることが確認できる。以下、近似にあたっての誤差に関して確認を行う。

import math
import numpy as np
import matplotlib.pyplot as plt

def comb(n,r):
    res = math.factorial(n)/(math.factorial(n-r)*math.factorial(r))
    return float(res)

n, p = 1000, 0.002
lamb = n*p

x = np.arange(0,n+1,1)
y_bin, y_poisson = np.zeros(n+1), np.zeros(n+1)

# 計算に時間がかかる場合はnを小さく変更してください
for i in range(x.shape[0]):
    y_bin[i] = comb(n,i) * p**i * (1-p)**(n-i)
    y_poisson[i] = lamb**i * np.e**(-lamb) / math.factorial(i)

y_diff = y_bin - y_poisson

print(np.sum(np.abs(y_diff)))

plt.plot(x[:21],y_diff[:21])
plt.plot(x[:21],np.zeros(21))
plt.show()

・実行結果

> print(np.sum(np.abs(y_diff)))
0.000903440009195

上記の結果より、誤差の絶対値の和が全確率の$1$の$0.09$%に対応することが確認できる。

中心極限定理

問題設定

基本的には「二項分布」で取り扱った問題設定と同様だが、$n=1000, p=0.3$のように$n$が大きい場合かつ、「ポアソン分布」の問題設定ほど$p$が小さくない場合を考える。

二項分布を用いる際の課題

$n=1000, p=0.3$の際の二項分布に関して考える。二項分布の基本的な考え方に基づいて考えると、確率変数$X$に対して$0$〜$1000$の値を考えれば良いので、以下この考え方に基づいて計算を行う。

import math
import numpy as np
import matplotlib.pyplot as plt

def comb(n,r):
    res = math.factorial(n)/(math.factorial(n-r)*math.factorial(r))
    return float(res)

n = 1000
p = 0.3

x = np.arange(0,n+1,1)
y = np.zeros(n+1)

# 計算に時間がかかる場合はnを小さく変更してください
for i in range(x.shape[0]):
    y[i] = comb(n,i) * p**i * (1-p)**(n-i)

plt.bar(x[280:320],y[280:320],color="limegreen")
plt.show()

・実行結果

実行結果を確認すると、概ね正規分布のような形状をしていることが確認できる。実際の取り扱いではここで中心極限定理を考えることにより、$N(np,\sqrt{np(1-p)})$で近似することが多い。次項で「正規分布」を用いた「二項分布の近似」とその誤差に関して確認を行う。

正規分布の描画と二項分布との近似誤差

前項では$n=1000, p=0.3$のように$n$が大きい場合の二項分布の取り扱いにおける課題の確認を行なった。この解決にあたっては「中心極限定理」に基づいて「正規分布」が用いられることが多い。以下では離散型の確率変数に対応して正規分布の累積分布関数より二項分布の近似を考える。

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

n, p = 1000, 0.3
lamb = n*p

x = np.arange(0,1000+1,1)
y = np.zeros(1000+1)

for i in range(x.shape[0]):
    y[i] = stats.norm.cdf(i+0.5,loc=n*p,scale=np.sqrt(n*p*(1-p))) - stats.norm.cdf(i-0.5,loc=n*p,scale=np.sqrt(n*p*(1-p)))

plt.bar(x[280:320],y[280:320],color="limegreen")
plt.show()

・実行結果

実行結果を確認すると、二項分布と概ね同様の結果が得られることが確認できる。途中の計算にあたっては連続修正の考えに基づき、stats.norm.cdf(i+0.5)-stats.norm.cdf(i-0.5)の計算を行なった。以下、近似にあたっての誤差に関して確認を行う。

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

def comb(n,r):
    res = math.factorial(n)/(math.factorial(n-r)*math.factorial(r))
    return float(res)

n, p = 1000, 0.3
lamb = n*p

x = np.arange(0,n+1,1)
y_bin, y_norm = np.zeros(n+1), np.zeros(n+1)

# 計算に時間がかかる場合はnを小さく変更してください
for i in range(x.shape[0]):
    y_bin[i] = comb(n,i) * p**i * (1-p)**(n-i)
    y_norm[i] = stats.norm.cdf(i+0.5,loc=n*p,scale=np.sqrt(n*p*(1-p))) - stats.norm.cdf(i-0.5,loc=n*p,scale=np.sqrt(n*p*(1-p)))

y_diff = y_bin - y_norm

print(np.sum(np.abs(y_diff)))

plt.plot(x[220:380],y_diff[220:380])
plt.plot(x[220:380],np.zeros(380-220))
plt.show()

・実行結果

> print(np.sum(np.abs(y_diff)))
0.00694647548049

上記の結果より、誤差の絶対値の和が全確率の$1$の$0.6$%に対応することが確認できる。

・参考
連続修正(continuity correction)

「統計学実践ワークブック」 演習問題etc Ch.7 「極限定理、漸近理論」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.$7$の「極限定理、漸近理論」に関して演習問題を中心に解説を行います。統計学の基盤である極限定理や漸近理論はよく出てくる一方で抽象的で難しいので演習を通して抑えておくと良いと思います。

本章のまとめ

確率収束の定義

$$
\large
\begin{align}
\lim_{n \to \infty} P(|X_n-Y|>\epsilon)=0
\end{align}
$$
上記が任意の$\epsilon$に対して成立するとき、${X_n}$が$Y$に確率収束(convergence in probability)すると定義する。概収束する際や平均二乗収束する際は必ず確率収束するので、必要条件のように考えられることは抑えておくと良い。

確率収束は概収束などに比較して数学的に取り扱いがしやすいと言われている。

大数の法則、中心極限定理

確率変数列$X_1, X_2, …, X_n$が$X_1, X_2, …, X_n \sim N(\mu,\sigma^2), i.i.d.$であるとき、標本平均を$\bar{X}_n$のように定める。

このとき中心極限定理(CLT; Central Limit Theorem)より、$\sqrt{n}(\bar{X}_n-\mu)$は$N(0, \sigma^2)$に分布収束すると考えることができる。

デルタ法

確率変数列$X_1, X_2, …, X_n$が$X_1, X_2, …, X_n \sim N(\mu,\sigma^2), i.i.d.$であるとき、$X_1, X_2, …, X_n$の標本平均を$\bar{X}_n$のように定める。

この際にある関数$f$に関して$\sqrt{n}(f(\bar{X}_n)-f(\mu))$の分布の収束先を考えるとき、$f(x)$が連続微分可能であればテイラーの定理より、下記のような近似を行うことができる。
$$
\large
\begin{align}
f(\bar{X}_n)-f(\mu) \simeq f'(\mu)(\bar{X}_n-\mu)
\end{align}
$$

上記に対して中心極限定理を用いることで、$\sqrt{n}(f(\bar{X}_n)-f(\mu))$が$N(0, f'(\mu)^2 \sigma^2)$に分布収束すると考えることができる。この手法をデルタ法(delta method)と呼ぶ。

演習問題解説

例7.1

$X_1,X_2,…,X_n \sim U(0,1)$より、$X_1,…,X_n$に関する大数の法則に基づいて$\displaystyle \frac{1}{n}(X_1+X_2+…+X_n)$は$\displaystyle \frac{1}{2}$に確率収束する。

よって、その平方根である$\displaystyle Z_n = \sqrt{\frac{1}{n}(X_1+X_2+…+X_n)}$は$\displaystyle \frac{1}{\sqrt{2}}$に確率収束する。

例7.2

$$
\large
\begin{align}
G(x) &= 1 \quad (x \geq 0) \\
&= 0 \quad (x < 0)
\end{align}
$$
$X_n$は上記のような$0$に集中した1点分布に分布収束する。

例7.3

$$
\large
\begin{align}
P(M_n \leq x) = \prod_{i=1}^{n} P(X_i \leq x) = (1-e^{-x})^n
\end{align}
$$

上記の式の右辺に対して$x = y + \log{n}$とおくと、下記のように変形を行うことができる。
$$
\large
\begin{align}
(1-e^{-x})^n &= (1-e^{-(y + \log{n})})^n \\
&= (1-e^{-y} e^{\log{1/n}})^n \\
&= \left( 1 – \frac{e^{-y}}{n} \right)^n \\
&= \left( \left( 1 – \frac{e^{-y}}{n} \right)^{-n/e^{-y}} \right)^{-e^{-y}} \\
& \to e^{-e^{-y}}
\end{align}
$$

上記はガンベル分布(Gumbel distribution)の分布であるので、$M_n – \log{n}$の分布はガンベル分布に収束すると考えることができる。

例7.4

$f(x)=x^2$とおき、デルタ法を適用することを考える。$f'(x)=2x$より、$\sqrt{n}(\bar{X}_n^2-\mu^2) = \sqrt{n}(f(\bar{X}_n)-f(\mu)) \simeq \sqrt{n}f'(\mu)(\bar{X}_n-\mu)$は$N(0,(2\mu)^2 \sigma^2)$に分布収束すると考えられる。

例7.5

連続写像定理より$X_n^2+Y_n^2$は自由度$2$の$\chi^2$分布$\chi^2(2)$に分布収束する。

問7.1

数字の$3$が出る回数を確率変数$X$で表すことを考える。このとき、$3$が$10$回以上現れる確率は$P(X \leq 10)$で表すことができるが、連続修正より$P(X \leq 9.5)$のように置き換えて考える。

また、$1$回の試行に対応する確率変数を$X_k$とおくとき、$X_k$に対応する期待値$E[X_k]$と分散$V[X_k]$は下記のように計算できる。
$$
\large
\begin{align}
E[X_k] &= \frac{1}{6} \\
V[X_k] &= \frac{1}{6} \left( 1-\frac{1}{6} \right)^2 + \frac{5}{6} \left( 0-\frac{1}{6} \right)^2 \\
&= \frac{25+5}{36 \times 6} = \frac{5}{36}
\end{align}
$$

ここで$\Phi(z)$を標準正規分布の累積分布関数と定義し、$P(X \geq 9.5)$に関して中心極限定理を適用することを考える。
$$
\large
\begin{align}
P(X \geq 9.5) &= P \left( \frac{X-E[X]}{\sqrt{V[X]}} \geq \frac{9.5-E[X]}{\sqrt{V[X]}} \right) \\
&= P \left( \frac{X-nE[X_k]}{\sqrt{n V[X_k]}} \geq \frac{9.5-n E[X_k]}{\sqrt{n V[X_k]}} \right) \\
&= P \left( Z \geq \frac{9.5-5}{\sqrt{25/6}} \right) \\
&= P(Z \geq 2.2) \\
& \simeq 1 – \Phi(2.2) \\
& \simeq 0.014
\end{align}
$$

ここで連続修正を行わなかった場合は$P(X \geq 10) \simeq P(Z \geq 2.45) = 0.0071$となるなど、値が大きく変わることにも注意しておくと良い。

・参考
中心極限定理の概要、応用、導出
https://www.hello-statisticians.com/explain-terms-cat/clt1.html

問7.2

$[1]$
中心極限定理より、$\displaystyle \sqrt{n}(\bar{X}_n-\mu)/\sigma$は標準正規分布$N(0,1)$に分布収束する。

$[2]$
$f(x)=x^3$とおき、デルタ法を適用することを考える。$f'(x)=3x^2$より、$\sqrt{n}(\bar{X}_n^3-\mu^3) = \sqrt{n}(f(\bar{X}_n)-f(\mu)) \simeq \sqrt{n}f'(\mu)(\bar{X}_n-\mu)$は$N(0,(3\mu^2)^2 \sigma^2)=N(0,9\mu^4 \sigma^2)$に分布収束すると考えられる。

$[3]$
$[1]$より、$\displaystyle \sqrt{n}(\bar{X}_n-\mu)/\sigma$は標準正規分布$N(0,1)$に分布収束する。よってその二乗である$\displaystyle (\sqrt{n}(\bar{X}_n-\mu)/\sigma)^2$は自由度$1$の$\chi^2$分布に分布収束する。

参考

・準$1$級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

「統計学実践ワークブック」 演習問題etc Ch.28 「分割表」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.28の「分割表」に関して演習問題を中心に解説を行います。分割表に対して実施する適合度$\chi^2$検定・尤度比検定やフィッシャーの正確検定など様々な手法があるので、演習を通して抑えておくと良いと思います。

本章のまとめ

演習問題解説

例28.1

下記を実行することでフィッシャーの正確検定を行うことができる。

import math

def comb(n,r):
    res = math.factorial(n)/(math.factorial(n-r)*math.factorial(r))
    return float(res)

all_x_11 = [2, 3, 4, 5, 6, 7]
p_x = []
for x_11 in all_x_11:
    p = comb(9,x_11)*comb(5,7-x_11)/comb(14,7)
    print("P(X_11={:.0f}): {:.5f}".format(x_11,p))
    p_x.append(p)

P_value = p_x[-1]+p_x[-2]
print("P(X_11>5): {:.3f}".format(P_value))

if P_value<0.05:
    print("P_value: {:.3f}, reject H_0.".format(P_value))
else:
    print("P_value: {:.3f}, accept H_0.".format(P_value))

・実行結果

P(X_11=2): 0.01049
P(X_11=3): 0.12238
P(X_11=4): 0.36713
P(X_11=5): 0.36713
P(X_11=6): 0.12238
P(X_11=7): 0.01049

P(X_11>5): 0.133
P_value: 0.133, accept H_0.

問28.1

$$
\large
\begin{align}
\frac{\eta_1/(1-\eta_1)}{\eta_2/(1-\eta_2)} &= \frac{P(A_1|B_1)/P(A_2|B_1)}{P(A_1|B_2)/P(A_2|B_2)} = \frac{P(B_1|A_1)/P(B_2|A_1)}{P(B_1|A_2)/P(B_2|A_2)} \\
&= \frac{\theta_1/(1-\theta_1)}{\theta_2/(1-\theta_2)} = \psi
\end{align}
$$

上記に基づいて考えることで、③が正しいことがわかる。

問28.2

下記を実行することで、それぞれ計算を行うことができる。

import numpy as np
from scipy import stats

observed = np.array([[4., 6.], [8., 30.]])
expected = np.array([[np.sum(observed,axis=0)[0]*np.sum(observed,axis=1)[0]/np.sum(observed), np.sum(observed,axis=0)[1]*np.sum(observed,axis=1)[0]/np.sum(observed)], [np.sum(observed,axis=0)[0]*np.sum(observed,axis=1)[1]/np.sum(observed), np.sum(observed,axis=0)[1]*np.sum(observed,axis=1)[1]/np.sum(observed)]])

chi2 = np.sum((observed-expected)**2/expected)
G2 = 2*np.sum(observed*np.log(observed/expected))
log_OR = np.log(observed[0,0]*observed[1,1]/(observed[0,1]*observed[1,0]))

print("・chi^2")
if chi2 < stats.chi2.ppf(1.-0.05,1):
    print("chi^2: {:.3f}, accept H_0".format(chi2))
else:
    print("chi^2: {:.3f}, reject H_0".format(chi2))

print("・G^2")
if G2 < stats.chi2.ppf(1.-0.05,1):
    print("G^2: {:.3f}, accept H_0".format(G2))
else:
    print("G^2: {:.3f}, reject H_0".format(G2))

OR_std = np.sqrt(1./observed[0,1]+1./observed[1,0]+1./observed[0,0]+1./observed[1,1])
print("・OR 95%-Interval")
print("OR 95%-Interval: [{:.3f}, {:.2f}]".format(np.exp(log_OR-stats.norm.ppf(1.-0.025)*OR_std),np.exp(log_OR+stats.norm.ppf(1.-0.025)*OR_std)))

・実行結果

・chi^2
chi^2: 1.516, accept H_0
・G^2
G^2: 1.410, accept H_0
・OR 95%-Interval
OR 95%-Interval: [0.566, 11.05]

問28.3

$[1]$
4つの頂点の中には連結が一切ないものは存在しないので、独立な因子は存在しないと言える。

$[2]$
AとCはBで分離されるので、Bを条件付けた際にAとBは条件付き独立である。

参考

・準1級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

Pythonを用いたベイズ法のプログラミング 〜事後分布、ベイズ推定量、予測分布 etc〜

数式だけの解説ではわかりにくい場合もあると思われるので、統計学の手法や関連する概念をPythonのプログラミングで表現します。当記事ではベイズ法の理解にあたって、共役事前分布などを用いて得た事後分布の描画やそれに基づくベイズ推定量、MAP推定量の値の確認を行います。

・Pythonを用いた統計学のプログラミングまとめ
https://www.hello-statisticians.com/stat_program

共役事前分布と事後分布を用いた推定

二項分布とベータ分布

ベータ分布の関数形

$$
\large
\begin{align}
f(x|a,b) &= \frac{1}{B(a,b)} x^{a-1} (1-x)^{b-1}, \quad 0 \leq x \leq 1 \\
B(a,b) &= \int_{0}^{1} x^{a-1} (1-x)^{b-1} dx
\end{align}
$$

ベータ分布$Be(a,b)$を考える際、確率密度関数は上記で表されるが、$\displaystyle B(a,b) = \frac{\gamma(a)\gamma(b)}{\gamma(a+b)}$のように考えることができるので、$a, b$が整数の時は$x^{a-1} (1-x)^{b-1}$の形状を中心に確認すれば良い。

以下、Pythonを用いて$x^{a-1} (1-x)^{b-1}$の形状や$\displaystyle \frac{1}{B(a,b)} = \frac{\gamma(a+b)}{\gamma(a)\gamma(b)}$の値の推移の確認を行う。

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

a, b = np.array([1, 1, 3, 5, 10]), np.array([1, 3, 1, 5, 10])
x = np.arange(0., 1.01, 0.01)
y = np.zeros([x.shape[0], a.shape[0]])
for i in range(a.shape[0]):
    y[:,i] = (math.factorial(a[i]+b[i]-1)/(math.factorial(a[i]-1)*math.factorial(b[i]-1))) * x**(a[i]-1) * (1-x)**(b[i]-1)
    plt.plot(x,y[:,i],label="(a,b): ({:.0f},{:.0f})".format(a[i],b[i]))
    print("1/B({},{}): {}".format(a[i],b[i],math.factorial(a[i]+b[i]-1)/(math.factorial(a[i]-1)*math.factorial(b[i]-1))))

plt.legend()
plt.show()

・実行結果

1/B(1,1): 1
1/B(1,3): 3
1/B(3,1): 3
1/B(5,5): 630
1/B(10,10): 923780

・参考
ベータ分布の定義と期待値・分散の計算

SciPyを用いたベータ分布の取り扱い

前項のように数式に基づいてベータ分布の作成を行うこともできるが、scipy.stats.betaを用いることで、ベータ分布に関して以下のように取り扱いを行うことも可能である。

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

a, b = np.array([1, 1, 3, 5, 10]), np.array([1, 3, 1, 5, 10])
x = np.arange(0., 1.01, 0.01)
y = np.zeros([x.shape[0], a.shape[0]])

for i in range(a.shape[0]):
    y[:,i] = stats.beta.pdf(x, a[i], b[i])
    plt.plot(x,y[:,i],label="(a,b): ({:.0f},{:.0f})".format(a[i],b[i]))

plt.legend()
plt.show()

・実行結果

scipy.stats.betaを用いることで、前項と同様の結果が得られることを確認しておくと良い。

事後分布とベイズ推定・MAP推定

$n$回のベルヌーイ試行のうち、確率$p$の事象が観測された回数を$x$とおくと、事前分布$Be(a,b)$からは事後分布$Be(a+x,b+n-x)$が得られる。
$$
\large
\begin{align}
\hat{p}_{B} &= E[X] \\
&= \frac{a}{a+b} \\
\hat{p}_{MAP} &= \frac{a-1}{a+b-2}
\end{align}
$$

ここでベータ分布$Be(a,b)$に基づくイズ推定量を$\hat{p}_{B}$、MAP推定量を$\hat{p}_{MAP}$は上記のように表せることから、事後分布$Be(a+x,b+n-x)$に基づくベイズ推定量$\hat{p}_{B}$、MAP推定量$\hat{p}_{MAP}$は、それぞれ下記のように計算できる。
$$
\large
\begin{align}
\hat{p}_{B} &= E[X] \\
&= \frac{a+x}{a+x+b+n-x} \\
&= \frac{a+x}{a+b+n} \\
\hat{p}_{MAP} &= \frac{a+x-1}{a+x+b+n-x-2} \\
&= \frac{a+x-1}{a+b+n-2}
\end{align}
$$

上記を元に、いくつかの$Be(a+x,b+n-x)$のパターンに対して、事後分布と$\hat{p}_{B}, \hat{p}_{MAP}$の確認を行う。

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

a, b = np.array([3., 2., 2., 5., 10., 10.]), np.array([2., 5., 10., 5., 20., 50.])
x = np.arange(0., 1.01, 0.01)
y = np.zeros([x.shape[0], a.shape[0]])

for i in range(6):
    y[:,i] = stats.beta.pdf(x, a[i], b[i])
    plt.subplot(2,3,i+1)
    plt.plot(x,y[:,i],color="green")
    plt.plot(np.repeat(a[i]/(a[i]+b[i]),20),np.linspace(0,stats.beta.pdf(a[i]/(a[i]+b[i]), a[i], b[i])-0.01,20),"b--", label="p_B")
    plt.plot(np.repeat((a[i]-1.)/(a[i]+b[i]-2.),20),np.linspace(0,stats.beta.pdf((a[i]-1.)/(a[i]+b[i]-2.), a[i], b[i])-0.01,20),"r--", label="p_B")
    plt.title("a+x={}, b+n-x={}".format(a[i],b[i]))
    plt.legend(loc=4)

plt.show()

・実行結果

$a=1, b=1$の一様分布などを事前分布に考えるとき、上記の結果より、観測サンプルが多くなるにつれて推定結果が$x/n$に収束していくことが確認できる。また、ベイズ推定量とMAP推定量はそれぞれの推定値が$0.5$より大きいか小さいかによってどちらの推定値が大きいかが定まることも読み取れる。

ポアソン分布とガンマ分布

ガンマ分布の関数形

$$
\large
\begin{align}
f(x|\nu,\alpha) &= \frac{1}{\gamma(\nu) \alpha^{\nu}} x^{\nu-1} e^{-\frac{x}{\alpha}}, \quad 0 \leq x \\
\gamma(\nu) &= \frac{1}{\alpha^{\nu}} \int_{0}^{\infty} x^{\nu-1} e^{-\frac{x}{\alpha}} dx
\end{align}
$$

ガンマ分布$Ga(\nu,\alpha)$を考える際、確率密度関数は上記で表されるが、$\gamma(\nu), \alpha^{\nu}$は確率分布の規格化定数なので、$\displaystyle x^{\nu-1} e^{-\frac{x}{\alpha}}$の形状を中心に確認すれば良い。

以下、Pythonを用いて$\displaystyle x^{\nu-1} e^{-\frac{x}{\alpha}}$の形状や$\gamma(\nu), \alpha^{\nu}$の値の推移の確認を行う。

import math
import numpy as np
import matplotlib.pyplot as plt

nu, alpha = np.array([1, 2, 5, 10, 2]), np.array([1, 1, 1, 1, 2])
x = np.arange(0., 10.1, 0.1)
y = np.zeros([x.shape[0], nu.shape[0]])

for i in range(nu.shape[0]):
    y[:,i] =  x**(nu[i]-1) * np.e**(-x/alpha[i]) / (math.factorial(nu[i]-1)*alpha[i]**nu[i])
    plt.plot(x,y[:,i],label="(nu,alpha): ({:.0f},{:.0f})".format(nu[i],alpha[i]))
    print("gamma({}): {}, alpha^{}: {}".format(nu[i],math.factorial(nu[i]-1),alpha[i],alpha[i]**nu[i]))

plt.legend()
plt.show()

・実行結果

gamma(1): 1, alpha^1: 1
gamma(2): 1, alpha^1: 1
gamma(5): 24, alpha^1: 1
gamma(10): 362880, alpha^1: 1
gamma(2): 1, alpha^2: 4

・参考
ガンマ分布の定義と期待値・分散の計算

SciPyを用いたガンマ分布の取り扱い

前項のように数式に基づいてガンマ分布の作成を行うこともできるが、scipy.stats.gammaを用いることで、ガンマ分布に関して以下のように取り扱いを行うことも可能である。

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

nu, alpha = np.array([1., 2., 5., 10., 2.]), np.array([1., 1., 1., 1., 2.])
x = np.arange(0., 10.1, 0.1)
y = np.zeros([x.shape[0], nu.shape[0]])

for i in range(nu.shape[0]):
    y[:,i] = stats.gamma.pdf(x, a=nu[i], scale=alpha[i])
    plt.plot(x,y[:,i],label="(nu,alpha): ({:.0f},{:.0f})".format(nu[i],alpha[i]))

plt.legend()
plt.show()

・実行結果

scipy.stats.gammaを用いることで、前項と同様の結果が得られることを確認しておくと良い。

事後分布とベイズ推定・MAP推定

平均を表すパラメータが$\lambda$のポアソン分布に従い、$x_1,x_2,…,x_n$が観測されたとき、事前分布$Ga(\nu,1/\beta)$からは事後分布$\displaystyle Ga(\nu+\sum_{i=1}^{n}x_i,1/(\beta+n))$が得られる。
$$
\large
\begin{align}
\hat{p}_{B} &= E[X] \\
&= \frac{\nu}{\beta} \\
\hat{p}_{MAP} &= \frac{\nu-1}{\beta}
\end{align}
$$

ここでガンマ分布$Ga(\nu,1/\beta)$に基づくベイズ推定量を$\hat{p}_{B}$、MAP推定量を$\hat{p}_{MAP}$は上記のように表せることから、事後分布$\displaystyle Ga(\nu+\sum_{i=1}^{n} x_i,1/(\beta+n))$に基づくベイズ推定量$\hat{\lambda}_{B}$、MAP推定量$\hat{\lambda}_{MAP}$は、それぞれ下記のように計算できる。
$$
\large
\begin{align}
\hat{p}_{B} &= E[X] \\
&= \frac{\nu+\sum_{i=1}^{n} x_i}{\beta+n} \\
\hat{p}_{MAP} &= \frac{\nu+\sum_{i=1}^{n} x_i-1}{\beta+n}
\end{align}
$$

上記を元に、いくつかの$\displaystyle Ga(\nu+\sum_{i=1}^{n}x_i,1/(\beta+n))$のパターンに対して、事後分布と$\hat{\lambda}_{B}, \hat{\lambda}_{MAP}$の確認を行う。

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

nu, beta = np.array([2., 3., 5., 7., 5., 5.]), np.array([1., 1., 1., 1., 3., 5.])
alpha = 1./beta
x = np.arange(0., 10.1, 0.1)
y = np.zeros([x.shape[0], nu.shape[0]])

for i in range(6):
    y[:,i] = stats.gamma.pdf(x, a=nu[i], scale=alpha[i])
    plt.subplot(2,3,i+1)
    plt.plot(x,y[:,i],color="green")
    plt.plot(np.repeat(nu[i]/beta[i],20),np.linspace(0,stats.gamma.pdf(nu[i]/beta[i]-0.01,a=nu[i],scale=alpha[i]),20),"b--", label="lambda_B")
    plt.plot(np.repeat((nu[i]-1)/beta[i],20),np.linspace(0,stats.gamma.pdf((nu[i]-1)/beta[i]-0.01,a=nu[i],scale=alpha[i]),20),"r--", label="lambda_MAP")
    plt.title("nu+x_1+...+x_n={}, 1/(beta+n)=1/{:.0f}".format(nu[i],beta[i]))
    plt.legend(loc=4)

plt.show()

・実行結果

正規分布

Pythonを用いた自動微分のプログラミング 〜自動微分の基本処理・モジュール化、勾配法 etc〜

数式だけの解説ではわかりにくい場合もあると思われるので、統計学の手法や関連する概念をPythonのプログラミングで表現します。当記事では自動微分の理解にあたって、自動微分とそれに基づく勾配法、自動微分のモジュール化などのPythonでの実装を取り扱いました。

・Pythonを用いた統計学のプログラミングまとめ
https://www.hello-statisticians.com/stat_program

作成にあたっては「ゼロから作るDeepLearning③」を主に参考にしましたので、そちらも合わせて参照ください。

自動微分の基本処理

変数と関数のクラス化

自動微分を考えるにあたっては変数と関数のクラス化を行うと取り扱いやすい。変数と関数は下記のようにクラス化を行うことができる。

import numpy as np

class Variable:
    def __init__(self, data):
        self.data = data

class Function:
    def __call__(self, input):
        x = input.data
        y = self.forward(x)
        output = Variable(y)
        return output

    def forward(self, x):
        raise NotImplementedError()

class Square(Function):
    def forward(self, x):
        return x**2

x = Variable(np.array(10))
f = Square()
y = f(x)

print(type(y))
print(y.data)

・実行結果

> print(type(y))
<type 'instance'>
> print(y.data)
100

上記ではクラス化を行ったFunction関数を継承してSquareクラスを定義し、これを用いて$10$の$2$乗の計算を行った。SquareFunctionを継承するような構成は、関数の作成の仕方が色々とあるからだと理解することができる。

なお、記述量を減らし可読性を上げるにあたって、NumPyの読み込みやFunctionクラスとVariableクラスに関しては内容の変更がない限りは以下に記載を行うプログラムでは省略を行うこととする。

合成関数の順伝播の計算の作成

当項では前項の内容を元に合成関数の作成を行う。前項のSquareと同様にExpを定義し、$e^{-x^2}$の$x=1$における値の計算を行う。

class Square(Function):
    def forward(self, x):
        return x**2

class Exp(Function):
    def forward(self, x):
        return np.exp(x)

class Neg(Function):
    def forward(self, x):
        return -x

x = Variable(np.array(1))
f1 = Square()
f2 = Neg()
f3 = Exp()
y = f3(f2(f1(x)))

print("y.data: {:.3f}".format(y.data))
print("exp(-x^2): {:.3f}".format(np.exp(-1.**2)))

・実行結果

> print("y.data: {:.3f}".format(y.data))
y.data: 0.368
> print("exp(-x^2): {:.3f}".format(np.exp(-1.**2)))
exp(-x^2): 0.368

自動微分の計算

自動微分は合成関数の微分の考え方に基づく微分であり、下記のように計算できる。

class Variable:
    def __init__(self, data):
        self.data = data
        self.grad = None

class Function:
    def __call__(self, input):
        x = input.data
        y = self.forward(x)
        output = Variable(y)
        self.input = input
        return output

    def forward(self, x):
        raise NotImplementedError()

    def backward(self, x):
        raise NotImplementedError()

class Square(Function):
    def forward(self, x):
        return x**2

    def backward(self, gy):
        x = self.input.data
        gx = 2*x*gy
        return gx

class Exp(Function):
    def forward(self, x):
        return np.exp(x)

    def backward(self, gy):
        x = self.input.data
        gx = np.exp(x)*gy
        return gx

class Neg(Function):
    def forward(self, x):
        return -x

    def backward(self, gy):
        x = self.input.data
        gx = -gy
        return gx

x = Variable(np.array(1))
f1 = Square()
f2 = Neg()
f3 = Exp()
a = f1(x)
b = f2(a)
y = f3(b)

y.grad = np.array(1)
b.grad = f3.backward(y.grad)
a.grad = f2.backward(b.grad)
x.grad = f1.backward(a.grad)

print("x.grad: {:.3f}".format(x.grad))
print("-2x exp(-x^2): {:.3f}".format(-2*1*np.exp(-1**2)))

・実行結果

> print("x.grad: {:.3f}".format(x.grad))
x.grad: -0.736
> print("-2x exp(-x^2): {:.3f}".format(-2*1*np.exp(-1**2)))
-2x exp(-x^2): -0.736

自動微分のモジュール化

バックプロパゲーションの自動化

下記のようにcreatorset_creatorを用いることでバックプロパゲーションの自動化を行うことができます。

class Variable:
    def __init__(self, data):
        self.data = data
        self.grad = None
        self.creator = None

    def set_creator(self, func):
        self.creator = func

    def backward(self):
        funcs = [self.creator]
        while funcs:
            f = funcs.pop()
            x, y = f.input, f.output
            x.grad = f.backward(y.grad)
            if x.creator is not None:
                funcs.append(x.creator)

class Function:
    def __call__(self, input):
        x = input.data
        y = self.forward(x)
        output = Variable(y)
        output.set_creator(self)
        self.input = input
        self.output = output
        return output

    def forward(self, x):
        raise NotImplementedError()

    def backward(self, x):
        raise NotImplementedError()

class Square(Function):
    def forward(self, x):
        return x**2

    def backward(self, gy):
        x = self.input.data
        gx = 2*x*gy
        return gx

class Exp(Function):
    def forward(self, x):
        return np.exp(x)

    def backward(self, gy):
        x = self.input.data
        gx = np.exp(x)*gy
        return gx

class Neg(Function):
    def forward(self, x):
        return -x

    def backward(self, gy):
        x = self.input.data
        gx = -gy
        return gx

x = Variable(np.array(1))
f1 = Square()
f2 = Neg()
f3 = Exp()
y = f3(f2(f1(x)))

y.grad = np.array(1)
y.backward()

print("x.grad: {:.3f}".format(x.grad))
print("-2x exp(-x^2): {:.3f}".format(-2*1*np.exp(-1**2)))

・実行結果

> print("x.grad: {:.3f}".format(x.grad))
x.grad: -0.736
> print("-2x exp(-x^2): {:.3f}".format(-2*1*np.exp(-1**2)))
-2x exp(-x^2): -0.736

勾配法を用いた自動微分の応用

線形回帰のパラメータ推定

ロジスティック回帰のパラメータ推定

「統計学実践ワークブック」 演習問題etc Ch.6 「連続型分布と標本分布」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.6の「連続型分布と標本分布」に関して演習問題を中心に解説を行います。正規分布、指数分布、ガンマ分布などの確率分布や、$t$分布$\chi^2$分布などの標本分布はあらゆる場面でよく用いられるので抑えておくと良いです。

本章のまとめ

正規分布

「連続型確率分布の数式まとめ」の「正規分布」で詳しく取り扱いました。

指数分布

「連続型確率分布の数式まとめ」の「指数分布」で詳しく取り扱いました。

演習問題解説

問6.1

$[1]$
下記を実行することで計算できる。

import numpy as np

mu, sigma = 65., 10.
T_A = 50. + 10.*(85.- mu)/sigma
T_B = 50. + 10.*(60.- mu)/sigma

print("A: {:.0f}".format(T_A))
print("B: {:.0f}".format(T_B))

・実行結果

> print("A: {:.0f}".format(T_A))
A: 70
> print("B: {:.0f}".format(T_B))
B: 45

$[2]$
下記を実行することで計算できる。

import numpy as np
from scipy import stats

n = 1000.
mu, sigma = 65., 10.

Z_A = (85.- mu)/sigma
Z_B = (60.- mu)/sigma
estimated_num = n*(stats.norm.cdf(Z_A)-stats.norm.cdf(Z_B))

print("A: {:.0f}".format(estimated_num))

・実行結果

> print("A: {:.0f}".format(estimated_num))
A: 669

$[3]$
下記を実行することで計算できる。

import numpy as np
from scipy import stats

sigma = 10.

q_range = sigma*(stats.norm.ppf(0.75)-stats.norm.ppf(0.25))

print("Box length: {:.1f}".format(q_range))

・実行結果

> print("Box length: {:.1f}".format(q_range))
Box length: 13.5

$[4]$
$X \sim N(65,10^2)$、$Z = (X-65)/10 \sim N(0,1)$に対して、$E[X|X \geq 65]=E[65+10Z|Z \geq 0]=65+10E[Z|Z \geq 0]$が成立する。ここで$Z \geq 0$における$Z$の条件付き分布の確率密度関数$f(z|z \geq 0)$は下記のように表すことができる。
$$
\begin{align}
f(z|z \geq 0) &= \frac{f(z)}{P(Z \geq 0)} \\
&= 2 f(z) = 2 \times \frac{1}{\sqrt{2 \pi}} e^{-\frac{z^2}{2}} \\
&= \sqrt{\frac{2}{\pi}} e^{-\frac{z^2}{2}}
\end{align}
$$

上記に基づいて$E[Z|Z \geq 0]$の計算を行う。
$$
\begin{align}
E[Z|Z \geq 0] &= \int_{0}^{\infty} z f(z|z \geq 0) dz \\
&= \int_{0}^{\infty} \sqrt{\frac{2}{\pi}} z e^{-\frac{z^2}{2}} dz \\
&= \left[ – \sqrt{\frac{2}{\pi}} e^{-\frac{z^2}{2}} \right]_{0}^{\infty} \\
&= \sqrt{\frac{2}{\pi}} \\
&= 0.7978…
\end{align}
$$

よって、$E[X|X \geq 65]=E[65+10Z|Z \geq 0]=65+10E[Z|Z \geq 0]$を用いて$E[X|X \geq 65]$は下記のように計算できる。
$$
\begin{align}
E[X|X \geq 65] &= 65 + 10E[Z|Z \geq 0] \\
&= 65 + 10 \times 0.7978… \\
&= 72.978…
\end{align}
$$

問6.2

$[1]$
$V[X+Y]=V[X]+V[Y]+2Cov(X,Y)$などを用いることによって、相関係数は下記のように計算できる。

import numpy as np

sigma_x, sigma_y, sigma_xy = 80., 90., 150.

r = (sigma_xy**2-sigma_x**2-sigma_y**2)/(2*sigma_x*sigma_y)

print("r: {:.2f}".format(r))

・実行結果

> print("r: {:.2f}".format(r))
r: 0.56

$[2]$
$\displaystyle E[Y|X=x] = E[Y] + \rho[X,Y] \cdot \sqrt{\frac{V[Y]}{V[X]}} (x-E[X])$より、下記のように計算を行うことができる。

x = 335.
mean_x, mean_y = 305., 250.

res = mean_y + r*np.sqrt(sigma_y/sigma_x)*(x-mean_x)

print("E[Y|X=335): {:.0f}".format(res))

・実行結果

> print("E[Y|X=335): {:.0f}".format(res))
E[Y|X=335): 268

・参考
2次元正規分布における条件付き確率分布・周辺分布の数式の導出
https://www.hello-statisticians.com/explain-terms-cat/multi_norm_dist3.html

問6.3

$[1]$
累積分布関数を$F(t) = P(T \leq t)$とおくと、$F(t)$に関して下記が成立する。
$$
\large
\begin{align}
F(t) &= P(T \leq t) = 1 – P(T > t) \\
&= 1 – S(t) \\
&= 1 – \exp(- \lambda t)
\end{align}
$$

ここで確率密度関数$f(t)$に関して$f(t)=F'(t)$が成立するので、$f(t)$は下記のように導出できる。
$$
\large
\begin{align}
f(t) &= \frac{d F(t)}{d t} \\
&= \frac{d}{d t} (- \exp(- \lambda t)) \\
&= \lambda \exp(- \lambda t) \quad (t \geq 0)
\end{align}
$$

$[2]$
分布の平均を$E[T]$とおくと、期待値の定義に基づいて$E[T]$は下記のように計算できる。
$$
\large
\begin{align}
E[T] &= \int_{0}^{\infty} t f(t) dt \\
&= \int_{0}^{\infty} \lambda t \exp(- \lambda t) dt \\
&= \left[ \frac{-\lambda}{\lambda} t \exp(- \lambda t) \right]_{0}^{\infty} + \int_{0}^{\infty} \exp(- \lambda t) dt \\
&= 0 + \left[ – \frac{1}{\lambda} \exp(- \lambda t) \right]_{0}^{\infty} \\
&= \frac{1}{\lambda}
\end{align}
$$

また、上側$25$%点に対応する$t$を$t_{0.25}$とおくと、$\exp(- \lambda t_{0.25}) = S(t_{0.25})=P(T>t_{0.25})=1/4$が成立する。これを$t_{0.25}$に関して解く。
$$
\large
\begin{align}
S(t_{0.25}) &= P(T>t_{0.25}) \\
-\exp(- \lambda t_{0.25}) &= \frac{1}{4} \\
-\lambda t_{0.25} &= \log{\frac{1}{4}} \\
-\lambda t_{0.25} &= – \log{4} \\
t_{0.25} &= \frac{\log{4}}{\lambda}
\end{align}
$$

$[3]$
$E[T]=1/\lambda$を標本平均$\bar{t}=3.0=1/\hat{\lambda}$で推定したと考える。このとき、$t_{0.25}$の推定値$\hat{t_{0.25}}$は$[2]$の結果を用いて下記のように計算できる。
$$
\large
\begin{align}
\hat{t_{0.25}} &= \frac{\log{4}}{\hat{\lambda}} \\
&= 6 \log{2} \\
&= 4.2
\end{align}
$$

$[4]$
$X \sim N(65,10^2)$、$Z = (X-65)/10 \sim N(0,1)$に対して、$E[X|X \geq 65]=E[65+10Z|Z \geq 0]=65+10E[Z|Z \geq 0]$が成立する。ここで$Z \geq 0$における$Z$の条件付き分布の確率密度関数$f(z|z \geq 0)$は下記のように表すことができる。
$$
\begin{align}
f(z|z \geq 0) &= \frac{f(z)}{P(Z \geq 0)} \\
&= 2 f(z) = 2 \times \frac{1}{\sqrt{2 \pi}} e^{-frac{z^2}{2}} \\
&= \sqrt{\frac{2}{\pi}} e^{-\frac{z^2}{2}}
\end{align}
$$

問6.4

$[1]$
偏差値はそれぞれ下記のように計算できる。
・Aさん
$$
\large
\begin{align}
50 + 10 \times \frac{67-65}{4} &= 50 + 10 \times \frac{1}{2} \\
&= 55
\end{align}
$$

・Bさん
$$
\large
\begin{align}
50 + 10 \times \frac{82-85}{3} &= 50 + 10 \times (-1) \\
&= 40
\end{align}
$$

$[2]$
$$
\large
\begin{align}
\Phi(z) = \int_{-\infty}^{z} \frac{1}{\sqrt{2 \pi}} e^{-\frac{x^2}{2}} dx
\end{align}
$$
上記のように標準正規分布の累積密度関数$\Phi(z)$を定義する。

ここで得点が$60$点以上である確率を$P(X \geq 60)$のようにおくと、$P(X \geq 60)$は下記のように計算できる。
$$
\large
\begin{align}
P(X \geq 60) & \simeq \frac{300}{500} \left( 1-\Phi \left( \frac{60-65}{4} \right) \right) + \frac{200}{500} \left( 1-\Phi \left( \frac{60-85}{3} \right) \right) \\
&= 1 – \frac{3}{5} \Phi (-1.25) + \frac{2}{5} \Phi(-8.33) \\
&= \frac{2}{3} \times 0.1056 + \frac{2}{5} \Phi(-8.33) = 0.9366…
\end{align}
$$

上記より、試験の合格率が概ね$94$%であると考えることができる。

なお、Pythonを用いて下記を計算することで結果を計算することができる。

import numpy as np
from scipy import stats

print(stats.norm.cdf(-1.25))
print(stats.norm.cdf(-8.33))
print(1-3*stats.norm.cdf(-1.25)/5.-2*stats.norm.cdf(-8.33)/5.)

・類題
https://www.hello-statisticians.com/toukei-kentei-semi1-kakomon-cat/kakomon-semi1-2018/stat_certifi_semi1_18_6.html

参考

・準1級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

「統計学実践ワークブック」 演習問題etc Ch.8 「統計的推定の基礎」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.8の「統計的推定の基礎」に関して演習問題を中心に解説を行います。統計量、推定量、推定値などは少々紛らわしいですが、概念を掴むと全体の理解がしやすくなるので演習を通して抑えておくと良いと思います。

本章のまとめ

有効推定量とクラメル・ラオの不等式

代表値を表すパラメータ$\theta$に基づいて標本$x_1,x_2,…,x_n$が得られたと考える。このとき代表値の推定量を表す標本の関数の統計量を$\hat{\theta} = T(x_1,x_2,…,x_n)$、$\hat{\theta}$の分散を$V[\hat{\theta}]$を下記のように表す。
$$
\large
\begin{align}
V[\hat{\theta}] &= V[T(X_1,X_2,…,X_n)] \\
&= V \left[ \frac{1}{n} \sum_{i=1}^{n} X_i \right] \\
&= \frac{1}{n^2} \times n V[X_i] = \frac{1}{n} V[X_i]
\end{align}
$$

また、下記のようにパラメータ$\theta$に関する尤度を$L(\theta)$とおく。
$$
\large
\begin{align}
L(\theta) &= P(X_1=x_1,X_2=x_2,…,X_n=x_n|\theta) \\
&= \prod_{i=1}^{n} P(X_i=x_i|\theta)
\end{align}
$$

上記に対し、対数尤度を$l(\theta) = \log{L(\theta)}$のようにおく。さらに対数尤度を元に$\theta$に関するフィッシャー情報量を下記のようにおく。
$$
\large
\begin{align}
I_{n}(\theta) = – E \left[ \frac{\partial^2}{\partial \theta^2} l(\theta) \right]
\end{align}
$$

このとき、下記で表すクラメル・ラオの不等式が$V[\hat{\theta}]$と$I_{n}(\theta)$に関して成立する。
$$
\large
\begin{align}
V[\hat{\theta}] \geq I_{n}(\theta)^{-1}
\end{align}
$$

また、上記で等号が成立するとき、$\hat{\theta}$を有効推定量(efficient estimator)と呼ぶ。有効推定量が一様最小分散不偏推定量であることも抑えておくと良い。

クラメル・ラオの不等式の取り扱いに関しては数式だけだと分かりにくいので一連の流れを下図にまとめた。

ここではわかりやすさの観点から$\theta$を正規分布の$\mu$やポアソン分布の$\lambda$に対応する代表値に限った議論を行なったが、代表値以外のパラメータも$\theta$で総称されるかつ代表値以外のパラメータでも同様の議論が成立することは抑えておくと良い。

漸近有効性・漸近正規性

パラメータ$\theta$に対して推定量$\hat{\theta}$を考えるとき、下記が成立するならば推定量$\hat{\theta}$は漸近有効性(asymptotic efficiency)を持つという。
$$
\large
\begin{align}
\lim_{n \to \infty} n V[\hat{\theta}] = J_{1}(\theta)^{-1}
\end{align}
$$

上記の数式はクラメル・ラオの不等式の統合が成立するときの$V[\hat{\theta}] = I_{n}(\theta)^{-1}$に類似した式である一方で、$J_{n}(\theta)^{-1}$ではなく$J_{1}(\theta)^{-1}$が用いられる分左辺に$n$がかけられていることは抑えておくと良い。

また、最尤推定量$\hat{\theta}$は漸近有効性をもちかつ、パラメータ$\theta$を$\hat{\theta}$から引いた$\hat{\theta}-\theta$を$\sqrt{n}$でスケーリングした$Z:=\sqrt{n}(\hat{\theta}-\theta)$は正規分布$N(0,J_{1}(\theta)^{-1})$に分布収束する。

このことを最尤推定量の漸近正規性(asymptotic normality)という。

ジャックナイフ推定量

推定量が不偏ではなくバイアスがある場合、標本を「再活用」して推定量のバイアスを補正する方法をジャックナイフ法(jackknife method)という。標本$X_1,…,X_n$から標本$X_{i}$を除いた部分標本を元に得られる推定量を$\hat{\theta}_{(i)}$とおく。

このとき下記のように$\hat{\theta}_{(i)}$の平均$\hat{\theta}_{(\cdot)}$を定義する。
$$
\large
\begin{align}
\hat{\theta}_{(\cdot)} = \frac{1}{n} \sum_{i=1}^{n} \hat{\theta}_{(i)}
\end{align}
$$

上記のように定めた$\hat{\theta}_{(\cdot)}$を元に推定量$\hat{\theta}$のバイアス$\hat{\mathrm{bias}}$は下記のように見積もられる。
$$
\large
\begin{align}
\hat{\mathrm{bias}} = (n-1)(\hat{\theta}_{(\cdot)}-\hat{\theta})
\end{align}
$$

また、$\hat{\mathrm{bias}}$を用いて$\hat{\theta}$の補正を行なったジャックナイフ推定量$\hat{\theta}_{jack}$は下記のように定められる。
$$
\large
\begin{align}
\hat{\theta}_{jack} = \hat{\theta} – \hat{\mathrm{bias}}
\end{align}
$$

演習問題解説

例8.1

統計量は未知のパラメータ$\theta$によらない標本の関数であるので、$\displaystyle \frac{1}{n} \sum_{i=1}^{n}(X_i-\mu)^2$以外は統計量である。

例8.2

尤度関数を$L(\mu,v)$と定めると、同時確率密度関数に一致することより、下記のように表すことができる。
$$
\large
\begin{align}
L(\mu,v) &= \prod_{i=1}^{n} \frac{1}{\sqrt{2 \pi v}} \exp \left[ -\frac{(x_i-\mu)^2}{2v} \right] \\
&= \left( \frac{1}{\sqrt{2 \pi v}} \right)^n \prod_{i=1}^{n} \exp \left[ -\frac{(x_i-\mu)^2}{2v} \right] \\
&= \left( \frac{1}{\sqrt{2 \pi v}} \right)^n \exp \left[ \sum_{i=1}^{n} -\frac{(x_i-\mu)^2}{2v} \right]
\end{align}
$$

このとき、対数尤度関数を$l(\mu,v)$と定めると、$l(\mu,v)=\log{L(\mu,v)}$より、下記のように表せる。
$$
\large
\begin{align}
l(\mu,v) &= \log{L(\mu,v)} \\
&= -\frac{n}{2} \log{(2 \pi v)} + \sum_{i=1}^{n} \left( -\frac{(x_i-\mu)^2}{2v} \right) \\
&= -\frac{n}{2} \log{(2 \pi v)} – \frac{1}{2v} \sum_{i=1}^{n} (x_i-\mu)^2
\end{align}
$$

ここで対数尤度$l(\mu,v)$の$\mu$に関する偏微分を考える。
$$
\large
\begin{align}
\frac{\partial l(\mu,v)}{\partial \mu} &= \frac{1}{2v} \sum_{i=1}^{n} 2(x_i-\mu) \\
&= \frac{1}{v} \sum_{i=1}^{n} (x_i-\mu) \\
&= \frac{n(\bar{x}-\mu)}{v}
\end{align}
$$

上記より、$v>0$の場合$v$の値に関わらず、$\mu=\bar{x}$のとき$l(\mu,v)$が最大となることがわかる。よって、$\mu$の最尤推定量は$\bar{x}$に一致する。

次に$\mu=\bar{x}$を元に$l(\bar{x},v)$の$v$に関する最大値を考える。$l(\bar{x},v)$を$v$に関して偏微分を行うと、標本分散を$\displaystyle S = \frac{1}{n} \sum_{i=1}^{n} (x_i-\bar{x})^2$とおいて、下記のように計算できる。
$$
\large
\begin{align}
\frac{\partial l(\bar{x},v)}{\partial v} &= \frac{\partial}{\partial v} \left( -\frac{n}{2} \log{(2 \pi v)} – \frac{1}{2v} \sum_{i=1}^{n} (x_i-\bar{x})^2 \right) \\
&= \frac{\partial}{\partial v} \left( -\frac{n}{2} \log{(2 \pi v)} – \frac{nS}{2v} \right) \\
&= -\frac{n \times 2 \pi}{2 \times 2 \pi v} + \frac{nS}{2v^2} \\
&= -\frac{n}{2v} + \frac{nS}{2v^2} \\
&= \frac{n}{2v} \left( \frac{S}{v}-1 \right)
\end{align}
$$

上記より、$v=S$のとき$l(\bar{x},v)$は最大値をとることがわかる。よって、標本分散$\displaystyle S = \frac{1}{n} \sum_{i=1}^{n} (x_i-\bar{x})^2$が$v$の最尤推定量であることがわかる。

以上の議論により、$\mu, v$の最尤推定量は標本平均$\displaystyle \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i$と標本分散$\displaystyle S = \frac{1}{n} \sum_{i=1}^{n} (x_i-\bar{x})^2$であると考えることができる。

例8.3

ガンマ分布$Ga(\alpha,1/\lambda)$の期待値$\mu_1=E[X]$と分散$\mu_2=V[X]$はそれぞれ$\mu_1=E[X]=\alpha/\lambda$、$\mu_2=V[X]=\alpha/\lambda^2$である。これを$\alpha, \lambda$に関して解くと下記が得られる。
$$
\large
\begin{align}
\alpha &= \frac{\mu_1^2}{\mu_2} \\
\lambda &= \frac{\mu_1}{\mu_2}
\end{align}
$$

また、モーメント法では$\mu_1, \mu_2$の推定量に標本平均$\bar{X}$と標本分散$S$を用いて推定を行うと考えられる。よって、$\alpha$と$\lambda$の推定量$\hat{\alpha}, \hat{\lambda}$は下記のように表すことができる。
$$
\large
\begin{align}
\hat{\alpha} &= \frac{\bar{X}^2}{S} \\
\lambda &= \frac{\bar{X}}{S}
\end{align}
$$

・参考
ガンマ分布のモーメント母関数の導出と期待値・分散の計算
https://www.hello-statisticians.com/explain-terms-cat/gamma_distribution1.html

例8.4

$x_1,x_2,…,x_n$に関する同時確率密度関数の式を$f(x_1,…,x_n|\mu,\sigma^2)$とおくと、$f(x_1,…,x_n|\mu,\sigma^2)$の式は下記のように分解することができる。
$$
\large
\begin{align}
f(x_1,…,x_n|\mu,\sigma^2) &= \prod_{i=1}^{n} \frac{1}{\sqrt{2 \pi \sigma^2}} \exp \left( – \frac{(x_i-\mu)^2}{2 \sigma^2} \right) \\
&= (2 \pi \sigma^2)^{-n/2} \exp \left( – \sum_{i=1}^{n} \frac{((x_i-\bar{x})+(\bar{x}-\mu))^2}{2 \sigma^2} \right) \\
&= (2 \pi \sigma^2)^{-n/2} \exp \left( – \sum_{i=1}^{n} \frac{(x_i-\bar{x})^2}{2 \sigma^2} \right) \exp \left( – \sum_{i=1}^{n} \frac{(\bar{x}-\mu)^2}{2 \sigma^2} \right)
\end{align}
$$

上記にフィッシャーネイマンの分解定理を適用することで、$\left( \bar{x} , \sum_{i=1}^{n}(x_i-\bar{x})^2 \right)$が十分統計量であることがわかる。

・参考
十分統計量の定義・分解定理と証明の具体例
https://www.hello-statisticians.com/explain-terms-cat/sufficient_statistic1.html

問8.1

①、②、④が正しい。以下詳しく確認を行う。

① 正しい:統計量は標本もしくは既知のパラメータの関数で表されなければならない。

② 正しい:尤度関数における積は順序を入れ替えることができるので十分統計量であると考えることができる。

③ 正しくない:$\sigma^2$の不偏推定量には$\displaystyle \frac{1}{n-1} \sum_{i=1}^{n}(X_i-\bar{X})^2$が対応する。

④ 正しい:正規分布の標本分散は分散の最尤推定量である。母分散の推定量は不偏推定量と最尤推定量が異なることは抑えておくと良い。

⑤ 正しくない:標本分散は一致推定量かつ漸近有効推定量である。

問8.2

$[1]$
尤度関数を$L(\lambda)$とおくと、$L(\lambda)$は同時確率関数$f(X_1=x_1,…,X_n=x_n)$に一致することから下記のように表すことができる。
$$
\large
\begin{align}
L(\lambda) &= f(X_1=x_1,…,X_n=x_n) = \prod_{i=1}^{n} f(X_i=x_i) \\
&= \prod_{i=1}^{n} \frac{\lambda^{x_i} e^{-\lambda}}{x_i!}
\end{align}
$$

上記の対数尤度$\log{L(\lambda)}$は下記のように表せる。
$$
\large
\begin{align}
\log{L(\lambda)} = \sum_{i=1}^{n} x_i \log{\lambda} – n \lambda + \sum_{i=1}^{n} \log{x_i!}
\end{align}
$$

上記を$\lambda$で偏微分すると下記のようになる。
$$
\large
\begin{align}
\frac{\partial \log{L(\lambda)}}{\partial \lambda} = \frac{1}{\lambda} \sum_{i=1}^{n} x_i – n
\end{align}
$$

ここで$\lambda>0$において上記は$\lambda$に対して単調減少であるので$\displaystyle \frac{\partial \log{L(\lambda)}}{\partial \lambda} = 0$となる$\lambda$が対数尤度$\log{L(\lambda)}$を最大にする$\lambda$であることがわかる。
$$
\large
\begin{align}
\frac{\partial \log{L(\lambda)}}{\partial \lambda} &= 0 \\
\frac{1}{\lambda} \sum_{i=1}^{n} x_i – n &= 0 \\
\lambda = \frac{1}{n} \sum_{i=1}^{n} x_i
\end{align}
$$

上記より$\displaystyle \hat{\lambda} = \frac{1}{n} \sum_{i=1}^{n} x_i$が$\lambda$の最尤推定量であり、式より標本平均に一致することも合わせて確認できる。

$[2]$
$\lambda$に関するフィッシャー情報量を$J_{n}(\lambda)$とおくと、$J_{n}(\lambda)$は下記のように計算することができる。
$$
\large
\begin{align}
J_{n}(\lambda) &= – E \left[ \frac{\partial^2}{\partial \lambda^2} \log{L(\lambda)} \right] \\
&= – E \left[ \frac{\partial}{\partial \lambda} \left( \frac{1}{\lambda} \sum_{i=1}^{n} X_i – n \right) \right] \\
&= – E \left[ – \frac{1}{\lambda^2} \sum_{i=1}^{n} X_i \right] \\
&= \frac{n}{\lambda^2} E[X] \\
&= \frac{n}{\lambda^2} \lambda = \frac{n}{\lambda}
\end{align}
$$

$[3]$
$[1]$より$\lambda$の最尤推定量は標本平均であると考えることができる。ここで標本平均の分散$V[\bar{X}]$は下記のように表すことができる。
$$
\large
\begin{align}
V[\bar{X}] &= V \left[ \frac{1}{n} \sum_{i=1}^{n} X_i \right] \\
&= \frac{1}{n^2} \times n V[X] \\
&= \frac{\lambda}{n}
\end{align}
$$

上記が$[2]$で計算した$J_{n}(\lambda)$の逆数$J_{n}(\lambda)^{-1}$に一致することから、クラメル・ラオの不等式の下限と一致すると考えることができる。これにより、標本平均が有効推定量に一致すると考えられる。

$[4]$
標本平均$\bar{X}$に関して中心極限定理を考えることにより、$\sqrt{n}(\bar{X}-\lambda)$は正規分布$N(0,\lambda)$に分布収束することがわかる。これにより最尤推定量の漸近正規性を示すことができる。
また、この場合の漸近分散の$\lambda$がフィッシャー情報量の逆数の$J_{1}(\lambda)^{-1}=\lambda$と一致することから漸近有効性も成立していると考えることができる。

問8.3

$[1]$
推定量$T_1, T_2$の期待値$E[T_1], E[T_2]$はそれぞれ下記のように考えられる。
$$
\large
\begin{align}
E[T_1] &= E[\bar{X}^2] \\
&= E[\bar{X}]^2 + V[\bar{X}] \\
&= \mu^2 + \frac{\sigma^2}{n} \\
E[T_2] &= E \left[ \frac{1}{n} \sum_{i=1}^{n} X_i^2 \right] \\
&= \frac{1}{n} E \left[ \sum_{i=1}^{n} X_i^2 \right] \\
&= \frac{n}{n} E[X_i^2] \\
&= E[X_i]^2 + V[X_i] \\
&= \mu^2 + \sigma^2
\end{align}
$$

よって、$T_1,T_2$のバイアス$b_1(\mu,\sigma^2), b_2(\mu,\sigma^2)$はそれぞれ下記のように得られる。
$$
\large
\begin{align}
b_1(\mu,\sigma^2) &= E[T_1] – \mu^2 \\
&= \mu^2 + \frac{\sigma^2}{n} – \mu^2 \\
&= \frac{\sigma^2}{n} \\
b_2(\mu,\sigma^2) &= E[T_2] – \mu^2 \\
&= \mu^2 + \sigma^2 – \mu^2 \\
&= \sigma^2
\end{align}
$$

$[2]$
半径の計測値から各面積を計算しその平均値を推定に用いる場合、コインの面積$\pi r^2$の推定量に$\pi T_2$を用いることに一致する。$[1]$より推定量$T_2$のバイアスは$\sigma^2$であり、$n$を増やしてもこのバイアスは減らない。

一方で$T_1$のバイアスは$\displaystyle \frac{\sigma^2}{n}$であり、$n \to \infty$で$0$に収束する。このように推定量の選定にあたってはサンプル数の$n$が増大するに連れてバイアスが小さくなる推定量を選定しなければならないので、$T_2$の推定量を用いる当該手法には問題がある。

$[3]$
下記のように計算を行うことができる。

import numpy as np

x = np.array([8.4, 9.0, 8.2, 10.4, 9.2])
mean_x = np.mean(x)
s2 = np.sum((x-mean_x)**2)/(x.shape[0]-1)

modified_T1 = mean_x**2 - s2/x.shape[0]
estimate = np.pi*modified_T1

print("mean_x: {:.1f}".format(mean_x))
print("unbiased variance: {:.1f}".format(s2))
print("estimated value: {:.1f}".format(estimate))

・実行結果

> print("mean_x: {:.1f}".format(mean_x))
mean_x: 9.0
> print("unbiased variance: {:.1f}".format(s2))
unbiased variance: 0.7
> print("estimated value: {:.1f}".format(estimate))
estimated value: 256.3

$[4]$
下記を実行することで計算できる。

import numpy as np

x = np.array([8.4, 9.0, 8.2, 10.4, 9.2])
mean_x = np.mean(x)

x_sub = np.zeros(5)
for i in range(x.shape[0]):
    a = 0
    for j in range(x.shape[0]):
        if i != j:
            a += x[j]
    x_sub[i] = (a/(x.shape[0]-1))**2

x_sub_mean = np.mean(x_sub)
bias = (x.shape[0]-1)*(x_sub_mean - mean_x**2)

est_jack = mean_x**2 - bias
estimated_value = np.pi*est_jack

print("modified estimated value: {:.1f}".format(estimated_value))

・実行結果

> print("modified estimated value: {:.1f}".format(estimated_value))
modified estimated value: 256.3

$[5]$
$\bar{X}$に関する中心極限定理により、$\sqrt{n}(\bar{X}-\mu)$は$\mathcal{N}(0,\sigma^2)$に分布収束する。ここで$f(x)=x^2$に対してデルタ法を適用することを考える。

このとき$\sqrt{n}(f(\bar{X})-f(\mu))$は$\mathcal{N}(0,\sigma^2(f'(\mu))^2) = \mathcal{N}(0,\sigma^2(2 \mu)^2) = \mathcal{N}(0,4\mu^2\sigma^2)$に分布収束すると考えられ、同時に漸近正規性が成立することが確かめられる。

・考察
ここで行なった結果が妥当かどうか確認するにあたって、下記で正規分布からの標本を元にPythonを用いて結果の検証を行なった。
https://www.hello-statisticians.com/explain-terms-cat/bias1.html

参考

・準$1$級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

「統計学実践ワークブック」 演習問題etc Ch.10 「検定の基礎と検定法の導出」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.$10$の「検定の基礎と検定法の導出」に関して演習問題を中心に解説を行います。第$1$種の過誤・有意水準や第$2$種の過誤・検出力など、抑えておくと良いトピックが多いので演習を通して習得すると良いと思います。

本章のまとめ

有意水準

下記で詳しく取り扱った。
有意水準$\alpha$と検出力$1-\beta$の値に基づくサンプルサイズ設計: 有意水準$\alpha$

検出力

下記で詳しく取り扱った。
有意水準$\alpha$と検出力$1-\beta$の値に基づくサンプルサイズ設計: 検出力$1-\beta$

サンプルサイズ設計

下記で詳しく取り扱った。
有意水準$\alpha$と検出力$1-\beta$の値に基づくサンプルサイズ設計: サンプルサイズ設計

問10.1

版によっては解答に誤植があるので、正確には正誤表の解答を確認すると良いです。

$1)$
検定に用いる統計量を$\hat{p}$とおくとき、有意水準$\alpha$と検出力$1-\beta$に関連して下記のような等式が成立する。
$$
\large
\begin{align}
z_{\alpha/2=0.025} &= \frac{\hat{p}-p_0}{\sqrt{p_0(1-p_0)/n}} \\
z_{\alpha/2=0.025} \sqrt{\frac{p_0(1-p_0)}{n}} &= \hat{p}-p_0 \quad (1) \\
z_{1-\beta} = -z_{\beta} &= \frac{\hat{p}-p_1}{\sqrt{p_1(1-p_1)/n}} \\
z_{\beta} &= \frac{p_1-\hat{p}}{\sqrt{p_1(1-p_1)/n}} \\
z_{\beta} \sqrt{\frac{p_1(1-p_1)}{n}} &= p_1-\hat{p} \quad (2)
\end{align}
$$

ここで$(1)+(2)$より下記が成立する。
$$
\large
\begin{align}
z_{\alpha/2=0.025}\sqrt{\frac{p_0(1-p_0)}{n}} + z_{\beta}\sqrt{\frac{p_1(1-p_1)}{n}} &= (\cancel{\hat{p}}-p_0) + (p_1-\cancel{\hat{p}}) \\
&= p_1 – p_0 \\
1.96 \times \sqrt{\frac{0.45 \cdot 0.55}{600}} + z_{\beta}\sqrt{\frac{0.5^2}{600}} &= 0.05
\end{align}
$$

上記を元に下記を実行することで検出力を計算することができる。

import numpy as np
from scipy import stats

alpha = 0.05
p_0, p_1 = 0.45, 0.5 
n = 600.

z_beta = (p_1 - p_0 - 1.96*np.sqrt(p_0*(1-p_0)/n))/(np.sqrt(p_1**2/n))
power = 1.-stats.norm.cdf(-z_beta)

print("power: {:.4f}".format(power))

・実行結果

> print("power: {:.4f}".format(power))
power: 0.6912

$2)$
$$
\large
\begin{align}
z_{\alpha/2=0.025}\sqrt{\frac{p_0(1-p_0)}{n}} + z_{\beta=0.2}\sqrt{\frac{p_1(1-p_1)}{n}} &= (\cancel{\hat{p}}-p_0) + (p_1-\cancel{\hat{p}}) \\
&= p_1 – p_0 \\
1.96 \times \sqrt{\frac{0.45 \cdot 0.55}{n}} + 0.84 \times \sqrt{\frac{0.5^2}{n}} &= 0.05
\end{align}
$$


下記を実行することでサンプルサイズを計算することができる。

import numpy as np
from scipy import stats

alpha = 0.05
beta = 0.2
p_0, p_1 = 0.45, 0.5

z_alpha, z_beta = stats.norm.ppf(1.-alpha/2), stats.norm.ppf(1.-beta)
n = (z_alpha*np.sqrt(p_0*(1.-p_0)) + z_beta*np.sqrt(p_1*(1.-p_1)) )**2 / (p_1-p_0)**2

print("n: {:.0f}".format(n))

・実行結果

> print("n: {:.0f}".format(n))
n: 779

問10.2

$1)$
$$
\large
\begin{align}
\frac{T^2}{\chi^2_{\alpha=0.025}(n-1)} \leq \sigma^2 \leq \frac{T^2}{\chi^2_{\alpha=0.975}(n-1)}
\end{align}
$$

サンプル数を$n$、$\chi^2$分布の上側確率を$\chi^2_{\alpha}$のようにおくとき、$95$%区間は上記のように計算できる。これに基づいて下記を実行することで、$95$%区間を得ることができる。

import numpy as np
from scipy import stats

T2 = 100.
n = 16

lower_sigma2 = T2/stats.chi2.ppf(1.-0.025,n-1)
upper_sigma2 = T2/stats.chi2.ppf(1.-0.975,n-1)

print("Estimated 95% Interval: [{:.2f}, {:.2f}]".format(lower_sigma2,upper_sigma2))

・実行結果

> print("Estimated 95% Interval: [{:.2f}, {:.2f}]".format(lower_sigma2,upper_sigma2))
Estimated 95% Interval: [3.64, 15.97]

$2)$
自由度は$15$で$F(15,15)$に従う。また、上側$5$%点$F_{\alpha=0.05}(15,15)=2.403$であることから、帰無仮説は棄却できる。

問10.3

$1)$
ア: $(1-0.3)^5 \simeq 0.17$
イ: ${}_{5} C_{1} \times 0.3^{1} (1-0.3)^{4} \simeq 0.36$
ウ: ${}_{5} C_{2} \times 0.3^{2} (1-0.3)^{3} \simeq 0.31$

$2)$
生産者危険: $0.07+0.01=0.08$
消費者危険: $0.33+0.41=0.74$

参考

・準$1$級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

「統計学実践ワークブック」 演習問題etc Ch.9 「区間推定」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.9の「区間推定」に関して演習問題を中心に解説を行います。区間推定はロバストな推定を行うにあたって、実用上も有用な考え方なので、繰り返し取り組むことで慣れると良いと思います。

本章のまとめ

演習問題解説

問9.1

$1)$
$$
\large
\begin{align}
\frac{X-np}{\sqrt{n\hat{p}(1-\hat{p})}} &= \frac{X/n-p}{\sqrt{\hat{p}(1-\hat{p})/n}} \\
&= \frac{\hat{p}-p}{\sqrt{\hat{p}(1-\hat{p})/n}}
\end{align}
$$

上記が標準正規分布$N(0,1)$に従うと考えると、$95$%区間は$\displaystyle \left[ \hat{p}-1.96\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}, \hat{p}+1.96\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \right]$で計算できる。

具体的な数値に関しては、下記を実行することで得られる。

import numpy as np

hat_p = 0.43
n = 1240.

Lower_p = hat_p - 1.96*np.sqrt(hat_p*(1.-hat_p)/n)
Upper_p = hat_p + 1.96*np.sqrt(hat_p*(1.-hat_p)/n)

print("95% Interval: [{:.3f}, {:.3f}]".format(Lower_p, Upper_p))

・実行結果

> print("95% Interval: [{:.3f}, {:.3f}]".format(Lower_p, Upper_p))
95% Interval: [0.402, 0.458]

$2)$
$\displaystyle \left[ \hat{p}-1.96\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}, \hat{p}+1.96\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \right]$の幅が$0.02$となるように$n$を定めれば良い。
$$
\large
\begin{align}
2 \times 1.96\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} = 0.02
\end{align}
$$

上記に対し、$\hat{p}=0.4$を代入し、$n$に関して解けば良い。
$$
\large
\begin{align}
2 \times 1.96\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} &= 0.02 \\
1.96\sqrt{\frac{0.4 \times 0.6}{n}} &= 0.01 \\
\sqrt{n} &= \frac{1.96 \sqrt{0.4 \times 0.6}}{0.01} \\
n &= \frac{1.96^2 \times 0.4 \times 0.6}{0.01^2} \\
&= 9219.8… \simeq 9220
\end{align}
$$

問9.2

$1)$
$95$%区間は問$9.1$と同様に考え、$\displaystyle \left[ \hat{p}-1.96\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}, \hat{p}+1.96\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \right]$を計算すればよい。

import numpy as np

hat_p = 0.262
n = 917.

Lower_p = hat_p - 1.96*np.sqrt(hat_p*(1.-hat_p)/n)
Upper_p = hat_p + 1.96*np.sqrt(hat_p*(1.-hat_p)/n)

print("95% Interval: [{:.4f}, {:.4f}]".format(Lower_p, Upper_p))

・実行結果

> print("95% Interval: [{:.4f}, {:.4f}]".format(Lower_p, Upper_p))
95% Interval: [0.2335, 0.2905]

$2)$
$$
\large
\begin{align}
(\hat{p}_1-\hat{p}_2) \pm 1.96 \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n} + \frac{\hat{p}_2(1-\hat{p}_2)}{n} + \frac{2\hat{p}_1\hat{p}_2}{n}}
\end{align}
$$

多項分布の割合の差の$95$%区間は上記のように計算できる。これに基づいて下記を実行することで計算結果が得られる。

import numpy as np

hat_p1 = 0.262
hat_p2 = 0.08
n = 917.

Lower_p_diff = (hat_p1-hat_p2) - 1.96*np.sqrt(hat_p1*(1.-hat_p1)/n + hat_p2*(1.-hat_p2)/n + 2*hat_p1*hat_p2/n)
Upper_p_diff = (hat_p1-hat_p2) + 1.96*np.sqrt(hat_p1*(1.-hat_p1)/n + hat_p2*(1.-hat_p2)/n + 2*hat_p1*hat_p2/n)

print("95% Interval: [{:.4f}, {:.4f}]".format(Lower_p_diff, Upper_p_diff))

・実行結果

> print("95% Interval: [{:.4f}, {:.4f}]".format(Lower_p_diff, Upper_p_diff))
95% Interval: [0.1460, 0.2180]

参考

・準1級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

「統計学実践ワークブック」 演習問題etc Ch.32 「シミュレーション」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.32の「シミュレーション」に関して演習問題を中心に解説を行います。モンテカルロ法を用いた乱数生成や、生成した乱数を用いたモンテカルロ積分など、重要なトピックが多いので抑えておくと良いと思います。

本章のまとめ

下記で取りまとめを行なった。
https://www.hello-statisticians.com/explain-terms-cat/monte_carlo1.html

演習問題解説

例32.1

生成した乱数を$(U_1,V_1),…,(U_N,V_N)$のようにおくと、$M$は二項分布$\displaystyle Bin \left( \frac{\pi}{4},N \right)$に従うので、$M$の分散$V[M]$は下記のように表すことができる。
$$
\large
\begin{align}
V[M] = N \times \frac{\pi}{4} \times \left( 1-\frac{\pi}{4} \right)
\end{align}
$$

よって、$\displaystyle \hat{\pi} = \frac{4M}{N}$の分散$V[\hat{\pi}]$は下記のように計算できる。
$$
\large
\begin{align}
V[\hat{\pi}] &= V \left[ \frac{4M}{N} \right] \\
&= \frac{4^2}{N^2} V[M] \\
&= \frac{4^2}{N^2} \times N \times \frac{\pi}{4} \times \left( 1-\frac{\pi}{4} \right) \\
&= \frac{4\pi}{N} \left( 1-\frac{\pi}{4} \right) \\
&= \frac{\pi(4-\pi)}{N}
\end{align}
$$

ここで$SD[\hat{\pi}]=\sqrt{V[\hat{\pi}]}=0.01$を$N$に関して解く。
$$
\large
\begin{align}
SD[\hat{\pi}] &= 0.01 \\
SD[\hat{\pi}]^2 &= 10^{-4} \\
V[\hat{\pi}] &= 10^{-4} \\
\frac{\pi(4-\pi)}{N} &= 10^{-4} \\
N &= \pi(4-\pi) \times 10^{4} \\
&= 26967.6…
\end{align}
$$

上記に基づいて用いるサンプルの組の数を考えれば良い。

例32.2

確率変数$X$の累積分布関数を$F(x)$とおくと、$F(x)$は下記のように計算できる。
$$
\large
\begin{align}
F(x) &= \int_{0}^{x} 2 e^{-2x} dx \\
&= \left[ -e^{-2x} \right]_{0}^{x} \\
&= 1-e^{-2x}
\end{align}
$$

ここで$u=F(x)$とおき、逆関数$x = F^{-1}(u)$を考える。
$$
\large
\begin{align}
u &= F(x) \\
u &= 1-e^{-2x} \\
e^{-2x} &= 1-u \\
-2x &= \log{(1-u)} \\
x &= -\frac{1}{2} \log{(1-u)}
\end{align}
$$

よって、確率変数$X$に従う乱数を生成するには$U(0,1)$に従う乱数を生成し、$\displaystyle x = -\frac{1}{2} \log{(1-u)}$によって$x$を計算すれば良いことがわかる。

例32.3

採択・棄却法は下記の手順で行うことができる。

1) 一様分布$U(0,1)$に基づいて$x$と$u$を発生させる。
2) $\displaystyle r = \frac{1}{M_i}x(1-x)$を計算し、$u \leq r$ならば$x$を生成し、そうでなければ棄却する。
3) 1)と2)を必要数のサンプルが得られるまで繰り返す。

また、$l(x)=x(1-x)$の最大値が$\displaystyle x = \frac{1}{2}$のときに$\displaystyle \frac{1}{4}$となるので、$M_2$の方が効率良くサンプリングを行うことができる。採択確率は$M_1$のとき$\displaystyle \frac{1}{6}$、$M_2$のとき$\displaystyle \frac{2}{3}$であることも確認できる。

例32.4

下記のような計算を実行することで推定を行うことができる。

import numpy as np

np.random.seed(0)

x = 3.*np.random.rand(100000)+2.
g_hat = np.mean(np.e**(-x))

print("Estimated I: {:.3f}".format(3*g_hat))

・実行結果

> print("Estimated I: {:.3f}".format(3*g_hat))
Estimated I: 0.129

実際の結果が$\displaystyle \int_{2}^{5} e^{-x} dx = \left[-e^{-x}\right]_{2}^{5}=e^{-2}-e^{-5}=0.128…$であることより、この結果が妥当であることが確認できる。

例32.5

$$
\large
\begin{align}
g_1(x) &= e^x \\
g_2(x) &= g_1(x) – h(x) + \int_{0}^{1} h(x) dx \\
&= e^x – x + \frac{1}{2}
\end{align}
$$

$g_1(x), g_2(x)$は上記のように表すことができる。また、$I_1=I_2=e-1$が成立する。よって、$\sigma_1^2, \sigma_2^2$は下記のようになる。
$$
\large
\begin{align}
\sigma_1^2 &= \int_{0}^{1} (g_1(x)-I_1)^2 dx \\
&= \int_{0}^{1} (e^x-(e-1))^2 dx \\
&= \int_{0}^{1} (e^x-e+1)^2 dx = 0.2420 \\
\sigma_2^2 &= \int_{0}^{1} (g_2(x)-I_2)^2 dx \\
&= \int_{0}^{1} \left( e^x – x + \frac{1}{2} – (e-1) \right)^2 dx \\
&= \int_{0}^{1} \left( e^x – e – x + \frac{3}{2} \right)^2 dx = 0.0437
\end{align}
$$

これより$\hat{I}_2$の推定の方が$\hat{I}_1$の推定よりも精度が良いことがわかる。

例32.6

確率変数が$X \sim U(0,1)$であるので、$g_{1}(X), g_{2}(X)$の期待値は$I$であり、分散$\sigma_1^2, \sigma_2^2$は下記のように表すことができる。
$$
\large
\begin{align}
\sigma_1^2 &= \int_{0}^{1} (g_{1}(x)-I)^2 dx \\
\sigma_2^2 &= \int_{0}^{1} (g_{2}(x)-I)^2 dx
\end{align}
$$

上記に対し、$g_{1}(X), g_{1}(1-X)$の相関係数を$\rho=\rho[g_{1}(X),g_{1}(1-X)]$のようにおき、$\sigma_2^2$を$\sigma_1^2$を用いて表せるように式変形を行う。
$$
\large
\begin{align}
\sigma_1^2 &= \int_{0}^{1} (g_{2}(x)-I) dx \\
&= \int_{0}^{1} \left( \frac{g_{1}(x)+g_{1}(1-x)}{2} – I \right)^2 dx \\
&= \int_{0}^{1} \left( \frac{g_{1}(x)-I}{2} + \frac{g_{1}(1-x)-I}{2} \right)^2 dx \\
&= \int_{0}^{1} \left( \frac{g_{1}(x)-I}{2} \right)^2 + \left( \frac{g_{1}(1-x)-I}{2} \right)^2 + \frac{(g_{1}(x)-I)(g_{1}(1-x)-I)}{4} dx \\
&= \frac{\sigma_1^2}{2}(1+\rho)
\end{align}
$$

ここで$\sigma_1^2=0.242$であり、$\rho$は下記のように計算することができる。
$$
\large
\begin{align}
\rho &= \frac{1}{\sqrt{\sigma_1^2 \times \sigma_1^2}} \int_{0}^{1} (g_{1}(x)-I)(g_{1}(1-x)-I) dx \\
&= \frac{1}{\sigma_1^2} \int_{0}^{1} (e^{x}-I)(e^{1-x}-I) dx \\
&= \frac{-0.234}{0.242} = -0.9669…
\end{align}
$$

よって、推定値$\hat{I}_1, \hat{I}_2$の標準偏差$se(\hat{I}_1), se(\hat{I}_2)$は下記のように表すことができる。
$$
\large
\begin{align}
se(\hat{I}_1) &= \sqrt{V \left[ \frac{1}{2m} \sum_{i=1}^{2m} g_1(X_i) \right]} \\
&= \sqrt{\frac{1}{(2m)^2} \times 2m V \left[ g_1(X) \right]} \\
&= \sqrt{\frac{\sigma_1^2}{2m}} = \frac{\sigma_1}{\sqrt{2m}} \\
se(\hat{I}_2) &= \sqrt{V \left[ \frac{1}{m} \sum_{i=1}^{m} g_2(X_i) \right]} \\
&= \sqrt{\frac{1}{m^2} \times m V \left[ g_2(X) \right]} \\
&= \sqrt{\frac{1}{m} \frac{\sigma_1^2}{2}(1+\rho)} \\
&= \frac{\sigma_1}{\sqrt{2m}}\sqrt{1+\rho} \\
&= \frac{\sigma_1}{\sqrt{2m}}\sqrt{1+\rho} \\
&= \frac{\sqrt{0.033}\sigma_1}{\sqrt{2m}} < \frac{\sigma_1}{\sqrt{2m}} = se(\hat{I}_1)
\end{align}
$$

上記より$\hat{I}_2$の近似の方が精度が良いと考えることができる。

・追記
ワークブックの解答では$se(\hat{I}_2)$が$\displaystyle \frac{\sigma_1}{\sqrt{2m}}(1+\rho)$とされるが、正確には$\displaystyle \frac{\sigma_1}{\sqrt{2m}}\sqrt{1+\rho}$の間違いであると思われる。

例32.7

下記を実行することで計算を行うことができる。

import numpy as np

sample_mean = 11.083
sample_variance = 13.538
bias = 0.021
se_B = 1.010
m = 12.

print("[1] : {:.3f}".format(sample_mean-bias))
print("[2] : {:.3f}".format(se_B/np.sqrt(sample_variance/m)))

・実行結果

[1] : 11.062
[2] : 0.951

例32.8

$[1]$
下記を実行することで計算することができる。

import numpy as np

x = np.array([11., 9., 9., 12., 5., 8., 7., 12., 13., 14., 18., 15.])

x_sub = np.zeros(x.shape)
for i in range(x.shape[0]):
    a = 0
    for j in range(x.shape[0]):
        if i != j:
            a += x[j]
    x_sub[i] = a/(x.shape[0]-1)

mean_x_sub = np.mean(x_sub)

print("mean-theta_j: {:.3f}".format(mean_x_sub))

・実行結果

> print("mean of theta_j: {:.3f}".format(mean_x_sub))
mean-theta_j: 11.083

$[2]$
下記を実行することで計算することができる。

import numpy as np

s2 = 0.10256
se_jack = np.sqrt(11*s2)

print("Standard error of jackknife estimator: {:.3f}".format(se_jack))

・実行結果

> print("Standard error of jackknife estimator: {:.3f}".format(se_jack))
Standard error of jackknife estimator: 1.062

問32.1

$[1]$
$\hat{\pi}$の標準偏差を$SD[\hat{\pi}]$と定義すると、標準偏差の定義により$SD[\hat{\pi}]$は下記のように考えることができる。
$$
\large
\begin{align}
SD[\hat{\pi}] &= \sqrt{V[\hat{\pi}]} = \sqrt{V \left[ 4 \times \frac{1}{n} \sum_{i=1}^{n} \sqrt{1-U_i^2} \right]} \\
&= \sqrt{\frac{4^2}{n^2} \times n V \left[ \sqrt{1-U^2} \right]} \\
&= \frac{4}{\sqrt{n}} \sqrt{ V \left[ \sqrt{1-U^2} \right] }
\end{align}
$$

ここで$\displaystyle V \left[ \sqrt{1-U^2} \right]$は下記のように計算することができる。
$$
\large
\begin{align}
V \left[ \sqrt{1-U^2} \right] &= E \left[ \sqrt{1-U^2}^2 \right] – E \left[ \sqrt{1-U^2} \right]^2 \\
&= \int_{0}^{1} (1-u^2) du – \left( \frac{\pi}{4} \right)^2 \\
&= \frac{2}{3} – \left( \frac{\pi}{4} \right)^2 = 0.04981…
\end{align}
$$

よって、$SD[\hat{\pi}]=0.01$となるのに必要な$n$は下記のように計算できる。
$$
\large
\begin{align}
SD[\hat{\pi}] &= 0.01 \\
\frac{4}{\sqrt{n}} \sqrt{ V \left[ \sqrt{1-U^2} \right] } &= 0.01 \\
\frac{4}{\sqrt{n}} \sqrt{ \frac{2}{3} – \left( \frac{\pi}{4} \right)^2 } &= 0.01 \\
n &= \frac{4^2}{0.01^2} \left( \frac{2}{3} – \left( \frac{\pi}{4} \right)^2 \right) \\
&= 7970.6…
\end{align}
$$

$[2]$
$\hat{\pi}$の標準偏差を$SD[\hat{\pi}]$とおくと、$[1]$と同様に下記のような計算を行うことができる。
$$
\large
\begin{align}
SD[\hat{\pi}] &= \sqrt{V[\hat{\pi}]} = \sqrt{V \left[ 4 \times \frac{1}{n} \sum_{i=1}^{n} \sqrt{1-U_i^2} + U_i – \frac{1}{2} \right]} \\
&= \frac{4}{\sqrt{n}} \sqrt{ V \left[ \sqrt{1-U^2} + U – \frac{1}{2} \right] } \\
&= \frac{4}{\sqrt{n}} \sqrt{ E \left[ \left( \sqrt{1-U^2} + U – \frac{1}{2} – \frac{\pi}{4} \right)^2 \right]} \\
&= \frac{4}{\sqrt{n}} \sqrt{ \int_{0}^{1} \left( \sqrt{1-u^2} + u – \frac{1}{2} – \frac{\pi}{4} \right)^2 du } \\
&= \frac{4}{\sqrt{n}} \sqrt{0.0144} \\
\end{align}
$$

よって、$SD[\hat{\pi}]=0.01$となるのに必要な$n$は下記のように計算できる。
$$
\large
\begin{align}
SD[\hat{\pi}] &= 0.01 \\
\frac{4}{\sqrt{n}} \sqrt{0.0144} &= 0.01 \\
n &= \frac{4^2}{0.01^2} \times 0.0144 = 2304
\end{align}
$$

参考

・準$1$級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1