パッケージを使った検定に関しては前に書きました。
これら、パラメトリックな検定と異なった、並び替え検定を試してみます。
参考はカニ本です。(本の中ではRによる実装)
※クリックするとamazonにとびます。
並び替え検定について
カニ本によると
ランダムな変動のはたす役割を探るためのヒューリスティックスな手続きだ。(略) 形式主義や数式に基づく「偽りの決定論」を避けることができる。 とあります。
基本的には、普通の検定と同じく、比較群を分けて、群の間の比較値の差がランダムの範囲内であるのか、を数字で特定するための手法です。
一般的なt検定などは、様々な前提の上で出てきた数値の解釈が必要で、
そこが
さらに並び替え検定のメリットとして、
数式に基づくアプローチと比べて、(略)推論の際に「すべてに適用可能」方式に近いことだ。 と言うふうに述べられています。
具体的には - サンプルサイズは同じでなくて良い - 数値でもバイナリでもよい - 正規分布などを仮定しない
という強い特徴があります。
検定の仕組み
詳しくはカニ本を読んでいただければいいのですが、すごくシンプルにすると
比較するために分けた群をいったんまとめ、そこからランダムに群を作り直し、比較値の分布をつくりだす
のがメインアイデアです。
あとは最初の群の比較値が、作り出した分布の中で滅多に発生しないか、を見るだけでいい、ということになります。
というわけで、コードを書いてみます。
コード
今回はカニ本のとおり、2群の間のCVRの差が有意なのかを検定することにします。
インプットするデータはcvしていれば1,していなかれば0が入っていることにします。
def perm_func(g1,g2): #グループにまとめて、シャッフルする g = g1 + g2 random.shuffle(g) #ランダムにもとのグループと同じ数になるよう割り当てる new_g1 = g[:len(g1)] new_g2 = g[len(g1):] #ランダムに作ったグループから比較値をつくる #今回はCVR=比率をみている diff = float(sum(new_g1)/len(new_g1) - float(sum(new_g2)/len(new_g2) return diff
あとはここからサンプリングを繰り返します。
#データ:対象なのか、郡内の数が同じかは気にしないでいい g1 = [1,1,1,0,0,...] g2 = [0,1,0,1...] #1000サンプリングしてみる res = [] for i in range(1000): res.append(perm_func(g1,g2) #実際の比率の差 data_diff = float(sum(g1)/len(g1) - float(sum(g2)/len(g2)
これらを元に必要そうな情報を取り出します。
#視覚的にみてみる import matplotlib.pyplot as plt plt.hist(res) plt.axvline(data_diff,color='r') #数値的に上下5%の値をみてみる print(np.quantile(res,[0.95,0.05]))
これで5%区間に入っていたら、偶然である、と判断することができます。
これだけみると仕組みは非常にシンプルで、視覚的にも捉えやすく、活用範囲も広いように感じます。
ただ、これほどまでに便利な手法なのに、なぜそれほど一般的ではないのか?というのが気になります。
なぜあまり一般的ではないのか
一つは本書にも書かれているのですが、リサンプリングを繰り返すので、それをこなせるマシンが各検定の理論が作られた時期にはなかったこと。
もう一つは、これは私の想像ですが、現在の統計の学習の過程で、各検定と統計的仮説検定の枠組みが密接になって教えられていることがあると思われます。
統計的仮説検定の枠組みで考えることと、t検定などを使うことは必ずしも同じ、ではないのですが、
きちんと理解せず、フォーマットだけ覚えてしまった場合、決まったパターンの検定を選択することが「仮説検定」をしていることである、と考えてしまいがちです。
そして、これは特にビジネス組織にありがちですが、バックグラウンドが違う人間が多い場合、多数のパラダイムで意思決定が行われ、それ以外は排除されるため、あまり有名ではない手法は有用でも受け入れられにくい、ことがあるので使用する際には注意が必要です。