Excel VBAで2群の比率の差の検定ができる関数を作ってみた
2群の比率の差の検定というものがあります。
独立性の検定(カイ二乗検定)で代用できるせいか、あまりメジャーではないようで、今まで読んだ入門書には解説が載っていませんでした。
視聴率とか値上がり率とか、世の中には○○率があふれていて、年ごと/月ごと/週ごと/日ごとの○○率を比較してみたいといったニーズは結構ありそうなのに、あまりフィーチャーされないのは、ちょっと不思議ですね。
私自身、比率の差を検定しようと思ったときは、以前作ったカイ二乗検定用の関数*1を使っていたのですが、
たとえばこんなデータがあるとき、*2
表を加工して、
こんなふうにクロス表を作ってから関数を適用しなければならないので、かなり面倒でした。そこで今回、お手軽に2群の比率の差が検定できる関数をVBAで作ってみることにしました。
2群の比率の差の検定統計量の求め方は、
として、
この検定統計量 が、帰無仮説 に対して標準正規分布に従うのだそうです。
この数式をVBAで記述すると以下のようになります。
'2群の比率の差の検定結果を求める
Function Diff_bw_Ratio(参照, Optional 種類 As Boolean, Optional 検定の指定)
Dim p, p1, p2, z
If 参照.Rows.Count = 2 And 参照.Columns.Count = 2 Then
p1 = 参照(2) / 参照(1)
p2 = 参照(4) / 参照(3)
p = (参照(2) + 参照(4)) / (参照(1) + 参照(3))
z = Abs(p1 - p2) / Sqr(p * (1 - p) * (1 / 参照(1) + 1 / 参照(3)))
If 種類 = True Then
If 検定の指定 = 1 Or 検定の指定 = 2 Then
Diff_bw_Ratio = _
(1 - Application.WorksheetFunction.Norm_S_Dist(z, True)) * 検定の指定
Else
Diff_bw_Ratio = CVErr(xlErrNA)
End If
Else
Diff_bw_Ratio = z
End If
Else
Diff_bw_Ratio = CVErr(xlErrNA)
End If
End Function
軽くコードの、というか使い方の解説をしますと、
- 引数の「参照」で2群の分母と分子のセル(2×2)を選択します。
- 比率は引数にせず、関数の内部で計算しています。
- 引数の「種類」は、TRUEでP値、FALSE または指定せずでZ値を返します。
- 「種類」で TRUE を選択した場合は、「検定の指定」で1:片側検定 2:両側検定を指定します。
実際に使ってみた結果がこちらです。
ご覧のとおり、両側検定のP値がカイ二乗検定のP値と同じ値ですね。
実は、 という関係も成り立っています。 う~ん、不思議。
それにつけても、昨年の統計検定2級試験は、1%有意になるほど合格率に差があったんですねえ。ちょっと吃驚です。
2017年11月の試験問題はそれ以前と出題傾向が違ったなんて話も聞きますが、この合格率の差はそのせいだったりするんでしょうか?
*2:統計検定公式サイト http://www.toukei-kentei.jp/past/ より