第152回: 「統計の実務」13 仮説検定《その3:ANOVA》
◀前の記事へ 次の記事へ▶
≡ はじめに
前回は、「仮説検定《その2:独立サンプルt検定》」について書きました。
内容としては、「対応のあるt検定」と「独立サンプルt検定」の違いについてでした。
母集団の平均値(サンプリングした値からサンプリング元の全データの平均値推定したもので、母平均とも言います)の検定は、前回と前々回に説明した2種類のt検定を“同じ人の体重の変化のような対応のあるデータ”なのか、“独立した2つのグループの平均値の差の有意差を知りたい”のかによって、使いわければ良いです。
ところがこのときに、「(t検定は2つのグループの比較しかできないので)3群以上の比較をしたいときのためにANOVAを知らないといけない」という人がいます。
そこで今回は「ANOVA」(分散分析とも呼ぶ)の話を書きます。
≡ 例題
今回はこんな例題です。
mean sd IQR 0% 25% 50% 75% 100% 最高血圧.mmHg.:n
夏 121.7634 11.361919 16.00 92 114.00 123.0 130.00 156 262
秋 124.1154 10.301377 11.50 95 118.25 123.5 129.75 151 130
春 127.5294 7.417638 9.25 111 123.00 127.0 132.25 153 136
冬 128.9153 8.375118 10.00 105 123.00 129.0 133.00 155 248
使用したデータ(朝晩の血圧の測定値1年分)はこちらです。
月ごとにざっくりと季節わけした列を追加したほかは、加工なしです。本当は季節ではなく気温を5度刻みとしたカテゴリ変数を作って気温の差による平均値の変化を調べる方が良いのかもしれません。
≡ 一元配置分散分析
季節で血圧に違いがあるかについては血圧値の「差の検定」を行えばよいのですが、前回と前々回にやった、t検定は、「ダイエット前とダイエット後」、「営業部と開発部」といったように、2つのデータ群の比較しかできません。
このようなときには、「一元配置分散分析」を使います。
(豆知識: 「一元配置分散分析」で、2つの群の検定を行うと、それは「独立サンプルt検定」と同じ結果となります。こちらの証明は意外と面倒なのでパスします)
「一元配置分散分析」の分析手順は前回と同様で超簡単です。上の「BloodPressure-202012-202111.csv」ファイルをRコマンダーに読み込んで、
[統計量]>[平均]>[1元配置分散分析]
を選択し、グループと目的変数を選ぶだけです。
オプションシートが出てきたら上図のようにグループと目的変数を選択、[✔︎OK]ボタンを押します。ここで、「2組ずつの平均の比較(多重比較)」にチェックを入れておくと良いでしょう。
グループの「季節」変数には血圧のデータを群に分ける水準(「春」、「夏」、「秋」、「冬」)が入っています。
[OK]すると、以下の出力が得られます。
> AnovaModel.20 <- aov(最高血圧.mmHg. ~ 季節, data=Dataset)
> summary(AnovaModel.20)
Df Sum Sq Mean Sq F value Pr(>F)
季節 3 7359 2452.9 26.25 3.56e-16 ***
Residuals 772 72136 93.4
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
> with(Dataset, numSummary(最高血圧.mmHg., groups=季節, statistics=c("mean", "sd")))
mean sd data:n
夏 121.7634 11.361919 262
秋 124.1154 10.301377 130
春 127.5294 7.417638 136
冬 128.9153 8.375118 248
> local({
+ .Pairs <- glht(AnovaModel.20, linfct = mcp(季節 = "Tukey"))
+ print(summary(.Pairs)) # pairwise tests
+ print(confint(.Pairs, level=0.95)) # confidence intervals
+ print(cld(.Pairs, level=0.05)) # compact letter display
+ old.oma <- par(oma=c(0, 5, 0, 0))
+ plot(confint(.Pairs))
+ par(old.oma)
+ })
Simultaneous Tests for General Linear Hypotheses
Multiple Comparisons of Means: Tukey Contrasts
Fit: aov(formula = 最高血圧.mmHg. ~ 季節, data = Dataset)
Linear Hypotheses:
Estimate Std. Error t value Pr(>|t|)
秋 - 夏 == 0 2.3520 1.0370 2.268 0.105
春 - 夏 == 0 5.7661 1.0216 5.644 <0.001 ***
冬 - 夏 == 0 7.1520 0.8564 8.351 <0.001 ***
春 - 秋 == 0 3.4140 1.1857 2.879 0.021 *
冬 - 秋 == 0 4.7999 1.0467 4.586 <0.001 ***
冬 - 春 == 0 1.3859 1.0314 1.344 0.532
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- single-step method)
Simultaneous Confidence Intervals
Multiple Comparisons of Means: Tukey Contrasts
Fit: aov(formula = 最高血圧.mmHg. ~ 季節, data = Dataset)
Quantile = 2.5693
95% family-wise confidence level
Linear Hypotheses:
Estimate lwr upr
秋 - 夏 == 0 2.3520 -0.3124 5.0164
春 - 夏 == 0 5.7661 3.1412 8.3909
冬 - 夏 == 0 7.1520 4.9516 9.3523
春 - 秋 == 0 3.4140 0.3677 6.4604
冬 - 秋 == 0 4.7999 2.1107 7.4892
冬 - 春 == 0 1.3859 -1.2641 4.0359
夏 秋 春 冬
"a" "a" "b" "b"
たくさんでていますが、前回と同様に、とりあえず、「Pr(>F)」のところを見て、この値が「0.05未満」であれば、「一元配置分散分析による検定の結果、平均には有意差がある」と判定します。
今回は、
Df Sum Sq Mean Sq F value Pr(>F)
季節 3 7359 2452.9 26.25 3.56e-16 ***
ですので、「Pr(>F)」の「3.56e-16 ***」から、p値が0.05未満であることがわかります。
今回のp値(なかで、F検定を使って求めています)は0.05未満(5%未満)でした。(季節の平均に差がない(という帰無仮説の)確率は、ほぼゼロということです)
したがって、「血圧の値は、季節によって有意差がある」と言えます。主治医の言うことは正しかったようです。
前回やったように「平均のプロット」グラフで確認しておきましょう。
そうそう、オプションで「2組ずつの平均の比較(多重比較)」にチェックを入れた結果の話をしていませんでした。以下に説明します。
≡ 多重比較
さて、以上で、「一元配置分散分析」による3群以上の母集団の平均値(サンプリングした値から推定したもの)の検定の進め方はおしまいです。
ところが、いくつか注意すべき点があることが分かってきて、次第に使わなくなりました。私が特に気になっている3点について説明します。
■ 分散分析は平均の有意差を求めるもの
近頃は、「分散分析」とは言わず「ANOVA」ということが多いですから、誤解が少なくなっていると思うのですが、「分散分析は、分散の大きさを検定するものではなく、推定した母集団の平均値の差を検定するもの」です。
ここで、ボタンの掛け違いがあると、その後の影響が大きいので気を付けましょう。(自分は知っていても、分散分析結果を上司などに説明するときに聞いている人が誤解しないように気を配る必要があります)
■ 帰無仮説は「全ての群の平均値には差がない」
今回、春夏秋冬の4つの群の平均値の差を検定しました。その結果、「Pr(>F)」は、「3.56e-16 ***」とほぼゼロでしたので、「差がない確率は、ほぼゼロ」=「季節によって差がある」という結論が導かれました。
さて、「季節によって差がある」という結論ですが、「春夏秋冬、全てに差がある」のか、「(例えば)冬だけ差がある」のかは「一元配置分散分析」の検定のみではわかりません。
ANOVAでわかるのは「【全ての季節で血圧値の平均に差がない】という(帰無)仮説は統計的に非常に疑わしい」ということまでです。
それでは、ANOVAで言えるようになる、「検定対象の複数の群の平均値がすべて同じこと」を知る目的って実務であるのだろうか? と思うのです。
今回の結論である「(血圧の値は)季節によって差がある」にしても、知りたいことは、季節によって差がないという話ではなく、例えば、「冬になるとどのくらい血圧が上がるのか」ではないでしょうか?
「なんの要因によってどのくらいの差が出るか?」を知りたいのに、「全部の要因で同じ平均値だった(もしくは同じ平均値でないものが少なくとも1つ存在する)」ことがわかって何がうれしいのか?
「ハンバーガー統計学にようこそ!」という、平均から分散分析までを楽しく学ぶ素晴らしいサイトがあります。🍔
(是非、ご一読されることをおすすめします)
こちらのサイトの分散分析の例は、「3つのハンバーガーショップの味の差はあるか」です。味の差があることはANOVAで求められますが、どこに違いがあるかが知りたいのではないでしょうか? その場合は、「多重比較」が必要です。
たまに、「多重比較を行う前にANOVAをしておくことが有効である」と書いてありますが、間違いです。それぞれ目的が異なりますので目的に合った手法を使用することが大切です。
■ 多重比較とは
「t検定がA群とB群の2群しか比較検定できないなら、例えば、A群、B群、C群の3群があったら、AとB、BとC、AとCの3回、t検定を実施したらよいのでは?」というアイデアが多重比較です。
ナイスアイデアですが、3群に対する検定結果をいうときに、ちょっと困ったことが起こります。それぞれのp値が0.05未満でも全体のp値が0.05とは限らないからです。
結論から言えば、それぞれのt検定について有意水準を0.05から「0.05/(比較する数)」とする必要があります。3群なら「0.05/3 = 0.016」、4群なら「0.05/6 = 0.008」です。
(もしくは多重比較用の手法がありますのでそちらを使います)
上のオプションで「2組ずつの平均の比較(多重比較)」にチェックを入れると、各t検定の結果と、以下のグラフが表示されます。
≡ おわりに
今回は、仮説検定の3回目として「ANOVA」について説明しました。実務上はt検定を使用します。
ANOVAを使う場面が来たときに、本当に「全群の比較結果に差がない」ことを知りたいのか自問してください。統計技法に振り回されないことが大切と思います。
さて、次回は、仮説検定そのものの話をしたいと思います。帰無仮説と対立仮説、p値と有意水準と有意差の関係などの話を復習をまじえて書く予定です。
正規分布で検定するZ検定ではなく、t検定を使う理由も書きたいけど、それは確率分布のときに書いたほうがいいかなあ。
◀前の記事へ 次の記事へ▶
この記事が気に入ったらサポートをしてみませんか?