データ分析系プログラマーのブログ

主にPythonを使ったデータ分析や機械学習をやっています。

離散一様分布について

確率密度関数が常に一定の値をとる分布のことを一様分布と言います。一様分布には、離散型確率分布と連続型確率分布があります。この記事では、離散一様分布について紹介しています。

離散一様分布とは

離散一様分とは、サイコロのように離散型確率分布であり、1から6までの目が出る確率がすべて1/6というように同じ確率の分布を言います。

離散一様分布に従う確率と期待値と分散

確率変数Xが離散一様分布に従う時、Xの確率と期待値と分散は以下のようになります。


P(X = k) = \frac{1}{N}\quad (k = 1,2,3,\dots,N)

E(X) = \frac{N+1}{2}

V(X) = \frac{N^2+1}{12}

例えば、サイコロの出る目の確率は離散一様分布に従いますが、サイコロの出る目をXとすると、確率、期待値、分散は以下のようになります。


P(X = 1)=P(X = 2)=P(X = 3)=P(X = 4)=P(X = 5)=P(X = 6)=\frac{1}{6}

E(X)=\frac{6+1}{2}=3.5

V(X)=\frac{6^2-1}{12}=2.9

離散一様分布に従う確率と期待値と分散の求め方その1

pythonで離散一様分布に従う確率、期待値、分散を求めるには、先ほどの式を使用して以下のように求めることができます。

n = 6
px = 1/n
ex = (n + 1)/2
vx = (n**2 - 1)/12

print("P(X = 6) = ", px)
print("E(X) = ", ex)
print("V(X) = ", vx)

P(X = 6) = 0.16666666666666666
E(X) = 3.5
V(X) = 2.9166666666666665

離散一様分布に従う確率と期待値と分散の求め方その2

pythonで確率、期待値、分散を求める場合には、以下のように1から6までのデータを用意して求めることもできます。

import math

dice = [1,2,3,4,5,6]#サイコロの事象
ex = 0#期待値を演算するための変数
p = 1/len(dice)#サイコロの確率
sum01 = 0

for x in dice:
    px = (p*x)
    ex += px

for i in dice:
    r = (i - ex)**2
    sum01 += r

vx =p*sum01

print("P(X = 6) = ", p)
print("E(X) = ", ex)
print("V(X) = ", vx)

P(X = 6) = 0.16666666666666666
E(X) = 3.5
V(X) = 2.9166666666666665

離散一様分布に従う確率と期待値と分散の求め方その3

データが用意してある場合の確率、期待値、分散の求め方については、statisticsのライブラリを使用する場合もあります。meanやpvarianceを使用することで期待値や分散をあらかじめ要したデータから簡単に求めることができます。

from statistics import mean
from statistics import pvariance
dice = [1,2,3,4,5,6]

s = [i for i in dice if i == 1]
p = len(s)/len(dice)
m = mean(dice)
v = pvariance(dice)

print("P(X = 6) = ", p)
print("E(X) = ", m)
print("V(X) = ", v)

P(X = 6) = 0.16666666666666666
E(X) = 3.5
V(X) = 2.9166666666666665

離散一様分布に従う確率と期待値と分散の求め方その4

以下の例は、random.randintを使用して1から6までの整数をランダムに10000個生成したデータを使用して、それぞれ確率、期待値、分散を求めています。結果を見てみると、概ね解析的に求めた数値を同じ結果になっていることがわかります。

import random
discrete_uniform = [random.randint(1, 6) for i in range(10000)]

s = [i for i in discrete_uniform if i == 1]
p = len(s)/len(discrete_uniform)
m = mean(discrete_uniform)
v = pvariance(discrete_uniform)

print("P(X = 6) = ", p)
print("E(X) = ", m)
print("V(X) = ", v)

P(X = 6) = 0.1683
E(X) = 3.4941
V(X) = 2.92116519

参考

統計学の時間 | 統計WEB