正規分布への当てはまりの良さ

データが正規分布にどの程度当てはまっているかを調べるには、
(1)normal q-q plotにより、定性的に評価
(2)Kolmogorov-Smirnov test(K-S検定)やShapiro-Wilk test(S-W検定)を用いて、p値を指標に評価
の二つの方法があります。

今回はこれらの方法について取り扱いと思います。


(1)normal q-q plotにより、定性的に評価
normal q-q plotととは、標準正規分布とデータの分位点との関係を図示したもので,これが,直線上に 乗っているとデータが正規分布によくあてはまっていることがわかります。

以下には、1)正規分布 2)ポアソン分布3)ベータ分布4)カイ二乗分布
を母集団として、乱数を発生させて、正規分布にどの程度当てはまるかを定性的に評価したいと思います。

##########################################################################
# 1)正規分布
dat1 <- rnorm(1000, mean=10, sd=2)
png("dat1.png")
#x に対する期待正規ランクスコアをプロットする
qqnorm(dat1)
#プロットにデータの上四分位点と下四分位点を結ぶ直線を描く
qqline(dat1, col="red")
dev.off()


# 2)ポアソン分布
dat2 <- rpois(n=1000, lambda=5)
png("dat2.png")
#x に対する期待正規ランクスコアをプロットする
qqnorm(dat2)
#プロットにデータの上四分位点と下四分位点を結ぶ直線を描く
qqline(dat2, col="red")
dev.off()

# 3)ベータ分布
dat3 <- rbeta(n=1000, shape1=5, shape2=3)
png("dat3.png")
#x に対する期待正規ランクスコアをプロットする
qqnorm(dat3)
#プロットにデータの上四分位点と下四分位点を結ぶ直線を描く
qqline(dat3, col="red")
dev.off()

# 4)カイ二乗分布
dat4 <- rchisq(n=1000, df=11, ncp=0)
png("dat4.png")
#x に対する期待正規ランクスコアをプロットする
qqnorm(dat4)
#プロットにデータの上四分位点と下四分位点を結ぶ直線を描く
qqline(dat4, col="red")
dev.off()

##########################################################################

(2) K-S検定 S-W検定
##########################################################################

### 1)正規分布を例に少しオブジェクトの構造を解析する
#K-S検定はks.test()を使用
> ks.test(dat1, "pnorm", mean=mean(dat1), sd=sqrt(var(dat1)))

One-sample Kolmogorov-Smirnov test

data:  dat1 
D = 0.0597, p-value = 0.8681
alternative hypothesis: two-sided 

> summary(ks.test(dat1, "pnorm", mean=mean(dat1), sd=sqrt(var(dat1))))
            Length Class  Mode     
statistic   1      -none- numeric  
p.value     1      -none- numeric  
alternative 1      -none- character
method      1      -none- character
data.name   1      -none- character

#p値を単独で取得できそう!
> (ks.test(dat1, "pnorm", mean=mean(dat1), sd=sqrt(var(dat1))))$p.value
[1] 0.8681218 #キター!!

###以下、各データに対して、K-S検定及びS-W検定を行う
#S-W検定はshapiro.test()を使用
> shapiro.test(dat1)

Shapiro-Wilk normality test

data:  dat1 
W = 0.9869, p-value = 0.434

> (shapiro.test(dat1))$p.value
[1] 0.4339936

###それでは各分布のサンプルについて検定を行います
# 1)正規分布
(ks.test(dat4, "pnorm", mean=mean(dat4), sd=sqrt(var(dat4))))$p.value
(shapiro.test(dat4))$p.value
> (ks.test(dat1, "pnorm", mean=mean(dat1), sd=sqrt(var(dat1))))$p.value
[1] 0.8681218
> (shapiro.test(dat1))$p.value
[1] 0.4339936

# 2)ポアソン分布
> (ks.test(dat2, "pnorm", mean=mean(dat2), sd=sqrt(var(dat2))))$p.value
[1] 0.07005836
> (shapiro.test(dat2))$p.value
[1] 0.00998934

# 3)ベータ分布
> (ks.test(dat3, "pnorm", mean=mean(dat3), sd=sqrt(var(dat3))))$p.value
[1] 0.5573208
> (shapiro.test(dat3))$p.value
[1] 0.1299853


# 4)カイ二乗分布
> (ks.test(dat4, "pnorm", mean=mean(dat4), sd=sqrt(var(dat4))))$p.value
[1] 0.0003856757
> (shapiro.test(dat4))$p.value
[1] 1.577593e-17
##########################################################################

(1)の方法は直感的でわかりやすいですね。(2)の方法は、例数が少なかったり、母集団の分布が正規分布に似ていたりすると、なかなかp値は小さくならないようです。p値が0.05を下回らないからといって、母集団の分布が正規分布であるとはだれも保証はできません。

【参考文献】
・統計学の基礎
・R - Source 正規性の検定