以前、”正規分布に従う確率変数の二乗和はカイ二乗分布に従うことの証明”という記事を書いた。
記事タイトルの通り、正規分布に従う確率変数の二乗和はカイ二乗分布に従う。
母平均\(\mu\)、標準偏差\(\sigma\)の正規分布から\(n\)個の標本を無作為抽出したとき、 \(n\)個の標本について二乗和\(V\)を計算した場合\(V\)はどのような分布をするか。 \begin{eqnarray} V = x_1^2 + x_2^2 + \cdots + x_n^2 \end{eqnarray} \(V\)の分布は自由度nのカイ二乗分布になる。 なお、実際にデータを表示してみた記事は以下。
実際にデータを生成して確かめてみる。
まずは、scipi.stats.chi2.pdfを使って各自由度と対応する確率密度関数を書いてみる。
“pdf” ってPortableDocumentFormatではなく、ProbabilityDensityFunction(確率密度関数)。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 0から8まで1000個のデータを等間隔で生成する
x = np.linspace(0, 8, 1000)
fig, ax = plt.subplots(1,1)
linestyles = [':', '--', '-.', '-']
deg_of_freedom = [1, 2, 3, 4]
for k in deg_of_freedom:
linestyle = linestyles[k-1]
ax.plot(x, stats.chi2.pdf(x, k), linestyle=linestyle, label=r'$k=%i$' % k)
plt.xlim(0, 8)
plt.ylim(0, 1.0)
plt.legend()
plt.show()
定義に従って各自由度ごとに2乗和を足し合わせてヒストグラムを作ってみる。
(ループのリストが自由度)
cum = 0
for i in [1,2,3,4]:
# 標準正規分布に従う乱数を1000個生成
x = np.random.normal(0, 1, 1000)
# 2乗
x2 = x**2
cum += x2
plt.figure(figsize=(7,5))
plt.title("chi2 distribution.[k=1]")
plt.hist(cum, 80)
全部k=1ってなってしまった…。左上、右上、左下、右下の順に1,2,3,4。
頻度がこうなので、各階級の頻度の相対値を考えると上記の確率密度関数の形になりそう。
k=1,2が大きくことなるのがわかるし、3,4と進むにつれて変化が少なくなる。
![]() |
![]() |
![]() |
![]() |