人工知能を作りたい!

統計的仮説検定

一元配置分散分析(対応なし)、Tukey(テューキー)の方法による多重比較




はじめに

t検定も分散分析も、難しい名称が付いていますが、母平均の差の検定を行います。では、t検定と分散分析の違いは何でしょうか。

分散分析は「3つ以上の群それぞれの母平均の差」を検定します。しかし、t検定は「2つの群それぞれの母平均の差」しか検定できません。つまり、まとめると以下のようになります。

2つの群それぞれの母平均の差を検定する場合 → t検定
3つ以上の群それぞれの母平均の差を検定する場合 → 分散分析

分散分析において、母平均に差をもたらす原因を因子といいます。また、因子の中に含まれる個々の条件を水準といいます。そして、因子を1つ配置した場合の分散分析を一元配置分散分析といいます。

全て異なる被験者から得たデータ(被験者間のデータ)は対応がないデータといいます。同じ被験者から異なる水準で得たデータ(被験者内のデータ)は対応があるデータといいます。




例題1:一元配置分散分析(対応なし)

健康な人の血糖値は、空腹時は約70 mg/dL、食後2時間後は約130 mg/dLです。食後のインスリン分泌に遅れのある2型糖尿病患者の血糖値は、空腹時は約70 mg/dLで正常値ですが、食後2時間後は約200 mg/dL以上になります。

新しく開発した4種類のインスリン分泌促進薬の効果を検証するため、インスリン分泌に遅れのある2型糖尿病患者群から40人の被験者を無作為に抽出しました。そして、10人ずつ、4つのグループに分け、グループごとに異なる種類の新薬を割り当てました。

新薬は食前10分前服用してもらい、食後2時間後の血糖値を測定しました。そして、「新薬を服用しない時の食後血糖値」と「新薬を服用した時の食後血糖値」の差を血糖降下度 (mg/dL) として、以下のようにデータ化しました。



<薬A>

 被験者No.  血糖値の差
 1  60
 2  79
 3  127
 4  98
 5  102
 6  79
 7  97
 8  86
 9  109
 10  47


<薬B>

 被験者No.  血糖値の差
 11  58
 12  83
 13  95
 14  102
 15  56
 16  89
 17  69
 18  77
 19  82
 20  64


<薬C>

 被験者No.  血糖値の差
 21  75
 22  89
 23  64
 24  47
 25  49
 26  49
 27  73
 28  102
 29  59
 30  74


<薬D>

 被験者No.  血糖値の差
 31  88
 32  98
 33  132
 34  129
 36  68
 37  95
 37  117
 38  77
 39  89
 40  86


4種類の新薬すべてにおいて、血糖値上昇を抑える効果は等しいと判断していいでしょうか。




帰無仮説と対立仮説の設定

帰無仮説 H0:μA = μB = μC = μD(4群それぞれの母平均は等しい)
対立仮説 H1:少なくとも1つの群の母平均が他の群の母平均と異なる
有意水準 α=0.05

F分布は正の値しか持たないため、常に片側検定となります。




Rによる統計解析

Rには分散分析を実行する関数が用意されています。以下にその2つの関数を示します。

関数 oneway.test()
関数 aov()

まず、下準備を行います。


> グループ1 <-c(60, 79, 127, 98, 102, 79, 97, 86, 109, 47)
> グループ2 <-c(58, 83, 95, 102, 56, 89, 69, 77, 82, 64)
> グループ3 <-c(75, 89, 64, 47, 47, 49, 73, 102 ,59, 74)
> グループ4 <-c(88, 98, 132, 129, 68, 95, 117, 77, 89, 86)


4群のデータをそれぞれ変数「グループ1」、「グループ2」、「グループ3」、「グループ4」に格納します。


> 全グループ<-c(グループ1, グループ2, グループ3, グループ4)


4群のデータすべてを変数「全グループ」に格納します。


> 薬の種類 <-c(rep("A", 10), rep("B", 10), rep("C", 10), rep("D", 10))


変数「薬の種類」を用意します。この変数「薬の種類」に、どの薬を服用したのかを示すAからDという文字型の値を10ずつ繰り返して格納します。

関数 rep(値, 回数) は、指定した値を指定した回数分、繰り返したデータを作成します。

確認のため、出力してみます。


> 薬の種類
 [1] "A" "A" "A" "A" "A" "A" "A" "A" "A" "A" "B" "B" "B" "B" "B" "B" "B" "B"
[19] "B" "B" "C" "C" "C" "C" "C" "C" "C" "C" "C" "C" "D" "D" "D" "D" "D" "D"
[37] "D" "D" "D" "D"


「薬の種類」を出力すると"A"のように " が付いています。これは「薬の種類」に含まれているデータが文字型であることを示しています。

しかし、分散分析を実行する関数において、グループ分けに使う関数は文字型から因子型に直す必要があります。因子型とは「それぞれの文字型の値に対してRが自動的に対応する数値を割り当てたデータ型」です。


> 薬の種類2 <-factor(薬の種類)


関数 factor() を使って文字型データを因子型データに変換します。


試しに「薬の種類2」を出力してみます。


> 薬の種類2
 [1] A A A A A A A A A A B B B B B B B B B B C C C C C C C C C C D D D D D D
[37] D D D D
Levels: A B C D


「薬の種類2」を出力すると「薬の種類」を出力した時と異なり、Aを挟んでいた " が消え、「Levels: A B C D」という行が追加されています。「因子の水準:A、B、C、D」を意味します。

これは、Rの内部で自動的に文字型データA、B、C、Dに「A=1、B=2、C=3、D=4」のように数値を割り当てて「因子の水準」を作り、因子型データに変換したことを示しています。


一元分散分析を実行する準備が整いました。それでは、まず、関数 oneway.test() を利用して統計解析を実行することにします。

関数 oneway.test() の書式は
oneway.test(分散分析の対象となる変数~群分けのための変数)
です。

関数 oneway.test() はデフォルトでは、「全ての群の母分散の等質性は満たされない」と仮定して統計解析が実行されます。ですので、var.equal=TRUEというオプションを指定して、「全ての群の母分散は等しい」と指定します。


> oneway.test(全グループ~薬の種類2, var.equal=TRUE)

        One-way analysis of means

data: 全グループ and 薬の種類2
F = 4.2585, num df = 3, denom df = 36, p-value = 0.0113


Fの実現値、分子の自由度、分母の自由度、p値が示されています。p 値が0.0113となり、有意水準0.05より小さいので帰無仮説は棄却されました。つまり、「対立仮説 H1:少なくとも1つの群の母平均が他の群の母平均と異なる」が採択されました。


続いて、関数aov() を利用してみましょう。

関数aov() の書式は
aov(分散分析の対象となる変数~群分けのための変数)
です。


> aov(全グループ~薬の種類2)
Call:
   aov(formula = 全グループ ~ 薬の種類2)

Terms:
                薬の種類2 Residuals
Sum of Squares 5094.075 14354.700
Deg. of Freedom 3 36

Residual standard error: 19.96852
Estimated effects may be unbalanced


関数 aov() を使って出力すると、結果は見やすいものになっていません。Fの実現値も出力されていません。関数 summary() を利用して結果を見やすくしてみましょう。

関数 summary() と関数 aov() を合わせた書式は
summary(aov(分散分析の対象となる変数~群分けのための変数))
です。


> summary(aov(全グループ~薬の種類2))
            Df Sum Sq Mean Sq F value Pr(>F)
薬の種類2 3 5094 1698.0 4.258 0.0113 *
Residuals 36 14355 398.7
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


上記の表を分散分析表と呼びます。p値が0.0113となり、関数 oneway.test() の結果と同じになりました。




Tukey(テューキー)の方法による多重比較とは

上記の例題において、Rによる統計計解析の結果、「帰無仮説 H0:μA = μB = μC = μD(4群それぞれの母平均は等しい)は棄却され、「対立仮説 H1:少なくとも1つの群の母平均が他の群の母平均と異なる」が採択されました。

しかし、この結果では「どの薬とどの薬の母平均に差があるのか」は具体的にわかりません。差のある「水準と水準の組み合わせ」を判明させるためには、複数の「水準と水準の組み合わせ」において、それぞれ比較する必要があります。

このように、複数の「水準と水準の組み合わせ」において、それぞれ比較することを多重比較と呼びます。

多重比較の方法としてよく使われているのが、Tukey(テューキー)の方法です。Tukey(テューキー)の方法は、各郡の拇分散は等しいと仮定して、すべての「水準と水準の組み合わせ」を一つ残らず比較します。
全ての「水準と水準の組み合わせ」は以下の6通りです。

薬Aと薬B
薬Aと薬C
薬Aと薬D
薬Bと薬C
薬Bと薬D
薬Cと薬D




例題2:Tukey(テューキー)の方法による多重比較

例題1において「対立仮説 H1:少なくとも1つの群の母平均が他の群の母平均と異なる」が採択されたとしたら、どの薬とどの薬の母平均に差があるのでしょうか。




Rによる統計解析

Tukey(テューキー)の方法による多重比較を行うために、Rに用意された関数 TukeyHSD() を利用します。

関数 TukeyHSD() の引数(ひきすう)として、一元配置分散分析(対応なし)を実行した関数 aov(全グループ~薬の種類2) を指定します。


> TukeyHSD(aov(全グループ~薬の種類2))
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = 全グループ ~ 薬の種類2)

$`薬の種類2`
     diff lwr upr p adj
B-A -10.9 -34.951036 13.151036 0.6181037
C-A -20.5 -44.551036 3.551036 0.1180038
D-A 9.5 -14.551036 33.551036 0.7133637
C-B -9.6 -33.651036 14.451036 0.7067349
D-B 20.4 -3.651036 44.451036 0.1206944
D-C 30.0 5.948964 54.051036 0.0096084


D-Cのところを見ると、p値が0.0096084です。有意水準0.05より小さいことから、「C群とD群の間に5%水準で有意な差がある」ということになります。つまり、「薬Cと薬Dの母平均は異なる」ということです。