R言語でカイ2乗検定を実行する方法を解説していきます。データセットの用意から検定までの一連の流れを紹介していきます。
カイ2乗検定の種類として適合度検定や独立性の検定がありますが、R言語に標準で実装されている関数を用いれば、これらの検定を統一的かつ簡単に実行することができます。
また、フィッシャーの正確率検定については以下の記事で紹介しています。
【R言語】フィッシャーの正確率検定 関数fisher.testの使い方
R言語でフィッシャーの正確率検定を実行する方法をみていきます。 前回紹介したカイ2乗検定の引き続き、カテゴリカルデータの検定方法であるフィッシャーの正確率検定の実行例を紹介します。 カイ2乗検定につい ...
続きを見る
この記事で扱うプログラミングコードは次のファイルにすべて保存してあります。
R言語 カイ二乗検定 Rスクリプト
カイ2乗検定の実行方法
仮説検定
ピアソンのカイ2乗検定とは次の仮説検定のことをいいます。
カイ2乗検定
仮説によって適合度検定や独立性の検定などの様々な種類の検定方法があります。
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)
x | numeric型のベクトルや行列。xとyにfactor型のベクトルを代入することも可。 |
y | xと同じ長さを持つfactor型のベクトル。xが行列である場合は無視される。 |
correct | xが2×2行列である場合、イェーツの補正を加えるかをTRUEかFALSEで指定できる。 |
p | 帰無仮説の下での確率p。 |
rescale.p | TRUEのときベクトルpの和が1になるようにリスケールされる。FALSEの場合されない。 |
simulate.p.value | モンテカルロシミュレーションによりp値を計算するかどうか決める。 |
B | モンテカルロ法での試行回数。 |
この後、関数chisq.testの使用例をみていきます。実際にデータセットを用いて実行していきます。
様々なカイ2乗検定
適合度検定や独立性の検定の実行例を紹介します。
データセットの用意から仮説検定の結果を取得するまでの一連の流れを見ていきます。
まず、カイ二乗検定に用いるデータセットを用意します。
テーブル型のデータをデータフレームに展開するために、次のパッケージepitoolsが便利です。
1 2 | install.packages("epitools") library(epitools) |
上を実行しインストールしましょう。
インストールが完了したら下を実行し、dataにHairEyeColorを展開したデータフレームを代入します。
1 2 3 4 5 6 7 8 9 | > data <- expand.table(HairEyeColor) > head(data) Hair Eye Sex 1 Black Brown Male 2 Black Brown Male 3 Black Brown Male 4 Black Brown Male 5 Black Brown Male 6 Black Brown Male |
dataはHair、Eye、Sexの3つのfactor型のデータから成ります。
これらの因子についての分割表を作成することで、カイ二乗検定を行っていきます。
適合度検定
次に、適合度検定の実行例を見ていきます。
適合度検定とは、次の仮説検定のことを言います。
適合度検定
検定統計量として次のカイ2乗統計量を用いる。
帰無仮説で特定の確率\(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を定義します。
1 2 3 4 5 | > prob <- c(0.2, 0.5, 0.1, 0.2) > names(prob) <- names(hair) > prob #各髪の色が発生する確率 Black Brown Red Blond 0.2 0.5 0.1 0.2 |
適合度検定を行うには、次のようにchisq.testの引数pに帰無仮説での確率\(p_{0i}\)を代入することで実行できます。
1 2 3 4 5 6 7 | > testResult <- chisq.test(hair, p = prob) > testResult Chi-squared test for given probabilities data: hair X-squared = 4.228, df = 3, p-value = 0.2379 |
testResultを参照すると「Chi-squared test for given probabilities」と書かれているように、帰無仮説において\(p_i = p_{0i},\ i=1, \ldots, k\)を与えていることが分かります。
一様性の検定で説明したように、次を実行することで検定結果を参照することが可能です。
1 2 3 | stat <- unname(testResult$statistic) #検定統計量 df <- unname(testResult$parameter) #自由度 pValue <- unname(testResult$p.value) #p値 |
また、次のように検定結果を格納したデータフレームを作成し、csvファイルへ出力する例を以下に紹介しときます。
1 2 | resultTable <- data.frame(Xsquared = stat, d.f. = df, p.value = pValue, row.names = NULL) write.csv(resultTable, "適合度検定.csv", row.names = FALSE) |
独立性の検定
独立性の検定(r×c分割表)
次に、独立性の検定の実行方法を紹介します。
\(r\times c\)分割表に対する独立性の検定を行っていきます。独立性の検定は次の検定のことをいいます。
独立性の検定
検定統計量として次のカイ2乗統計量を用いる。
ここに\(X_{i \cdot} = \sum_{j=1}^cX_{ij}\)、\(X_{\cdot j} = \sum_{i=1}^r X_{ij}\)。
まず、dataからHairとEyeに関するクロス集計表を作成しましょう。
1 2 3 4 5 6 7 8 | > table_HairEye <- table(data$Hair, data$Eye) > table_HairEye Brown Blue Hazel Green Black 68 20 15 5 Brown 119 84 54 29 Red 26 17 14 14 Blond 7 94 10 16 |
「HairとEyeの分布は独立であるか」という仮説検定をするには、次のようにchisq.testの引数xに分割表を表す行列またはデータフレームを代入するか、3行目のように引数xとyにそれぞれHairのベクトルとEyeのベクトルを代入します。
1 2 3 | #HairとEyeに関するカイ二乗検定 testResult <- chisq.test(table_HairEye) #引数xに行列を指定 chisq.test(data$Hair, data$Eye) #引数xとyにベクトルを指定 |
testResultを参照すると、独立性の検定結果を見ることができます。
1 2 3 4 5 6 | > testResult Pearson's Chi-squared test data: table_HairEye X-squared = 138.29, df = 9, p-value < 2.2e-16 |
p-value < 2.2e-16<0.05であることから帰無仮説を棄却し、「HairとEyeの分布は独立ではない」ことがいえました。<.span>
p値以外の検定結果が欲しいときは、次のようにtestResultの後ろの「$」を付け加えることでリストの要素にアクセスすることが可能です。
1 2 3 | stat <- unname(testResult$statistic) #検定統計量 df <- unname(testResult$parameter) #自由度 pValue <- unname(testResult$p.value) #p値 |
次のように、上記の検定結果をデータフレームに格納することができます。
1 2 3 4 | > resultTable <- data.frame(Xsquared = stat, d.f. = df, p.value = pValue, row.names = NULL) > resultTable Xsquared d.f. p.value 1 182.527 3 2.510287e-39 |
write.csvを用いてcsvファイルにこれらの結果を出力することができます。
1 | write.csv(resultTable, "独立性の検定.csv", row.names = FALSE) |
作業ディレクトリに"独立性の検定.csv"が出力されているのが確認できます。
2×2分割表の場合(イェーツの補正を適用)
最後に、2×2の分割表の場合の検定方法を紹介します。イェーツの補正を適用する方法をみていきます。
まず、最初に次のUCバークレーの入学者に関するデータセットを用意します。カイ2乗検定で最初に説明したように、関数expand.tableを用いてテーブル型のデータを展開しましょう。
1 2 3 4 5 6 7 8 9 | > data <- expand.table(UCBAdmissions) > head(data) Admit Gender Dept 1 Admitted Male A 2 Admitted Male A 3 Admitted Male A 4 Admitted Male A 5 Admitted Male A 6 Admitted Male A |
UCBAdmissionsはAdmitとGenderとDeptの3つのfactor型のデータから構成されます。Admitが合格か不合格、Genderは性別、Deptは学部となっています。AdmitとGenderの水準数はそれぞれ2つであるため、これら2つのfactor型のデータから2×2の分割表を作成することができます。早速、関数tableを用いてAdmitとGenderに関する分割表を作成します。
1 2 3 4 5 6 | > table_AdmitGender <- table(data$Admit, data$Gender) > table_AdmitGender Male Female Admitted 1198 557 Rejected 1493 1278 |
合格と比較すると、Female(女性)の方がMale(男性)よりもRejected(不合格)の割合が多いように見えます。
独立性の検定を用いて、AdmitとGenderの分布は独立であるか(Genderによって差があるか)を検定していきます。
\(r\times c\)の分割表と同様に、関数chisq.testの引数にクロス集計表を代入することで簡単に独立性の検定を行うことが可能です。
1 2 3 4 5 6 7 | > testResult <- chisq.test(table_AdmitGender) > testResult Pearson's Chi-squared test with Yates' continuity correction data: table_AdmitGender X-squared = 91.61, df = 1, p-value < 2.2e-16 |
また、2×2の分割表の場合にはイェーツの補正を適用したい場合があると思います。引数のcorrectをTRUEにすることで、イェーツの補正を適用することができます。
1 2 3 4 5 6 7 | > testResult_correct <- chisq.test(table_AdmitGender, correct = TRUE)#イェーツの補正を適用する > testResult_correct Pearson's Chi-squared test with Yates' continuity correction data: table_AdmitGender X-squared = 91.61, df = 1, p-value < 2.2e-16 |
「Pearson's Chi-squared test with Yates' continuity correction」とあるように、イェーツの補正が適用されているのが分かります。
これらの検定結果もtestResult_correctの後ろに「$」を付けることで参照することが可能です。
1 2 3 | stat_correct <- unname(testResult_correct$statistic) #検定統計量 df_correct <- unname(testResult_correct$parameter) #自由度 pValue_correct <- unname(testResult_correct$p.value) #p値 |
これらの検定結果をcsvファイルへ出力したい場合は、次のようにデータフレームに検定結果を格納し、write.csvを用いてcsvファイルへ出力しましょう。
1 2 3 4 | resultTable <- data.frame(Xsquared_correct = stat_correct, d.f._correct = df_correct, p.value_correct = pValue_correct, row.names = NULL) write.csv(resultTable, "2×2独立性の検定_補正なしあり.csv", row.names = FALSE) |
作業ディレクトリに”2×2独立性の検定_補正なしあり.csv"が出力されているのが確認できます。
一様性の検定
一様性の検定の実行方法をみていきます。
一様性の検定とは次の仮説検定のことをいいます。
一様性の検定
検定統計量として次のカイ2乗統計量を用いる。
ここに、\(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の各水準のデータ数を取得することができます。
1 2 3 | #一様性の検定 data <- expand.table(HairEyeColor) table_SexEye <- table(data$Sex, data$Eye) |
table_SexEyeは次のようにSexとEyeから構成されます。
1 2 3 4 5 | > table_SexEye Brown Blue Hazel Green Male 98 101 47 33 Female 122 114 46 31 |
次のように、関数chisq.testの引数xにセル数を表すベクトルを代入することで、一様性の検定を行うことができます。
testResultを参照すると次のように検定結果が格納されているのが分かります。
1 2 3 4 5 6 7 | > testResult <- chisq.test(table_SexEye) > testResult Pearson's Chi-squared test data: table_SexEye X-squared = 1.5298, df = 3, p-value = 0.6754 |
上の結果から分かるようにp-value=0.6754であり、「各Eye(瞳の色)のはSexによって変わらない」という結論が得られました。
p値以外にも様々な検定結果があるのが確認できます。検定結果はリストの要素として保存されているので、次のようにして各検定結果を参照することが可能です。
1 2 3 | stat <- unname(testResult$statistic) #検定統計量 df <- unname(testResult$parameter) #自由度 pValue <- unname(testResult$p.value) #p値 |
最後に、これらの検定結果をデータフレームに格納し、検定結果をcsvファイルに出力してみましょう。次のようにdata.frameでデータフレームを作ります。
1 2 3 4 | > resultTable <- data.frame(Xsquared = stat, d.f. = df, p.value = pValue, row.names = NULL) > resultTable Xsquared d.f. p.value 1 1.529824 3 0.6754042 |
write.csvを用いれば作業ディレクトリに"適合度検定(一様性の検定).csv"を出力することができます。
1 | write.csv(resultTable, "一様性の検定.csv", row.names = FALSE) |
まとめ
R言語でカイ二乗検定を実行する方法をみていきました。
適合度検定や独立性の検定がchisq.testだけで行えることを紹介しました。
chisq.testの引数にベクトルを与えるか 行列を与えるかで、検定方法が変わることを覚えておいてください。