見出し画像

第152回: 「統計の実務」13 仮説検定《その3:ANOVA》


◀前の記事へ   次の記事へ▶

≡ はじめに

前回は、「仮説検定《その2:独立サンプルt検定》」について書きました。

内容としては、「対応のあるt検定」と「独立サンプルt検定」の違いについてでした。
母集団の平均値(サンプリングした値からサンプリング元の全データの平均値推定したもので、母平均とも言います)の検定は、前回と前々回に説明した2種類のt検定を“同じ人の体重の変化のような対応のあるデータ”なのか、“独立した2つのグループの平均値の差の有意差を知りたい”のかによって、使いわければ良いです。
ところがこのときに、「(t検定は2つのグループの比較しかできないので)3群以上の比較をしたいときのためにANOVAを知らないといけない」という人がいます。
そこで今回は「ANOVAアノーヴァ」(分散分析とも呼ぶ)の話を書きます。

率直に言って、ANOVAは、実験計画法を理解するための中間ステップとして勉強するものであって、実務上で使う恩恵はほとんどないと思っています。
特に今回説明する「一元配置分散分析」は(実務において)何を知りたいときに使うんだろう?と思います。
あとで例を挙げますが、そんなに「実務で知りたいこと」ではないと思うからです。(知的好奇心を満たす系? いや、私が「一元配置分散分析」の有効な用途を知らないだけの可能性が高いかもしれません……。)

今回、説明をパスする、「多元配置分散分析」のほうは、ひょっとしたら交互作用の有無をチェック出来るので、使っても良いかもしれません。
しかし、交互作用を知るためには、結局、多数の因子を取り上げて、その組み合わせを調べることになるので、現実的には実験計画法を使うことになるでしょう。ということで、実務で「多元配置分散分析」を使うこともそんなにないかなあと思います。
分散分析表を説明するかどうかは悩みましたが「手計算(Excelで自分で式を埋めて作る場合を含む)の時にどこで計算を間違えたか知る」以外に役に立った記憶がないので、Rコマンダーの結果を信じようというこの連載のコンセプトとしてはどうでもいいかなと思い、説明しないことにしました。
(分散分析表については、読めるようにはなっていたほうが良いかもしれません。「真値+誤差値=測定値」の考え方に慣れるために大切なので)

ところで、エクセルでは「多元配置分散分析」については、二元までで、「三元」以上はできなかったような気がします。

※ 「一元」や「二元」の、「一」とか「二」は、結果に影響を及ぼすかどうかについて推定したい要因の数のことです。今回の例題では「季節という1つの要因が血圧値に影響を及ぼすか」を検定したいので、「一元配置分散分析」をします。
これが、「季節」の違いだけではなく「朝晩」の違いも考慮したいなら要因は「季節」と「朝晩」の2つになりますから「二元配置分散分析」を使います。
更に「食事の前後」の違いも考慮したいなら要因の数は3になりますから「多元配置分散分析」を使います。要因の中の水準の数(春・夏・秋・冬なら4水準)とをゴッちゃにしないようにしましょう。

以上のことから、ANOVAの説明をやめて、「実験計画法」(ソフトウェアの性能テストなどで使う)についてまとめようかなと思ったのですが、実験計画法はRコマンダーのサポートがなく、この連載の趣旨からずれまくるので、書くとしても、ずっと先になりそうです。

…… Rのパッケージには実験計画法を扱うものがあるので、それを使うのが良いかなあ? でもGUIでできるパッケージは知らないからなー。

ちなみに、実験計画法を仕事で使うなら、日科技連の「JUSE-StatWorks」を買えばいいと思うけど、ソフトウェアの人には、そこまでの統計処理機能は要らないと思う……。


≡ 例題

今回はこんな例題です。

あきやまくんは、主治医から、「血圧は季節によって上下するから冬場はちょっと上がりますが、気にしないでください」と言われました。
『そういうものなのか。でも本当かな?』と思ったあきやまくんは、ずっと記録している血圧値を使って季節ごとの平均値の差について、調べてみることにしました。

まずは、基礎統計量です。Rコマンダーの
  [統計量]>[要約]>[数値による要約]
を選ぶと以下の統計値が得られます。

   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

確かに、"最高血圧.mmHg."の平均値(mean)は、春:127.5、夏:121.8、秋:124.1、冬:128.9であり、夏が低く冬が高い傾向です。
『でも、季節によらず140を超える日だってあるしなあ』……あきやまくんは、ちょっと疑り深いようです。

使用したデータ(朝晩の血圧の測定値1年分)はこちらです。
月ごとにざっくりと季節わけした列を追加したほかは、加工なしです。本当は季節ではなく気温を5度刻みとしたカテゴリ変数を作って気温の差による平均値の変化を調べる方が良いのかもしれません。

『折角Rコマンダーに読み込んだのだから、密度推定グラフでも描いてみるか。』と思ったあきやまくんはポチポチとクリックをしました。

季節ごとの最高血圧の分布(密度推定)

『なんか、かえって分からなくなっちゃったなあ』(;^ω^)


≡ 一元配置分散分析

季節で血圧に違いがあるかについては血圧値の「差の検定」を行えばよいのですが、前回と前々回にやった、t検定は、「ダイエット前とダイエット後」、「営業部と開発部」といったように、2つのデータ群の比較しかできません。

このようなときには、「一元配置分散分析」を使います。
(豆知識: 「一元配置分散分析」で、2つの群の検定を行うと、それは「独立サンプルt検定」と同じ結果となります。こちらの証明は意外と面倒なのでパスします)

「一元配置分散分析」の分析手順は前回と同様で超簡単です。上の「BloodPressure-202012-202111.csv」ファイルをRコマンダーに読み込んで、
  [統計量]>[平均]>[1元配置分散分析]
を選択し、グループと目的変数を選ぶだけです。

Rコマンダーのメニュー選択
グループと目的変数の選択

オプションシートが出てきたら上図のようにグループと目的変数を選択、[✔︎OK]ボタンを押します。ここで、「2組ずつの平均の比較(多重比較)」にチェックを入れておくと良いでしょう。

信頼水準:0.95のところですが、たぶんバグだと思うのですが、うまく機能しないようです。

グループの「季節」変数には血圧のデータを群に分ける水準(「春」、「夏」、「秋」、「冬」)が入っています。
[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    262124.1154 10.301377    130127.5294  7.417638    136128.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未満であることがわかります。

「3.56e-16 ***」は、「3.56 × 10^(-16) 」(10のマイナス16乗、、、つまり、ほぼゼロ)の意味です。数値の後ろの「*」は一つだったら「0.1未満(10%未満)」、二つだったら「0.05未満(5%未満)」、三つだったら「0.01未満(1%未満)」を意味します。「*」があったら小さい値だよということです。
マイナス16乗については以下の表を眺めて、その小ささを実感してください。

https://www.hakko.co.jp/qa/qakit/html/h06010.htm

今回のp値(なかで、F検定を使って求めています)は0.05未満(5%未満)でした。(季節の平均に差がない(という帰無仮説の)確率は、ほぼゼロということです)
したがって、「血圧の値は、季節によって有意差がある」と言えます。主治医の言うことは正しかったようです。
前回やったように「平均のプロット」グラフで確認しておきましょう。

最高血圧の平均のプロット(季節の違い)

こんなにきれいなグラフになるとは!
(自分が一番驚いている!!)

※ Rでは、グラフの横軸は文字コードの昇順になるようなので、ちょっと気に入らない。(笑)
、、、名義尺度なのでどんな順番でも、統計処理的には文句はないけど。

そうそう、オプションで「2組ずつの平均の比較(多重比較)」にチェックを入れた結果の話をしていませんでした。以下に説明します。


≡ 多重比較

さて、以上で、「一元配置分散分析」による3群以上の母集団の平均値(サンプリングした値から推定したもの)の検定の進め方はおしまいです。

「なーんだ、役に立ちそうじゃないか」と思われた人が多いと思います。私も最初のうちは「ビバ! アノーヴァ!!」でした。

ところが、いくつか注意すべき点があることが分かってきて、次第に使わなくなりました。私が特に気になっている3点について説明します。

■ 分散分析は平均の有意差を求めるもの

近頃は、「分散分析」とは言わず「ANOVA」ということが多いですから、誤解が少なくなっていると思うのですが、「分散分析は、分散の大きさを検定するものではなく、推定した母集団の平均値の差を検定するもの」です。
ここで、ボタンの掛け違いがあると、その後の影響が大きいので気を付けましょう。(自分は知っていても、分散分析結果を上司などに説明するときに聞いている人が誤解しないように気を配る必要があります)

ANOVAは、フィッシャーが作った「analysis of variance」の略称です。varianceは、統計の専門用語の分散に当たりますから「分散分析」という日本語訳になったのだと思います。
でも「analysis of variance」のvarianceは統計の専門用語の分散ではなく、一般名詞としての「相違、不一致、変化」の意味だったのではないかと私は思います。

「分散をもとにして平均値の差を検定するのだから『分散分析』の訳であっている」という人もいます。でも「不一致分析」のほうが意味をストレートに表現しているような気がするのです。


■ 帰無仮説は「全ての群の平均値には差がない」

今回、春夏秋冬の4つの群の平均値の差を検定しました。その結果、「Pr(>F)」は、「3.56e-16 ***」とほぼゼロでしたので、「差がない確率は、ほぼゼロ」=「季節によって差がある」という結論が導かれました。

この辺の仮説検証(帰無仮説と対立仮説、p値と有意水準と有意差の関係など)の話については次回にまとめて書きます。
いまはなんとなくの理解でOKです。

さて、「季節によって差がある」という結論ですが、「春夏秋冬、全てに差がある」のか、「(例えば)冬だけ差がある」のかは「一元配置分散分析」の検定のみではわかりません。
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を使う場面が来たときに、本当に「全群の比較結果に差がない」ことを知りたいのか自問してください。統計技法に振り回されないことが大切と思います。

今週末のJaSST 21 Kyushuの中で、「手法やプロセスは、手段であるが、運用段階にて目的化することで失敗する」という話題に触れようかなと思っています。

 ・ 新しいやり方で結果を出したいとの思いが、失敗したくないという気持を起こす
 ・ 「せめて新手法のやり方は間違えずに進めたい」と強く思う
 ・ 結果的に、「その新手法で何を実現するか」という目的を見失ってしまう

ということについてです。
言い古されていることですが、統計手法を使うときには常に心にとめておきたいものです。

さて、次回は、仮説検定そのものの話をしたいと思います。帰無仮説と対立仮説、p値と有意水準と有意差の関係などの話を復習をまじえて書く予定です。
正規分布で検定するZ検定ではなく、t検定を使う理由も書きたいけど、それは確率分布のときに書いたほうがいいかなあ。

次回で検定の話が終わったら、「回帰分析(単回帰分析と重回帰分析)」→「クロス集計とカイ二乗検定」→「管理図とEVM」→「確率分布」と続ける予定です。

◀前の記事へ   次の記事へ▶

この記事が気に入ったらサポートをしてみませんか?