適合度検定とは、観測度数分布が期待度数分布と同じかどうかを統計的に確かめる方法である。

適合度検定を行う手順は次の通りである。

  1. 仮説を立てる。
    • 帰無仮説 H0:観測度数分布と期待度数分布が同じ。
    • 対立仮説 H1:観測度数分布と期待度数分布が同じではない。
  2. A1 A2 ・・・ An 合計
    観測度数 x1 x2 ・・・ xn X
    期待度数 y1 y2 ・・・ yn Y
  3. 期待度数yi{i=1,..,n}が5以下の場合は、隣接する列と合わせる。
  4. 検定統計量Tを次のように計算する。
    chi-square-test-test-of-goodness-of-fit-test-statistic
  5. このとき、検定統計量Tは自由度(n-1)のカイ二乗分布に従うので、有意水準のカイ二乗値kと比較する。
  6. T>kであれば、帰無仮説を棄却して、対立仮説を採用する。

日本人のABO式血液型の分布は大まかにA型が40%、B型が20%、O型が30%、AB型が10%とされている(「ABO式血液型 – Wikipedia」より)。
100人に血液型を調査したとき、A型が47人、B型が18人、O型が27人、AB型が8人であった場合、日本人のABO式血液型の分布に従っているかを確認してみる。
そこで、帰無仮説は次のようになる。

  • 帰無仮説 H0:A型が40%、B型が20%、O型が30%、AB型が10%である。

期待度数は観測度数合計×割合となるので、まとめると次のようになる。

血液型 A型 B型 O型 AB型 合計
観測度数 47 18 27 8 100
割合 0.4 0.2 0.3 0.1 1
期待度数(=観測度数合計×割合) 40 20 30 10 100

次にそれぞれに対して、(観測度数 – 期待度数)2/期待度数を求める。

血液型 A型 B型 O型 AB型 合計
(観測度数-期待度数)2/期待度数 (47-40)2/40 (18-20)2/20 (27-30)2/30 (8-10)2/10
(観測度数-期待度数)2/期待度数 1.225 0.200 0.300 0.400 2.125

これから検定統計量はT=2.125となる。
これは、自由度(4-1)=3のカイ二乗分布に従うので、有意水準を0.05とするとカイ二乗値は7.81473となる。
エクセルでこの値を求めるときは、CHIINV関数を使えば良い。

CHIINV(確率,自由度)

今回の例では、セルに「=CHIINV(0.05,3)」を入力する。

chi-square-test-test-of-goodness-of-fit-excel-chiinv
T=2.125<7.81473から棄却域に入らないので帰無仮説H0を棄てられない。
よって、調査結果は統計的にA型が40%、B型が20%、O型が30%、AB型が10%であるといえる。

Rで計算する

Rで適合度検定を行う場合は、次のようになる。


> chisq.test(c(47, 18, 27, 8), p = c(0.4, 0.2, 0.3, 0.1))

    Chi-squared test for given probabilities

    data:  c(47, 18, 27, 8)
    X-squared = 2.125, df = 3, p-value = 0.5469

よって、有意水準を5%(=0.05)とすると、p-value=0.5469>0.05となるため、帰無仮説は棄却されない。

Pythonで計算する

Pythonで適度度検定を行う場合は、次のようになる。あらかじめ、scipyパッケージをインストールしておく。


from scipy import stats
result = stats.chisquare([47, 18, 27, 8], f_exp = [40, 20, 30, 10])
print(result)

これを実行すると、次のようになる。


(2.125, 0.5468716738890154)

これは、カイ二乗値2.125、p値0.5468という意味である。

関連する記事

  • R UbuntuでRからMariaDBへ接続する方法 UbuntuでRからMariaDBへ接続して、データフレームとして取得する方法をお伝えする。 環境 Ubuntuのバージョン $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu […]
  • R knitrで特定ページを横向きにしてPDF出力する方法R knitrで特定ページを横向きにしてPDF出力する方法 knitrでレポートをPDF出力する際に、ある特定ページだけ横向きにする方法をお伝えする。 まずは、事前準備として本体となるファイルの同一ディレクトリに「header.tex」として、次の内容を書き込んで保存しておく。 これは、このファイルが読み込まれた時に、「lscape」パッケージを読み込んで、 「\blandscape」「\enlandscape」と記述してある場 […]
  • R言語 CRAN Task View:機械学習&統計学習R言語 CRAN Task View:機械学習&統計学習 CRAN Task View: Machine Learning & Statistical Learningの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Torsten Hothorn Contact: Torsten.Hothorn at […]
  • R言語 CRAN Task View:社会科学の統計R言語 CRAN Task View:社会科学の統計 CRAN Task View: Statistics for the Social Sciencesの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: John Fox Contact: jfox at […]
  • R言語 CRAN Task View:Rでの高性能並列コンピューティングR言語 CRAN Task View:Rでの高性能並列コンピューティング CRAN Task View: High-Performance and Parallel Computing with Rの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Dirk Eddelbuettel Contact: Dirk.Eddelbuettel at […]
カイ二乗検定 – 適合度検定