2つの集団の母平均に差があるかどうかを確かめるとき

Last-modified: 2013-10-09 (水) 10:56:38


方法

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)の符号順位検定
  • その他