Pythonプログラミング(ステップ7・カイ二乗検定・適合度検定)

このページでは、有意差検定の例とPythonを使った計算方法について考える。

二項分布とサンプルの偏りとカイ二乗統計量

紅白のボールが沢山入っている箱があって、紅と白は同数入っているはずと考えて(期待して)いる。 それを確かめたいのだけれども、ボールの数が多すぎて、全部を調べるのは断念することにした。 その代わり、無作為に中から$n$個取り出したところ、赤が$r$個、白が$w=n-r$個であった。 当初の予想は正しかったと言えるであろうか。

箱の中のボールのうち赤$p$、白が$q=1-p$の割合で入っていたと仮定すると、 $n$個の玉の中で赤が$r$個であるような確率は二項分布に従い、赤の平均は$\mu=np$、分散は$\sigma^2 = n p q$となることは良く知られている。

*ただし、二項分布が正規分布で近似できるためには、$np, nq$がある程度大きくなければならない。

ここで、 $$ \chi^2 = \frac{(r-np)^2}{np} + \frac{(w-nq)^2}{nq} $$ という量を考える。$q=1-p, w=n-r$を思い出して上式を整理すると、 $$ \chi^2 = \frac{(r-np)^2}{n p q} = \left[ \frac{(r-\mu)}{\sigma} \right]^2 $$ となる。 $n$が大きければ二項分布は正規分布で良く近似できるから*、$\chi^2$(カイ二乗)、すなわち、「規格化された赤の個数の平均からの偏差の2乗」は 平均0、分散1の正規分布に従うようなランダム変数の2乗、のように振る舞うはずである。

ただし、一般の$k$項分布の場合に、右式が自由度$k-1$のカイ二乗分布に従うことを示すには、多少の数学的な準備が必要である。 その説明をこちらのページで補足したので、興味のある者は参照のこと。

ここで、$X_i$ の平均を$E(X_i)$ と表記することにすると、$\chi^2$は、統計学のテキストに登場する $$ \sum_i^k \frac{\left(x_i-E(X_i)\right)^2}{E(X_i)} $$ のパターン(ピアソンのカイ二乗統計量)になっている。そして、紅白ボールの場合、自由度は1(独立なランダム変数が1つで、その二乗が1回足しあわされている)である。

カイ2乗分布関数

例えば、$k=1$の場合を考えてみよう。 $X$の分布関数 $$ \frac{1}{\sqrt{2\pi}} \exp(-x^2/2) dx $$ から、$Z=X^2$の分布関数は以下のように導くことができる。 まず、$z=x^2$と変数変換すると、 $X \gt 0$および$X\lt 0$の場合それぞれに対応して $$\frac{1}{2\sqrt{2\pi}} z^{-1/2} \exp(-z/2) dz$$ が得られる。$Z$の分布関数は二つの場合の寄与を加え、 $$ \frac{1}{\sqrt{2\pi}} z^{-1/2} \exp(-z/2) dz $$ となる。

それぞれが正規分布$N(0,1)$に従うような $k$ 個の独立な確率変数 $X_1, X_2, \cdots, X_k$ を2乗し、その和を取って作った確率変数 $Z = {X_1}^2 + {X_2}^2 + \cdots + {X_k}^2$ はカイ2乗分布 $$ f(z;k) = \frac{z^{k/2-1} e^{-z/2}}{2^{k/2} \Gamma(k/2)} $$ に従うことが知られている。ここで $\Gamma( )$はガンマ関数である。

元々のボールの数が二項分布(を近似した正規分布)すると仮定した場合に、データから得られる $\chi^2$ 値が、 仮定の下でどれくらいの確率で生じるものなのかを評価・検討するのがカイ二乗検定である。

例として、$k=1$の場合の確率密度関数をプロットした(下図)。 $\chi^2$は「基準からどれくらいずれているか」の目安であり、ずれが著しく大きい場合の確率は、当然、減少する。 ここでは、有意水準10%を想定し、「ずれ」が大きい領域を確率(面積)にして10%分だけ赤く塗りつぶした。

仮に、サンプルから $\chi^2=2$ が得られたとすると、この10%の領域には入っていないことは一目瞭然であるが、 このことを数値的にきちんと見積もるには、$z\gt 2$の領域の面積を計算し、それが0.1よりも大きいかどうかを判定すればよい。

また、全く同じことであるが、まず $z\lt 2$ の領域(水色の部分)の面積を求め、 その面積と $0.9$ $(=1-0.1)$ とを比べてもよい。

そうした際に、カイ二乗分布の累積分布 $$ F_k(z) = \int_0^{z} f(y;k) dy $$ を計算する必要があるが、$k=2$の場合($f(z;2)$は指数関数になる)を除いて、具体的な値は数値的に求める他ない。

累積分布関数の数値計算

例えば、SciPyライブラリにはカイ二乗分布に関係する計算を行う機能が用意されている。 が、ここでは練習のため、 標準機能だけを使って計算することにする。

多くの統計学のテキスト等には数値がテーブルとして掲載されているし、表計算や統計ソフトには、標準で関数として内蔵されている。 が、残念ながら、標準的なPythonの数学関数には含まれていない。 なお、Pythonの標準数学ライブラリにはガンマ関数$\Gamma(\ )$はmath.gamma( )という名前で登録されている。

紅白ボールの例では $k=1$ なので、ガンマ関数の具体的な値を入れると($\Gamma(1/2)=\sqrt{\pi}$)、$F_1$は $$ F_1(z) = \frac{1}{\sqrt{2 \pi}} \int_0^z y^{-1/2} e^{-y/2} dy $$ となる。

$F_1(z)$を評価するため、 台形法などを使って$f_1(z)$を数値的に積分しようとしても、 積分区間の端点(0)で非積分関数が発散するので具合が悪い。そこで、部分積分して $$ \int_0^z y^{-1/2} e^{-y/2} dy = \Big[ 2 y^{1/2} e^{-y/2} \Big]_0^z + \int_0^z y^{1/2} e^{-y/2} dy $$ の形に直したこちらの式を使って計算すると良い。

カイ二乗検定

以上を踏まえると、検定(適合度検定)の流れは以下のようになる:

『箱には赤と白のボールが同数入っている』という仮説(帰無仮説; null hypothesis)を設定する。

仮説に基づき、$p=1/2$とおいて(すなわち、紅白のボールの平均は、それぞれ、$n/2$とし)、データ$n,r,w$を使って$\chi^2$の値を計算する。

$F_1(z)$は、仮説の下で、カイ二乗の値が$z$ よりも小さくなるような確率を表している。 したがって、サンプルから得られたカイ二乗値を$\chi^2$とすると、有意水準を5%に設定した場合、 $F_1(\chi^2) \lt 0.95$であれば、そのカイ二乗値は、5%の確率でしか起こらないはずの「大きなずれ」の範囲の外にあることになる。 すなわち、有意水準5%で、帰無仮説は棄却されない(「統計的に有意でない」。仮説の下で、偶然そのようなサンプルが得られたと考えるほうが自然である)。

$1 - F_1(\chi^2)$はp値と呼ばれる。p値が有意水準を下回った場合が「統計的に有意」ということになる。

逆に、$F_1(\chi^2) \gt 0.95$ならば、仮説の下ではごく稀にしか起きないはずの範囲の中にあるので、帰無仮説は棄却される (「統計的に有意である」。仮説の下で、偶然そのようなサンプルが得られたとは考えにくい)。 その結果、『箱には赤と白のボールが同数入っていない』(対立仮説)が支持される。

統計的過誤

上のような検定は、あくまで仮定の下での可能性を議論しているので、「可能性の見積もり方が間違っている」場合と「仮定そのものが間違っている」場合の両方があり得ることに用心しなければならない:

第1種の過誤
本当に「ボールが同数」の場合であっても、 $F(\chi^2) \gt 0.95$ となってしまうような可能性が(5%の確率で)あり得ないわけではないのに、 「ボールが同数」を棄却してしまうという間違い。すなわち、5%の確率で間違った判断を犯す可能性があるわけだ。
第2種の過誤
これに対して、元々、ボールは同数でなかった場合に、たまたま$F(\chi^2) \lt 0.95$となったために、「ボールが同数」という仮説を棄却しなかった、 というタイプの間違い。
仮説検定は万能ではない

現実の複雑な現象について考える場合(例えば、ある観点から細胞のタイプを分別する場合等)、「赤」と「白」が完全に同数という状況はまずあり得ない (「完全に」正しいモデルなど存在しない、とも言える)。 「本当の」赤の確率が1/2から僅かにずれていて、$1/2+\epsilon$ $(\left| \epsilon \right| \ll 1)$ だったとすれば、 「正しい」カイ二乗値は $$ \chi^2 = \frac{\left(r-n(0.5+\epsilon)\right)^2}{n \left(0.5+\epsilon \right)\left(0.5-\epsilon \right)} \approx \frac{\left(r - 0.5 n\right)^2}{0.25 n} - 8(r-0.5 n)\,\epsilon $$ であるべきところを、「赤」と「白」を同数と仮定した場合は、 $$ \chi^2 = \frac{\left(r - 0.5 n\right)^2}{0.25 n} $$ と見積もることになるので、両者の間には平均的に $-8 n \epsilon^2$ の差が生じる。 つまり、「赤」と「白」が同数という仮説の下で計算したカイ二乗値は、$8 n \epsilon^2$ の程度大きく見積られてしまう。 厄介なことに、この差は、サンプル数 $n$ によって加減できてしまう。 つまり、サンプル数が少なければ棄却されなかった仮説も、サンプル数を多く取ることで、いずれ棄却できてしまうことになる($p$値を小さくすることができる)。 あるいは、そもそも、「完全に同数」という実際にあり得ない仮説を棄却すること自体に意味が無かったと言うこともできるかもしれない。 仮説検定の使用については、反省や批判もあるので、そちらも併せて調べておくのが良いだろう。 例えば、アメリカ統計学会の声明効果量を参照。

icon-pc 練習:カイ二乗検定

紅と白のボールの例について、$n,r$、および有意水準$\alpha$を入力すると、カイ二乗の適合度検定を行ない、その結果を出力するプログラムを作成しなさい。