R言語

【R言語】カイ二乗検定 適合度検定・独立性の検定

  1. HOME >
  2. R言語 >

【R言語】カイ二乗検定 適合度検定・独立性の検定

スポンサーリンク

R言語でカイ2乗検定を実行する方法を解説していきます。データセットの用意から検定までの一連の流れを紹介していきます。

カイ2乗検定の種類として適合度検定や独立性の検定がありますが、R言語に標準で実装されている関数を用いれば、これらの検定を統一的かつ簡単に実行することができます。

また、フィッシャーの正確率検定については以下の記事で紹介しています。

【R言語】フィッシャーの正確率検定 関数fisher.testの使い方

R言語でフィッシャーの正確率検定を実行する方法をみていきます。 前回紹介したカイ2乗検定の引き続き、カテゴリカルデータの検定方法であるフィッシャーの正確率検定の実行例を紹介します。 カイ2乗検定につい ...

続きを見る

この記事で扱うプログラミングコードは次のファイルにすべて保存してあります。

統計学初学者向けの教材です
¥2,970 (2022/06/01 17:41時点 | Amazon調べ)

カイ2乗検定の実行方法

仮説検定

ピアソンのカイ2乗検定とは次の仮説検定のことをいいます。

カイ2乗検定

\(n\)個の標本を\(k\)個の事象に分類し事象の生起数を\(O_1, \ldots, O_k\)で表しとする。また、\(i\)番目の事象の生起確率を\(p_i\)で表し、期待度数を\(E_i = np_i,\ i = 1, \ldots, k\)とする。このとき、次の仮説を考える。\begin{align}X^2 &= \sum_{i=1}^k\cfrac{(O_i-E_i)^2}{E_i}\sim \chi_{k-1}^2.\end{align}

仮説によって適合度検定や独立性の検定などの様々な種類の検定方法があります。

R言語でこれらの検定を実行する方法をみていきます。

関数chisq.test

R言語にはchisq.testという関数があります。chisq.testを用いることで適合度検定や独立性の検定を簡単に実行することができます。

chisq.test(x, y = NULL, correct = TRUE, p = rep(1/length(x), length(x)), rescale.p = FALSE, simulate.p.value = FALSE, B = 2000)

chisq.testの引数
xnumeric型のベクトルや行列。xとyにfactor型のベクトルを代入することも可。
yxと同じ長さを持つfactor型のベクトル。xが行列である場合は無視される。
correctxが2×2行列である場合、イェーツの補正を加えるかをTRUEかFALSEで指定できる。
p帰無仮説の下での確率p。
rescale.pTRUEのときベクトルpの和が1になるようにリスケールされる。FALSEの場合されない。
simulate.p.valueモンテカルロシミュレーションによりp値を計算するかどうか決める。
Bモンテカルロ法での試行回数。

この後、関数chisq.testの使用例をみていきます。実際にデータセットを用いて実行していきます。

様々なカイ2乗検定

適合度検定や独立性の検定の実行例を紹介します。

データセットの用意から仮説検定の結果を取得するまでの一連の流れを見ていきます。

まず、カイ二乗検定に用いるデータセットを用意します。

テーブル型のデータをデータフレームに展開するために、次のパッケージepitoolsが便利です。

上を実行しインストールしましょう。

インストールが完了したら下を実行し、dataHairEyeColorを展開したデータフレームを代入します。

dataHairEyeSexの3つのfactor型のデータから成ります。

これらの因子についての分割表を作成することで、カイ二乗検定を行っていきます。

適合度検定

次に、適合度検定の実行例を見ていきます。

適合度検定とは、次の仮説検定のことを言います。

適合度検定

\(n\)個の標本を\(k\)個の事象に分類し事象の生起数を\(x_1, \ldots, x_k\)で表し、その確率変数を\(X_i, i = 1, \ldots, k\)とする。また、\(i\)番目の事象の生起確率を\(p_i\)で表し、期待度数を\(E_i = np_i,\ i = 1, \ldots, k\)とする。このとき、次の仮説を考える。

\begin{align}&H_0: p_i = p_{0i} ,\ \ \ \ i = 1,\ldots, k\\&H_1: {\mathrm not}\ \  H_0\end{align}

検定統計量として次のカイ2乗統計量を用いる。

\begin{align}X^2 = \sum_{i=1}^k\cfrac{(X_i-np_{0i})^2}{np_i} \sim \chi_{k-1}^2.\end{align}

帰無仮説で特定の確率\(p_{0i},\ i=1,\ \ldots, k\)を与え、それぞれの生起確率が\(p_{0i},\ i= 1, \ldots, k\)であるかを検定しています。<.span>

上記の適合度検定を実行してみましょう。一様性の検定で用いたhairに対して、適合度検定を行ってみます。

まず、帰無仮説で与えたい確率\(p_{01}\)を作ります。「Blackが20%、Brownが50%、Redが10%、Blondが20%」であることを表すベクトルprobを定義します。

適合度検定を行うには、次のようにchisq.testの引数pに帰無仮説での確率\(p_{0i}\)を代入することで実行できます。

testResultを参照すると「Chi-squared test for given probabilities」と書かれているように、帰無仮説において\(p_i = p_{0i},\ i=1, \ldots, k\)を与えていることが分かります。

一様性の検定で説明したように、次を実行することで検定結果を参照することが可能です。

また、次のように検定結果を格納したデータフレームを作成し、csvファイルへ出力する例を以下に紹介しときます。

適合度検定結果

独立性の検定

独立性の検定(r×c分割表)

次に、独立性の検定の実行方法を紹介します。

\(r\times c\)分割表に対する独立性の検定を行っていきます。独立性の検定は次の検定のことをいいます。

独立性の検定

2つの属性\(A\)、\(B\)が与えられているとする。\(A\)は\(r\)個のクラス\(A_1, \ldots, A_r\)、\(B\)は\(c\)個のクラス\(B_1, \ldots, B_c\)をもつ。このとき、\(n\)個の標本を2つの属性\(A\)、\(B\)に分類し、それぞれ事象の生起数を\(x_{11}, \ldots, x_{rc}\)で表し、その確率変数を\(X_{11}, \ldots, X_{rc}\)とする。また、生起確率を\(p_{11}, \ldots, p_{rc}\)で表し、期待度数を\(E_{11} = np_{11}, \ldots, E_{rc} = np_{rc}\)とする。このとき、次の仮説を考える。

\begin{align}&H_0: p_{ij} = p_{i\cdot} p_{\cdot j} ,\ \ \ \ i = 1,\ldots, r,\ j  = 1,\ldots, c\\&H_1: {\mathrm not}\ \  H_0\end{align}

検定統計量として次のカイ2乗統計量を用いる。

\begin{align}X^2 = \sum_{i=1}^r \sum_{j=1}^c\cfrac{\left( X_{ij} - \frac{X_{i \cdot }X_{\cdot j}}{n}\right)^2}{ \frac{X_{i \cdot }X_{\cdot j}}{n}} \sim \chi_{(r-1)(c-1)}^2,\end{align}

ここに\(X_{i \cdot} = \sum_{j=1}^cX_{ij}\)、\(X_{\cdot j} = \sum_{i=1}^r X_{ij}\)。

まず、dataからHairEyeに関するクロス集計表を作成しましょう。

「HairとEyeの分布は独立であるか」という仮説検定をするには、次のようにchisq.testの引数xに分割表を表す行列またはデータフレームを代入するか、3行目のように引数xとyにそれぞれHairのベクトルとEyeのベクトルを代入します。

testResultを参照すると、独立性の検定結果を見ることができます。

p-value < 2.2e-16<0.05であることから帰無仮説を棄却し、「HairとEyeの分布は独立ではない」ことがいえました。<.span>

p値以外の検定結果が欲しいときは、次のようにtestResultの後ろの「$」を付け加えることでリストの要素にアクセスすることが可能です。

次のように、上記の検定結果をデータフレームに格納することができます。

write.csvを用いてcsvファイルにこれらの結果を出力することができます。

作業ディレクトリに"独立性の検定.csv"が出力されているのが確認できます。

独立性の検定結果

2×2分割表の場合(イェーツの補正を適用)

最後に、2×2の分割表の場合の検定方法を紹介します。イェーツの補正を適用する方法をみていきます。

まず、最初に次のUCバークレーの入学者に関するデータセットを用意します。カイ2乗検定で最初に説明したように、関数expand.tableを用いてテーブル型のデータを展開しましょう。

UCBAdmissionsAdmitGenderDeptの3つのfactor型のデータから構成されます。Admitが合格か不合格、Genderは性別、Deptは学部となっています。AdmitとGenderの水準数はそれぞれ2つであるため、これら2つのfactor型のデータから2×2の分割表を作成することができます。早速、関数tableを用いてAdmitとGenderに関する分割表を作成します。

合格と比較すると、Female(女性)の方がMale(男性)よりもRejected(不合格)の割合が多いように見えます。

独立性の検定を用いて、AdmitとGenderの分布は独立であるか(Genderによって差があるか)を検定していきます。

\(r\times c\)の分割表と同様に、関数chisq.testの引数にクロス集計表を代入することで簡単に独立性の検定を行うことが可能です。

また、2×2の分割表の場合にはイェーツの補正を適用したい場合があると思います。引数のcorrectをTRUEにすることで、イェーツの補正を適用することができます。

「Pearson's Chi-squared test with Yates' continuity correction」とあるように、イェーツの補正が適用されているのが分かります。

これらの検定結果もtestResult_correctの後ろに「$」を付けることで参照することが可能です。

これらの検定結果をcsvファイルへ出力したい場合は、次のようにデータフレームに検定結果を格納し、write.csvを用いてcsvファイルへ出力しましょう。

作業ディレクトリに”2×2独立性の検定_補正なしあり.csv"が出力されているのが確認できます。

一様性の検定

一様性の検定の実行方法をみていきます。

一様性の検定とは次の仮説検定のことをいいます。

一様性の検定

2つの属性\(A\)、\(B\)が与えられているとする。\(A\)は\(k\)個のクラス\(A_1, \ldots, A_k\)、\(B\)は\(2\)個のクラス\(B_1, B_2\)をもつ。このとき、\(n\)個の標本を2つの属性\(A\)、\(B\)に分類し、それぞれ事象の生起数を\(x_{11}, x_{12}, \ldots, x_{2k}\)で表し、その確率変数を\(X_{11}, X_{12}, \ldots, X_{2k}\)とする。また、生起確率を\(p_{11}, p_{12}, \ldots, p_{2k}\)で表し、期待度数を\(E_{11} = np_{11}, E_{12} = np_{12},\ldots, E_{2k} = np_{2k}\)とする。このとき、次の仮説を考える。

\begin{align}&H_0: p_{1i} = p_{2i}\quad i = 1, 2, \ldots, k\\ &H_1: {\mathrm not}\ \  H_0\end{align}

検定統計量として次のカイ2乗統計量を用いる。

\begin{align}X^2 = \sum_{i=1}^2 \sum_{j = 1}^k \cfrac{\left(X_{ij} - \frac{X_{i\cdot}X_{\cdot j}}{n}\right)^2 }{ \frac{X_{i\cdot}X_{\cdot j}}{n}} \sim \chi_{k-1}^2\end{align}

ここに、\(X_{i\cdot} = \sum_{j=1}^k X_{ij}\)、\(X_{\cdot j} = \sum_{i=1}^2 X_{ij}\)。

上記のように、一様性の検定では「\(k\)個の排反な事象\(A_1, \ldots, A_{k}\)があり、その事象が起こる確率が全て等しいかの仮説」を検定します。

上で与えたdataのHairの列に関して一様性の検定を行ってみます。関数tableを用いることで、Hairの各水準のデータ数を取得することができます。

table_SexEyeは次のようにSexEyeから構成されます。

次のように、関数chisq.testの引数xにセル数を表すベクトルを代入することで、一様性の検定を行うことができます。

testResultを参照すると次のように検定結果が格納されているのが分かります。

上の結果から分かるようにp-value=0.6754であり、「各Eye(瞳の色)のはSexによって変わらない」という結論が得られました。

p値以外にも様々な検定結果があるのが確認できます。検定結果はリストの要素として保存されているので、次のようにして各検定結果を参照することが可能です。

最後に、これらの検定結果をデータフレームに格納し、検定結果をcsvファイルに出力してみましょう。次のようにdata.frameでデータフレームを作ります。

write.csvを用いれば作業ディレクトリに"適合度検定(一様性の検定).csv"を出力することができます。

一様性の検定結果

まとめ

R言語でカイ二乗検定を実行する方法をみていきました。

適合度検定や独立性の検定がchisq.testだけで行えることを紹介しました。

chisq.testの引数にベクトルを与えるか 行列を与えるかで、検定方法が変わることを覚えておいてください。

スポンサーリンク

  • この記事を書いた人
  • 最新記事

usagi-san

統計学とゲームとかをメインに解説していくよ。 数式とかプログラミングコードにミスがあったり質問があったりする場合はコメントで受け付けます。すぐに対応します。

-R言語
-, , ,