分散分析とは

 3組以上の標本間に差があるかどうかの検定法である。この検定法では順序間隔比率尺度のデータが適用できる。分散分析(ANOVA:analysis of variance)には,一元配置分散分析(one-way ANOVA)とクラスカル・ワリスの検定(Kruskal-Wallis test)がある。

分散分析の用語

要因と水準:検定の主目的になる変数を要因(因子ともいう)と呼び,要因の内訳(カテゴリー)を水準という。例えば,疾患が要因で,疾患の中で,疾患A,疾患Bと疾患Cというのは水準となる。

対応のある要因と対応のない要因:検定に共通の概念で,1標本2組のデータは対応のあるデータで,2標本2組のデータは対応のないデータである。対応とは,同じ対象者から測定されたデータであるのか否かという違いを表すもので,同じ対象者は「対応のある」で,異なる対象者は「対応のない」である。  一元配置分散分析は,個々の水準が異なる標本から構成されている対応のない要因の差の検定法である。例えば,水準の疾患AとBとCはそれぞれ異なる標本で,「疾患」は対応のない要因となる。対応のある要因では,同一の標本で複数の条件で反復測定されるから,「反復測定の分散分析」という。

主効果:分散分析を行って,有意な差があったとき,「要因による有意な主効果が見られた」とか,「要因の主効果が有意であった」と表現する。

パラメトリック法とノンパラメトリック法: 対応のない要因(データ)に対して2水準(群)の差の検定する場合には, パラメトリック法(2群のデータはそれぞれ正規分布)として,2群t検定とウェルチの検定が適用となり,ノンパラメトリック法(少なくとも1群のデータは非正規分布)として,ウィルコクソンとマン・ホイットニーの検定法が適用となる。  一元配置分散分析は,パラメトリック法に分類される検定法で,ノンパラメトリック法として用いられる手法には,クラスカル・ワリスの検定がある。

多重比較法:分散分析の結果,要因全体に有意な差があった場合,具体的にどの水準とどの水準の間に有意な差があるかは,分からない。例えば,要因(内訳:水準A,BとC)に有意な差があると言っても,AとBに?AとCに?BとCに?,または全体に?差があるのか,不明である。よって,分散分布を行った後に,多重比較法を用いて,水準間の差を検定する。「ポストホック検定(事後検定)」という。

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

今回,一元配置分散分析手順1について,説明する。

(1)一元配置分散分析の対象データの尺度は,順序,間隔と比率である。

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

(3)各々水準の正規性検定:シャピロ検定で,p値が全て0.05以上なら,一元配置分散分析が適用(下記の(4)へ)。少なくとも1つp<0.05場合,クラスカル・ワリスの検定が適用される(下記の(5)へ)。

(4)一元配置分散分析を行い,p<0.05ならば,仮説を棄却し,「要因に有意な差がある」と判断し,そして多重比較法を行い,p値<00.5の場合,水準間に有意な差があり,p≧0.05の場合,水準間には差があると言えない。また,一元配置分散分析の結果p≧0.05ならば,要因に有意な差があると言えない。

(5)クラスカル・ワリスの検定結果,p<0.05ならば,「要因に有意な差がある」と判断し,引き続き多重比較法を行い,p値<00.5の場合,水準間に有意な差があり,p≧0.05の場合,水準間には差があると言えない。

以上の説明を下図でまとめる。

一元配置分散分析と多重比較法の解析手順

R言語による分散分析プログラム

下記の分散分析のRプログラムを実行するには,「dplyr」,「FSA」と「ggplot2」というライブラリが必要で,自動にインストールしておく。

# 3群以上の差の検定(一元配置分析)
library(dplyr)  #install.packages("dplyr")を実行
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(FSA)  #install.packages("FSA")を実行
## Warning: package 'FSA' was built under R version 4.5.2
## ## FSA v0.10.0. See citation('FSA') if used in publication.
## ## Run fishR() for related website and fishR('IFAR') for related book.
library(ggplot2)  #install.packages("ggplot2)を実行
## Warning: package 'ggplot2' was built under R version 4.5.2

 データをフレームの構造で入力し,groupに各水準(この例ではA, B, C,各水準の要素を5とする)を設定し, 各水準のデータをベクトルで入力する。データを自動的に分析し,検定手法が決まる。

data <- data.frame(
  group = factor(rep(c("A", "B", "C"), each = 5)),
  value = c(8, 9, 6, 7, 10, 12, 14, 13, 15, 11, 5, 7, 6, 8, 9) #例1のデータ
  #value = c(30.5 ,22.5 ,28, 18.5 ,34, 31, 36.5, 13, 25.5, 16, 18, 33, 45.5, 39, 26) #例2のデータ
  #value = c(8, 9, 6, 7, 10, 12, 14, 13, 15, 11, 1, 9, 1, 8, 9) #例3のデータ
)
#データの確認
cat("\n 入力されたデータ:\n")
## 
##  入力されたデータ:
print(data)
##    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
# シャピロ正規性検定
result <- data%>%
  group_by (group)%>%
  summarise(shapiro_p_value = shapiro.test(value)$p.value)%>%
    ungroup()

cat("\nシャピロで正規性を検定した結果:\n")
## 
## シャピロで正規性を検定した結果:
print(result)
## # A tibble: 3 × 2
##   group shapiro_p_value
##   <fct>           <dbl>
## 1 A               0.967
## 2 B               0.967
## 3 C               0.967
#各正規性検定のp値が0.05以上ならば1,そうでなければ0
and_result <- as.integer(all(result$shapiro_p_value >= 0.05))

if(and_result == 1){
  cat("\n正規分布であるため,一元配置分散分析を行う\n")
  anova_result <- aov(value ~ group, data = data) #ANOVAの実行
  print(summary(anova_result))
  p_value <- summary(anova_result)[[1]]$`Pr(>F)`[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("一元配置分散分析の結果 p=", p_value, "なので,有意な差があると言えないから,多重比較法を実行しない。\n")
  }
  #plot(tukey_result) #95%全体信頼水準のグラフ
} else {
  cat("\n少なくとも一つの正規分布でない水準があり,クラスカル・ワリス検定を行う。\n")
  kruskal_result <- kruskal.test(value ~ group, data = data)
  print(kruskal_result)
  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("\nDunn検定結果(スティール・ドゥワス検定の代替) \n")
   print(dunn_result)
  } else{
   cat("クラスカル・ワリス検定の p=", p_value, "なので,有意な差があると言えないから,多重比較法を実行しない。\n")
     }
}
## 
## 正規分布であるため,一元配置分散分析を行う
##             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
# ggplot2を使って,箱ひげ図を表示
print(ggplot(data, aes(x = group, y = value)) + geom_boxplot() + theme_minimal())

例1のデータを分散分析した結果:①3つの水準のp値が全て0.05以上で,それぞれ正規分布と認める。よって,一元配置分散分析が適用される。②一元配置分散分析結果のp値が0.00013<0.05,帰無仮説を棄却し,要因に差があると判断。③多重比較法の結果から,BとA間にp=0.00083<0.05, CとB間にp=0.00017となったため,差があると認め,CとA間はp=0.59>0.05,差があると言えない。④3つの水準の箱ひげ図からみると,確かにCとAに差があるかどうか,言えない。


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