あるshimaoの備忘録的な何か

コードを書かない分析系の記事を書いていきます。コードを記述する場合はQiitaに書いています。

各群における反応率と各群の総サンプル数しかわからない場合の検定

この記事に書いたこと

  • 書くことになったきっかけ
  • standard error of the difference of proportions(SEDP)について
  • SEDPの導出

書いた動機

先日、上長と話していたとき『機械学習するときにどれだけサンプル数があれば良いか』って話になりました。そこでサンプリングしてサンプル数減らして機械学習してる論文を探していたところ、2群の分類学習で各群15,600にサンプリングしているモノを発見。で、この15,600って数学的にどういう意味やねんって事をSEDPを例として説明しました。そのメモとしてこの記事を書いています。

※15,600という数値はブログ用に適当に値を作っています

SEDPってなんやねん?

 2群の「反応率の差の標準誤差」です。

二項分布における分散を使用しているため、yes/noなどの2者択一のモノに対する反応率についての差の検定に用いる事が可能です。

標準誤差自体は正規分布ですので、その信頼区間を用いて簡単な検定を行うという時に使用します。

つまりZ値を用いた検定です。

簡単な例

3つのサイトの支持率の間に差があるのかどうか、を例にとって見ていきます。

SEDP = {p1(1-p1)/N1 + p2(1-p2)/N2}^0.5  p:サイトの支持率、N:投票者数

として話を進めます。

各サイトのプロパティを以下に記載します。

 サイト1:支持率 75%, 投票者数 400名

 サイト2:支持率 53%, 投票者数 1,500名

 サイト3:支持率 50%, 投票者数 700名

以下、差の検定の計算例を示す。

 SEDP_1,2 = {0.75*(1-0.75)/400 + 0.53*(1-0.53)/1500}^0.5 ⋍ 0.025

 Z score_1,2 = |p1 – p2| / SEDP1,2  = (0.75 – 0.53)/0.025 ⋍ 8.8

 SEDP_2,3 = {0.53*(1-0.53)/1500 + 0.50*(1-0.50)/700}^0.5 ⋍ 0.023

 Z score_2,3 = |p2 – p3| / SEDP2,3  = (0.53 – 0.50)/0.023 ⋍ 1.3

 Z score_1,2 > 1.96(95%のz値)

 Z score_2,3 < 1.64(90%のz値)

したがって、サイト1とサイト2の支持率には95%水準で有意差があるが、サイト2とサイト3の支持率には90%水準でも有意差がない、ということになります。

ただ、これ、本来は多重比較しないと評価が甘く出てしまい、第一種の過誤が起きてしまう場面です。3群以上の検定をする場合は多重比較をして下さい。

(2群の比率の差を見る場合、無理にSEDP使わなくても比率の差の検定していただければ大丈夫です。)

SEDPによるサンプルサイズの検討

信頼度95%、反応率5%、0.5%の誤差を検出する。

という条件の下での必要サンプル数をSEDPによって求めてみます。

式としては以下のようになります。

 0.5%/1.96 = {p(1-p)/N + (p+d)(1-p-d)/N}^0.5  p:反応率、N:必要サンプル数

これをNについて計算すると、N⋍15,286となります。

15,600サンプルぐらいだと大体上のような条件の場合が想定されるわけです。

ただ、これもボンフェローニ補正をしていない場合の計算ですのでご注意下さい。

SEDPの導出

2つの独立した正規母集団N(μx, σx2)とN(μY, σY2)を考える。ここで期待値および分散の基本フォーミュラより、

 E[Xb] = E[1/nΣXi] = 1/nE[ΣXi] = 1/nΣE[Xi] = μ

 V[Xb] = V[1/nΣXi] = 1/n2V[ΣXi] = 1/n2ΣV[Xi] = (1/n)σ2

ここでXbはXの平均値を指す。期待値ではないのでこの段階では揺らぐ値であることに注意。

また、各々の集団より抽出された標本平均の分布は、

 Xb~N(μx, σx2/n), Yb~N(μY, σY2/m)   (各々サンプル数をn、mとした)

次に標本平均の差の標本分布を考える。ここでも期待値、分散の基本フォーミュラに立ち返ることにより導出を行い、

 Xb – Yb = Xb + (-1)・Yb ~ N(μx + (-1)・μY, σx2/n + (-1)2σY2/m)

したがって、

  Xb – Yb ~ N(μx - μY , σx2/n + σY2/m)

これにより標準誤差は(σx2/n + σY2/m)^0.5であることが導かれた。

まとめ

最後のところ「導かれた(ドヤッ」って書いてありますが、これであってんだっけ?って思いながら書きましたw

絶賛ツッコミお待ち中です!

おかしいところあったらガンガンツッコんで下さいませm(_ _)m

Appendix

SEPと期待値、分散についてもついでに書いておきます。

期待値、分散の基本フォーミュラ

期待値:E[X] = Σk kP (X = k)

分散:V[X] ≡ E[(X - μ)2] ただしμ≡E[X]

ここから

 E[cX] = cE[X] = cμ

 V[cX] = E[(cX – cE[X])2] = E[c2(X - μ)2] = c2E[(X - μ)2] = c2V[X]

またXとYが独立、E[X]=μ, E[Y]=νとして

 V[X+Y] = E[{(X+Y) – (μ+ν)}2] = E[{(X –μ) + (Y – ν)}2]

         = E[(X - μ)2 + (Y - ν)2 + 2(X - μ)(Y - ν)]

         = E[(X - μ)2] + E[(Y - ν)2] + E[2(X - μ)(Y - ν)]

         = V[X] + V[Y] + 2E[(X - μ)(Y - ν)]

ここで右辺第3項はX,Yの独立性から

 2E[(X - μ)(Y - ν)] = 2E[X - μ]E[Y - ν] = 2(μ - μ)(ν - ν) = 0

したがって、XとYが独立である場合、

 V[X+Y] = V[X] + V[Y]

standard error of a proportion(SEP)の導出

2項分布Bn(n,p)の分散を求めることによって導出できる。以下書き下す。

ます確率pで1、確率q≡1-pで0が出る独立な確率変数Z1,…,Znを考える。左の場合、その合計X≡Z1+…+Znは2項分布Bn(n,p)に従うことは自明。ここで事象の独立性から

 V[X] = V[Z1]+…+ V[Zn]

また、定義どおりの計算により

 V[Zt] = E[(Zt - p)^2] = (1-p)2p + (0-p)2q = q2p + p2q = pq(q + p) = pq    (t=1,…,n)

よってBn(n,p)の分散はV[X] = npq = np(1-p)

 SEP = SD/(n)^0.5 = (V[X]/n)^0.5 / (n)^0.5 = {p(1-p)/n}^0.5

参考書籍

javaでグレンジャー因果検定やってみた

以前qiitaでアップしていた記事です。

せっかくなのでリンクだけ貼っておきましたw

javaでグレンジャー因果検定やってみた

 

参考書籍を以下に掲載しておきます。

短文スミマセン (´Д`;)ヾ ドウモスミマセン

SVDによる次元圧縮の効果を見てみる

SVD入門

SVDについてはwikipediaやteramonagi大先生のRcppEigen & singular value decompositionを参照していただきたく思います。

今回やっていることを手順ごとに簡単に書くと、

 1.行列XをX=UΣV^Tと分解

 2.情報量の多い上位k個の特異値を用いk列の正規直交ベクトルV_kを得る

 3.XV_kを計算することで情報量を圧縮した空間に元々の行列XをX_kに写像する

情報が落ちるというマイナス面はあるのですが、ノイズ軽減、計算時間削減などの効果もあります。

今回はディスプレイ広告をクリックするか否かを広告の情報などから学習するモデルの構築をSVDを使った例として挙げています。

といっても、ノイズの多いスパースなデータをSVDで圧縮してC-SVM(ソフトマージンSVM)にかけるだけの簡単なお仕事です。

今考えると発生させたデータはスパースなのでLanczos法などを用いる方が合理的だったかもしれません。。

 

以下pythonのコードを記載します。

コード

gist6463769

SVDで圧縮しない場合、まともな結果が出てきませんので試しにやってみてください。

※発生したデータによってはSVDの段階でエラーが発生する場合があります。その場合は再度実行し、それでもエラーが出る場合はrandom seedの値を変更して再実行してください。

 

参考

上で記載したSVD(特異値分解)やSVMなどがわかりやすく書いてありますので以下の書籍ご参考にされると良いと思います。

まとめ

例で発生させたデータが汚いのでSVDによる効果が見えやすいのではないかと思います。

ただ、SVDはデータを一箇所に集める必要があり分散処理には向かないという欠点があります。しかし、他の手法と比較しても効果の高さは実証されており、次元圧縮の有効な手段であることには変わりありません。

SVDの有効性に関しては

Scalable Supervised Dimensionality Reduction Using Clusteringを参照してください。

今回は横着してSVDやSVMの説明は外部に譲ってしまいましたが、

次回以降余裕があれば詳細な説明も記載していこうと思います。

追記

SVMかける前に正規化した方がいいですね。。。初歩的な事忘れてました。。。