ヘロログ
統計学

ベルヌーイ分布

ベルヌーイ分布は、「成功」か「失敗」の2つの結果しかない試行を表す、もっとも基本的な離散型確率分布である。

日常生活でも、ベルヌーイ分布に従う現象は数多く存在する。コイン投げで表が出るか裏が出るか、製品が良品か不良品か、患者が回復するかしないか、顧客が購入するかしないかなど、結果が2通りしかない状況はすべてベルヌーイ分布で表現できる。

ベルヌーイ分布は二項分布の基礎となる分布であり、独立なベルヌーイ試行を繰り返したときの成功回数が二項分布に従う。機械学習における二値分類やロジスティック回帰など、多くの手法の理論的基盤となっている。

定義

2つの結果のうち、いずれか一方が起こる試行を考える。一方の結果を「成功」、もう一方を「失敗」と呼ぶ。成功の起こる確率を p0 < p < 1)とする。このような試行をベルヌーイ試行(Bernoulli trial)という。

確率変数 X を、成功のとき 1、失敗のとき 0 をとるように定義する。このとき X の従う分布をベルヌーイ分布(Bernoulli distribution)といい、\text{Bin}(1, p) または \text{Bernoulli}(p) と表す。

ベルヌーイ分布の確率関数
P(X = x) = p^x (1-p)^{1-x}, \quad x = 0, 1

q = 1 - p とおくと、次のようにも書ける。

P(X = x) = p^x q^{1-x}, \quad x = 0, 1

具体的に値を代入すると

  • P(X = 0) = p^0 q^1 = q = 1 - p(失敗の確率)
  • P(X = 1) = p^1 q^0 = p(成功の確率)

確率分布のグラフ

ベルヌーイ分布は x = 0x = 1 の2点でのみ確率をもつ。以下は p = 0.3 の場合のグラフである。

P(X=x) 1.0 0.75 0.5 0.25 0 x 0 1 0.7 0.3 失敗 成功
図1: ベルヌーイ分布の確率関数(p=0.3)

p が大きくなると x = 1 の確率が大きくなり、グラフの形が変化する。p = 0.5 のとき、2つの棒の高さが等しくなる。

期待値と分散

期待値

ベルヌーイ分布の期待値は次のように求められる。

\begin{aligned} E[X] &= \sum_{x=0}^{1} x \cdot P(X = x) \\[5pt] &= 0 \times q + 1 \times p \\[5pt] &= p \end{aligned}
期待値
E[X] = p

期待値が成功確率 p そのものに等しいのは直感的にも理解しやすい。

分散

分散は V[X] = E[X^2] - (E[X])^2 から求める。X01 しかとらないので、X^2 = X が成り立つ。したがって

E[X^2] = E[X] = p

よって分散は

\begin{aligned} V[X] &= E[X^2] - (E[X])^2 \\[5pt] &= p - p^2 \\[5pt] &= p(1 - p) = pq \end{aligned}
分散
V[X] = p(1-p) = pq

分散 V[X] = p(1-p)p = 0.5 のとき最大値 0.25 をとる。p0 または 1 に近づくと、結果がほぼ確定的になるため分散は小さくなる。

V[X] 0.25 0.20 0.15 0.10 0 p 0 0.25 0.5 0.75 1 最大値 0.25 (p = 0.5)
図2: 分散 V[X] = p(1-p) のグラフ(p = 0.5 で最大)
ポイント

ベルヌーイ分布 \text{Bin}(1, p) では

  • 期待値:E[X] = p
  • 分散:V[X] = p(1-p)
  • 分散は p = 0.5 で最大

確率母関数

確率母関数(probability generating function)は次のように求められる。

\begin{aligned} G(s) &= E[s^X] = \sum_{x=0}^{1} s^x \cdot P(X = x) \\[5pt] &= s^0 \times q + s^1 \times p \\[5pt] &= q + ps = ps + q \end{aligned}
確率母関数
G(s) = ps + q = ps + (1-p)

この確率母関数は二項分布との関係で重要な役割を果たす。独立なベルヌーイ試行を n 回繰り返したとき、成功回数の確率母関数は (ps + q)^n となり、これが二項分布の確率母関数である。

二項分布との関係

ベルヌーイ分布は二項分布 \text{Bin}(n, p) の特殊ケース(n = 1)である。

独立なベルヌーイ試行 X_1, X_2, \ldots, X_n(各 X_i \sim \text{Bin}(1, p))を考えると、その和

Y = X_1 + X_2 + \cdots + X_n

は二項分布 \text{Bin}(n, p) に従う。つまり、二項分布は「ベルヌーイ試行を n 回繰り返したときの成功回数の分布」である。

この関係から、二項分布の期待値と分散は次のように導ける。

\begin{aligned} E[Y] &= E[X_1] + \cdots + E[X_n] = np \\[5pt] V[Y] &= V[X_1] + \cdots + V[X_n] = npq \end{aligned}

簡単な計算例

例1:バスケットボールのフリースロー

あるバスケットボール選手のフリースロー成功率は70%である。この選手が1本のフリースローを打つとき、成功を 1、失敗を 0 とする確率変数 X の期待値と分散を求めよ。

【解答】

Xp = 0.7 のベルヌーイ分布に従う。

\begin{aligned} E[X] &= p = 0.7 \\[5pt] V[X] &= p(1-p) = 0.7 \times 0.3 = 0.21 \end{aligned}

例2:Webサイトの購入率

あるオンラインショップでは、訪問者が商品を購入する確率が5%である。ランダムに選んだ1人の訪問者について、購入を 1、非購入を 0 とする確率変数 X の確率関数、期待値、分散を求めよ。

【解答】

Xp = 0.05 のベルヌーイ分布に従う。

確率関数:

  • P(X = 0) = 1 - 0.05 = 0.95
  • P(X = 1) = 0.05
\begin{aligned} E[X] &= 0.05 \\[5pt] V[X] &= 0.05 \times 0.95 = 0.0475 \end{aligned}

標準偏差は \sigma = \sqrt{0.0475} \approx 0.218 である。

練習問題

問1. あるゲームで、プレイヤーが1回の挑戦でステージをクリアできる確率は40%である。クリアを 1、失敗を 0 とする確率変数 X の期待値と分散を求めよ。

Xp = 0.4 のベルヌーイ分布に従う。

\begin{aligned} E[X] &= p = 0.4 \\[5pt] V[X] &= p(1-p) = 0.4 \times 0.6 = 0.24 \end{aligned}
問2. ベルヌーイ分布において、分散 V[X] = p(1-p) が最大となる p の値と、そのときの分散を求めよ。

f(p) = p(1-p) = p - p^2p で微分すると

f'(p) = 1 - 2p

f'(p) = 0 より p = 0.5

f''(p) = -2 < 0 より、これは最大値である。

よって p = 0.5 のとき分散は最大値 0.5 \times 0.5 = 0.25 をとる。

問3. 成功確率 p = 0.3 のベルヌーイ分布に従う確率変数 X の確率母関数 G(s) を求め、G(2) の値を計算せよ。

確率母関数は

G(s) = ps + q = 0.3s + 0.7

s = 2 を代入すると

G(2) = 0.3 \times 2 + 0.7 = 0.6 + 0.7 = 1.3

まとめ

項目 内容
分布名 ベルヌーイ分布(Bernoulli distribution)
記法 \text{Bin}(1, p) または \text{Bernoulli}(p)
確率関数 P(X = x) = p^x (1-p)^{1-x} (x = 0, 1
期待値 E[X] = p
分散 V[X] = p(1-p)
確率母関数 G(s) = ps + (1-p)
二項分布との関係 \text{Bin}(n, p)n = 1 の場合

Pythonで実装する

Pythonを使ってベルヌーイ分布の計算やシミュレーションを行う。

bernoulli_distribution.py
import numpy as np
from scipy import stats

# パラメータ設定
p = 0.3  # 成功確率

# 期待値と分散(理論値)
E_X = p
V_X = p * (1 - p)

print("=== ベルヌーイ分布(p=0.3)===")
print(f"期待値(理論値): E[X] = {E_X}")
print(f"分散(理論値)  : V[X] = {V_X}")
print(f"標準偏差       : σ = {np.sqrt(V_X):.4f}")

# scipy.statsを使用した計算
dist = stats.bernoulli(p)
print(f"\nscipy.statsによる計算:")
print(f"期待値: {dist.mean()}")
print(f"分散  : {dist.var()}")

# 確率関数の確認
print(f"\n確率関数 P(X=x):")
print(f"  P(X=0) = {dist.pmf(0):.4f}")
print(f"  P(X=1) = {dist.pmf(1):.4f}")

# 確率母関数の計算
s = 2
G_s = p * s + (1 - p)
print(f"\n確率母関数 G({s}) = {G_s}")

# シミュレーション
np.random.seed(42)
n_samples = 10000
samples = stats.bernoulli.rvs(p, size=n_samples)

print(f"\nシミュレーション(n={n_samples}):")
print(f"標本平均: {np.mean(samples):.4f}")
print(f"標本分散: {np.var(samples, ddof=0):.4f}")
print(f"成功の割合: {np.sum(samples)/n_samples:.4f}")
=== ベルヌーイ分布(p=0.3)=== 期待値(理論値): E[X] = 0.3 分散(理論値) : V[X] = 0.21 標準偏差 : σ = 0.4583 scipy.statsによる計算: 期待値: 0.3 分散 : 0.21 確率関数 P(X=x): P(X=0) = 0.7000 P(X=1) = 0.3000 確率母関数 G(2) = 1.3 シミュレーション(n=10000): 標本平均: 0.2887 標本分散: 0.2054 成功の割合: 0.2887

シミュレーション結果が理論値(期待値0.3、分散0.21)に近い値を示しており、大数の法則により標本サイズを増やすほど理論値に収束する。