Topic 3
一元配置分散分析 ANOVA:3群以上の比較
One-way ANOVA with bar plot, raw points, and post-hoc comparisons
3群以上の独立したグループの平均を比較し、F 値・事後比較・効果量まで読み解く基本テーマ。『平均との差を見る』だけでなく、『群間の差が群内のばらつきより十分大きいか』という ANOVA の考え方を、初心者にも分かる形で整理します。
このページでは、対照群・ワークショップ群・コーチング群の3群を例に、一元配置分散分析の考え方、前提条件の確認、R による実装、図の読み方、レポートでの書き方までを一気通貫で扱います。学術レポートを意識しつつも、ANOVA を初めて学ぶ人が「何を検定していて、どこを読めばよいか」が迷子にならない構成にしています。
このページのゴール
- 一元配置 ANOVA が『3群以上の平均をまとめて比較するオムニバス検定』であることを理解する
- F 値・自由度・p 値・η 2 の読み方を理解する
- Tukey HSD による事後比較で、どの群間が異なるかを報告できるようになる
- 平均値+95%信頼区間+raw points の図と、学術レポート向け文例をそのまま応用できるようになる
Start here
まず押さえる3つのポイント
初心者向けの見取り図
- ANOVA の最初の問いは『どの群が違うか』ではなく、『少なくとも1つの群平均が違いそうか』です。
- 判断の核は 群間のばらつき / 群内のばらつき で、この比が F 値です。
- ANOVA が有意でも、それだけでは具体的な差の場所は分かりません。平均値と Tukey HSD を合わせて読みます。
一番大事な考え方
初学者向けの最重要ポイントは『ANOVA は群平均どうしの距離そのものではなく、群間差が群内の散らばりに対してどれだけ大きいかを見る』という点です。この発想が分かると、F 値・ANOVA 表・事後比較の関係が整理しやすくなります。
Basics
分析の概要と前提条件
どんなときに使うか
一元配置分散分析(one-way ANOVA)は、1つの連続変数を3群以上の独立群で比較したいときの基本手法です。今回の例では、学習支援の方法が 対照群 / ワークショップ群 / コーチング群 の3水準あり、それぞれのテスト得点の平均に差があるかを検討します。
必要なデータ形式:1行が1観測の long / tidy 形式。目的変数は連続変数、説明変数は3水準以上のカテゴリ変数です。
向いている場面
- 3つ以上の独立した処置群の平均を比べたいとき
- 授業法 A・B・C の成績差を比較したいとき
- 製品タイプごとの平均評価点を比べたいとき
別の方法を考える場面
- 2群だけなら対応のない t 検定の方が直感的です
- 同じ対象を繰り返し測っているなら、反復測定 ANOVA や混合モデルを検討します
- 等分散性が怪しいなら Welch ANOVA、強い非正規性や外れ値があるなら Kruskal-Wallis 検定も候補になります
F 値の考え方を数式で確認する
MSbetween は群平均の違いによる変動、MSwithin は群内の散らばりによる変動です。群間差が群内の散らばりより十分大きいとき、F 値が大きくなります。
- 各観測値どうしが独立していること(これは設計段階の前提)
- 各群の残差が大きく歪みすぎていないこと
- 群ごとの分散が極端に異ならないこと
- 目的変数が少なくとも間隔尺度として扱えること
Assumption check
前提条件はどう確認するか
一元配置 ANOVA では、全体のヒストグラムを見るだけではなく、群ごとの分布とモデル残差を確認するのが基本です。
1. 独立性は設計で担保する
ANOVA で最も重要なのは、各観測が独立していることです。これは分析後の検定ではなく、データ収集の段階で確認する前提です。
2. 群ごとの分布と残差をみる
箱ひげ図や raw points を見て、外れ値や極端な歪みがないか確認します。QQ プロットや shapiro.test(residuals(fit)) は補助的に使います。
3. 等分散性は図+検定で確認する
各群の SD が大きく違わないかを図で見たうえで、bartlett.test() や fligner.test() を参考にします。非正規性が気になるときは Fligner-Killeen の方が頑健です。
4. 有意差の前に『分布が見えているか』を確認する
平均値だけでは、分布の重なりや外れ値の影響は分かりません。初心者でも、bar + error bar に raw points を重ねるだけで、かなり読みやすくなります。
Data structure
データの形をつかむ
一元配置 ANOVA では、1行1観測の tidy 形式が基本です。
分析に使う元データ
1行が1人のテストスコアで、どの群に属するかを group 列に持たせます。
| id | group | score |
|---|---|---|
| 1 | Control | 59.1 |
| 2 | Control | 61.2 |
| 3 | Control | 69.5 |
| 4 | Control | 65.0 |
| 5 | Control | 54.6 |
| 6 | Control | 62.0 |
| 7 | Control | 59.2 |
| 8 | Control | 62.7 |
| 9 | Control | 54.8 |
このサンプルで比べる3群
今回は、学習支援の強さが段階的に異なる3群を想定しています。
- 対照群:通常の学習のみ
- ワークショップ群:短時間の補助セッションあり
- コーチング群:個別支援を含む強い介入あり
群のラベルは例示であり、授業法・治療法・製品タイプなどに置き換えてそのまま応用できます。
サンプルデータの要約統計
| 群 | n | 平均 | SD | 中央値 | 95%CI |
|---|---|---|---|---|---|
| 対照群 | 12 | 61.95 | 4.69 | 62.35 | [58.97, 64.93] |
| ワークショップ群 | 12 | 67.40 | 5.47 | 66.95 | [63.92, 70.88] |
| コーチング群 | 12 | 74.23 | 5.44 | 75.40 | [70.77, 77.68] |
R code
Rコードを順番に実行する
library(tidyverse)
dat <- read.csv("sample-data/sample_anova_scores.csv")
dat$group <- factor(dat$group, levels = c("Control", "Workshop", "Coaching"))
dat %>%
group_by(group) %>%
summarise(
n = n(),
mean = mean(score),
sd = sd(score),
se = sd / sqrt(n),
ci95 = qt(0.975, df = n - 1) * se
)
library(ggplot2)
# まず図で確認する
ggplot(dat, aes(x = group, y = score)) +
geom_boxplot(width = 0.55, alpha = 0.35, outlier.shape = NA) +
geom_jitter(width = 0.08, alpha = 0.7, size = 2) +
labs(x = NULL, y = "Test score") +
theme_minimal(base_size = 13)
fit <- aov(score ~ group, data = dat)
# 残差の正規性を補助的に確認
shapiro.test(residuals(fit))
qqnorm(residuals(fit)); qqline(residuals(fit))
# 等分散性の確認
bartlett.test(score ~ group, data = dat)
fligner.test(score ~ group, data = dat)
fit <- aov(score ~ group, data = dat)
summary(fit)
# 効果量 η^2 を手計算
anova_tab <- summary(fit)[[1]]
ss_between <- anova_tab["group", "Sum Sq"]
ss_within <- anova_tab["Residuals", "Sum Sq"]
ss_total <- ss_between + ss_within
eta_sq <- ss_between / ss_total
eta_sq
# 事後比較
TukeyHSD(fit)
dat_sum <- dat %>%
group_by(group) %>%
summarise(
n = n(),
mean = mean(score),
sd = sd(score),
se = sd / sqrt(n),
ci95 = qt(0.975, df = n - 1) * se,
.groups = "drop"
)
ggplot(dat_sum, aes(x = group, y = mean, fill = group)) +
geom_col(width = 0.62, alpha = 0.75) +
geom_errorbar(
aes(ymin = mean - ci95, ymax = mean + ci95),
width = 0.12,
linewidth = 0.7
) +
geom_jitter(
data = dat,
aes(x = group, y = score),
inherit.aes = FALSE,
width = 0.08,
alpha = 0.6,
size = 2
) +
labs(
x = NULL,
y = "Test score",
title = "Group means with 95% CI and raw observations"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "none")
# summary(fit)
# Df Sum Sq Mean Sq F value Pr(>F)
# group 2 907.8 453.9 16.70 9.76e-06 ***
# Residuals 33 896.9 27.18
# eta_sq
# [1] 0.503
# TukeyHSD(fit)
# Workshop - Control diff = 5.45, p adj = 0.0393
# Coaching - Control diff = 12.28, p adj < .001
# Coaching - Workshop diff = 6.83, p adj = 0.0082
Interpretation
出力の読み方
ANOVA の出力は、最初は F 値・自由度・p 値・効果量・事後比較 の5点に分けて読むと整理しやすくなります。
ANOVA 表の読み取り
| 変動要因 | SS | df | MS | F | p |
|---|---|---|---|---|---|
| 群間(Between groups) | 907.83 | 2 | 453.92 | 16.70 | < .001 |
| 群内 / 残差(Within groups) | 896.89 | 33 | 27.18 | — | — |
| 合計(Total) | 1804.73 | 35 | — | — | — |
Tukey HSD の結果
| 比較 | 平均差 | 95%CI | 調整済み p | 判定 |
|---|---|---|---|---|
| ワークショップ群 − 対照群 | 5.45 | [0.23, 10.67] | 0.0393 | 有意 |
| コーチング群 − 対照群 | 12.28 | [7.05, 17.50] | < .001 | 有意 |
| コーチング群 − ワークショップ群 | 6.83 | [1.60, 12.05] | 0.0082 | 有意 |
F(2, 33) = 16.70
群間平均のばらつきを群内のばらつきで割った指標です。値が大きいほど、「群の違い」が「群内の散らばり」より大きいことを示します。
読み方のヒント:F は方向を持たない指標なので、どの群が高いかは平均値と事後比較で確認します。
p < .001
『3群の母平均はすべて等しい』という帰無仮説のもとでは、今回のような F 値はかなり出にくいことを示します。
読み方のヒント:有意になっても「どの群間が違うか」はまだ確定しません。ここで止めず、事後比較に進みます。
η2 = 0.50
総変動のうち約 50% が群の違いで説明される、という見方ができます。1要因の ANOVA では効果量として η2 を示すと、差の大きさが伝わりやすくなります。
補足:このサンプルでは ω2 も 0.47 程度で、効果の大きさは比較的大きい水準です。
Tukey HSD の結果
コーチング群は対照群・ワークショップ群より有意に高く、ワークショップ群も対照群より有意に高いという結果でした。
読み方のヒント:Tukey HSD は多重比較を考慮したうえで、各ペアの平均差・信頼区間・調整済み p 値を返します。
前提条件チェック
このサンプルでは、残差の Shapiro-Wilk 検定は p = 0.648、Fligner-Killeen 検定は p = 0.743 で、少なくとも大きな問題は見えにくい例です。
読み方のヒント:ただし p 値だけでなく、QQ プロットや箱ひげ図などの図も必ず一緒に確認します。
平均値の並び
対照群 61.95 点、ワークショップ群 67.40 点、コーチング群 74.23 点で、平均値は段階的に上昇していました。
読み方のヒント:方向や実務的な意味合いは、F 値よりむしろ平均値・差分・図からつかみます。
Figure
図の読み方
図1 各群の平均値(95%信頼区間)と個々の観測値、および群内分布の可視化。左は平均値+95%CI+raw points、右は群ごとの箱ひげ図。
どこを見るとよいか
- 左図では、平均値が 対照群 < ワークショップ群 < コーチング群 の順に上がっていることが一目で分かります。
- 誤差線は平均の不確実性を示すもので、個々の点の散らばりそのものではありません。raw points を重ねると、群内ばらつきも同時に把握できます。
- 右図では、コーチング群の中央値と分布全体が上側に位置しており、群差の方向がより自然に読み取れます。
- 学術的には bar plot だけだと分布が隠れやすいので、可能なら raw points や箱ひげ図も併記すると説明力が上がります。
Writing
レポート用の結果記述例
Japanese / simple
初学者向けの書き方
3群のテストスコアを比較したところ、群の主効果は有意であった(one-way ANOVA, F(2, 33)=16.70, p < .001, η2 = 0.50)。平均値は対照群 61.95 ± 4.69点、ワークショップ群 67.40 ± 5.47点、コーチング群 74.23 ± 5.44点であり、Tukey HSD による事後比較では、コーチング群は対照群・ワークショップ群より有意に高く、ワークショップ群も対照群より有意に高かった。図1に各群の平均値と分布を示した。
Japanese / academic
やや学術寄りの書き方
独立3群を対象とした一元配置分散分析の結果、テストスコアに有意な群差が認められた(F(2, 33) = 16.70, p < .001, η2 = .50)。各群の平均値(SD)は、対照群で 61.95 (4.69)、ワークショップ群で 67.40 (5.47)、コーチング群で 74.23 (5.44) であった。Tukey HSD による多重比較の結果、コーチング群は対照群およびワークショップ群より有意に高く、ワークショップ群も対照群より有意に高かった。これらの傾向は、平均値と 95%信頼区間、および群内分布を示した図1からも確認できる。
English
Report writing example
A one-way ANOVA comparing test scores across the three groups revealed a significant main effect of group, F(2, 33) = 16.70, p < .001, η2 = .50. The mean (SD) scores were 61.95 (4.69) for the control group, 67.40 (5.47) for the workshop group, and 74.23 (5.44) for the coaching group. Tukey's HSD post-hoc test indicated that the coaching group scored significantly higher than both the control and workshop groups, and the workshop group also scored significantly higher than the control group. These patterns are also visible in Figure 1.
Caption
図キャプション例(日本語)
図1 各群の平均値(95%信頼区間)と個々の観測値、および群内分布の可視化。左は平均値+95%CI+raw points、右は群ごとの箱ひげ図。
Checklist
最低限書いておきたい項目
- 各群の平均値・SD・n を書く
- F 値、自由度、p 値を書く
- 効果量(η2 など)を書く
- 事後比較の方法名(Tukey HSD など)と主な結果を書く
- 図では平均値だけでなく分布の様子にも一言添える
Common pitfalls
初心者がつまずきやすい点
有意な ANOVA = 全群が違う、と解釈してしまう
ANOVA の有意差は『少なくとも1つの群平均が異なる』ことしか示しません。どの群間が違うかは Tukey HSD などの事後比較で確認します。
最初から t 検定を何本も走らせる
3群以上で無調整の t 検定を繰り返すと、多重比較によって偶然の有意差が増えます。まず omnibus test として ANOVA を行い、その後で補正つきの比較に進みます。
生の得点だけを見て正規性を判断する
ANOVA では、各群から引いた残差や群内分布を確認する方が意味のあるチェックになります。群平均が異なるだけで、全体の分布は複峰的に見えることがあります。
棒グラフだけで満足してしまう
棒グラフは平均値をつかみやすい一方で、分布の広がりや外れ値を見落としやすいです。可能なら raw points や箱ひげ図も併記すると安心です。
独立性の問題を後から補おうとする
同じクラス単位、同じ施設単位などでデータが入れ子になっている場合、通常の一元配置 ANOVA では前提が崩れることがあります。設計段階で確認が必要です。
等分散性が怪しいのに通常の ANOVA を続ける
群ごとの分散差が大きいときは、Welch ANOVA の方が素直です。特に群サイズも不均衡なときは注意します。
FAQ
よくある質問
Q. 2群だけなら ANOVA を使ってもよいですか?
A. 使えますが、初学者には対応のない t 検定の方が直感的です。2群で分散を等しいと仮定するなら、ANOVA と independent t-test は同じ結論になります。
Q. 有意な ANOVA の後は必ず事後比較が必要ですか?
A. どの群間が違うかを具体的に述べたいなら必要です。特定の比較だけを最初から理論的に決めている場合は、planned contrasts という考え方もあります。
Q. 群サイズが同じでないと ANOVA は使えませんか?
A. 使えます。ただし R の aov() は balanced design で特に扱いやすいという位置づけです。欠測や不均衡があるときは、設計と解釈に少し注意が必要です。
Q. 分散が等しくないときはどうしますか?
A. ベース R なら oneway.test(score ~ group, data = dat) で Welch ANOVA を実行できます。通常の一元配置 ANOVA の代替として覚えておくと便利です。
Q. 正規性がかなり怪しいときはどうしますか?
A. 強い外れ値や著しい歪みがあるなら、Kruskal-Wallis 検定が候補です。ただし検定が変わると、解釈は『平均差』より『位置の差』に近いものになります。
代替手法
代替手法・次の一歩
研究課題やデータ構造が少し変わると、選ぶべき手法も変わります。このテーマを土台にしつつ、どの条件で別の方法へ進むかを押さえておくと、分析計画が立てやすくなります。
Welch ANOVA
群ごとの分散がかなり異なるときの第一候補です。R では oneway.test(score ~ group, data = dat) を使います。等分散性を強く仮定しない点が利点です。
Kruskal-Wallis 検定
外れ値や強い非正規性があり、平均ベースの ANOVA が不安なときのノンパラメトリックな代替法です。R では kruskal.test(score ~ group, data = dat) を使います。
反復測定 ANOVA / 混合モデル
同じ参加者を複数回測定している場合は、一元配置 ANOVA ではなく対応のあるモデルを使います。独立群 ANOVA と混同しないことが重要です。
参考資料
参考資料
このページの説明は、R 本体の公式ドキュメント、NIST の統計ハンドブック、Penn State の教材、ggplot2 の公式リファレンスを軸に整理しています。
- R Core Team: aov() documentation
- R Core Team: oneway.test() documentation (Welch ANOVA)
- R Core Team: TukeyHSD() documentation
- R Core Team: fligner.test() documentation
- R Core Team: bartlett.test() documentation
- NIST/SEMATECH e-Handbook: One-way ANOVA overview
- Penn State STAT 500: Introduction to ANOVA
- ggplot2: geom_errorbar() reference
- ggplot2: geom_boxplot() reference
運営と利用上の注意
このページの位置づけ
本サイトのトピックページは、Rによるデータ分析の学習支援とレポート作成の補助を目的としたオリジナル解説です。サンプルデータとコードは再現練習用に作成しているため、実データを扱う際には研究計画・前提条件・欠測・外れ値・尺度水準をあらためて確認してください。
編集方針
ページ本文は、標準的な統計手法、Rの公式ドキュメント、一次資料に近い参考文献を優先して整理しています。更新や訂正の方針は編集方針ページで公開しています。