66. カテゴリデータの検定


χ2 (カイ二乗) 検定

適合度検定や独立性の検定は全て同じ関数 chisq.test() で行うことが出来る.この場合,引数のデータの形式と引数に確率を入れるかで検定内容が異なる.

検定したいデータの形式

以下の 1.2 が適合度検定,3 ~ 5 が独立性の検定である.いずれの場合も引数に correct=F を入れることで連続性の補正を抑制することが出来る.

  1. 1 つのベクトルを引数にする場合 → c(8, 12, 10, 9, 5, 6) :
    例えばサイコロを振った結果を入れて,このサイコロが正しいサイコロであるかどうか ( 1 ~ 6 の生起確率が全て等しいのか) を検定する場合は 1 つのベクトルを引数にすればよい.
     
  2. 1 つのベクトルと生起確率を引数にする場合 → c(20,8,5,2), p=c(4, 3, 2, 1)/10 :
    35 人の血液型を調べ,これより日本人の血液型は A,B,O,AB の順で 40%,30%,20%,10% の比率になっているかどうかを検定する場合は 1 つのベクトルと,その生起確率を引数にすればよい.
     
  3. 2 列の行列を引数にする場合 → matrix(c(20, 15, 16, 4, 15, 7, 9, 4), ncol=2, byrow=T) :
    男女 90人の血液型を調べて,男女の血液型の分布が同じかどうかを検定する場合は 2 列の行列を引数にすればよい.
     
  4. 2 行 2 列の行列を引数にする場合 → matrix(c(20, 15, 16, 9), ncol=2, byrow=T) :
    男女 60 人に喫煙の有無を調べ,男女の喫煙率に差があるかどうかを検定する場合は 2 行 2 列の行列を引数にすればよい.
     
  5. m 列の行列を引数にする場合 → matrix(c(20, 15, ... ), ncol=m, byrow=T) :
    例えば都道府県別に決まった人数を抽出して血液型を調べ,都道府県と血液型の間に関係があるかどうかを検定する場合は m 列 (m ≧ 2) の行列を引数にすればよい.

検定関数の記述例

上のデータ形式それぞれの入力例である.

 
 chisq.test(c(8, 12, 10, 9, 5, 6))
 chisq.test(c(20,8,5,2), p=c(4, 3, 2, 1)/10)
 chisq.test(matrix(c(20, 15, 16, 4, 15, 7, 9, 4), ncol=4, byrow=T))
 chisq.test(matrix(c(20, 15, 16, 9), ncol=2, byrow=T))
 chisq.test(matrix(c(20, 15, 16, 4, 15, 7, 9, 4, 10), ncol=3, byrow=T))

実際の検定例

例えば以下のようなデータが取られた場合に,『第一外国語の単位を取得する』ことと『第二外国語の単位を取得する』ことに関連があるかを検定することを考える.

 

第一外国語

合計

単位取得

単位取得不可

第二外国語

単位取得

14

8

22

単位取得不可

4

17

21

合計

18

25

43

このような場合は,例えば χ2 検定を用いればよい.

 
 x <- matrix(c(14, 8, 4, 17), ncol=2, byrow=T) 
 chisq.test(x)
 
        Pearson's Chi-squared test with Yates' continuity correction
data:  x 
X-squared = 7.0406, df = 1, p-value = 0.007968

フィッシャーの直接確率検定

χ2 検定は近似的な方法である.正確な計算を行う場合は,フィッシャーの直接確率検定を用いる.関数は fisher.test() を使い,引数には 2×2 の行列を与えればよい.

 
 x <- matrix(c(14, 8, 4, 17), ncol=2, byrow=T) 
 fisher.test(x)
 
        Fisher's Exact Test for Count Data
data:  x 
p-value = 0.005089
alternative hypothesis: true odds ratio is not equal to 1 
95 percent confidence interval:
  1.567890 39.549785 
sample estimates:
odds ratio 
  7.051895

フィッシャーの直接確率検定 (分割表が 2×2 よりも大きい場合)

上の場合は 2×2 の行列を引数に与えたが,分割表が 2×2 より大きい場合 (第二外国語を細分化する場合など) は,同じサイズの行列を引数に与えてフィッシャーの直接確率検定を用いればよい.

マクネマー検定

異なる状況下で同じ個体 (例えば学生) から2回データを取った場合など,関連のある (対応のある) 2つの集団からデータが取られた場合に,半年の間に単位取得状況に変化があるかを検定する場合はマクネマー検定を用いる.

 

前期の英語

合計

単位取得

単位取得不可

後期の英語

単位取得

14

8

22

単位取得不可

4

17

21

合計

18

25

43

関数は mcnemar.test() を使い,引数には 2×2 の行列を与えればよい.このとき,correct=F を引数に与えることで,連続性の補正を抑制することが出来る.

 
 x <- matrix(c(14, 8, 4, 17), ncol=2, byrow=T) 
 mcnemar.test(x, correct=F)
 
        McNemar's Chi-squared test
data:  x 
McNemar's chi-squared = 1.3333, df = 1, p-value = 0.2482

マクネマー検定 (分割表が 2×2 よりも大きい場合)

異なる状況下で同じ個体 (例えば学生) から2回データを取った場合など,関連のある (対応のある) 2つの集団からデータが取られた場合に,調査項目が3つ以上で,半年の間に単位取得状況に変化があるかを検定する場合もマクネマー検定を用いる.この時,引数には分割表と同じサイズの行列を与えればよい.

二群の比率の差の検定

「あなたは納豆が好きですか?」 という質問に対して,東京では 300 人中 245 人が,大阪では 250 人中 157 人が好きだと答えた場合に,好きな人の割合に差があるかどうか検定する場合は関数 prop.test() を使う.このとき,correct=F を引数に与えることで,連続性の補正を抑制することが出来る. 

 
 prop.test(c(245, 157), c(300,250), correct=F)

        2-sample test for equality of proportions without continuity  correction

data:  c(245, 157) out of c(300, 250) 
X-squared = 24.6789, df = 1, p-value = 6.772e-07
alternative hypothesis: two.sided 
95 percent confidence interval:
 0.1144583 0.2628750 
sample estimates:
   prop 1    prop 2 
0.8166667 0.6280000

オッズ比とその信頼区間を求める場合はパッケージ vcd を呼び出した後で summary(oddsratio(table(A,B),log=F)) を実行すればよい.このとき,対数オッズ比を計算する場合は引数 log=F をつけないこと.

いくつかの群の比率が独立変数と線形傾向があるかどうかを検定するための関数 prop.trend.test() がある.これはコクラン・アーミテージ検定といわれる検定方法である.指定は prop.trend.test (ベクトル1, ベクトル2) とすればよい.

符号検定と二項検定

ある納豆の製造会社が,大阪の人 10 人に「新製品『なっとうよん』を食べる前の納豆に対する評価」と「『なっとうよん』を 1 週間食べ続けてもらった後の納豆に対する評価」をアンケートで調査した.5 段階(5:良い ~ 1:悪い)で評価してもらった結果は以下の通りになった.

5:良い ~ 1:悪い

 

A

B

C

D

E

F

G

H

I

J

食べる前

4

1

1

2

1

2

4

3

3

2

食べた後

2

1

3

1

5

1

5

3

3

1

前 - 後

0

0

0

1 週間で納豆の好き嫌いの割合に差があったかどうかを検定するときは符号検定を行う

 
 x <- c(4, 1, 1, 2, 1, 2, 4, 3, 3, 2)
 y <- c(2, 1, 3, 1, 5, 1, 5, 3, 3, 1)
 binom.test(c(length(x[x>y]), length(x[x < y])))
 
        Exact binomial test

data:  c(length(x[x > y]), length(x[x < y])) 
number of successes = 4, number of trials = 7, p-value = 1
alternative hypothesis: true probability of success is not equal to 0.5 
95 percent confidence interval:
 0.1840516 0.9010117 
sample estimates:
probability of success 
             0.5714286 

コインを多数回投げた結果について,表と裏の出る確率が等しくなっているかを検定する場合は,比率の同一性検定 prop.test(表が出た回数, 裏が出た回数, p = 0.5) を行う.これは近似による検定なので,正確な検定を行う場合は二項検定 binom.test() を行えばよい. 

 
 binom.test(c(257, 243), p=1/2)   # binom.test(表が出た回数, 裏が出た回数, 表が出る確率)

カッパ係数

例えば,A さんと B さんが同じものを測定することを考える.A さんと B さんの評価の一致度を測る場合は κ (カッパ) 係数を用いる. 

 

A さん

良い

普通

悪い

B さん

良い

80

15

5

普通

10

40

20

悪い

5

10

25

κ (カッパ) 係数を計算する際は,パッケージ vcd を呼び出した後で関数 Kappa() を実行すればよい.

 
 measure2 <- matrix(c(80, 15,  5,
                      10, 40, 20,
                       5, 10, 25), 3, byrow=T)
 Kappa(measure2)

               value        ASE       lwr       upr
Unweighted 0.4915254 0.05492153 0.3838812 0.5991696  # カッパ係数
Weighted   0.4736842 0.08145561 0.3140342 0.6333343  # 重みつきカッパ係数(不一致の程度も考慮)

κ (カッパ) 係数に関連して,信頼性係数 ICC (Intraclass correlation coefficient) を求める場合は,パッケージ irr 中の関数 icc() を用いればよい.

 
 data(anxiety)
 icc(anxiety, model="twoway", type="agreement")