見出し画像

カイ二乗検定は何をやっているのか

こんにちは。コグラフ株式会社データアナリティクス事業部の塩見です。

私は「カイ二乗検定」に対して、当初は納得できない部分がありました。やりたいことに対して、必要以上に複雑な手法のように感じたからです。同じような疑問を持つ方も多いのではないでしょうか。この記事では、私が「カイ二乗検定」を理解し納得するまでの過程をお伝えします。

結論から言いますと、一度頻度論を離れてベイズ統計の視点で考えてみたところ、実は非常に単純なことを行っていると気づきました。その後、カイ二乗検定を再び考え直すと、すんなり理解できたというお話です。


カイ二乗検定の手順

まず、サイコロを何度も投げ、出た目の回数(実測値)を記録します。偏りのないサイコロでは、全ての目が均等に出るはずです。この理論的な回数を理論値と呼びます。

次に、実測値と理論値の差を計算し、その差を二乗してから理論値で割ります。この計算結果を「ズレ」と呼びましょう。サイコロの場合は、各目のズレを合計すると自由度5のカイ二乗分布に従うことがわかっています。

カイ二乗検定を行う際、以下の仮定を設定します。

  • 帰無仮説:サイコロの目に偏りはない

  • 標本分布:実測値と理論値のズレの合計は、自由度5のカイ二乗分布に従う

  • 有意水準:5%

  • 検定方法:片側検定(右側)とする。なぜなら、この検定ではズレが小さい場合に帰無仮説を棄却することはないため。

サイコロの実測値、理論値、ズレ

サイコロを144回投げた結果、実測値と理論値のズレの合計は13.42となりました。この値がカイ二乗分布表における棄却域に入るかどうかを確認します。下のカイ二乗分布表より、自由度5、有意水準5%のカイ二乗値は11.07です。13.42はこれより大きいため棄却域に入ります。帰無仮説「サイコロの目に偏りはない」は棄却されました。

カイ二乗分布表

このように、カイ二乗検定を使ってサイコロの偏りを検出できましたが、みなさんはこの手続きを当たり前だ、自然な発想だと感じますか?私は最初、とても複雑だと感じました。そしてなぜこれほど回りくどく、大げさな方法を使うのかと疑問に思ったのです。

以降では頻度論を離れてベイズ統計の視点から、もっと単純に考える方法を示します。その後、再び頻度論に戻り、ベイズ統計のように単純にはいかないこと、そしてカイ二乗検定が問題を回避しつつ有効であることを説明します。

頻度論とベイズ統計におけるパラメーターの扱いの違い

統計学には大きく分けて、頻度論とベイズ統計の2つのアプローチが存在し、これらはパラメーターの扱い方に大きな違いがあります。
パラメーターとは、分布の形状を決定する値を指します。例えば、正規分布の場合、平均 $${\mu}$$と標準偏差 $${\sigma}$$ がそのパラメーターです。また、二項分布では、試行回数 $${N}$$ と成功確率$${\theta}$$がパラメーターとなります。

頻度論ではパラメーターは分布ではない

頻度論(伝統的な統計学)では、母集団には真のパラメーターが存在し、データはその母集団から抽出された標本であると考えます。目的は、標本データから母集団のパラメーターを推定することです。しかし、推定されたパラメーター同士を直接比較することはできません。推定値に差があったとしても、母集団のパラメーターに差があるとは断言できないためです。

仮説検定の役割
頻度論では、推定値の差を直接比較できないため、仮説検定を行います。仮説検定ではまず「帰無仮説」を立て、その仮説が正しいと仮定した場合の標本分布を予測します。次に、実際に得られたデータがその標本分布とどれほど一致するかを確認します。もしデータが標本分布から大きく外れていれば、帰無仮説は正しくないと判断し、棄却します。

仮説検定の具体例
例えば、Aさんの平均睡眠時間が8時間、Bさんが7時間であるとき、両者の平均睡眠時間に差があるかを検定する場合、「AさんとBさんの平均睡眠時間は等しい」という帰無仮説を立てます。そして、実際に得られたデータと帰無仮説に基づく標本分布を比較し、乖離が大きければ帰無仮説を棄却し、その差が「統計的に有意」であると判断します。

統計的に有意とは
「統計的に有意」とは、差が偶然によるものではなく、データから示唆される有意な違いがあるということです。ただし、統計的に有意であっても、その差が「大きい」か「小さい」かについては言及していない点に注意が必要です。

ベイズ統計ではパラメーターは分布である

ベイズ統計では、パラメーターそのものを確率分布として扱います。これにより、パラメーターの不確実性を明示的に表現し、パラメーターの差を直接評価することが可能になります。

パラメーターの差の評価方法
例えば、AさんとBさんのパラメーターの分布を重ねて比較することで、その差を視覚的に判断できます。分布の重なりが多いほど、差が小さいとみなし、重なりが少なければ差が大きいと判断します。

定量的な評価
この重なり具合は数値化することも可能で、パラメーターの差の大きさを定量的に評価できます。これにより、差の大きさを具体的な数値で表すことができる点が、頻度論との大きな違いです。

コイン投げの頻度論による分析

  • 帰無仮説:コインは公平である。

  • 標本分布:二項分布$${B(N=24, \theta=0.5)}$$(表が出る確率が50%であるコインを24回投げたときに、表が出る回数が従う確率分布です。)

  • 有意水準:5%

  • 得られた標本:コインを24回投げて、表が18回出た。

上記の標本分布を図示しました。オレンジ色は「表が18回という観測データ、またはそれよりもっと極端なデータが得られた」確率です。

標本分布

オレンジ色の確率をすべて合計した確率(P値)は約2%です。有意水準の5%を下回っているため、帰無仮説を棄却します。
グラフ描画とP値計算のpythonコードを以下に示します。

# コイン投げの仮説検定
from scipy import stats
import numpy as np
from matplotlib import pyplot as plt
import pandas as pd

theta = 0.5
N = 24
n = np.arange(N+1)
p = stats.binom.pmf(n, N, theta)
df = pd.DataFrame({'n':n, 'p':p})

# 表が18回という観測データが得られたときの確率をthresholdとする
# 分布の左右がぴったり同じ値じゃないので、1.001を掛けてthresholdを少しだけ大きくした
threshold = df[n==18]['p'].iat[0] * 1.001

# threshold より上か下かでグラフを描き分けるため、データフレームを分ける
df1 = df[df['p']> threshold]
df2 = df[df['p']<=threshold]

# df['p']の値が小さい場所でもグラフが見えるようp=-0.001から描いています
plt.vlines(df1['n'], -0.001, df1['p'], color='C0') 
plt.vlines(df2['n'], -0.001, df2['p'], color='C1')
plt.xlabel('n')
plt.ylabel('p')
plt.show()

# P値を求める
sum(df[df['p']<=threshold]['p'])
# 結果: 0.02265584468841551

コイン投げのベイズ統計による分析

コイン投げにおいて、表が出る確率を示すパラメーター $${\theta}$$ を確率分布として扱います。まず、このパラメーターに対して適切な事前分布を設定します。ここでは、一様分布を事前分布として使用し、コインの表が出る確率を特定の偏りなく初期設定します。

次に、得られたデータ(表が出た回数と総投数)を用いて、二項分布を尤度としてベイズ更新を行い、パラメーター $${\theta}$$ の事後分布を求めます。

事後分布の解釈

事後分布は、コインの表が出る確率に対する我々の知識をデータに基づいて更新した結果です。(下図参照)この分布を用いることで、コインが公平かどうかを判断できます。例えば、事後分布が $${\theta=0.5}$$ から大きく離れている場合、そのコインは公平ではなく、表が出やすいか裏が出やすいかの偏りがあると判断できます。

ベイズ更新で得られたパラメーターの事後分布

また、異なる2種類のコインの事後分布を比較すれば、どちらのコインが表が出やすいかを分布の形で評価することができます。

ベイズ統計の特徴

ベイズ統計では、パラメーターの事後分布を求め、分布の形や重なり具合を基に直接的な評価を行える点が特徴です。このアプローチにより、コインの偏りや2つのコイン間の差を定量的に判断できます。

実装例

以下のコードは、ベイズ更新を行い、パラメーター $${\theta}$$ の事後分布を可視化するものです。

# ベイズ更新のコード
import numpy as np
from matplotlib import pyplot as plt

# 尤度は二項分布とする
def likelihood(a, N):
  return thetas ** a * (1 - thetas) ** (N - a)

# 事後分布を求める
def posterior(a, N, prior):
  lp = likelihood(a, N) * prior
  return lp / lp.sum()

# パラメーターthetaは確率密度関数(連続分布)なのですが、確率質量関数(離散分布)で近似しています
thetas = np.linspace(0, 1, 1001)
# 事前分布を一様分布に設定する
prior = 1 / len(thetas)

# 事後分布を求めて結果を描画する
plt.plot(thetas, posterior(18, 24, prior))
plt.xlabel(r'$\theta$')
plt.ylabel(r'$p(\theta)$')
plt.show()

二項分布の定義

二項分布は以下のように定義されます。

$$
B(N,\theta)=p(a|N,\theta)=\dbinom{N}{a}\theta^{a}(1-\theta)^{N-a}
$$

$${\theta}$$: 表が出る確率
$${N}$$: コインを投げる回数
$${a}$$: 表が出た回数

サイコロ投げのベイズ統計による分析

サイコロ投げにおいて、特定の目(例えば1)が出る確率をコイン投げのように二項分布でモデル化します。この場合、サイコロの目「1」が出る確率 $${\theta_1}$$ を確率分布として扱い、得られたデータに基づいてベイズ更新を行います。

同様に、サイコロの他の目(2~6)についても、それぞれの確率 $${\theta_2}$$ から $${\theta_6}$$ の分布をベイズ更新で求めることができます。(下図参照)これらの分布を比較し、特定の目の分布が他と大きく異なる場合、そのサイコロは偏っている可能性があると判断できます。

サイコロの目が出る確率の分布

パラメーターの分布の解釈

各サイコロの目の出現確率に対する事後分布を求めることで、サイコロが偏っているかどうかを評価できます。分布の重なりが少ないほど、目ごとの確率に違いがあることを示し、そのサイコロは偏っていると考えられます。

多項分布によるモデリング

サイコロの各目について二項分布を用いてベイズ更新を行うことも可能ですが、サイコロのすべての目の確率を同時に扱うには、二項分布の多変数版である「多項分布」を用いることが適しています。多項分布を使えば、サイコロの全ての目について一度のベイズ更新で確率分布を求めることができます。

ベイズ統計の特徴

ベイズ統計では、各目の出現確率に対する事後分布を求め、分布の違いや重なり具合を基にサイコロの偏りを定量的に評価できる点が特徴です。

サイコロ投げの頻度論による分析

ベイズ統計では、サイコロ投げをコイン投げの自然な拡張として簡単に扱うことができましたが、頻度論での分析は複雑になります。

素朴な方法:二項検定を6回行う

サイコロの各目について、個別に二項検定を行うのは自然な発想です。これに基づき、以下のような6つの帰無仮説を立てて、それぞれに対して検定を行います。

  • 帰無仮説1:1の出やすさは1/6と等しい

  • 帰無仮説2:2の出やすさは1/6と等しい

  • 帰無仮説3:3の出やすさは1/6と等しい

  • 帰無仮説4:4の出やすさは1/6と等しい

  • 帰無仮説5:5の出やすさは1/6と等しい

  • 帰無仮説6:6の出やすさは1/6と等しい

しかし、この方法には問題があります。検定を複数回行うことで、偶然に有意な結果が出やすくなり、統計的な誤り(多重比較の問題)が発生しやすくなります。

多項分布による検定

それならばと、二項分布ではなく多項分布を使う方法を思いつくのではないでしょうか。多項分布は、二項分布を複数の変数に拡張した確率分布です。多項分布を用いればサイコロの目の出やすさを1回の検定で評価できるはずです。

ところが、理論的にはよさそうなこのアイデアは、なぜか実際にはあまり使われていないのです。どうやら多項分布に従う標本分布の計算量が大きいため使い勝手が悪いようです。広く使われているのは最初に紹介した「カイ二乗検定」です。この手法が、サイコロの偏りを検定する際に主流となっています。

カイ二乗検定の仕組み

カイ二乗検定は「実測値と理論値のズレの合計」がカイ二乗分布に従う性質を利用した検定です。まず、サンプルサイズ$${N}$$が十分大きい場合、二項分布$${B(N,\theta)}$$は正規分布$${\mathcal{N}(N\theta,N\theta(1-\theta))}$$で近似できます。これにより、確率変数$${X}$$が二項分布$${B(N,\theta)}$$に従うとき、標準化した値

$$
\dfrac{X-N\theta}{\sqrt{N\theta(1-\theta)}}
$$

は標準正規分布に近似されます。

カイ二乗分布と自由度

カイ二乗分布$${\chi^2(k)}$$は、$${k}$$個の独立な標準正規分布の二乗和が従う分布で、$${k}$$を自由度と呼びます。カイ二乗分布は、次のように表されます。

$$
\chi^2(k) \sim \sum_{i=1}^{k} \frac{(X_i-N\theta_i)^2}{N\theta_i(1-\theta_i)}
$$

「実測値と理論値のズレの合計」がカイ二乗分布に従う

カイ二乗検定は、帰無仮説が成り立つ場合に「実測値と理論値のズレの合計がカイ二乗分布に従う」ことを利用する統計的検定方法です。

$${k}$$面のサイコロについて「実測値と理論値のズレの合計」は次の式で表されます:

$$
\sum_{i=1}^{k} \frac{(F_i-N\theta_i)^2}{N\theta_i}
$$

ここで$${F_i}$$は実測値、$${N\theta_i}$$は理論値です。この検定は、理論値と観測値のズレが偶然によるものか、それとも帰無仮説が誤りであるかを判断するために使われます。

サイコロを例に説明
話を単純にするために、2面のサイコロを考えましょう。実測値と理論値は以下の表のようになります。

2面サイコロの実測値と理論値

2面サイコロで、目を「1」か「2」ではなく、「1」か「not 1」だと考えて変数を減らします。すると以下のように表すことができます。

変数を減らした2面サイコロ

この表から、次の式で「実測値と理論値のズレの合計」を表します。

$$
\frac{(F_1-N\theta_1)^2}{N\theta_1}+\frac{((N-F_1)-N(1-\theta_1))^2}{N(1-\theta_1)} 
$$

上記の式を変形していきます。まずは分母をそろえます。

$$
\frac{(1-\theta_1)(F_1-N\theta_1)^2+\theta_1((N-F_1)-N(1-\theta_1))^2}{N\theta_1(1-\theta_1)}
$$

次に、分母の第二項を整理します。

$$
\frac{(1-\theta_1)(F_1-N\theta_1)^2+\theta_1(-F_1+N\theta_1)^2}{N\theta_1(1-\theta_1)}
$$

そして分母の第一項を展開します。

$$
\frac{(F_1-N\theta_1)^2-\theta_1(F_1-N\theta_1)^2+\theta_1(-F_1+N\theta_1)^2}{N\theta_1(1-\theta_1)}
$$

分母の第二項と第三項は打ち消しあうので、最終的に次の形になります。

$$
\frac{(F_1-N\theta_1)^2}{N\theta_1(1-\theta_1)} \sim \chi^2(1)
$$

これにより、2面サイコロの場合「実測値と理論値のズレの合計」は自由度1のカイ二乗分布に従うことが確認できます。先ほど提示したカイ二乗分布の定義式と一致しました。これを6面サイコロに一般化すると、自由度5のカイ二乗分布に従うことになります。

カイ二乗検定の意義
「実測値と理論値のズレの合計」がカイ二乗分布に従うという性質を利用することで、カイ二乗検定は観測データが理論分布とどれほど異なるかを評価する有効な方法です。ズレが大きければ、帰無仮説を棄却する根拠となります。

まとめ

カイ二乗検定の仕組みを以下の4ステップで説明しました。

  1. 二項分布は正規分布で近似できる。

  2. 二項分布に従う確率変数を標準化すると、標準正規分布に従う。

  3. 標準正規分布の二乗和はカイ二乗分布に従う。

  4. 「実測値と理論値のズレの合計」はカイ二乗分布に従う。

一度頻度論を離れ、ベイズ統計の視点で考えてみたところ、サイコロの偏りを検知するのは非常に簡単であると気づきました。その後、サイコロの偏り検知をカイ二乗検定で行う方法について考え直すと、すんなり理解できました。これが、私がカイ二乗検定を理解し納得するまでの過程です。もちろん、これはあくまでも私個人の経験ですので、この経路が誰にとっても最適というわけではありませんが、この記事がどなたかの参考になれば幸いです。

記事を書いてよかったこと

  • 統計的検定は差の大小について何も言及していないことを改めて認識できました。有意差があることと、効果があることは必ずしも関係がありません。

  • ベイズ統計が簡単で便利だということ再認識できました。個人的には、積極的にベイズ統計を活用していきたいと思っています。

データ分析に興味のある方募集中!

コグラフ株式会社データアナリティクス事業部ではPythonやSQLの研修を行った後、実務に着手します。
研修内容の充実はもちろん、経験者に相談できる環境が備わっています。
このようにコグラフの研修には、実務を想定し着実にスキルアップを目指す環境があります。
興味がある方は、下記リンクよりお問い合わせください。

X(Twitter)もやってます!

コグラフデータ事業部ではX(Twitter)でも情報を発信しています。
データ分析に興味がある、データアナリストになりたい人など、ぜひフォローお願いします!

この記事が気に入ったらサポートをしてみませんか?