①分散分析の概説(ANOVA:analysis of variance)

 3組以上のデータ(対応のない3標本のデータか,対応のある1標本の3群のデータ) の間に差があるかどうか検定する手法である。この手法は,数値データ (順序,間隔と比率尺度)に適用される。図1は,15名の患者が3組の 疾患(A,BとC)に分けられ,各組の患者の歩行速度を測定したデータである。 各組間の歩行速度の差があるかどうかを検定したい場合,分散分析が用いられる。 ここで,「疾患」を要因といい,疾患A,疾患Bと疾患Cをそれぞれ水準という。 即ち,各水準間に有意な差があるかを検定する手法である。

図1:分散分析のデータ
図1:分散分析のデータ


 分散分析には,主に一元配置分散分析(one-way ANOVA) とクラスカル・ワリスの検定(Kruskal-Wallis test)がある。

一元配置分散分析

 分散分析は,3組以上のデータは,各組が正規分布であれば, 各組の「平均値1」に差があるかを検定するパラメトリック手法である。

 正規性の検定には,シャピロ・ウイルク(Shapiro-Wilk)検定法がよく使われる。 各組のデータを検定した結果,各組のp値が0.05以上ならば(正規分布と認め), 分散分析が適用される。要因が1つしかない場合,一元配置分散分析といい, 要因がn個の場合,n元配置分散分析(n-way ANOVA)という。 ここでは,一元配置分散分析のみを説明する。

クラスカル・ワリスの検定

 クラスカル・ワリスの検定は,3組以上のデータにおいて, シャピロ・ウイルク検定で,少なくとも1組が 正規分布でなければ,各組間の「中央値」に差があるかを 検定するノンパラメトリック手法である。

②一元配置分散分析の手順

 一元配置分散分析の手順は図2に示す2

(1)一元配置分散分析の対象データの尺度(順序,間隔と比率)をチェックする。

(2)帰無仮説:要因に差がないと仮定する。

(3)シャピロ検定で各水準のデータの正規性を検定する。すべて正規分布 であれば,一元配置分散分析が適用され,少なくとも1つが正規分布ではない場合, クラスカル・ワリスの検定が適用される。

(4)一元配置分散分析(またはクラスカル・ワリスの検定)を 行った後,分析した結果のp値0.05未満ならば, 帰無仮説を棄却し,要因に有意な差があると判断する。この場合, 例えば,3つの水準(A,B,C)があり,AとBの間か,AとCの間か,BとCの間か, 少なくともある2つの水準に差があるならば,要因に有意な差があると認める。

(5)要因に有意な差があると判断された場合,多重比較法を行い, 各水準間に差があるかどうかを詳しく調べる。上の(4)で要因に差があると言えない 場合(p値0.05以上),多重比較法を行わない。

(6)各水準のデータの特性値を箱ひげ図で表示し,検定した結果が確認できる。

図2:分散分析の手順
図2:分散分析の手順

③分散分析の実装

 R言語で分散分析を実装するとき,下記のことを考慮に入れた。

(1)ライブラリ「dplyr」,「FSA」,「ggplot2」を利用するため, Line 2-4は,3つのライブラリを読み込む。

(2)データは,データフレームで与える。例として,3つのデータ (例1,例2,例3)をLine7-12に用意し,実行時に1つを選んで, その他を#で閉じること。例1(Line 9)と例2(Line 10)は, 一元配置分散分析に適用され,例1は有意な差があると認め, 例2は,有意な差があると言えない。例3(Line 11)は クラスカル・ワリスの検定に適用される。 各水準のデータ数が異なる場合,Line 8のgroup = factor() の中のTimes = c()で指定する。例えば,A群の要素が6,B群の要素が5, C群の要素が4の場合,Times = C(6, 5, 4)と指定する。データ数が多い場合, csvファイルで入力することを勧める。

(3)正規性はシャピロ・ウイルク検定(Line 19-26)を用いる。全ての水準が 正規分布(シャピロ検定結果,p>0.05)であれば,Line 31-38は, 自動に一元配置分散分析を行い,少なくとも1つが正規分布ではなければ, Line 50-55は,クラスカル・ワリス検定を行う。

(4)一元配置分散分析の結果,p値が0.05未満の場合,帰無仮説を棄却し, 「要因に有意な差がある」と認めた場合, Line 42-44の多重比較法(Tukey HSD)を行い, 各水準間に差があるか(p値が0.05未満), また,あるとは言えないか(p値が0.05以上)を検定する。 「要因に有意な差がある」と認められない場合(p値が0.05以上), 多重比較法を実行しない。

(5)クラスカル・ワリス検定の結果,p値が0.05未満の場合,帰無仮説を棄却し, 「要因に有意な差がある」と認めた場合,Line 58-61のDunnのbonferroniという 多重比較法(スティール・ドゥワス検定の代替)を実行する。

(6)Line 68は箱ひげ図を表示する。 # fill = group を color = groupに変えれば,グラフの枠線に色付けられる。

実装したプログラム

#3群以上差の検定(一元配置分散分析とクラスカル・ワリス検定+多重比較法)
library(dplyr) #なければ, install.packages("dplyr")を実行
library(FSA) #なければ, install.packages("FSA")を実行
library(ggplot2) #なければ, install.packages("ggplot2")を実行

#データの入力
data <- data.frame(
  group =factor(rep(c("A", "B", "C"), times = c(5, 5, 5))),
  value = c(8, 9, 6, 7, 10, 12, 14, 13, 15, 11, 5, 7, 6, 8, 9) #one-way ANOVA例1
  #value = c(30.5,22.5,28,18.5,34,31,36.5,13,25.5,16,18,33,45.5,39,26) #one-way ANOVA例2
  #value = c(8, 9, 6, 7, 10, 12, 14, 13, 15, 11, 1, 9, 1, 8, 9) #Krushal-wallis例3
)

# データの確認
cat("\n入力されたデータ:\n")
print(data)

#シャピロ検定
result <- data %>%
  group_by(group) %>%
  summarise(shapiro_p_value = shapiro.test(value)$p.value) %>%
  ungroup()  # グループ化を解除(念のため)

# 結果を出力
cat("\nシャピロ法で正規性を検定した結果:\n")
print(result)

# 各 p値が 0.05 以上なら 1(AND が真)、そうでなければ 0(AND が偽)
and_result <- as.integer(all(result$shapiro_p_value >= 0.05))

if (and_result ==1){
  cat("\n正規分布であるため,一元配置分散分析を行う\n")
  # ANOVAの実行
  anova_result <- aov(value ~ group, data = data)
  # ANOVAの結果を表示
  print(summary(anova_result)) 
  # p値を取得
  p_value <- summary(anova_result)[[1]]$`Pr(>F)`[1]  # 第1行のp値
  # p < 0.05 の場合のみ Tukey HSD 検定を実行
  if (p_value < 0.05) {
    cat("\n一元配置分散分析の結果p =", p_value, "なので,有意な差があると認め,\n")
    cat("多重比較法(Tukey HSD)を行う。\n")
    tukey_result <- TukeyHSD(anova_result)
    print(tukey_result)
  } else {
    cat("\n一元配置分散分析のp =", p_value, "なので,有意な差があると言えないから,多重比較法を実行しない。\n")
  }
  #plot(tukey_result) #95%全体信頼水準のグラフ
}else{
  cat("\n正規分布でない水準があり,クラスカル・ワリス検定を行う。\n ")  
  # クラスカル・ワリス検定の実行
  kruskal_result <- kruskal.test(value ~ group, data = data)
  print(kruskal_result)
  # p値を取得
  p_value <- kruskal_result$p.value
  if (p_value < 0.05) {
    cat("\nクラスカル・ワリス検定の結果p = ", p_value, "なので,有意な差があると認め,\n")
    cat("多重比較法(Dunn検定(スティール・ドゥワス検定の代替)を行う。\n")
    dunn_result <- dunnTest(value ~ group, data = data, method = "bonferroni")
    cat("\n Dunn検定結果(スティール・ドゥワス検定の代替)\n ")  
    print(dunn_result)
  } else {
    cat("\nクラスカル・ワリス検定のp =", p_value, "なので,有意な差があると言えないから,多重比較法を実行しない。\n")
  }
}

# ggplot2を使った箱ひげ図
print(ggplot(data, aes(x = group, y = value, fill = group)) + geom_boxplot() + theme_minimal()) # fill = group を color = groupグラフの枠線に色付け

実行した結果

 例1のデータを分散分布した結果:  

## Warning: パッケージ 'dplyr' はバージョン 4.4.2 の R の下で造られました
## 
## 次のパッケージを付け加えます: 'dplyr'
## 以下のオブジェクトは 'package:stats' からマスクされています:
## 
##     filter, lag
## 以下のオブジェクトは 'package:base' からマスクされています:
## 
##     intersect, setdiff, setequal, union
## Warning: パッケージ 'FSA' はバージョン 4.4.2 の R の下で造られました
## ## FSA v0.9.6. See citation('FSA') if used in publication.
## ## Run fishR() for related website and fishR('IFAR') for related book.
## 
## 入力されたデータ:
##    group value
## 1      A     8
## 2      A     9
## 3      A     6
## 4      A     7
## 5      A    10
## 6      B    12
## 7      B    14
## 8      B    13
## 9      B    15
## 10     B    11
## 11     C     5
## 12     C     7
## 13     C     6
## 14     C     8
## 15     C     9
## 
## シャピロ法で正規性を検定した結果:
## # A tibble: 3 × 2
##   group shapiro_p_value
##   <fct>           <dbl>
## 1 A               0.967
## 2 B               0.967
## 3 C               0.967
## 
## 正規分布であるため,一元配置分散分析を行う
##             Df Sum Sq Mean Sq F value  Pr(>F)    
## group        2  103.3   51.67   20.67 0.00013 ***
## Residuals   12   30.0    2.50                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 一元配置分散分析の結果p = 0.0001297463 なので,有意な差があると認め,
## 多重比較法(Tukey HSD)を行う。
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = value ~ group, data = data)
## 
## $group
##     diff       lwr       upr     p adj
## B-A    5  2.332136  7.667864 0.0008342
## C-A   -1 -3.667864  1.667864 0.5907706
## C-B   -6 -8.667864 -3.332136 0.0001701

分散分析結果の解釈

 例1のデータで実行した結果から,次のように解釈できる。

  • 正規性の判定結果,3つの水準A,BとCのp値が0.967 > 0.05, 3つとも正規分布と認める。よって,一元配置分散分析が適用される。

  • 一元配置分散分析結果,そのp値が0.00013<0.05, 帰無仮説を棄却し,要因に有意な差があると判断。

  • 多重比較法の結果,BとA間にp=0.00083<0.05, CとB間にp=0.00017<0.05 となり,有意な差があると認められ,CとA間はp=0.59>0.05,差があると言えない。

  • 各水準A,BとCのデータを箱ひげ図で示し,確かにAとB,BとCに差があり, AとCに差があるとは言えない状態を箱ひげ図で確認できる。


  1. 正規分布であるため,平均値と中央値は等しいから,「中央値」に差があるかを 検定すると言っても間違っていない。↩︎

  2. 石川朗,対馬栄輝,「リハビリテーション統計学」第2版 ,中山書店。↩︎