分布を比較する

正規分布の「大小」を知りたい。


確率密度が正規分布であり独立な二つの確率変数 $X_1$, $X_2$ があったとする。その二つの確率変数を比較した際に片方が片方よりも大きくなる蓋然性を求めたい。「平均値が大きい方が、勝ちやすそう」「分散が大きくなると、勝率が半々に近づきそう」とおおよその見当はつくし、世間一般ではそのような定性的な判断をするシチュエーションは多い。数値計算的に比較を多数行えばおおよその確率は求まりそうだが、解析的に求められるなら求めたい。

正規分布ふりかえり

正規分布は左右対称の釣鐘型で平均値と中央値と最頻値が同じで、実数の全範囲で積分すると有限値(=1)になる。平均値から変曲点までの距離が母標準偏差$\sigma$と一致し、その範囲内には全体の約68%が収まっている。

英語ではNormal distributionと呼ばれる程、「普通」の分布だ。統計学の最も知られている定理である中心極限定理など統計学のいたるところで登場する。またある条件で正規分布に近似できることが知られている分布(サンプル数が多い二項分布や、母平均$\mu$が大きいポワソン分布 etc)が対象になっている場合や、母分布に関して特にヒントがない場合など、「正規分布である」と仮定される場面は多い。

正規分布の大小

確率密度が正規分布であり独立な二つの確率変数$X_1$,$X_2$があったとする。その二つの確率変数を比較した際に片方が片方よりも大きくなる確率を求めたい。$X_1$が$X_2$よりも大きくなる確率

$ P(X_1-X_2 \geq 0) $

を考える。二つの分布の差の分布を知りたいので、その分布の平均値と分散を求める。確率変数の変換公式から次のようになる。

$ \mu = E(X_1-X_2) = \mu1 - \mu2 \\\ \sigma^2 = Var(X_1-X_2) = \sigma_1^2 + \sigma_2^2 $

$\mu$と$\sigma$が分かったので、この分布を標準化できる。

$ \cfrac{X_1 - X_2 - \mu}{\sigma} = N(0,1) $

ここで最初の「二つの確率変数の差」を次のように書きなおすことができる。

$ \begin{align} P(X_1-X_2 \geq 0) &= P(X_1-X_2 - \mu \geq - \mu ) \nonumber \\\ &= P\biggl( \cfrac{X_1-X_2-\mu}{\sigma} \geq \cfrac{-\mu}{\sigma} \biggr) \nonumber \\\ &= P\biggl( N(0,1) \geq \cfrac{-\mu}{\sigma} \biggr) \nonumber \\\ \end{align} $

これはつまり標準正規分布$N(0,1)$中の$\cfrac{-\mu}{\sigma}$以上となる領域の面積を求めればいいことになる。標準正規分布の累積分布関数は誤差関数を使って次のように求められることが知られている。

$ F_x(x) = \cfrac{1}{2} \biggl( 1 + erf \biggl( \cfrac{x}{\sqrt{2}} \biggr) \biggr) $

まとめると次のようになる。

$ P(X_1-X_2 \geq 0) = \cfrac{1}{2} \biggl( 1 + erf \biggl( \cfrac{\mu}{\sqrt{2 \sigma^2} } \biggr) \biggr) $

デモ

以下はR言語で記述したデモだ。

{% highlight ruby %}

二つの正規分布のパラメーター

x1は安定して強いが、x2は弱いがたまに化けるようなものを想定

x1_mu <- 1.0 x1_sd <- 1.0 x2_mu <- 0.0 x2_sd <- 2.0

解析的に求める

mu <- x1_mu - x2_mu sd2 <- x1_sd*x1_sd + x2_sd*x2_sd erf <- function(x) 2 * pnorm(x * sqrt(2)) - 1 pa <- 0.5 *( 1.0 + erf( (x1_mu-x2_mu)/(2.0*sd2)^0.5 ) ) print( pa );

数値計算的に求める

sampleNum <- 10000 x1f <- rnorm(sampleNum, x1_mu, x1_sd ) x2f <- rnorm(sampleNum, x2_mu, x2_sd ) pb <- sum(x1f > x2f) / sampleNum print( pb );

[1] 0.6726396 [1] 0.6674

{% endhighlight %}

またC99には誤差関数erf()が標準で存在する(一方で標準正規分布を返す関数はない)。