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

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

連続一様分布について

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

連続一様分とは

確率変数がどのような値でも、その時の確率密度関数が一定の値をとる分布のことを連続一様分布といいます。

連続一様分布に従う確率密度関数と期待値と分散

確率変数Xがa <= X <= bにおける連続一様分布に従うとき、確率密度関数と期待値と分散はそれぞれ次のようになります。


f(x) = \frac{1}{b-a}\quad (a \leq X \leq b)

f(x) = 0\quad (X < a, X > b)

E(X) = \frac{a+b}{2}

V(X) = \frac{(b-a)^2}{12}

例えば、確率変数Xが1 <= X <= 4における連続一様分布に従うとき、確率密度関数と期待値と分散はそれぞれ以下のようになります。


f(x) = \frac{1}{b-a}\quad (1 \leq X \leq 4) = \frac{1}{4-1} =\frac{1}{3}

E(X) = \frac{a+b}{2}=\frac{1+4}{2}=\frac{5}{2}

V(X) = \frac{(b-a)^2}{12}=\frac{(4-1)^2}{12}=\frac{9}{12}=\frac{3}{4}

連続一様分布に従う累積分布関数

確率密度関数f(x)が連続一様分布に従う場合の累積分布関数F(x)は以下のようになります。


F(x) = \frac{x-a}{b-a}\quad (a \leq X < b)

F(x) = 0\quad (X < a)

F(x) = 1\quad (X \geq b)

例えば、2以上12以下の範囲で乱数を10,000個作成したとき、その中で6以下、もしくは9以上の値をとる確率は以下のようになります。


F(x) =(2 \leq X \leq 6)+(9 \leq X \leq 12)= \frac{6-2}{12-2}+\frac{12-9}{12-2}=\frac{4}{10}+\frac{3}{10}=\frac{7}{10}

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

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

from fractions import Fraction

a = 1
b = 4
fx = Fraction(1, (b - a))

ex = Fraction((a + b), 2)
vx = Fraction((b - a)**2, 12)

print("f(X ) = ", fx)
print("E(X) = ", ex)
print("V(X) = ", vx)

f(X ) = 1/3
E(X) = 5/2
V(X) = 3/4

連続一様分布に従う累積分布関数の求め方その1

pythonで連続一様分布に従う累積分布関数の確率を求める場合は、先ほどの式を使用して以下のように求めることができます。

a = 2
b = 12
x1 = 6
x2 = 9

print("F(X) = (2 < x < 6) + (9 < x < 12)なので")
Fx = Fraction((x1 - a), (b - a)) + Fraction((b - x2), (b - a))

print("F(X ) = ", Fx)

F(X) = (2 < x < 6) + (9 < x < 12)なので
F(X ) = 7/10

連続一様分布に従う期待値と分散の求め方その2(random.uniform)

random.uniformを使用すると、連続一様分布に従ったデータを生成することができます。以下の例では、random.uniformを使用して1から4までの連続一様分布に従うデータを10000個生成して、そのデータを使用して期待値と分散を求めています。

import random
from statistics import mean
from statistics import pvariance

x = []
for i in range(10000):
    x.append(random.uniform(1, 4))

m = mean(x)
v = pvariance(x)

print("E(X) = ", m)
print("V(X) = ", v)

E(X) = 2.5047683204489855
V(X) = 0.7423550594411364

連続一様分布に従う累積分布関数の求め方その2(random.uniform)

連続一様分布に従う累積分布関数の確率を求める場合は、以下のように条件に合うデータの数をカウントすることで確率を求めることができます。

x = []
for i in range(10000):
    x.append(random.uniform(2, 12))

p1 = 0
p2 = 0

for j in x:
    if j <= 6:
        p1 += 1 #6以下のデータをカウントする

for k in x:
    if k >= 9:
        p2 += 1 #9以上のデータをカウントする

p = (p1+ p2)/10000
print("F(X ) = ", p)

F(X ) = 0.6981

連続一様分布に従う期待値と分散の求め方その3(np.random.uniform)

np.random.uniformを使用すると、連続一様分布に従ったデータを生成することができます。以下の例では、np.random.uniformを使用して1から4までの連続一様分布に従うデータを10000個生成して、そのデータを使用して期待値と分散を求めています。

import numpy as np
from statistics import mean
from statistics import pvariance

x = np.random.uniform(1,4,10000)

m = mean(x)
v = pvariance(x)

print("E(X) = ", m)
print("V(X) = ", v)

E(X) = 2.50598766012386
V(X) = 0.7446555437307987

連続一様分布に従う累積分布関数の求め方その3(np.random.uniform)

連続一様分布に従う累積分布関数の確率を求める場合は、以下のように条件に合うデータの数をカウントすることで確率を求めることができます。

x = np.random.uniform(2,12,10000)

p1 = 0
p2 = 0

for i in x:
    if i <= 6:
        p1 += 1 #6以下のデーたをカウントする

for j in x:
    if j >= 9:
        p2 += 1 #9以上のデータをカウントする

p = (p1+ p2)/10000
print("F(X ) = ", p)

F(X ) = 0.702

連続一様分布に従う確率と期待値と分散の求め方その4(uniform)

scipy.statsのuniformを使用することでも、連続一様分布に従ったデータを生成することができます。以下の例では、scipy.statsのuniformを使用して1から4までの連続一様分布に従うデータを10000個生成して、そのデータを使用して期待値と分散を求めています。scipy.statsのuniformの場合、区間を指定するときは、loc, loc+scaleとなるように指定します。

from scipy.stats import uniform
from statistics import mean
from statistics import pvariance

x = np.linspace(uniform.ppf(0.01, loc=1.0, scale=3.0), uniform.ppf(0.99, loc=1.0, scale=3.0), 1)
p = uniform.pdf(x,loc=1, scale=3)

x2 = uniform.rvs(loc=1.0, scale=3.0, size=10000) #区間 loc, loc+scale

m = mean(x2)
v = pvariance(x2)

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

P(X) = [0.33333333]
E(X) = 2.4900863096103154
V(X) = 0.7406137576339912

連続一様分布に従う累積分布関数の求め方その4(uniform)

連続一様分布に従う累積分布関数の確率を求める場合は、以下のように条件に合うデータの数をカウントすることで確率を求めることができます。

x2 = uniform.rvs(loc=2.0, scale=10.0, size=10000) #区間 loc, loc+scale
p1 = 0
p2 = 0

for i in x2:
    if i <= 6:
        p1 += 1 #6以下のデータをカウントする

for j in x2:
    if j >= 9:
        p2 += 1 #9以上のデータをカウントする

p = (p1+ p2)/10000
print("F(X ) = ", p)

F(X ) = 0.7041

参考

統計学の時間 | 統計WEB