本日の目標

  1. 多重比較の必要性と Tukey HSD 法の考え方を理解する
  2. Rで多重比較を実行し,どの群間に差があるかを特定できる
  3. 分散分析から多重比較までの結果を統合してレポートにまとめられる

1. 多重比較とは

分散分析の後に必要なこと

分散分析(ANOVA)で「少なくとも1組の群に有意差がある」とわかっても, 「どの群とどの群が異なるのか」はわかりません。

多重比較(post-hoc test) でペアごとの差を検定します。

なぜ専用の方法が必要か?

単純な t検定の繰り返しでは第一種の過誤率が膨らむ(第13回で解説)ため, 検定全体の誤り率を制御する方法を使います。


2. 代表的な多重比較法

方法 特徴 Rの関数
Tukey HSD 全ペア比較,バランスのとれた設計に適す TukeyHSD()
Bonferroni 保守的,検定回数で α を割る pairwise.t.test(..., p.adjust="bonferroni")
Holm Bonferroni より検出力が高い pairwise.t.test(..., p.adjust="holm")
Scheffé 任意の対比を検定,最も保守的 専用パッケージ

本授業では Tukey HSD 法 を中心に扱います。


3. Tukey HSD 法の実行

例:iris データ(3種のがく片の長さ)

# 分散分析の実行(第13回の復習)
result_anova <- aov(Sepal.Length ~ Species, data = iris)
summary(result_anova)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## Species       2  63.21  31.606   119.3 <2e-16 ***
## Residuals   147  38.96   0.265                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Tukey HSD 多重比較
result_tukey <- TukeyHSD(result_anova)
result_tukey
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Sepal.Length ~ Species, data = iris)
## 
## $Species
##                       diff       lwr       upr p adj
## versicolor-setosa    0.930 0.6862273 1.1737727     0
## virginica-setosa     1.582 1.3382273 1.8257727     0
## virginica-versicolor 0.652 0.4082273 0.8957727     0

結果の読み方

  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Sepal.Length ~ Species, data = iris)

$Species
                      diff        lwr        upr     p adj
versicolor-setosa    0.930  0.6862...  1.1737...  0.0000000
virginica-setosa     1.582  1.3382...  1.8257...  0.0000000
virginica-versicolor 0.652  0.4082...  0.8957...  0.0000000
意味
diff 平均差
lwr / upr 95%信頼区間の下限・上限
p adj 調整済みp値(< .05 で有意)

4. Tukey HSD 結果の可視化

# confint() でデータフレームに変換して描く
tukey_df <- as.data.frame(result_tukey$Species)
tukey_df$comparison <- rownames(tukey_df)

ggplot(tukey_df, aes(x = comparison, y = diff)) +
  geom_point(size = 3, color = "steelblue") +
  geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.1, color = "steelblue") +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(title = "Tukey HSD:群間の平均差と95%CI",
       x = "比較ペア", y = "平均差(cm)") +
  coord_flip() +
  theme_bw()

信頼区間が 0 をまたがっていなければ有意差あり。


5. 全体の結果をグラフで示す

有意差ブラケット付きの箱ひげ図

# ggplot2で箱ひげ図を作成
p_box <- ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
  geom_boxplot(outlier.shape = NA, alpha = 0.7) +
  geom_jitter(width = 0.1, alpha = 0.3, size = 1.5) +
  scale_fill_brewer(palette = "Pastel1") +
  labs(title = "種ごとのがく片の長さ(Tukey HSD: すべての群間に p < .001)",
       x = "種", y = "がく片の長さ (cm)") +
  theme_bw() +
  theme(legend.position = "none")
p_box


6. 完全な分析フローのまとめ

Step 1:記述統計

iris |>
  group_by(Species) |>
  summarise(n = n(), M = mean(Sepal.Length), SD = sd(Sepal.Length)) |>
  mutate(across(where(is.numeric), ~ round(., 2)))

Step 2:前提条件の確認

bartlett.test(Sepal.Length ~ Species, data = iris)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  Sepal.Length by Species
## Bartlett's K-squared = 16.006, df = 2, p-value = 0.0003345

Step 3:分散分析

result_anova <- aov(Sepal.Length ~ Species, data = iris)
summary(result_anova)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## Species       2  63.21  31.606   119.3 <2e-16 ***
## Residuals   147  38.96   0.265                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Step 4:多重比較

TukeyHSD(result_anova)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Sepal.Length ~ Species, data = iris)
## 
## $Species
##                       diff       lwr       upr p adj
## versicolor-setosa    0.930 0.6862273 1.1737727     0
## virginica-setosa     1.582 1.3382273 1.8257727     0
## virginica-versicolor 0.652 0.4082273 0.8957727     0

Step 5:効果量

ss_b <- 63.21
ss_t <- 63.21 + 38.96
round(ss_b / ss_t, 3)
## [1] 0.619

7. 結果の報告(論文・レポート形式)

方法:3種のアヤメ(setosa, versicolor, virginica)のがく片の長さを 一元配置分散分析によって比較した。多重比較には Tukey HSD 法を用いた。

結果:種の主効果が有意であった,F(2, 147) = 119.3, p < .001, η² = .62。 Tukey HSD 法による多重比較の結果, setosa と versicolor(p < .001),setosa と virginica(p < .001), versicolor と virginica(p < .001)の間でそれぞれ有意差が認められた。


演習

演習1:多重比較の実行

iris データで Petal.Length の一元配置分散分析を実行し, Tukey HSD で多重比較を行ってください。

どの群間に有意差がありましたか?

result <- aov(___ ~ ___, data = iris)
TukeyHSD(result)

演習2:視覚化

演習1の Tukey HSD の結果を,tukey_df を使って信頼区間のプロットで表示してください。

演習3:総合レポート(最終課題の練習)

以下の問いに対して,Step 1〜5 の分析フローを実行し, 結果を論文の「方法・結果」の節として1段落にまとめてください。

問いmtcars データで,シリンダー数(cyl:4・6・8)によって 馬力(hp)に違いがあるかを検討してください。

  1. 記述統計(平均・SD・n)
  2. 箱ひげ図
  3. 一元配置分散分析(aov()
  4. Tukey HSD
  5. 効果量 η²
  6. 結果の記述

本日のまとめ

  • 分散分析で有意差が出た後,Tukey HSD でどの群間かを特定する
  • TukeyHSD() で調整済みp値と信頼区間を確認
  • 分析フローは「記述統計 → 前提確認 → ANOVA → 多重比較 → 効果量 → 報告」
  • 結果の記述には F値・df・p値・η²・多重比較の結果を含める

宿題・予習

  • 演習3(総合問題)を完成させ,スクリプトを保存する
  • 次回(第15回)は最終まとめと習熟度確認テスト(第3回)です
  • 第1〜14回の内容全体を見直しておいてください