方法
2つの母集団の性質によって検定が異なる
まず両方の分布が正規分布であるかどうかで分かれる
- 両方が正規分布のとき(パラメトリック)
二つの分布の分散が同じであるかどうかでまた分かれる- 等分散のとき
t検定を行う - 等分散でないとき
ウェルチの検定を行う
- 等分散のとき
- どちらかが正規分布でないとき(ノンパラメトリック)
マン・ホィットニーの U 検定(=ウィルコクソンの符号付順位和検定)や
ウィルコクソンの符号付順位検定を行う
- 対応がある(関連がある)場合:A,B,C,DさんがそれぞれX条件とY条件で比較する
比べる集団が同じなので、分散が同じと考える - 対応がない(関連がない)場合:男性A,Bさんと女性C,DさんをX条件下で比較する
異なる集団を比べるので、分散は異なると考える
Rによる実践
実際のデータの場合、その二つの母集団が正規分布であるとか等分散であるとかは大抵わからない。
そこでその部分についても検定で判断する。
しかし、ここには多段階検定の問題が存在する。
例えば
90%の確率で正規分布で、90%の確率で等分散だから
t検定をして、90%の確率で差があるとわかりました。
とわかったとき
本当に2つの母集団が正規分布で等分散であれば、差がある確率は90%ですが
計算上は90%の確率で正規分布であり、等分散であるので、
データからわかることは72.9%(=90%×90%×90%)の確率で差があるになってしまうのです。
なので、どんな検定も分布の検定は行わず、始めからノンパラメトリックな検定でするべきだという話もあります。
コメント
(でも、上の話では正規分布で等分散であるときの差がある確率であって、すごい限定的すぎるような・・・
まぁでも10%×90%×X%と10%×10%×Y%を加えて考えれば問題解決?、、まぁいいか)
以下は、Rで使えるソースです。ただし多段階で検定しています。
name1:data1の名前
data1:1つ目のデータ(ベクトル)
name2:data2の名前
data2:2つ目のデータ(ベクトル)
item:条件名
例
>data1 <- c(10,8,4,6,7,5,6,6,3)
>data2 <- c(1,7,3,5,6,2,4,5,3,2,4)
>Mean2Test("xxx",data1,"yyyy",data2,"AAA")
----------------------------------
item: AAA xxx : 9 , yyy : 11
個々に正規性が仮定できる
等分散を仮定できる
x と y t検定
★有意差がある t.test$p.value: 0.01755208
mean x : 6.111111 , y : 3.818182
Rソース
Mean2Test <- function(name1,data1,name2,data2,item){
cat("----------------------------------\n")
cat("item:",item," ",name1,":",length(data1),",",name2,":",length(data2),"\n")
#正規性の確認、個々に(Shapiro-Wilkの正規性の検定)
flagNorm = T
if(class(try(resShapiro1 <- shapiro.test(data1),TRUE))=="try-error"){
cat("▲▲▲ ",name1," shapro error ; value are identical\n")
flagNorm = F
}
if(class(try(resShapiro2 <- shapiro.test(data2),TRUE))=="try-error"){
cat("▲▲▲ ",name2," shapro error ; value are identical\n")
flagNorm = F
}
if(flagNorm){
if(resShapiro1$p.value<0.05||resShapiro2$p.value<0.05){
flagNorm = F
cat("どちらか正規性が仮定できない ",name1,":",resShapiro1$p.value,", ",name2,":",resShapiro2$p.value,"\n")
}else{
cat("個々に正規性が仮定できる\n")
}
}
if(flagNorm){#正規性があるとき
#等分散の確認(F検定)
flagVar = T
resVar <- var.test(data1,data2)
variance = resVar$p.value
if(variance<0.05){
flagVar = F
cat("等分散を仮定できない var$p.value:",variance,"\n")
print(variance)
}else{
cat("等分散を仮定できる\n")
}
#T検定
resT <- t.test(data1,data2,var.equal=flagVar)
resultP <- resT$p.value
if(flagVar){
cat(" ",name1," と ",name2," t検定\n")
}else{
cat(" ",name1," と ",name2," ウェルチのt検定\n")
}
if(resultP<=0.05){
cat("\n ★有意差がある t.test$p.value:",resultP,"\n\n")
}else if(resultP <=0.1){
cat("\n ●有意傾向がある t.test$p.value:",resultP,"\n\n")
}else{
cat(" ×有意差なし t.test$p.value:",resultP,"\n")
}
}else{#正規性がないとき
#Wilcoxonの順位和検定
suppressWarnings(resWilcox <- wilcox.test(data1,data2))
resultP <-resWilcox$p.value
cat(" ",name1," と ",name2," Wilcoxonの符号付順位和検定\n")
if(resultP<=0.05){
cat("\n ★有意差がある wilcox.test$p.value:",resultP,"\n\n")
}else if(resultP <=0.1){
cat("\n ●有意傾向がある wilcox.test$p.value:",resultP,"\n\n")
}else{
cat(" ×有意差なし wilcox.test$p.value:",resultP,"\n")
}
}
cat("mean ",name1,":",mean(data1)," , ",name2,":",mean(data2),"\n")
}
参考サイト
- 正規性の検定
- t検定
- マン・ホイットニー(Mann・Whitney)のU検定、ウィルコクソン(Wilcoxon)の符号順位検定
- その他