ベータ分布(beta distribution)は、区間 (0, 1) 上で定義される連続型確率分布である。割合や確率といった 0 から 1 の値をとる量をモデル化するのに適しており、ベイズ統計学では二項分布の共役事前分布として重要な役割を果たす。
ベータ分布は2つのパラメータによって多様な形状をとることができ、一様分布、U字型、J字型、単峰型など様々な分布の形を表現できる柔軟性をもつ。
ベータ関数
ベータ分布を定義する前に、ベータ関数を導入する。ベータ関数は正の実数 a > 0, b > 0 に対して次のように定義される。
ベータ関数はガンマ関数を用いて表すことができる。
ベータ関数には以下の性質がある。
- 対称性: B(a, b) = B(b, a)
- 特殊値: B(1, 1) = 1、B\left(\dfrac{1}{2}, \dfrac{1}{2}\right) = \pi
定義
パラメータ a > 0, b > 0 に対して、確率変数 X が以下の確率密度関数をもつとき、X はベータ分布に従うという。この分布を \text{Be}(a, b) と表記する。
パラメータ a と b によって分布の形状が決まる。
- a = b = 1: 一様分布(水平な直線)
- a = b > 1: 対称な単峰型(x = 0.5 に最頻値)
- a < 1 かつ b < 1: U字型(両端で発散)
- a > b: 右に歪んだ分布
- a < b: 左に歪んだ分布
グラフ
異なるパラメータに対するベータ分布の確率密度関数を示す。
\text{Be}(2, 5) と \text{Be}(5, 2) は互いに鏡像の関係にある。これはベータ分布の対称性 X \sim \text{Be}(a, b) \Rightarrow 1-X \sim \text{Be}(b, a) を反映している。
期待値と分散
ベータ分布 \text{Be}(a, b) の期待値と分散は次のようになる。
【期待値の導出】 ベータ関数の性質を利用する。
【分散の導出】 まず E[X^2] を求める。
よって分散は
最頻値(モード)は a > 1 かつ b > 1 のとき次のようになる。
対称性
ベータ分布には重要な対称性がある。
X \sim \text{Be}(a, b) のとき
特に a = b のとき、分布は x = 0.5 に関して対称になる。
ガンマ分布との関係
ベータ分布は独立なガンマ分布の比として構成できる。
X_1 \sim \text{Ga}(a, c)、X_2 \sim \text{Ga}(b, c) が独立のとき
この関係から、ベータ分布は「全体のうちの割合」を表す自然な分布であることがわかる。また、\dfrac{X_1}{X_1+X_2} と X_1+X_2 は独立であることも重要な性質である。
一様分布との関係
ベータ分布 \text{Be}(1, 1) は区間 (0, 1) 上の一様分布に一致する。
a = b = 1 のとき、確率密度関数は f(x) = \dfrac{1}{B(1,1)} = 1 となり、一様分布の確率密度関数に一致する。
計算例
X \sim \text{Be}(2, 5) のとき、期待値と分散を求める。
練習問題
ベータ分布の対称性より
期待値は E[1-X] = \dfrac{6}{6+4} = 0.6 となる。これは 1 - E[X] = 1 - \dfrac{4}{10} = 0.6 と一致する。
まとめ
| 項目 | 内容 |
|---|---|
| 分布名 | ベータ分布(beta distribution) |
| 表記 | \text{Be}(a, b) |
| パラメータ | a > 0、b > 0 |
| 台 | 0 < x < 1 |
| 確率密度関数 | f(x) = \dfrac{x^{a-1}(1-x)^{b-1}}{B(a,b)} |
| 期待値 | E[X] = \dfrac{a}{a+b} |
| 分散 | V[X] = \dfrac{ab}{(a+b)^2(a+b+1)} |
| 対称性 | X \sim \text{Be}(a,b) \Rightarrow 1-X \sim \text{Be}(b,a) |
| 特殊ケース | \text{Be}(1,1) = U(0,1) |
Pythonで実装する
Pythonを使ってベータ分布の計算やシミュレーションを行う。
import numpy as np
from scipy import stats
from scipy.special import beta as beta_func
# パラメータ設定
a, b = 2, 5 # Be(2, 5)
print(f"=== ベータ分布 Be({a}, {b}) ===")
dist = stats.beta(a, b)
print(f"期待値: E[X] = a/(a+b) = {dist.mean():.6f}")
print(f"分散 : V[X] = {dist.var():.6f}")
# 理論値
print(f"理論値 E[X] = {a/(a+b):.6f}")
print(f"理論値 V[X] = {a*b/((a+b)**2*(a+b+1)):.6f}")
# 確率密度関数
print(f"\n確率密度関数の値:")
for x in [0.1, 0.2, 0.3, 0.4, 0.5]:
print(f" f({x}) = {dist.pdf(x):.6f}")
# 累積分布関数
print(f"\n累積分布関数:")
for x in [0.2, 0.4, 0.6, 0.8]:
print(f" P(X ≤ {x}) = {dist.cdf(x):.4f}")
# ベータ関数の値
print(f"\nベータ関数 B({a}, {b}) = {beta_func(a, b):.6f}")
# 一様分布との関係
print(f"\n=== 一様分布との関係 ===")
print("Be(1, 1) = U(0, 1)")
be11 = stats.beta(1, 1)
unif = stats.uniform(0, 1)
print(f"Be(1,1): E[X]={be11.mean():.4f}, V[X]={be11.var():.6f}")
print(f"U(0,1): E[X]={unif.mean():.4f}, V[X]={unif.var():.6f}")
# 対称性の確認
print(f"\n=== 対称性の確認 ===")
print(f"X ~ Be({a},{b}) のとき 1-X ~ Be({b},{a})")
x_val = 0.3
be_ab = stats.beta(a, b)
be_ba = stats.beta(b, a)
print(f"Be({a},{b})のf({x_val}) = {be_ab.pdf(x_val):.6f}")
print(f"Be({b},{a})のf({1-x_val}) = {be_ba.pdf(1-x_val):.6f}")
# シミュレーション
np.random.seed(42)
n_samples = 10000
samples = np.random.beta(a, b, size=n_samples)
print(f"\nシミュレーション(n={n_samples}):")
print(f"標本平均: {np.mean(samples):.4f} (理論値: {a/(a+b):.4f})")
print(f"標本分散: {np.var(samples):.6f}")
対称性 f_{\text{Be}(a,b)}(x) = f_{\text{Be}(b,a)}(1-x) が数値的に確認できる。ベイズ統計学では、二項分布の成功確率の事前分布としてベータ分布がよく使われる。