ブログ

「統計検定1級テキスト」 練習問題解答例 Ch.6 「統計応用共通手法」

当記事は「統計検定$1$級対応 統計学(東京図書)」の読解サポートにあたって第$6$章の「統計応用共通手法」に関して演習問題を中心に解説を行います。標本調査法、実験計画法、重回帰分析、主成分分析、因子分析、ロジスティック回帰など重要トピックが多いので、抑えておくと良いと思います。

本章のまとめ

練習問題解説

問$6$.$1$

$[1]$
$Y_i = \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i} + \varepsilon_i$には通常下記の仮定が置かれる。

$(a)$ $E[\varepsilon_i] = 0$
$(b)$ $V[\varepsilon_i] = \sigma^2$
$(c)$ $\mathrm{Cov}[\varepsilon_i,\varepsilon_j] = 0, \; i \neq j$

最尤推定に基づく最小二乗法を実行する場合は、上記は$Y_i \sim \mathcal{N}(\beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i},\sigma^2), \; i.i.d.$でまとめて取り扱われる。

$[2]$
推定された回帰式は$y = -1.938+0.099x_1+0.194x_2$であり、Listeningの点数が$10$点上がることで$y$は約$1$点上がり、Readingの点数が$10$点上がるごとに$y$は$2$点上がると解釈できる。

問$6$.$2$

問$6$.$3$

問$6$.$4$

参考

・統計検定$1$級 統計応用 関連まとめ
https://www.hello-statisticians.com/stat_certifi_1_app

【Matplotlib 一問一答】統計学を学ぶにあたって知っておくと良いMatplotlibの用法

統計学を学ぶにあたって、グラフなどを用いて視覚的に理解することは重要です。PythonではMatplotlibがシンプルで使いやすいですが、毎度調べるというのは大変です。そこで当記事ではMatplotlibの抑えておきたい用法について一問一答形式でまとめました。

配列には主にNumPyを用いますので、NumPyの使い方に関してはわからなければ適宜調べるようにお願いします。また、実行結果の図示に関しては容量の都合上省略しているものも多いです。

基本事項の確認

配列の定義

下記のように配列の定義は行う。

import numpy as np

x = np.arange(0., 2.1, 0.1)
y = 2.*x + 1.

print(x)
print(y)

・実行結果

> print(x)
[ 0.   0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.   1.1  1.2  1.3  1.4  1.5  1.6  1.7  1.8  1.9  2. ]
> print(y)
[ 1.   1.2  1.4  1.6  1.8  2.   2.2  2.4  2.6  2.8  3.   3.2  3.4  3.6  3.8  4.   4.2  4.4  4.6  4.8  5. ]

配列xの定義にあたっては、numpy.arangenp.linspaceを用いることで作成を行える。また、np.arrayなどを用いて多次元リストを変換する場合もある。以下ではグラフの作成の際のxyに関して先に与え、出題という形式でまとめる。

ライブラリの読み込み

解答$1$つ$1$つでライブラリの読み込みを行うと冗長であるので、以下を実行した上でそれぞれの解答のプログラムを実行する必要がある。

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

pyplotの用法

グラフの描画

Q.1-1-1 棒グラフの描画

x = np.array([1,2,3,4,5])
y = np.array([3.2, 2.1, 5.1, 1.2, 3.7])

上記のように与えられたxyに対して棒グラフの描画を行え。

・解答

plt.bar(x,y)
plt.show()

・実行結果

Q.1-1-2 折れ線グラフの描画

x = np.array([1,2,3,4,5])
y = np.array([3.2, 2.1, 5.1, 1.2, 3.7])

上記のように与えられたxyに対して折れ線グラフの描画を行え。
・解答

plt.plot(x,y)
plt.show()

・実行結果

Q.1-1-3 ヒストグラムの描画

x = stats.norm.rvs(size=1000)

上記のように与えられたxに対して区間の数が$20$個のヒストグラムの描画を行え。

・解答

plt.hist(x,bins=20)
plt.show()

・実行結果

Q.1-1-4 散布図の描画

np.random.seed(0)
x = stats.norm.rvs(size=500)
y = 1.2*x + 0.5*stats.norm.rvs(size=500)

上記のように与えられたxyに対して散布図の描画を行え。

・解答

plt.scatter(x,y)
plt.show()

・実行結果

Q.1-1-5 plt.plotを用いた円の描画

$x^2 + y^2 = 1$の描画をplt.plotを用いて行え。

・解答

pi = np.linspace(0,2*np.pi,100)
x = np.cos(pi)
y = np.sin(pi)

plt.plot(x,y)
plt.show()

・実行結果

Q.1-1-6 plt.fill_betweenを用いた領域の描画

plt.fill_betweenを用いて$0 \leq x \leq 1, x^2 \leq y \leq x$の領域を図示せよ。

・解答

x = np.arange(0., 1.01, 0.01)
y1 = x**2
y2 = x

plt.fill_between(x, y1, y2, alpha=0.3)
plt.show()

・実行結果

plt.fill_betweenは区間推定を行う際などに用いることが多いが、alpha=0.3のように指定することで区間と推定値の双方を見やすく表示できることは抑えておくと良い。

Q.1-1-7 plt.hist2dを用いた$2$次元ヒストグラムの描画

np.random.seed(0)

n = 100000
U1, U2 = np.random.rand(n), np.random.rand(n)

X = np.sqrt(-2*np.log(U1)) * np.cos(2*np.pi*U2)
Y = np.sqrt(-2*np.log(U1)) * np.sin(2*np.pi*U2)

上記を実行することでボックスミュラー法に基づいて正規乱数XYの生成を行なうことができる。plt.hist2dを用いてXYを$2$次元ヒストグラムの形式で描画せよ。

・解答

plt.hist2d(X,Y,bins=50)
plt.show()

・実行結果

・参考
ボックスミュラー法

グラフの調整

Q.1-2-1 グラフの色

Q.$1$-$3$で取り扱ったヒストグラムを緑で表せ。

・解答

np.random.seed(0)
x = stats.norm.rvs(size=1000)

plt.hist(x,bins=20,color="green")
plt.show()

・実行結果

以下、グラフの色の使い分けに関しては見やすさを重視し、特に指定なく使用する。

Q.1-2-2 範囲の調整

Q.$1$-$1$-$5$の描画結果を$-1.2 \leq x \leq 1.2, -1.2 \leq y \leq 1.2$で表せ。

・解答

pi = np.linspace(0,2*np.pi,100)
x = np.cos(pi)
y = np.sin(pi)

plt.plot(x,y)
plt.xlim([-1.2,1.2])
plt.ylim([-1.2,1.2])

plt.show()

・実行結果

Q.1-2-3 凡例の追加

x = np.arange(0.,5.1,0.1)
y1 = 2*x + 1
y2 = x**2

y1y2に関してグラフを作成し、それぞれ凡例を示せ。

・解答

plt.plot(x,y1,label="y1")
plt.plot(x,y2,label="y2")

plt.legend()
plt.show()

・実行結果

Q.1-2-4 凡例の位置の調整

Q.$1$-$2$-$3$の凡例を左上に配置せよ。

・解答

plt.plot(x,y1,label="y1")
plt.plot(x,y2,label="y2")

plt.legend(loc="upper left")
plt.show()

・実行結果

Q.1-2-5 図のタイトルの追加

np.random.seed(0)
x = stats.norm.rvs(size=1000)

Q.$1$-$1$-$3$と同様に上記のヒストグラムを作成し、タイトルに「Histgram」を追加せよ。

・解答

plt.hist(x,bins=20)
plt.title("Histgram")
plt.show()

Q.1-2-6 常用対数グラフの作成

x = np.arange(0.1,5.1,0.1)
y1 = 2*x + 1
y2 = 2**x

上記のy1y2を常用対数のスケールでグラフ化せよ。

・解答

plt.plot(x,y1,label="y1")
plt.plot(x,y2,label="y2")

plt.yscale("log")
plt.legend(loc="upper left")
plt.show()

・実行結果

Q.1-2-7 対数グラフの底の変換

Q.$1$-$2$-$6$を対数の底を$2$に設定し、グラフの作成を行え。

・解答

plt.plot(x,y1,label="y1")
plt.plot(x,y2,label="y2")

plt.yscale("log", basey=2)
plt.legend(loc="upper left")
plt.show()

・実行結果

Q.1-2-8 マーカーの形と大きさ

①Q.$1$-$1$-$4$のマーカーの大きさを変えよ。②●ではなく×に変え、同様に散布図の描画を行え。

・Q.$1$-$1$-$4$で生成を行うサンプル

np.random.seed(0)
x = stats.norm.rvs(size=500)
y = 1.2*x + 0.5*stats.norm.rvs(size=500)

・解答①

plt.scatter(x,y,s=100)
plt.show()

・実行結果①

・解答②

plt.scatter(x,y,marker="x",s=50)
plt.show()

・実行結果②

Q.1-2-9 図の描画順

x = np.array([1,2,3,4,5])
y = np.array([3.2, 2.1, 5.1, 1.2, 3.7])

上記のQ.$1$-$1$-$2$の例に対し、折れ線グラフの上に各点の描画を行え。

・解答

plt.plot(x,y,zorder=1)
plt.scatter(x,y,s=50,zorder=2)
plt.show()

・実行結果

プラスアルファで抑えておくと良い使い方

Q.1-3-1 複数グラフの描画

np.random.seed(0)

x = np.arange(-5.,5.1,0.1)
y = stats.norm.pdf(x)

sampled_x = stats.norm.rvs(size=10000)

標準正規分布$\mathcal{N}(0,1)$の確率密度関数である上記のyのグラフと、$\mathcal{N}(0,1)$からのサンプルであるsampled_xのグラフをそれぞれ上下配置で作成せよ。また、グラフの定義域は一致させよ。

・解答

plt.subplot(211)
plt.plot(x,y,color="green")
plt.xlim([-5.1,5.1])
plt.subplot(212)
plt.hist(sampled_x,bins=20,color="limegreen")
plt.xlim([-5.1,5.1])
plt.show()

・実行結果

Q.1-3-2 グラフの保存

「Q.$1$-$3$-$1$ 複数グラフの描画」の結果をnorm1.pngに書き出せ。

・解答

plt.subplot(211)
plt.plot(x,y,color="green")
plt.xlim([-5.1,5.1])
plt.subplot(212)
plt.hist(sampled_x,bins=20,color="limegreen")
plt.xlim([-5.1,5.1])

plt.savefig("norm1.png")

・実行結果 norm1.png

まとめ

Ch.5 「地域統計」の章末問題の解答例 〜基礎統計学Ⅱ 人文・社会科学の統計学〜

当記事は「基礎統計学Ⅱ 人文・社会科学の統計学(東京大学出版会)」の読解サポートにあたってChapter.$5$の「地域統計」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_stat_basic_1-3#green

章末の演習問題について

問題5.1の解答例

問題5.2の解答例

下記を実行することでそれぞれ各地域の特化係数を計算できる。
・$4$案

import numpy as np

ratio1_ij = np.array([[15.1, 51.4, 5.4, 28.1], [20.5, 40.2, 6.5, 32.8], [21.2, 45.9, 6.4, 26.5], [17.9, 24.1, 34.1, 23.9], [22.8, 37.7, 15.7, 23.8], [22.3, 42.1, 10.0, 25.6], [6.7, 36.4, 8.5, 48.4], [18.1, 37.5, 14.2, 30.2]])
ratio1_i = np.array([18.6, 43.4, 9.6, 28.3])

print(ratio1_ij/ratio1_i)

・実行結果

[[ 0.81182796  1.1843318   0.5625      0.99293286]
 [ 1.10215054  0.92626728  0.67708333  1.1590106 ]
 [ 1.13978495  1.05760369  0.66666667  0.93639576]
 [ 0.96236559  0.55529954  3.55208333  0.84452297]
 [ 1.22580645  0.86866359  1.63541667  0.8409894 ]
 [ 1.19892473  0.97004608  1.04166667  0.90459364]
 [ 0.36021505  0.83870968  0.88541667  1.71024735]
 [ 0.97311828  0.8640553   1.47916667  1.06713781]]

・$2$案

ratio2_ij = np.array([[67.7, 32.3], [60.5, 39.5], [67.7, 32.3], [62.8, 37.2], [68.2, 31.8], [66.5, 33.5], [46.6, 53.4], [61.4, 38.6]])
ratio2_i = np.array([65.2, 34.8])

print(ratio2_ij/ratio2_i)

・実行結果

[[ 1.03834356  0.92816092]
 [ 0.92791411  1.13505747]
 [ 1.03834356  0.92816092]
 [ 0.96319018  1.06896552]
 [ 1.04601227  0.9137931 ]
 [ 1.01993865  0.96264368]
 [ 0.71472393  1.53448276]
 [ 0.94171779  1.1091954 ]]

問題5.3の解答例

10章「仮説検定の方法(2)」の練習問題解答例〜例題で学ぶ初歩からの統計学[第2版]〜

当記事は「白砂, 例題で学ぶ初歩からの統計学 第$2$版 (日本評論社)」の読解サポートにあたって$10$章「仮説検定の方法$(2)$:母比率・母平均の差・母比率の差の検定」の練習問題を解説します。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。(そのため著者の意図とは異なる解説となる可能性はあります)

・統計学に関する書籍の解答集
https://www.hello-statisticians.com/answer_textbook

執筆:@kakusan96

演習問題 解答例

10-1.(母比率の検定[右片側検定])

帰無仮説を本日の製造工程において不良率が従来と変わらなかった($p=0.05$)、対立仮説を本日の製造工程において不良率が上昇した($p >0.05$)として、有意水準の1%の右片側検定を行う。

問題文より、

  • 標本数$n=1900$
  • 母比率$p=0.05$
  • 標本比率$\hat{p}=0.07$

であり、帰無仮説が正しいとき標本比率$\hat{p}$の分布は正規分布N(p, $\frac{p(1-p)}{n}$)に従う。
標本平均の分布が正規分布に従うためz検定を行う。

検定統計量$z=\frac{\hat{p}-p}{\sqrt{\frac{p(1-p)}{n}}}$を計算すると

$$
\begin{align}
z&=\frac{0.07-0.05}{\sqrt{\frac{0.05(1-0.05)}{1900}}} \\
z&=\frac{0.02}{0.005} \\
z&=4
\end{align}
$$

$z>2.326$より有意水準の1%の右方側検定において帰無仮説は棄却され、対立仮説が採択されるため、本日の製造工程において、不良率が上昇したといえる。

10-2.(母比率の検定[右片側検定])

帰無仮説を候補者Cの得票率は$50%$である($p=0.5$)、対立仮説を候補者Cの得票率は$50%$より大きい($p >0.5$)として、有意水準の$1%$の右片側検定を行う。

問題文より、

  • 標本数n=1600
  • 母比率$p=0.5$
  • 標本比率$\hat{p}=0.54$

であり、帰無仮説が正しいとき標本比率$\hat{p}$の分布は正規分布$N(p, \frac{p(1-p)}{n})$に従う。標本平均の分布が正規分布に従うためz検定を行う。

検定統計量$z=\frac{\hat{p}-p}{\sqrt{\frac{p(1-p)}{n}}}$を計算すると

$$
\begin{align}
z&=\frac{0.54-0.5}{\sqrt{\frac{0.5(1-0.5)}{1600}}} \\
z&=\frac{0.02}{0.005} \\
z&=3.2
\end{align}
$$

$z>2.326$より有意水準の$1%$の右片側検定において帰無仮説は棄却され、対立仮説が採択されるため、候補者Cは当選確実といえる。

10-3.(母比率の検定[右片側検定])

帰無仮説を商品の知名度は、テレビCMの増加によって従来と変わらなかった($p=0.18$)、対立仮説を商品の知名度は、テレビCMの増加によって従来より向上した($p >0.18$)として、有意水準の$5%$の右片側検定を行う。

問題文より

  • 標本数n=4100
  • 母比率$p=0.18$
  • 標本比率$\hat{p}=0.2$

であり、帰無仮説が正しいとき標本比率$\hat{p}$の分布は正規分布$N(p, \frac{p(1-p)}{n})$に従う。標本平均の分布が正規分布に従うためz検定を行う。

検定統計量$z=\frac{\hat{p}-p}{\sqrt{\frac{p(1-p)}{n}}}$を計算すると

$$
\begin{align}
z&=\frac{0.2-0.18}{\sqrt{\frac{0.18(1-0.18)}{4100}}} \\
z&=\frac{0.02}{0.006} \\
z&=3.333…
\end{align}
$$

$z>1.645$より有意水準の$5%$の右片側検定において帰無仮説は棄却され、対立仮説が採択されるため、この商品の知名度は、テレビCMの増加によって従来より向上したといえる。

10-4.(母比率の検定[左片側検定])

帰無仮説をA市の50代で高血圧の人の割合は、県内の割合と同じである($p=0.24$)、対立仮説をA市の50代で高血圧の人の割合は、県内の割合より小さい($p <0.24$)として、有意水準の$5%$の左片側検定を行う。

問題文より

  • 標本数n=2850
  • 母比率$p=0.24$
  • 標本比率$\hat{p}=0.22$

であり、帰無仮説が正しいとき標本比率$\hat{p}$の分布は正規分布$N(p, \frac{p(1-p)}{n})$に従う。標本平均の分布が正規分布に従うためz検定を行う。

検定統計量$z=\frac{\hat{p}-p}{\sqrt{\frac{p(1-p)}{n}}}$を計算すると

$$
\begin{align}
z&=\frac{0.22-0.24}{\sqrt{\frac{0.24(1-0.24)}{2850}}} \\
z&=\frac{-0.02}{0.008} \\
z&=-2.5
\end{align}
$$

$z<-1.645$より有意水準の$5%$の右片側検定において帰無仮説は棄却され、対立仮説が採択されるため、A市の50代で高血圧の人の割合は、県内の割合より小さいといえる。

10-5.(母平均の差の検定[両側検定])

帰無仮説をA国とB国の工場で製造されたタイヤの平均寿命に差がない($\mu_1=\mu_2$)、対立仮説をA国とB国の工場で製造されたタイヤの平均寿命に差がある($\mu_1\neq\mu_2$)として、有意水準の$1%$の両側検定を行う。
問題文より、

  • 標本数 $n_1=400$
  • 標本数 $n_2=400$
  • 標本平均 $\bar{X_1}=27500$
  • 標本平均 $\bar{X_2}=26800$
  • 標本標準偏差 $s_1=2400$
  • 標本標準偏差 $s_2=3200$

であり、帰無仮説が正しいとき標本平均の差$\mu_1-\mu_2$の分布は正規分布$N(\mu_1-\mu_2, \frac{s_1^2}{n_1}+\frac{s_2^2}{n_2})$に従う。標本平均の分布が正規分布に従うためz検定を行う。

標本平均が同じだとすると$\mu_1=\mu_2$であり、検定統計量

$z=\frac{(\bar{X_1}-\bar{X_2})-(\mu_1-\mu_2)}{\sqrt{\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2}}}=\frac{\bar{X_1}-\bar{X_2}}{\sqrt{\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2}}}$

を計算すると

$$
\begin{align}
z &=\frac{27500-26800}{\sqrt{\frac{2400^2}{400}+\frac{3200^2}{400}}} \\
z &=\frac{700}{200}\\
z &=3.5
\end{align}
$$

今回は両側検定であるため$z_{\frac{0.01}{2}}=\pm 2.576$より、有意水準$5%$の両側検定における臨界値は$z=\pm 2.576$である。
$z>2.576$より有意水準$5%$の両側検定において帰無仮説は棄却され、対立仮説が採択されるため、A国とB国の工場で製造されたタイヤの平均寿命に差があるといえる。

10-6.(母平均の差の検定[右片側検定])

帰無仮説を前回と今回の試験結果に差がない($\mu_1=\mu_2$)、対立仮説を前回よりも今回の試験結果の方が良い($\mu_1<\mu_2$)として、有意水準の$1%$の右片側検定を行う。

問題文より、

  • 標本数$n_1=625$
  • 標本数$n_2=625$
  • 標本平均$\bar{X_1}=64.1$
  • 標本平均$\bar{X_2}=62.4$
  • 標本標準偏差$s_1=9.0$
  • 標本標準偏差$s_2=12.0$

であり、帰無仮説が正しいとき標本平均の差$\mu_1-\mu_2$の分布は正規分布$N(\mu_1-\mu_2, \frac{s_1^2}{n_1}+\frac{s_2^2}{n_2})$に従う。標本平均の分布が正規分布に従うためz検定を行う。

標本平均が同じだとすると$\mu_1=\mu_2$であり、検定統計量

$$z=\frac{(\bar{X_1}-\bar{X_2})-(\mu_1-\mu_2)}{\sqrt{\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2}}}=\frac{\bar{X_1}-\bar{X_2}}{\sqrt{\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2}}}$$

を計算すると

$$
\begin{align}
z&=\frac{64.1-62.4}{\sqrt{\frac{9.0^2}{625}+\frac{12.0^2}{625}}} \\
z&=\frac{1.7}{0.6} \\
z&=2.833
\end{align}
$$

$z>2.326$より有意水準の$1%$の右片側検定において帰無仮説は棄却され、対立仮説が採択されるため、前回よりも今回の試験結果の方が良いといえる。

10-7.(母比率の差の検定[両側検定])

帰無仮説をカップ麺に対する評価は関東と関西で差がない($p_1=p_2$)、対立仮説をカップ麺に対する評価は関東と関西で差がある($p_1\neq p_2$)として、有意水準$5%$の両側検定を行う。

問題文より、

  • 関東の試食における標本数$n_1=800$
  • 関西の試食における標本数$n_2=800$
  • 関東の試食にて「おいしい」と答えた標本比率$\hat{p_1}=0.67$
  • 関西の試食にて「おいしい」と答えた標本比率$\hat{p_2}=0.61$

帰無仮説が正しいとき標本比率の差$\hat{p_1}-\hat{p_2}$の分布は正規分布$N(p_1-p_2, \frac{p_1(1-p_1)}{n_1}+\frac{p_2(1-p_2)}{n_2})$に従う。

二つの母比率に差がないとき、$p_1=p_2$であり、$p_1=p_2=p$とすると、$p_1-p_2=0$, $\frac{p_1(1-p_1)}{n_1}+\frac{p_2(1-p_2)}{n_2}=\frac{p(1-p)}{n_1}+\frac{p(1-p)}{n_2}$である。

従って、帰無仮説が正しいとき標本比率の差$\hat{p_1}-\hat{p_2}$の分布は正規分布N(0, $p(1-p)(\frac{1}{n_1}+\frac{1}{n_2})$)に従う。
母比率pは未知であり、二つの標本を合わせた比率$\hat{p}$を母比率pの推定値とする。関東の試食にて「おいしい」と答えた人数を$x_1$,関西の試食にて「おいしい」と答えた人数を$x_2$とすると$\hat{p}=\frac{x_1+x_2}{n_1+n_2}$である。
標本平均の分布が正規分布に従うためz検定を行う。

検定統計量

$$
z=\frac{(\hat{p_1}-\hat{p_2})-(p_1-p_2)}{\sqrt{\frac{p_1(1-p_1)}{n_1}+\frac{p_2(1-p_2)}{n_2}}}=\frac{\hat{p_1}-\hat{p_2}}{\sqrt{\hat{p}(1-\hat{p})(\frac{1}{n_1}+\frac{1}{n_2})}}
$$

を計算すると

$$
\begin{align}
z&=\frac{0.67-0.61}{\sqrt{{0.64(1-0.64)(\frac{1}{800}+\frac{1}{800})}}} \\
z&=\frac{0.06}{0.024}\\
z&=2.5
\end{align}
$$

今回は両側検定であるため$z_{\frac{0.05}{2}}=\pm 1.96$より、有意水準5%の両側検定における臨界値は$z=\pm 1.96$である。
$z>1.96$より有意水準の5%の両側検定において帰無仮説は棄却され、対立仮説が採択されるため、カップ麺に対する評価は関東と関西で差があるといえる。

10-8.(母比率の差の検定[左片側検定])

帰無仮説をこの10年間で、この大都市の男子大学生の喫煙率は変わらなかった($p_1=p_2$)、対立仮説をこの10年間で、この大都市の男子大学生の喫煙率は低下した($p_1<p_2$)として、有意水準の$1%$の左片側検定を行う。

問題文より

  • 現在の男子大学生の喫煙者率の標本数$n_1=4200$
  • 10年前の男子大学生の喫煙者率の標本数$n_2=4200$
  • 現在の男子大学生の喫煙者率の標本比率$\hat{p_1}=0.285$
  • 10年前の男子大学生の喫煙者率の標本比率$\hat{p_2}=0.315$

帰無仮説が正しいとき標本比率の差$\hat{p_1}-\hat{p_2}$の分布は正規分布$N(p_1-p_2, \frac{p_1(1-p_1)}{n_1}+\frac{p_2(1-p_2)}{n_2})$に従う。

二つの母比率に差がないとき、$p_1=p_2$であり、$p_1=p_2=p$とすると、$p_1-p_2=0$, $\frac{p_1(1-p_1)}{n_1}+\frac{p_2(1-p_2)}{n_2}=\frac{p(1-p)}{n_1}+\frac{p(1-p)}{n_2}$である。

従って、帰無仮説が正しいとき標本比率の差$\hat{p_1}-\hat{p_2}$の分布は正規分布$N(0, p(1-p)(\frac{1}{n_1}+\frac{1}{n_2}))$に従う。
母比率$p$は未知であり、二つの標本を合わせた比率$\hat{p}$を母比率$p$の推定値とする。現在のこの大都市の男子大学生の喫煙者数を$x_1$,10年前のこの大都市の男子大学生の喫煙者数を$x_2$とすると$\hat{p}=\frac{x_1+x_2}{n_1+n_2}$である。
標本平均の分布が正規分布に従うためz検定を行う。

検定統計量

$$
z=\frac{(\hat{p_1}-\hat{p_2})-(p_1-p_2)}{\sqrt{\frac{p_1(1-p_1)}{n_1}+\frac{p_2(1-p_2)}{n_2}}}=\frac{\hat{p_1}-\hat{p_2}}{\sqrt{\hat{p}(1-\hat{p})(\frac{1}{n_1}+\frac{1}{n_2})}}
$$

を計算すると

$$
\begin{align}
z&=\frac{0.285ー0.315}{\sqrt{{0.3(1-0.3)(\frac{1}{4200}+\frac{1}{4200})}}} \\
z&=\frac{-0.03}{0.01}\\
z&=-3
\end{align}
$$

$z<-2.36$より有意水準$1%$の左片側検定において帰無仮説は棄却され、対立仮説が採択されるため、この10年間で、この大都市の男子大学生の喫煙率は低下したといえる。

ガンマ乱数の生成とその応用 〜ガンマ分布、$\chi^2$分布に基づく乱数の生成〜

当記事ではガンマ分布に基づくガンマ乱数の生成とその応用にあたって$\chi^2$分布に基づく乱数の生成を行います。ガンマ分布の形状パラメータと尺度パラメータに特定の値を定めることで、指数分布や$\chi^2$分布が導出できるので合わせて抑えておくと良いと思います。

一様乱数の生成などの他の乱数生成の手法に関しては下記で取りまとめを行いましたので、こちらも合わせてご確認ください。
https://www.hello-statisticians.com/explain-terms-cat/random_sampling1.html

「自然科学の統計学」の$11.4.3$節を参考に作成を行いました。

また、ガンマ分布と標本分布に関しては「現代数理統計学」の$4$章の「統計量と標本分布」なども合わせて参照すると良いと思います。

ガンマ分布

ガンマ分布の確率密度関数

ガンマ分布$\mathrm{Ga}(\alpha,\beta)$の確率密度関数$f(x)$を下記のように定められる。
$$
\large
\begin{align}
f(x) = \frac{1}{\beta^{\alpha} \Gamma(\alpha)} x^{\alpha-1} e^{-\frac{x}{\beta}} \quad (1)
\end{align}
$$

上記の$\alpha$と$\beta$はガンマ分布のパラメータであり、それぞれ形状パラメータ、尺度パラメータという。ここで尺度パラメータ$\beta$を元に$\mathrm{Ga}(\alpha,\beta)$と表すか、$\lambda=1/\beta$のように逆数を考え、$\mathrm{Ga}(\alpha,\lambda)$のように表すかは書籍によって異なるので注意が必要である。以下では$\mathrm{Ga}(\alpha,\beta)$、$\mathrm{Ga}(\alpha,\lambda)$の文字に着目して下記のように使い分けを行う。
$$
\large
\begin{align}
f(x) &= \frac{1}{\beta^{\alpha} \Gamma(\alpha)} x^{\alpha-1} e^{-\frac{x}{\beta}} \quad (1) \\
f(x) &= \frac{\lambda^{\alpha}}{\Gamma(\alpha)} x^{\alpha-1} e^{-\lambda x} \quad (1)’
\end{align}
$$

また、$\Gamma(\alpha)$はガンマ関数であり、ガンマ分布の正規化にあたって用いられる。ガンマ関数は下記のように定義される。
$$
\large
\begin{align}
\Gamma(\alpha) = \int_{0}^{\infty} t^{\alpha-1} e^{-t} dt \quad (2)
\end{align}
$$

ここで上記に対し、$t = \lambda x$で変数変換を行うことを考える。$\displaystyle \frac{dt}{dx}=\lambda$より、$(2)$式は下記のように変形できる。
$$
\large
\begin{align}
\Gamma(\alpha) &= \int_{0}^{\infty} t^{\alpha-1} e^{-t} dt \quad (2) \\
\Gamma(\alpha) &= \int_{0}^{\infty} (\beta x)^{\alpha-1} e^{-\lambda x} \frac{dt}{dx} dx \\
\Gamma(\alpha) &= \beta^{\alpha-1} \int_{0}^{\infty} x^{\alpha-1} e^{-\lambda x} \times \lambda dx \\
\Gamma(\alpha) &= \lambda^{\alpha} \int_{0}^{\infty} x^{\alpha-1} e^{-\lambda x} dx \\
\frac{\Gamma(\alpha)}{\lambda^{\alpha}} &= \int_{0}^{\infty} x^{\alpha-1} e^{-\lambda x} dx \quad (3)
\end{align}
$$

$(3)$式は積分に関する導出にあたってよく出てくるので抑えておくと良い。また、$(3)$式より、$(1)’$式が正規化されていることも確認できる。

形状パラメータ・尺度パラメータと分布の形状

ガンマ分布$\mathrm{Ga}(\alpha,\beta)$の確率密度関数の形状が、形状パラメータ$\alpha$と尺度パラメータ$\beta$の値の変化によってどのように変化するかに関して以下では確認を行う。

ガンマ分布の確率密度関数の計算を行うにあたってはガンマ関数$\Gamma(\alpha)$の値を計算する必要がある。ガンマ関数に関しては$\alpha$が$1$以上の整数であるときに$\Gamma(\alpha)=(\alpha-1)!$が成立するので、以下では$\alpha=2,3,5$のそれぞれに関して$\beta=0.5,1$の確認を行う。

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

alpha = np.array([2., 3., 5.])
beta = np.array([0.5, 1.])

x = np.arange(0., 8.1, 0.1)

for i in range(alpha.shape[0]):
    for j in range(beta.shape[0]):
        f_x = x**(alpha[i]-1) * np.e**(-x/beta[j]) /(beta[j]**alpha[i] * math.factorial(alpha[i]-1))
        plt.plot(x,f_x,label="alpha: {}, beta: {}".format(alpha[i],beta[j]))

plt.legend()
plt.show()

・実行結果

上記の「青、赤、紫」や「緑、水色、黄色」を確認すると、$\alpha$が大きくなるにつれて分布の中心が右にシフトしていることが確認できる。同様に「青と緑」、「赤と水色」、「紫と黄色」を確認することで$\beta$が大きくなるにつれて分布の中心が右にシフトしていることが確認できる。

この解釈にあたっては$\alpha$は多項式の次数であり、指数関数の減少分に対しどこまで対応できるかの指標であると考えると良い。また、$\beta$は指数関数の減少の速さを制御するパラメータだと考えると良い。

ここまでの内容により、多項式の次数に対応する形状パラメータ$\alpha$が大きいと分布は右にシフトし、指数関数の減少の速さに対応する尺度パラメータ$\beta$が大きいと分布が右にシフトすることについて把握することができる。

ガンマ分布と指数分布

ガンマ分布$\mathrm{Ga}(\alpha,\beta)$の形状パラメータと尺度パラメータが$\alpha=1,\beta=1/\lambda$のように与えられる場合、$(1)$式で表される確率密度関数$f(x)$は下記のように考えられる。
$$
\large
\begin{align}
f(x) &= \frac{1}{\beta^{\alpha} \Gamma(\alpha)} x^{\alpha-1} e^{-\frac{x}{\beta}} \quad (1) \\
&= \frac{\lambda^{1}}{\Gamma(1)} x^{1-1} e^{-\lambda x} \\
&= \frac{\lambda}{0!} x^{0} e^{-\lambda x} \\
&= \frac{\lambda}{1} \times 1 \times e^{-\lambda x} \\
&= \lambda e^{-\lambda x}
\end{align}
$$

上記は指数分布$\mathrm{Ex}(\lambda)$に一致する。よって指数分布はガンマ分布の特殊な場合と考えることができる。前項のガンマ分布のプログラムを元に、指数分布のグラフは下記のように作成できる。

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

alpha = np.array([1.])
lamb = np.array([1., 2., 3.])

x = np.arange(0., 3.1, 0.1)

for i in range(alpha.shape[0]):
    for j in range(lamb.shape[0]):
        f_x = lamb[j]**alpha[i] * x**(alpha[i]-1) * np.e**(-lamb[j]*x) / math.factorial(alpha[i]-1)
        plt.plot(x,f_x,label="alpha: {}, lambda: {}".format(alpha[i],lamb[j]))

plt.legend()
plt.show()

・実行結果

前項で取り扱ったガンマ分布をさらに左にシフトさせたグラフが得られたことが確認できる。また、前項と当項では$x=0$を考慮したが、$0<\alpha<1$では$x=0$の値が計算できないので$x>0$でグラフ描画の計算を行う必要がある。

ガンマ分布と$\chi^2$分布

自由度$1$の$\chi^2$分布がガンマ分布$\displaystyle \mathrm{Ga}(\alpha,\beta) = \mathrm{Ga} \left(\frac{1}{2},2\right)$で表せることを以下に示す。

まずは標準正規分布の確率密度関数の$f(x)$を考える。$f(x)$は下記のように表せる。
$$
\large
\begin{align}
f(x) = \mathcal{N}(x|0,1) = \frac{1}{\sqrt{2 \pi}} \exp \left( -\frac{x^2}{2} \right)
\end{align}
$$

上記に対し、$x \geq 0$で$y=x^2$のように変数変換を行うことを考える。このとき$x \geq 0$であるので、$x = \sqrt{y} \geq 0$が成立する。ここで$\displaystyle \frac{dx}{dy}$は下記のように計算できる。
$$
\large
\begin{align}
\frac{dx}{dy} &= \frac{d}{dy} (y)^{\frac{1}{2}} \\
&= \frac{1}{2 \sqrt{y}}
\end{align}
$$

よって$y$に対応する確率密度関数を$g(y)$とおくと、$g(y)$は下記のように表せる。
$$
\large
\begin{align}
g(y) &= f(x)\frac{dx}{dy} \\
&= \frac{1}{\sqrt{2 \pi}} \exp \left( -\frac{y}{2} \right) \times \frac{1}{2 \sqrt{y}} \\
&= \frac{1}{2} \times \frac{1}{\sqrt{2 \pi}} y^{\frac{1}{2}-1} \exp \left( -\frac{y}{2} \right)
\end{align}
$$

上記は$x \geq 0$のみを考えたので、$\chi^2$分布の確率密度関数$f_2(y)$は$f_2(y)=2g(y)$で得られる。ここで$f_2(y)=2g(y)$は下記のように変形できる。
$$
\large
\begin{align}
f_2(y) &= 2g(y) = \frac{2}{2} \times \frac{1}{\sqrt{2 \pi}} y^{\frac{1}{2}-1} \exp \left( -\frac{y}{2} \right) \\
&= \frac{1}{\sqrt{2 \pi}} y^{\frac{1}{2}-1} \exp \left( -\frac{y}{2} \right) \\
&= \frac{1}{\displaystyle 2^{\frac{1}{2}} \Gamma \left( \frac{1}{2} \right)} y^{\frac{1}{2}-1} \exp \left( -\frac{y}{2} \right)
\end{align}
$$

上記はガンマ分布$\displaystyle \mathrm{Ga} \left(\frac{1}{2},2\right)$の確率密度関数に一致する。また、次項で取り扱う「ガンマ分布の再生性」を用いることで、自由度$\nu$のガンマ分布が$\displaystyle \mathrm{Ga} \left(\frac{\nu}{2},2\right)$であることも示せる。

ガンマ分布の再生性

$X_1 \sim \mathrm{Ga}(\alpha_1,\beta), X_2 \sim \mathrm{Ga}(\alpha_2,\beta)$のとき、$X_1+X_2 \sim \mathrm{Ga}(\alpha_1+\alpha_2,\beta)$が成立する。詳細は「現代数理統計学」の演習$3.8$の解答で取り扱った。

ガンマ分布の再生性より、$\displaystyle X_i \sim \mathrm{Ga} \left( \frac{1}{2}, 2 \right)$のとき、下記が成立する。
$$
\large
\begin{align}
\sum_{i=1}^{\nu} X_i \sim \mathrm{Ga} \left( \frac{\nu}{2}, 2 \right)
\end{align}
$$

上記より、自由度$\nu$の$\chi^2$分布はガンマ分布$\displaystyle \mathrm{Ga} \left( \frac{\nu}{2}, 2 \right)$であることが示せる。

Pythonを用いたガンマ乱数の生成

仕組みの確認

指数分布と逆関数法」の対応では一様乱数の$U \sim \mathrm{Uniform}(0,1)$を元に$\displaystyle X = -\frac{1}{\lambda}\log{U}$を計算することで指数分布$\mathrm{Ex}(\lambda)$を元にサンプリングできることの確認を行なった。

ここで当記事では$\displaystyle \beta = \frac{1}{\lambda}$のように定義したので、$\displaystyle X = -\beta\log{U} \sim \mathrm{Ga}(1,\beta)$であると考えられる。

以下、形状パラメータ$\alpha$の値に関して場合分けを行い、それぞれのサンプリング法について確認を行う。

ガンマ分布の形状パラメータ$\alpha$が整数の場合のサンプリング

ガンマ分布の再生性」より、$\displaystyle X_i \sim \mathrm{Ga}(1,\beta)$であることに基づいて下記が成立する。
$$
\large
\begin{align}
\sum_{i=1}^{n} X_i \sim \mathrm{Ga}(n, \beta)
\end{align}
$$

したがって、下記を計算することでガンマ分布$\mathrm{Ga}(n, \beta)$を元にサンプリングを行える。
$$
\large
\begin{align}
\sum_{i=1}^{n} X_i &= -\sum_{i=1}^{n} \beta\log{U_i} \\
&= -\beta \log{ \left[ \prod_{i=1}^{n} U_i \right] }
\end{align}
$$

ガンマ分布の形状パラメータ$\alpha$が$($整数$+1/2)$の場合のサンプリング

前節の「ガンマ分布と$\chi^2$分布」より、$Z \sim \mathcal{N}(0,1)$のとき、$\displaystyle Z^2 \sim \mathrm{Ga} \left(\frac{1}{2},2\right)$が成立する。また、下記も同時に成り立つ。
$$
\large
\begin{align}
\frac{\beta}{2}Z^2 \sim \mathrm{Ga} \left(\frac{1}{2},\beta\right)
\end{align}
$$

よって、下記を計算することでガンマ分布$\displaystyle \mathrm{Ga} \left(n+\frac{1}{2},\beta\right)$を元にサンプリングを行える。
$$
\large
\begin{align}
\sum_{i=1}^{n} X_i + \frac{\beta}{2}Z^2 = -\beta \log{ \left[ \prod_{i=1}^{n} U_i \right] } + \frac{\beta}{2}Z^2
\end{align}
$$

詳しい導出は下記の演習で取り扱った。

Pythonを用いたサンプリング

$\alpha=5,\beta=1$のサンプリングのプログラム

以下、ガンマ分布$\mathrm{Ga}(\alpha,\beta) = \mathrm{Ga}(5,1)$に基づくサンプリングを行う。

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

np.random.seed(0)

alpha = 5
num_samples = 1000
beta = 1.

x = np.arange(0.,15.1,0.1)
y = x**(alpha-1) * np.e**(-x/beta) / (beta**(alpha) * math.factorial(alpha-1))

U = np.random.rand(num_samples, alpha)
X = np.zeros(num_samples)

for i in range(U.shape[0]):
    U_ = 1.
    for j in range(U.shape[1]):
        U_ *= U[i,j]
    X[i] = -beta*np.log(U_)

plt.subplot(211)
plt.plot(x,y,color="green")
plt.subplot(212)
plt.hist(X,bins=50,color="limegreen")
plt.xlim([0.,15.])
plt.show()

・実行結果

上記を確認すると、概ね確率密度関数と同様のサンプリングを行えたことが確認できる。上記は$1,000$個のサンプルに対応するので、以下ではさらに確認するにあたって$100,000$個のサンプルの生成を行う。

np.random.seed(0)

alpha = 5
num_samples = 100000
beta = 1.

x = np.arange(0.,15.1,0.1)
y = x**(alpha-1) * np.e**(-x/beta) / (beta**(alpha) * math.factorial(alpha-1))

U = np.random.rand(num_samples, alpha)
X = np.zeros(num_samples)

for i in range(U.shape[0]):
    U_ = 1.
    for j in range(U.shape[1]):
        U_ *= U[i,j]
    X[i] = -beta*np.log(U_)

plt.subplot(211)
plt.plot(x,y,color="green")
plt.subplot(212)
plt.hist(X,bins=50,color="limegreen")
plt.xlim([0.,15.])
plt.show()

・実行結果

$\displaystyle \alpha=5+\frac{1}{2},\beta=1$のサンプリングのプログラム

以下、ガンマ分布$\displaystyle \mathrm{Ga}(\alpha,\beta) = \mathrm{Ga}\left(5+\frac{1}{2},1\right)$に基づくサンプリングを行う。

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

np.random.seed(0)

alpha = 5.5
num_samples = 1000
beta = 1.

x = np.arange(0.,15.1,0.1)
y = x**(alpha-1) * np.e**(-x/beta) / (beta**(alpha) * math.factorial(int(alpha)-1) * np.sqrt(np.pi))

U = np.random.rand(num_samples, alpha)
X = np.zeros(num_samples)

for i in range(U.shape[0]):
    U_ = 1.
    for j in range(U.shape[1]):
        U_ *= U[i,j]
    X[i] = -beta*np.log(U_)

X += stats.norm.rvs(size=num_samples)**2

plt.subplot(211)
plt.plot(x,y,color="green")
plt.subplot(212)
plt.hist(X,bins=50,color="limegreen")
plt.xlim([0.,15.])
plt.show()

・実行結果

上記を確認すると、概ね確率密度関数と同様のサンプリングを行えたことが確認できる。以下ではさらに確認するにあたって$100,000$個のサンプルの生成を行う。

np.random.seed(0)

alpha = 5.5
num_samples = 100000
beta = 1.

x = np.arange(0.,15.1,0.1)
y = x**(alpha-1) * np.e**(-x/beta) / (beta**(alpha) * math.factorial(int(alpha)-1) * np.sqrt(np.pi))

U = np.random.rand(num_samples, alpha)
X = np.zeros(num_samples)

for i in range(U.shape[0]):
    U_ = 1.
    for j in range(U.shape[1]):
        U_ *= U[i,j]
    X[i] = -beta*np.log(U_)

X += stats.norm.rvs(size=num_samples)**2

plt.subplot(211)
plt.plot(x,y,color="green")
plt.subplot(212)
plt.hist(X,bins=50,color="limegreen")
plt.xlim([0.,15.])
plt.show()

・実行結果

Ch.5 「ニューラルネットワーク」の章末問題の解答例 パターン認識と機械学習 5.21〜5.41

当記事は「パターン認識と機械学習」の読解サポートにあたってChapter.$5$の「ニューラルネットワーク」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・参考
パターン認識と機械学習 解答まとめ
https://www.hello-statisticians.com/answer_textbook_prml

解答まとめ

問題$5.21$

問題$5.22$

問題$5.23$

問題$5.24$

問題$5.25$

問題$5.26$

問題$5.27$

問題$5.28$

問題$5.29$

問題$5.30$

問題$5.31$

問題$5.32$

問題$5.33$

接地点を原点$(0,0)$とおくと、$(x_1,x_2)$はそれぞれ下記のように表される。
$$
\large
\begin{align}
x_1 &= L_1 \cos{\theta_1} + L_2 \sin{\left( \theta_1+\theta_2-\frac{\pi}{2} \right)} \\
x_2 &= L_1 \sin{\theta_1} + L_2 \cos{\left( \theta_1+\theta_2-\frac{\pi}{2} \right)}
\end{align}
$$

問題$5.34$

問題$5.35$

問題$5.36$

問題$5.37$

問題$5.38$

問題$5.39$

問題$5.40$

問題$5.41$

Ch.11 「サンプリング法」の章末問題の解答例 パターン認識と機械学習 11.1〜11.17

当記事は「パターン認識と機械学習」の読解サポートにあたってChapter.$11$の「サンプリング法」の章末問題の解説について行います。

基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・参考
パターン認識と機械学習 解答まとめ
https://www.hello-statisticians.com/answer_textbook#prml

問題$11.1$

問題$11.2$

下記で詳しく取り扱った。

問題$11.3$

$$
\large
\begin{align}
p(y) = \frac{1}{\pi} \frac{1}{1+y^2} \quad (11.8)
\end{align}
$$

上記で表した確率密度関数$p(y)$に関して累積分布関数$\displaystyle h(y) = \int_{-\infty}^{y} p(x) dx$を定める。このとき$h(y)$は下記のように表せる。
$$
\large
\begin{align}
h(y) &= \int_{-\infty}^{y} p(x) dx \\
&= \int_{-\infty}^{y} \frac{1}{\pi} \frac{1}{1+x^2} dx \\
&= \frac{1}{\pi} \int_{-\infty}^{y} \frac{1}{1+x^2} dx \quad (1)
\end{align}
$$

このとき上記に対し、$x=\tan{\theta}$のように変数変換することを考える。このとき下記が成立する。
$$
\large
\begin{align}
\frac{1}{1+x^2} &= \frac{1}{1+\tan^2{\theta}} \\
&= \frac{\cos^2{\theta}}{\cos^2{\theta}+\sin^2{\theta}} = \cos^2{\theta} \\
\frac{dx}{d \theta} &= \frac{1}{\cos^2{\theta}}
\end{align}
$$

また、$-\infty < x \leq y$には$\displaystyle -\frac{\pi}{2} < \theta \leq \tan^{-1}{y}$が対応する。よって、$(1)$式は下記のように計算できる。
$$
\large
\begin{align}
h(y) &= \frac{1}{\pi} \int_{-\infty}^{y} \frac{1}{1+x^2} dx \quad (1) \\
&= \frac{1}{\pi} \int_{-\frac{\pi}{2}}^{\tan^{-1}{y}} \cos^2{\theta} \frac{1}{\cos^2{\theta}} d \theta \\
&= \frac{1}{\pi} \left[ \theta \right]_{-\frac{\pi}{2}}^{\tan^{-1}{y}} \\
&= \frac{1}{\pi} \left[ \tan^{-1}{y} – \left( -\frac{\pi}{2} \right) \right] \\
&= \frac{1}{\pi}\tan^{-1}{y} + \frac{1}{2} \quad (2)
\end{align}
$$

ここで$z=h(y)$のようにおくと、$y=h^{-1}(z)$を計算することでコーシー分布に基づく乱数の生成を行える。$(2)$式を元に$y=f(z)=h^{-1}(z)$は下記のように導出できる。
$$
\large
\begin{align}
z &= h(y) = \frac{1}{\pi}\tan^{-1}{y} + \frac{1}{2} \quad (2) \\
\tan^{-1}{y} &= \left( z – \frac{1}{2} \right) \pi \\
y &= \tan{ \left[ \left( z – \frac{1}{2} \right) \pi \right] } = f(z)
\end{align}
$$

下記でも同様の導出を取り扱った。

問題$11.4$

問題$11.5$

$\mathbf{z} \sim \mathcal{N}(0,1)$であるので、$\mathbf{y} = \boldsymbol{\mu} + \mathbf{L}\mathbf{z}$も正規分布に従う。このことは確率密度関数を考えることで示せる。よって、以下は$\mathbb{E}[\mathbf{y}]$と$\mathrm{cov}[\mathbf{y}]$を計算する。
$$
\large
\begin{align}
\mathbb{E}[\mathbf{y}] &= \mathbb{E}[\boldsymbol{\mu} + \mathbf{L}\mathbf{z}] \\
&= \boldsymbol{\mu} + \mathbf{L} \mathbb{E}[\mathbf{z}] \\
&= \boldsymbol{\mu} + \mathbf{L} \mathbf{0} = \boldsymbol{\mu} \\
\mathrm{cov}[\mathbf{y}] &= \mathbb{E} \left[ \mathbf{y}\mathbf{y}^{\mathrm{T}} \right] – \mathbb{E}[\mathbf{y}]\mathbb{E}[\mathbf{y}]^{\mathrm{T}} \\
&= \mathbb{E} \left[ (\boldsymbol{\mu} + \mathbf{L}\mathbf{z})(\boldsymbol{\mu} + \mathbf{L}\mathbf{z})^{\mathrm{T}} \right] – \boldsymbol{\mu}\boldsymbol{\mu}^{\mathrm{T}} \\
&= \mathbb{E} \left[ \boldsymbol{\mu}\boldsymbol{\mu}^{\mathrm{T}} + 2 \boldsymbol{\mu}^{\mathrm{T}}\mathbf{L}\mathbf{z} + (\mathbf{L}\mathbf{z})(\mathbf{L}\mathbf{z})^{\mathrm{T}} \right] – \boldsymbol{\mu}\boldsymbol{\mu}^{\mathrm{T}} \\
&= \boldsymbol{\mu}\boldsymbol{\mu}^{\mathrm{T}} – \boldsymbol{\mu}\boldsymbol{\mu}^{\mathrm{T}} + \mathbb{E} \left[ (\mathbf{L}\mathbf{z})(\mathbf{L}\mathbf{z})^{\mathrm{T}} \right] \\
&= \mathbb{E} \left[ (\mathbf{L}\mathbf{z})(\mathbf{L}\mathbf{z})^{\mathrm{T}} \right] \\
&= \mathbf{L} \mathbb{E} \left[ \mathbf{z} \mathbf{z}^{\mathrm{T}} \right] \mathbf{L}^{\mathrm{T}} \\
&= \mathbf{L} \mathbf{L}^{\mathrm{T}} = \mathbf{\Sigma}
\end{align}
$$

よって$\mathbf{y} \sim \mathcal{N}(\boldsymbol{\mu},\mathbf{\Sigma})$が示される。

別名法を用いた離散型確率分布に基づく乱数生成の手順とPythonプログラムまとめ

当記事では離散型確率分布に基づく乱数生成の手法である別名(alias)法に関して手順とPythonプログラムに関して取りまとめを行いました。途中で用いる$2$点分布の取り扱いなど、少々手順が複雑なのでなるべく直感的に理解できるような構成になるように取りまとめを行いました。

一様乱数の生成などの他の乱数生成の手法に関しては下記で取りまとめを行いましたので、こちらも合わせてご確認ください。
https://www.hello-statisticians.com/explain-terms-cat/random_sampling1.html

「自然科学の統計学」の$11.4.2$節を参考に作成を行いました。

別名法の手順

別名法の概要

$K=5$の確率変数に対し、$p(X=1)=0.12, p(X=2)=0.24, p(X=3)=0.38, p(X=4)=0.16, p(X=5)=0.10$のような離散型確率分布を考える。この例は結果の確認が行いやすいように「自然科学の統計学」と同様のものを用いた。下記ではこの確率分布の確率関数に$K$をかけてグラフ化を行なった。

上記は離散型確率分布の確率関数に確率変数の数をかけたものであり、確率分布が一様であれば値が$1$に一致するように調整を行なったと考えればよい。ここで基礎的な乱数生成の手法は一様分布で得られることから、逆に「一様分布から得たサンプルを離散型確率分布に従うように補正する」手法について考える。この手法は、グラフの$1$以上を削り$1$以下に配分する一方でどこの値から削ったものかを把握しておくことで実現できる。

上図のように分布を配分しておくと、乱数生成の際は一様分布から逆に辿ることで確率の大きな確率変数が生成される。この詳しい手順に関して以下、数式とPythonプログラムを元に取りまとめる。

離散型確率分布の一様分布化

前項で取り扱った概要を実現するにあたっては、「①離散型確率分布の一様分布化」と「②乱数の生成」の二つのステップが必要になる。当項では「①離散型確率分布の一様分布化」の手順に関してまとめる。

諸々を数式を用いて表すにあたって、確率変数を$X$、確率変数のインデックスを整数$k, 1 \leq k \leq K$、$X=k$における確率関数を$p_{k}=P(X=k)$で表す。また、一様分布に基づいて乱数$k$を生成したのちに対応する確率変数を採択する確率を$v_{k}$、採択されない場合に採択する確率変数を$a_{k}$で定める。このとき、$v_{k}$と$a_{k}$は以下の手順に沿うことでそれぞれ自動的に計算を行うことができる。

$[1].$ $v_k \leftarrow Kp_{k} \quad 1 \leq k \leq K$
$[2].$ $v_{k} \geq 1$の$k$の集合を$G$、$v_{k} < 1$の$k$の集合を$S$とおく。
$[3].$ $S$が空集合でない限り以下の$[3.1]$〜$[3.4]$を繰り返し実行する。
$[3.1]$ $S, G$から$1$つずつ任意の要素を選び、$k,l$とおく。
$[3.2]$ $a_{k} \leftarrow l, v_{l} \leftarrow v_{l}-(1-v_{k})$
$[3.3]$ $S$から$k$を取り除く。
$[3.4]$ $v_{l} < 1$なら$l$を$G$から$S$に移す。

基本的には前項でも取り扱った上図に基づいた処理であるが、$1$以下のものを$1$に調整する際に削った元が$1$以下になる場合を考慮することでやや処理が複雑に見えることに注意が必要である。

乱数の生成

別名法は主に「①離散型確率分布の一様分布化」と「②乱数の生成」の$2$ステップで乱数生成を行うが、前項で「①離散型確率分布の一様分布化」について取り扱ったので当項では「②乱数の生成」に関して確認を行う。具体的には以下の手順で$1$つの乱数$X$を発生する。

$[1].$ 一様乱数$U \sim \mathrm{Uniform}(0,1)$に基づいて、$V=KU$を計算する。
$[2].$ $V$より大きい最小の整数を$k$とおき、$u \leftarrow k-V$の計算を行う。
$[3].$ $u \leq v_{k}$ならば$X \leftarrow k$、$u > v_{k}$であれば$X \leftarrow a_k$を生成する。

上記の手順の解釈にあたっては$0$〜$1$の値を取る$u$が$k$を発生させる確率が$v_{k}$、$a_{k}$を発生させる確率が$1-v_{k}$であることを元に考えれば良い。

別名法のPythonプログラムの作成

プログラムの基本形

前節の例に基づいてプログラムの基本形に関して確認を行う。まず、以下を実行することで「①離散型確率分布の一様分布化」を行うことができる。

import numpy as np

p = np.array([0.12, 0.24, 0.38, 0.16, 0.1])
K = p.shape[0]

v = p*K
x = np.arange(1,6,1)
a = np.arange(0,5,1)

G, S = v>=1., v<1.

while any(S):
    for l in range(K):
        if S[l]:
            k = np.argmax(v)
            v[k] -= 1-v[l]
            a[l] = k
            S[l] = False
            if v[k]<1.:
                S[k]=True

print("alias: {}".format(a))
print("probability: {}".format(v))

・実行結果

alias: [2 1 1 2 2]
probability: [ 0.6  1.   0.8  0.8  0.5]

次に、以下を実行することで「②乱数の生成」の手順に基づいて$N=1000$の乱数の生成を行うことができる。

import matplotlib.pyplot as plt

np.random.seed(0)

N = 1000
X = np.zeros(N)

for i in range(N):
    V = np.random.rand()*K
    k = np.int(V)+1
    u = k-V
    if u <= v[k-1]:
        X[i] = k
    else:
        X[i] = a[k-1]+1

plt.subplot(121)
plt.bar(x,p,color="limegreen")
plt.title("probability distribution")
plt.subplot(122)
plt.hist(np.int8(X),bins=K,color="limegreen")
plt.title("histgram")
plt.show()

・実行結果

実行結果より、大元の確率分布の$p(X=1)=0.12, p(X=2)=0.24, p(X=3)=0.38, p(X=4)=0.16, p(X=5)=0.10$に概ね基づいて乱数が生成されたことが確認できる。

また、別名法を用いずに発生したサンプルに対しMCMCのように採択率を計算する方法もあり、こちらの方がシンプルではあるが、採択しなかった場合にサンプルを棄却することになり効率が良くない。逆に別名法では棄却する場合を他のサンプルの生成にあてることで計算効率を上げたと理解することもできる。

離散型分布に基づく乱数生成

ベルヌーイ分布

二項分布

幾何分布

Ch.6 「カーネル法」の章末問題の解答例 パターン認識と機械学習 6.16〜6.27

当記事は「パターン認識と機械学習」の読解サポートにあたってChapter.$6$の「カーネル法」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・参考
パターン認識と機械学習 解答まとめ
https://www.hello-statisticians.com/answer_textbook#prml

解答まとめ

問題$6.16$

問題$6.17$

問題$6.18$

問題$6.19$

問題$6.20$

$$
\large
\begin{align}
\mathbf{\mu}_{a|b} &= (\mathbf{\mu}_{a} + \mathbf{\Sigma}_{ab}\mathbf{\Sigma}_{bb}^{-1}(\mathbf{x}_{b}-\mathbf{\mu}_{b})) \quad (2.81) \\
\mathbf{\mu}_{b|a} &= (\mathbf{\mu}_{b} + \mathbf{\Sigma}_{ba}\mathbf{\Sigma}_{aa}^{-1}(\mathbf{x}_{a}-\mathbf{\mu}_{a})) \quad (2.81)’ \\
\mathbf{\Sigma}_{a|b} &= \mathbf{\Sigma}_{aa}-\mathbf{\Sigma}_{ab}\mathbf{\Sigma}_{bb}^{-1}\mathbf{\Sigma}_{ba} \quad (2.82) \\
\mathbf{\Sigma}_{b|a} &= \mathbf{\Sigma}_{bb}-\mathbf{\Sigma}_{ba}\mathbf{\Sigma}_{aa}^{-1}\mathbf{\Sigma}_{ab} \quad (2.82)’
\end{align}
$$

$(2.81), (2.82)$式は上記のように表される。詳しい導出は「多次元正規分布における条件付き確率分布の数式の導出」で取り扱った。

ここで同時分布の$p(\mathbf{t}_{N+1})$と共分散行列の$C_{N+1}$はそれぞれ下記のように表される。
$$
\large
\begin{align}
p(\mathbf{t}_{N+1}) &= \mathcal{N}(\mathbf{0}_{N+1},C_{N+1}) \quad (6.64)’ \\
C_{N+1} &= \left( \begin{array}{cc} C_{N} & \mathbf{k} \\ \mathbf{k}^{\mathrm{T}} & c \end{array} \right) \quad (6.65)
\end{align}
$$

上記に$(2.81)’$式を適用することで下記が得られる。
$$
\large
\begin{align}
m(\mathbf{x}_{N+1}) &= (0 + \mathbf{k}^{\mathrm{T}}C_{N}^{-1}(\mathbf{t}-\mathbf{0}_{N})) \\
&= \mathbf{k}^{\mathrm{T}}C_{N}^{-1}\mathbf{t} \quad (6.66)
\end{align}
$$

同様に$(2.82)’$式を適用することで下記が得られる。
$$
\large
\begin{align}
\sigma^2(\mathbf{x}_{N+1}) = c-\mathbf{k}^{\mathrm{T}}C_{N}^{-1}\mathbf{k} \quad (6.67)
\end{align}
$$

問題$6.21$

問題$6.22$

問題$6.23$

問題$6.24$

問題$6.25$

問題$6.26$

$$
\large
\begin{align}
p(a_{N+1}|\mathbf{t}_{N}) &= \int p(a_{N+1}|\mathbf{a}_{N})p(\mathbf{a}_{N}|\mathbf{t}_{N}) d \mathbf{a}_{N} \quad (6.77) \\
p(a_{N+1}|\mathbf{a}_{N}) &= \mathcal{N}(a_{N+1}|\mathbf{k}^{\mathrm{T}} C_{N}^{-1} \mathbf{a}_{N}, c-\mathbf{k}^{\mathrm{T}} C_{N}^{-1}\mathbf{k}) \quad (6.78)
\end{align}
$$

問題$6.27$

ガウス過程回帰の導出の流れとPythonプログラムを用いた$2 \sigma$区間の作成

カーネル法(Kernel methods)の応用例の一つにガウス過程回帰(Gaussian Process Regression)があるので、当記事ではガウス過程回帰の導出の流れとPythonプログラムを用いたガウス過程の作成に関して取り扱います。

作成にあたっては「ガウス過程と機械学習」の$3$章の「ガウス過程」と「パターン認識と機械学習」の$6.4$節の「Gaussian Processes」を参考にしました。

・参考
カーネル関数の計算とPythonを用いたグラフの作成
https://www.hello-statisticians.com/explain-terms-cat/kernel_methods1.html
ガウス過程
https://www.hello-statisticians.com/explain-terms-cat/kernel_methods2.html

ガウス過程回帰の仕組み

同時分布の導出

実際に観測されるサンプルを$(\mathbf{x}_1,t_1), …, (\mathbf{x}_N,t_N)$とおくとき、実測値$t_n$と予測値$t_n$に関して下記が成立すると考える。
$$
\large
\begin{align}
t_n = y_n + \epsilon_n \\
\epsilon_n \sim \mathcal{N}(0,\sigma^2)
\end{align}
$$

このとき条件付き確率$p(t_n|y_n)$は上記に基づいて下記のように表すことができる。
$$
\large
\begin{align}
p(t_n|y_n) = \mathcal{N}(y_n,\sigma^2)
\end{align}
$$

上記を$N$個のサンプルに関して考えると下記が成立する。
$$
\large
\begin{align}
p(\mathbf{t}|\mathbf{y}) &= \mathcal{N}(\mathbf{y},\sigma^2 I_N) \\
\mathbf{t} &= \left( \begin{array}{c} t_{1} \\ \vdots \\ t_{N} \end{array} \right) \\
\mathbf{y} &= \left( \begin{array}{c} y_{1} \\ \vdots \\ y_{N} \end{array} \right)
\end{align}
$$

また、前項の$\mathbf{y} \sim \mathcal{N}(\mathbf{0},\lambda^2 \boldsymbol{\Phi} \boldsymbol{\Phi}^{\mathrm{T}})$より、$p(\mathbf{y})$は下記のように表せる。
$$
\large
\begin{align}
p(\mathbf{y}) = \mathcal{N}(\mathbf{0},\lambda^2 \boldsymbol{\Phi} \boldsymbol{\Phi}^{\mathrm{T}})
\end{align}
$$

このとき、周辺分布$p(\mathbf{t})$は下記のように考えることができる。
$$
\large
\begin{align}
p(\mathbf{t}) = \int p(\mathbf{t}|\mathbf{y}) p(\mathbf{y}) d \mathbf{y}
\end{align}
$$

上記に対して「多次元正規分布におけるベイズの定理を用いた周辺確率の導出」で取り扱った結果を元に考えると、$p(\mathbf{t})$は下記のように表せる。
$$
\large
\begin{align}
p(\mathbf{t}) &= \int p(\mathbf{t}|\mathbf{y}) p(\mathbf{y}) d \mathbf{y} \\
&= \mathcal{N}(\mathbf{0},C) \quad (6.61) \\
C &= \sigma^2 I_N + \lambda^2 \boldsymbol{\Phi} \boldsymbol{\Phi}^{\mathrm{T}} = \sigma^2 I_N + K \quad (6.62)’
\end{align}
$$

上記の$K$はグラム行列に一致し、「カーネル関数」に基づいて計算できる。上記は$\mathbf{t}$に関する同時分布であるが、ここで新たなサンプルの$\mathbf{x}_{N+1}$が得られたとき、下記で定める$\mathbf{t}_{N+1}$に関する同時分布を新たに考える。
$$
\large
\begin{align}
\mathbf{t}_{N+1} &= \left( \begin{array}{c} t_{1} \\ t_{2} \\ \vdots \\ t_{N} \\ t_{N+1} \end{array} \right)
\end{align}
$$

ここで同時分布$p(\mathbf{t}_{N+1})$は$(6.61)$に基づいて下記のように得られると考える。
$$
\large
\begin{align}
p(\mathbf{t}_{N+1}) &= \mathcal{N}(\mathbf{0},C_{N+1}) \quad (6.64)
\end{align}
$$

ここで$C_{N+1}$の$(i,j)$成分を$(C_{N+1})_{ij}$とおくと、$(C_{N+1})_{ij}$は「カーネル関数」$k(\mathbf{x},\mathbf{x}’)$を用いて$(C_{N+1})_{ij} = \sigma^2 (I_{N})_{ij} + k(\mathbf{x}_{i},\mathbf{x}_{j})$のように計算できる。

同時分布の条件付き分布の計算による予測分布の導出

前項で計算を行なった$p(\mathbf{t}_{N+1}) = \mathcal{N}(\mathbf{0},C_{N+1})$に対して、条件付き分布$p(t_{N+1}|\mathbf{t})$を導出することを当項では考える。前項の同時分布$p(\mathbf{t}_{N+1})$に関して下記のような式表記を定める。
$$
\large
\begin{align}
p(\mathbf{t}_{N+1}) &= \mathcal{N}(\mathbf{0},C_{N+1}) \quad (6.64) \\
C_{N+1} &= \left( \begin{array}{cc} C_{N} & \mathbf{k} \\ \mathbf{k}^{\mathrm{T}} & c \end{array} \right) \quad (6.65) \\
(C_{N+1})_{ij} &= \sigma^2 (I_{N+1})_{ij} + k(\mathbf{x}_{i},\mathbf{x}_{j}) \quad (6.62)^{”}
\end{align}
$$

上記に対し、多次元正規分布の条件付き確率に関する$(2.81),(2.82)$式を用いることで、$p(t_{N+1}|\mathbf{t})$が下記のように導出できる。
$$
\large
\begin{align}
p(t_{N+1}|\mathbf{t}) = \mathcal{N}(\mathbf{k}^{\mathrm{T}}C_{N}^{-1}\mathbf{t}, c-\mathbf{k}^{\mathrm{T}}C_{N}^{-1}\mathbf{k}) \quad (6.66), (6.67)
\end{align}
$$

なお、多次元正規分布の条件付き確率に関する$(2.81),(2.82)$式の導出は下記で詳しく取り扱った。

また、式の適用の詳細に関しては「パターン認識と機械学習」の演習$6.20$の解答で取りまとめた。

予測値が複数の場合の予測分布の作成

$M$個の予測値を表すにあたって、下記のように$\mathbf{t}_{M},\mathbf{t}_{N+M}$を定める。
$$
\large
\begin{align}
\mathbf{t}_{M} &= \left( \begin{array}{c} t_{1} \\ \vdots \\ t_{M} \end{array} \right) \\
\mathbf{t}_{N+M} &= \left( \begin{array}{c} t_{1} \\ \vdots \\ t_{N} \\ t_{N+1} \\ \vdots \\ t_{N+M} \end{array} \right)
\end{align}
$$

上記に対して、同時分布$p(\mathbf{t}_{N+M})$を下記のように表すことを考える。
$$
\large
\begin{align}
p(\mathbf{t}_{N+M}) &= \mathcal{N}(\mathbf{0},C_{N+M}) \\
C_{N+M} &= \left( \begin{array}{cc} C_{N} & \mathbf{k}_2 \\ \mathbf{k}_2^{\mathrm{T}} & C_{M} \end{array} \right) \\
(C_{N+M})_{ij} &= \sigma^2 (I_{N+M})_{ij} + k(\mathbf{x}_{i},\mathbf{x}_{j})
\end{align}
$$

上記の同時分布$\mathbf{t}_{N+M}$に、多次元正規分布の条件付き確率に関する$(2.81),(2.82)$式を用いることで、$p(\mathbf{t}_{M}|\mathbf{t})$が下記のように導出できる。
$$
\large
\begin{align}
p(\mathbf{t}_{M}|\mathbf{t}) = \mathcal{N}(\mathbf{k}_2^{\mathrm{T}}C_{N}^{-1}\mathbf{t}, C_{M}-\mathbf{k}_2^{\mathrm{T}}C_{N}^{-1}\mathbf{k}_2) \quad (6.66)’, (6.67)’
\end{align}
$$

予測値が複数の場合の予測に関しては「ガウス過程と機械学習」の「公式$3.8$」で取り扱われているので、詳しく確認する際は合わせて参照すると良いと思われる。

Pythonプログラムを用いたガウス過程回帰の実行

予測値が複数の場合の予測分布の作成」の内容を元に、以下ガウス過程回帰の計算と図式化を行う。

予測分布

下記を実行することで$2 \sigma$区間の予測分布の作成を行える。

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

np.random.seed(0)

theta = np.array([1., 10., 0., 0.])

x = np.arange(0.,5.1,0.1)
n = x.shape[0]
sigma2 = 0.02

x_ = np.arange(0.05,7.25,0.2)
n_ = x_.shape[0]

x_all = np.zeros(n+n_)
x_all[:n] = x
x_all[n:] = x_

K = np.zeros([n+n_,n+n_])

for i in range(n+n_):
    for j in range(n+n_):
        K[i,j] = theta[0]*np.exp(-theta[1]*(x_all[i]-x_all[j])**2/2) + theta[2] + theta[3]*x_all[i]*x_all[j]
        if i==j:
            K[i,j] += sigma2*beta

Lamb, U_T = np.linalg.eig(K[:n,:n])
Lamb, U_T = Lamb.real, U_T.real
U = U_T.T

A = np.dot(U_T,np.diag(np.sqrt(Lamb)))
y = np.dot(A,stats.norm.rvs(loc=0,scale=1,size=n))

mu = np.dot(K[n:,:n],np.dot(np.linalg.inv(K[:n,:n]),y))
Sigma = K[n:,n:] - np.dot(K[n:,:n],np.dot(np.linalg.inv(K[:n,:n]),K[:n,n:]))
sigma = np.sqrt(np.diagonal(Sigma))

ly = mu - 2.*sigma
uy = mu + 2.*sigma

plt.plot(x_all[n:],np.dot(K[n:,:n],np.dot(np.linalg.inv(K[:n,:n]),y)))
plt.fill_between(x_all[n:],ly,uy,facecolor="gray",alpha=0.3)
plt.xlim(-0.2,7.2)

plt.show()

・実行結果