Statistical Programming

2群の検定 with R

今まで「Scala Days」というタイトルでScalaについて主に書いてたんだけど最近python使わなくちゃいけなくなったし統計に関することもメモりたいからタイトル名を「Statistical Programming」へと変更。というわけでとりあえず統計の復習を少しばかり。

2つのグループに関するデータがあり、グループ間に有為な差が見受けられるか否かを調べたい。そういったケースのプロセスについて。まずその2つのグループが独立した異なるグループ(独立2群)かそれとも単一のグループだが異なる時期に実験を行ったもの(関連2群)なのか判断する必要がある。

独立2群の例;A組の生徒は3ヶ月間補習を受ける。B組の生徒は補習を受けない。3ヶ月後に両方の生徒は試験を受けその試験結果に有為な差がないかどうか調べる

関連2群の例;A組の生徒はまず試験を受ける。その後3ヶ月間特別な補習を受ける。補習が終了したらA組の生徒は再び試験を受け、最初の試験結果と補習後の試験結果に有意な差が見受けられるかを調べる

関連2群の場合、

(補習後の試験結果)ー(補習前の試験結果)

をした後に1標本t検定を行う。

> data=read.csv("試験.csv",header=TRUE)
> data
    om  am cs
1   94  97 96
2   81  94 99
3   85  89 86
4   81  81 77
5   79  85 80
6   96  99 99
7   67  67 79
8   96 100 99
9   70  77 81
10  82  84 90
11  82  92 97
12  80  98 95
13  89  94 98
14  75  88 93
15  91  94 95
16  57  86 82
17  95  92 99
18  90 100 99
19  86  99 98
20  89  85 89
21  73  92 96
22  85  73 68
23  97  97 97
24  85  98 87
25  80  84 88
26  99  99 97
27  87  93 89
28  91  90 94
29  88  98 98
30 100 100 99
31  87  76 96
32  96  96 94
33  84  96 94
34  78 100 97
35  98  98 97
36  48  55 59
37  58  83 84
38  91 100 94
39  89  90 95
40  67  76 83
41  69  86 98

> origin=data$om
> result=data$cs
1標本t検定
> differ=result-origin
> t.test(differ)

    One Sample t-test

data:  differ
t = 5.4028, df = 40, p-value = 3.256e-06
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
  4.885244 10.724512
sample estimates:
mean of x 
 7.804878 

p-valueは0.05より明らかに小さいから補習の前後に有為な差があると考えられる。

翻って独立した2群である場合、まずコルモゴロフ・スミルノフ検定
を使って正規分布かどうかを調べてみる。帰無仮説は「標本分布が正規分布に従う」なのでp-valueが十分に大きかったら正規性が保証される。

コルモゴロフ・スミルノフ検定
>ks.test(origin,"pnorm",mean=mean(origin),sd=sd(origin))

    One-sample Kolmogorov-Smirnov test

data:  origin
D = 0.124, p-value = 0.5545
alternative hypothesis: two-sided

 警告メッセージ: 
In ks.test(origin, "pnorm", mean = mean(origin), sd = sd(origin)) :
   コルモゴロフ・スミノフ検定において、タイは現れるべきではありません 

ちなみに上記の例のようにデータに同値の値が存在している場合p-valueが正しく算出されないことがあるため別のパッケージをダウンロードしたほうがいい。
もしここで正規性に疑いがあると判断出来る場合、t検定ではなくWilcoxonの順位和検定(Mann-WhitneyのU検定)によって2群の相違を調べる。この手法はt検定とは異なりノンパラメトリック。帰無仮説は「両群が同じ母集団から抽出された」。

Wilcoxonの順位和検定
> wilcox.test(origin,result)

    Wilcoxon rank sum test with continuity correction

data:  origin and result
W = 479, p-value = 0.0008022
alternative hypothesis: true location shift is not equal to 0

 警告メッセージ: 
In wilcox.test.default(origin, result) :
   タイがあるため、正確な p 値を計算することができません 

p-valueは十分小さく仮説は棄却できる。よって2群の間に有為な差が見受けられる。

次に、2群の分散が極端に異なる場合を避けるためにF検定を行う(分散分析で登場するF検定とは計算方法が異なる)。帰無仮説は「二群の母分散は等しい」であり、p-valueが十分大きかったら等分散性が保証される。

等分散性を調べるF検定
> var.test(origin,result)

    F test to compare two variances

data:  origin and result
F = 1.7627, num df = 40, denom df = 40, p-value = 0.07678
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.9399903 3.3053492
sample estimates:
ratio of variances 
          1.762667 

0.07678と十分大きいため仮説は採択される。

※t検定において等分散性はさほど影響を及ぼさないことがわかっているらしいっす

最後に正規性が保証されている場合、Welchのt検定を行う。

> t.test(origin,result)

    Welch Two Sample t-test

data:  origin and result
t = -3.3155, df = 74.335, p-value = 0.001417
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -12.495062  -3.114694
sample estimates:
mean of x mean of y 
 83.29268  91.09756 
alternative hypothesisとは帰無仮説が棄却された時に得られる対立仮説のこと。p-valueが十分小さい時にこの対立仮説を採用する。ノンパラメトリックな検定は使い勝手がいいけれどその分適切に用いられたパラメトリックな検定より正確性は落ちるらしいからできることならパラメトリックな検定を使用出来る時は使用しよ