統計ER

R, EZR, SPSS, KH Coder を使ったデータ分析方法を紹介するブログ。ニッチな内容が多め

Rで正規性の検定はどうやるか?シャピロウィルク検定はRでどうやるか?

データの正規性とは、データが正規分布しているかどうかのこと。

正規分布を前提にした統計手法が多いため、データが正規分布をしているかどうかが問題になることが多い。

>>もう統計で悩むのを終わりにしませんか?


↑1万人以上の医療従事者が購読中

正規分布かどうかの検定

データが正規分布しているかどうかの検定には、Shapiro-Wilk test (シャピロ・ウィルクの検定)がある。

帰無仮説は「正規分布している」なので、棄却されないほうがいい。

帰無仮説が棄却されないときは、統計学的な結論ではないので、正規分布を積極的に証明しているわけではないことに注意。

> shapiro.test(sleep$extra)

        Shapiro-Wilk normality test

data:  sleep$extra
W = 0.94607, p-value = 0.3114

このデータの場合は、正規分布していると考えてよい。

ヒストグラムを見てみると、悪くはない。

hist(sleep$extra)

サンプルサイズを見てみると、20例。

> length(sleep$extra)
[1] 20

グループごとの正規分布の検定

グループごとにShapiro-Wilk検定を行うにはどうするか?tapply()という関数を使う。

sleepというデータフレームには、groupという変数があり、groupは1と2がある。

group別にextraというデータが正規分布しているかどうかを見る。

> tapply(sleep$extra,sleep$group,shapiro.test)
$`1`

        Shapiro-Wilk normality test

data:  X[[i]]
W = 0.92581, p-value = 0.4079


$`2`

        Shapiro-Wilk normality test

data:  X[[i]]
W = 0.9193, p-value = 0.3511

Shapiro-Wilk test の帰無仮説は、正規分布している、なので、棄却されなかったから、上記の2グループともに、正規分布してそう、という結果。

グラフを左右に並べたいときは、グラフウィンドを横長にしてから、layout(t(1:2))を実行する。

そのあとにtapply()でグループごとのグラフを描く。

layout(t(1:2))
tapply(sleep$extra, sleep$group, hist)

左がgroup1、右がgroup2。

>>もう統計で悩むのを終わりにしませんか?


↑1万人以上の医療従事者が購読中

正規性の確認もう一つの例

MASSパッケージのbirthwtデータフレームを使う。

smoke(母親の喫煙)別のbwt(出生時体重)比較をする。

MASSパッケージを呼び出して、bwtヒストグラムを描く。

正規分布しているように見える。サンプルサイズは189。

library(MASS)
hist(birthwt$bwt)

喫煙か非喫煙かでグラフを描く。

左がsmoke=0で非喫煙、右がsmoke=1で喫煙。

layout(t(1:2))
with(birthwt, tapply(bwt, smoke, hist))

正規性の確認の方法としてQQプロットという方法がある。

横軸に理論的な分位数(クォンタイル)、縦軸に実際の値としてプロットする。対角線上にプロットが並べば、正規分布と考えられる。

with(birthwt, tapply(bwt, smoke, qqnorm))

まっすぐに並んでいるとはいいがたいが、まったくずれているとも言えないので、正規分布の範囲内と考えていい。

グループごとにShapiro-Wilk検定を実施すると、smoke=0もsmoke=1もどちらも有意でなく、正規分布と言ってよい。

> with(birthwt, tapply(bwt, smoke, shapiro.test))
$`0`

        Shapiro-Wilk normality test

data:  X[[i]]
W = 0.98694, p-value = 0.3337


$`1`

        Shapiro-Wilk normality test

data:  X[[i]]
W = 0.98296, p-value = 0.4195

平均と標準偏差も見ておくと、ともに平均は標準偏差の3倍以上。上か下のすそ野のが途中で切れていることもない。

> with(birthwt, tapply(bwt, smoke, mean))
       0        1 
3055.696 2771.919 
> with(birthwt, tapply(bwt, smoke, sd))
       0        1 
752.6566 659.6349 

最後に、グラフウィンドを閉じてlayout()をリセットしてから、四角いウィンドで箱ひげ図を描いてみる。飛び離れた値もなさそうなことがわかる。

boxplot(bwt ~ smoke)

まとめ

データ分析を進めるにあたり、データの正規性を確認する方法をまとめた。

最低限ヒストグラムは見てみる。余力があればQQプロットも描いてみる。Shapiro-Wilk検定もしてもいいが結果にとらわれないようにする。

以上がデータの正規性の確認だ。

編集後記「正規性を気にしすぎている」

個人的には多くの人が正規性を気にしすぎだと思う。

確かに、初学者だったころ、ぼくも非常に気になった。

しかし、データが正規分布していようがしてまいが、現実世界では正規分布を前提としたパラメトリックな手法が、ばんばん使われている。

教科書は教科書であって、研究発表の現場ではそこまで気にしていない。

結論としては、

  • 自分がある程度納得できる範囲で確認する。
  • 聞かれたら「チェックはしました」と言える程度に確認する。
  • 対数変換などをしたほうが明らかに適切なら当然実施する。

という程度でよい。

そんなことよりも、比較対照がない観察研究で、多変量調整をしなければならない状況なのに、多変量調整をしないほうがよほど問題。

正規性にとらわれると統計手法の選択肢が非常に狭まる。

正規性は四角四面に考えないことだ。

参考書籍