63. 正規性の検定


グラフによる正規分布との比較

パッケージ stepfum の中の関数 ecdf() で累積分布関数 (cdf) を描き,正規分布からのズレを見ることが出来る.stepfun は階段関数を扱うライブラリで,特に経験分布関数の作図ができる.

 
 data <- rnorm(30)                   # データを用意
 Fn <- ecdf(data)                    # ecdf()でデータフレームを作成
 Fn                                  # 中身を確認
 summary(Fn)                         # Fn の要約
 summary.stepfun(Fn)                 # Fn の詳しい要約
 plot(Fn)                            # 経験分布関数をプロット
 plot(Fn, do.point=F, verticals=T)   # 点を描かず,ジャンプ線(縦の線)を描く

この累積分布関数に正規分布の分布関数を上書きしてみる.

 
 x <- seq(-3,3,0.01)
 lines(x, pnorm(x, mean=mean(data), sd=sqrt(var(data))), col=2)

Q-Q プロットに関する関数も用意されている.

関数

機能

qqnorm(x)

x に対する期待正規ランクスコアをプロットする.データが正規分布に従っているかどうかを調べるために用いられ,qqnorm() によって描かれた散布図の点がほぼ直線上に並んでいればそのデータは正規分布に従っていると考えられる.

qqline(x)

上のプロットにデータの上四分位点と下四分位点を結ぶ直線を描く.

qqplot(x, y)

x の確率点に対する y の確率点 ( Quantile-Quantile Plot:Q-Q プロット) を描く.

qqplotはプロットした点の座標(リスト)を返す.関数 lsfit() を使って回帰直線を求め,それを abline() を用いて重ね描きすることで点列についての当てはめ直線を描くことが出来る.

 
 x <- rt(50, df=5)
 xy <- qqplot(qt(ppoints(50), df=5), x)
 abline(lsfit(xy$x, xy$y), lty=2)

データが他の理論分布,例えば対数正規分布に従っているかどうかを調べるには以下の様にすればよい.x はデータ,ppoints() はQQプロット用の確率ベクトルを作る関数,qlnorm() は対数正規分布の確率点を求める関数である

 
 plot(qlnorm(ppoints(x)), sort(x))

qlnorm() の代わりに他の理論分布の確率点を求める関数を使えば,その分布に従っているかどうかを調べることも出来る.

正規性の検定

関数 shapiro.test() で Shapiro-Wilk 検定 を行うことが出来る.

 
 data(faithful)
 long <- faithful$eruptions[faithful$eruptions > 3]
 long                                                         # データの確認
 shapiro.test(long)

        Shapiro-Wilk normality test
data:  long 
W = 0.9793, p-value = 0.01052

関数 ks.test() で Kolmogorov-Smirnov 検定 を行うことが出来る.

 
 data(faithful)
 ( long <- faithful$eruptions[faithful$eruptions > 3] )       # データ出力は省略
 ks.test(long, "pnorm", mean=mean(long), sd=sqrt(var(long)))

        One-sample Kolmogorov-Smirnov test
data:  long 
D = 0.0661, p-value = 0.4284
alternative hypothesis: two.sided