Traffine I/O

日本語

2022-12-01

ベータ分布

ベータ分布とは

ベータ分布とは、ある試行の成功数 \alpha と失敗数 \beta が分かっている事象の成功率 x が従う確率分布です。 例えば、コイントスを10回繰り返して表 \alpha が7回、裏 \beta が3回出たとすると、このときの成功率(表が出る確率)はベータ分布に従います。

ベータ分布の確率密度関数は以下の式で表されます。

f(x) = {\frac{x^{\alpha -1}(1-x)^{\beta -1}}{B(\alpha ,\beta)}}
B(\alpha, \beta) = \int_{0}^{1}x^{\alpha-1}(1-x)^{\beta-1}dx

ベータ分布は下図が示す通り、 \alpha\beta の値によって形状に柔軟に変化します。

Beta distribution

そのため、事前確率分布として扱いやすいためベイズ統計で頻繁に使用されます。

ベータ分布の α の影響

ベータ分布の \alpha は値により以下のような分布の形状になります。

Beta distribution alpha

ベータ分布の β の影響

ベータ分布の \beta は値により以下のような分布の形状になります。

Beta distribution beta

ベータ分布の期待値と分散

ベータ分布の期待値、分散はそれぞれ以下になります。

E(X)=\frac{\alpha}{\alpha + \beta}
V(X)=\frac{\alpha \beta}{(\alpha + \beta)^2(\alpha + \beta + 1)}

Python コード

今回使用したPythonコードは以下になります。

ベータ分布の描画

import numpy as np
from scipy.stats import beta
import matplotlib.pyplot as plt

plt.style.use('ggplot')
fig, ax = plt.subplots(facecolor="w", figsize=(10, 5))

# x axis
x = np.linspace(0, 1, 100)

# draw graph
plt.plot(x, beta.pdf(x, 1, 1), label='beta(1,1)')
plt.plot(x, beta.pdf(x, 1, 2), label='beta(1,2)')
plt.plot(x, beta.pdf(x, 2, 1), label='beta(2,1)')
plt.plot(x, beta.pdf(x, 5, 1), label='beta(5,1)')
plt.plot(x, beta.pdf(x, 7, 2), label='beta(7,2)')
plt.plot(x, beta.pdf(x, 5, 5), label='beta(5,5)')
plt.plot(x, beta.pdf(x, 1, 5), label='beta(1,5)')
plt.plot(x, beta.pdf(x, 2, 7), label='beta(2,7)')
plt.plot(x, beta.pdf(x, 10, 10), label='beta(10,10)')
plt.legend()
plt.xlabel("x")
plt.ylabel("Probability density")
plt.show()

Beta distribution

α の影響の描画

import numpy as np
from scipy.stats import beta
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation, rc
from matplotlib.animation import FuncAnimation

rc('animation', html='html5')
np.random.seed(5)

# Set up formatting for the movie files
Writer = animation.writers['ffmpeg']
writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)

prob_vals = np.arange(start=0.1, stop=10.01, step=0.2)

plt.style.use('ggplot')
fig = plt.figure(figsize=(10, 5))

# x axis
x = np.linspace(0, 1, 100)

def update(i):
    # initialize the graph of the previous frame
    plt.cla()
    p = prob_vals[i]

    # draw graph
    plt.plot(x, beta.pdf(x, round(p, 1), 2))
    plt.title(f'$alpha={str(round(p, 1))}, beta=2$', loc='left')
    plt.xlabel("x")
    plt.ylabel("Probability density")
    plt.ylim(0.1, 10.1)
    plt.xticks(ticks=[0, 1]) # x axis ticks

anime_prob = FuncAnimation(fig, update, frames=len(prob_vals), interval=1000)
anime_prob.save('beta_dist_alpha.gif', writer='pillow', fps=10)

Beta distribution alpha

β の影響の描画

import numpy as np
from scipy.stats import beta
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation, rc
from matplotlib.animation import FuncAnimation

rc('animation', html='html5')
np.random.seed(5)

# Set up formatting for the movie files
Writer = animation.writers['ffmpeg']
writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)

prob_vals = np.arange(start=0.1, stop=10.01, step=0.2)

plt.style.use('ggplot')
fig = plt.figure(figsize=(10, 5))

# x axis
x = np.linspace(0, 1, 100)

def update(i):
    # initialize the graph of the previous frame
    plt.cla()
    p = prob_vals[i]

    # draw graph
    plt.plot(x, beta.pdf(x, 2, round(p, 1)))
    plt.title(f'$alpha=2, beta={str(round(p, 1))}$', loc='left')
    plt.xlabel("x")
    plt.ylabel("Probability density")
    plt.ylim(0.1, 10.1)
    plt.xticks(ticks=[0, 1]) # x axis ticks

anime_prob = FuncAnimation(fig, update, frames=len(prob_vals), interval=1000)
anime_prob.save('beta_dist_beta.gif', writer='pillow', fps=10)

Beta distribution beta

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!