幾何分布とは?定義・期待値の導出とPython実装

コインを投げ続けて、初めて表が出るまでに何回かかるでしょうか?サイコロを振り続けて、初めて6が出るまでに何回かかるでしょうか?

この「成功するまでに必要な試行回数」の分布が幾何分布(geometric distribution)です。名前の由来は、確率質量関数が等比数列(幾何級数)の形をしていることにあります。

幾何分布は「待ち時間の分布」として、以下のような幅広い場面で登場します。

  • 品質管理: 不良品が初めて検出されるまでの検査回数
  • 通信工学: パケットが初めてエラーなく到着するまでの送信回数
  • 生態学: 特定の種が初めて発見されるまでの観測回数
  • ゲーム理論: ガチャで当たりを引くまでの試行回数
  • 信頼性工学: 離散的な試行で故障が初めて発生するまでの回数

本記事の内容

  • 幾何分布の定義と2つの慣習(0始まり/1始まり)
  • 期待値と分散の導出
  • 無記憶性の定義と証明
  • 負の二項分布との関係
  • Pythonでの実装と可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

幾何分布とは — 「初めて成功するまでの回数」

直感

幾何分布の直感は非常にシンプルです。毎回同じ確率 $p$ で成功するベルヌーイ試行を繰り返し、初めて成功するまでの試行回数が幾何分布に従います。

コイン(表の確率 $p = 0.5$)を投げ続ける場面を考えましょう。

  • 1回目で表が出る確率: $p = 0.5$
  • 2回目で初めて表が出る確率: $(1-p) \cdot p = 0.25$(1回目が裏、2回目が表)
  • 3回目で初めて表が出る確率: $(1-p)^2 \cdot p = 0.125$
  • $k$ 回目で初めて表が出る確率: $(1-p)^{k-1} \cdot p$

確率は $p, p(1-p), p(1-p)^2, \ldots$ と公比 $(1-p)$ の等比数列(幾何級数)をなします。

2つの定義の慣習

幾何分布には2つの慣習があるため注意が必要です。

慣習1(成功までの試行回数): $X$ は初めて成功するまでの試行回数($X = 1, 2, 3, \ldots$)

$$ P(X = k) = (1-p)^{k-1} p, \quad k = 1, 2, 3, \ldots $$

慣習2(成功前の失敗回数): $Y$ は初めて成功する前の失敗回数($Y = 0, 1, 2, \ldots$)

$$ P(Y = k) = (1-p)^k p, \quad k = 0, 1, 2, \ldots $$

$Y = X – 1$ の関係があります。本記事では慣習1(試行回数)を主に使います。

数学的定義と正規化

確率質量関数

$X \sim \text{Geom}(p)$ のPMFは

$$ \begin{equation} P(X = k) = (1-p)^{k-1} p, \quad k = 1, 2, 3, \ldots \end{equation} $$

$q = 1 – p$ と書くと $P(X = k) = q^{k-1} p$ です。

正規化の確認

確率の合計が1になることを確認します。

$$ \sum_{k=1}^{\infty} q^{k-1} p = p \sum_{k=0}^{\infty} q^k = p \cdot \frac{1}{1-q} = p \cdot \frac{1}{p} = 1 $$

等比級数の和の公式 $\sum_{k=0}^{\infty} r^k = 1/(1-r)$($|r| < 1$)を使いました。$0 < p \leq 1$ なので $|q| < 1$ が保証されます。

累積分布関数

$P(X > k)$($k$ 回以内に成功しない確率)は

$$ P(X > k) = \sum_{j=k+1}^{\infty} q^{j-1} p = q^k \sum_{j=0}^{\infty} q^j p = q^k $$

よってCDFは

$$ F(k) = P(X \leq k) = 1 – q^k = 1 – (1-p)^k $$

$k$ 回以内に少なくとも1回成功する確率は $1 – (1-p)^k$ です。

期待値と分散を導出しましょう。

期待値の導出

方法1: 定義から直接計算

$$ E[X] = \sum_{k=1}^{\infty} k \cdot q^{k-1} p = p \sum_{k=1}^{\infty} k q^{k-1} $$

$\sum_{k=1}^{\infty} k r^{k-1} = 1/(1-r)^2$($|r| < 1$)を使うと

$$ E[X] = p \cdot \frac{1}{(1-q)^2} = p \cdot \frac{1}{p^2} = \frac{1}{p} $$

方法2: 条件付き期待値を使う方法

より直感的な導出方法があります。

1回目の試行で成功すれば(確率 $p$)、$X = 1$ です。失敗すれば(確率 $q = 1-p$)、1回の試行を「無駄にした」上で、残りは同じ問題の繰り返しなので $E[X] = 1 + E[X]$ 回かかります。

$$ E[X] = p \cdot 1 + q \cdot (1 + E[X]) $$

$E[X]$ について解くと

$$ E[X] = p + q + q \cdot E[X] $$

$$ E[X] – q \cdot E[X] = 1 $$

$$ E[X](1 – q) = 1 \quad \Rightarrow \quad E[X] = \frac{1}{p} $$

この方法は無記憶性を利用しており、後で正式に定義します。

サイコロで6が出るまでの期待試行回数は $1/p = 1/(1/6) = 6$ 回です。コイン($p = 0.5$)なら $1/0.5 = 2$ 回です。直感と一致しています。

分散の導出

$E[X^2]$ を計算するために $E[X(X-1)]$ を使います。

$$ E[X(X-1)] = \sum_{k=1}^{\infty} k(k-1) q^{k-1} p = pq \sum_{k=2}^{\infty} k(k-1) q^{k-2} $$

$\sum_{k=2}^{\infty} k(k-1) r^{k-2} = 2/(1-r)^3$ を使うと

$$ E[X(X-1)] = pq \cdot \frac{2}{p^3} = \frac{2q}{p^2} $$

$E[X^2] = E[X(X-1)] + E[X] = 2q/p^2 + 1/p$ より

$$ \text{Var}(X) = E[X^2] – (E[X])^2 = \frac{2q}{p^2} + \frac{1}{p} – \frac{1}{p^2} = \frac{2q + p – 1}{p^2} = \frac{q}{p^2} $$

$$ \begin{equation} \text{Var}(X) = \frac{1 – p}{p^2} \end{equation} $$

$p$ が小さいほど分散が大きくなります。成功確率が低いと、待ち時間のばらつきが非常に大きくなるのです。

次に、幾何分布の最も特徴的な性質 — 無記憶性 — を見ていきましょう。

無記憶性

定義

幾何分布は離散分布の中で唯一の無記憶性(memoryless property)を持つ分布です。

$$ \begin{equation} P(X > m + n | X > m) = P(X > n) \end{equation} $$

これは「$m$ 回失敗した後でも、追加で $n$ 回以上かかる確率は、最初から $n$ 回以上かかる確率と同じ」ということです。

直感

コインを10回投げて全部裏だったとします。「次こそ表が出るはず」と思いがちですが(ギャンブラーの誤謬)、実際には11回目に表が出る確率はやはり $p$ です。過去の失敗は将来の確率に影響を与えないのです。

証明

$$ P(X > m + n | X > m) = \frac{P(X > m + n)}{P(X > m)} = \frac{q^{m+n}}{q^m} = q^n = P(X > n) $$

CDFの公式 $P(X > k) = q^k$ を使いました。

無記憶性の特徴づけ

逆も成り立ちます。離散的で無記憶性を持つ分布は幾何分布に限ることが証明できます。

連続分布で無記憶性を持つのは指数分布だけであり、幾何分布は指数分布の離散版と見なすことができます。

幾何分布と他の分布の関係

負の二項分布との関係

$r$ 回目の成功が起きるまでの試行回数の分布が負の二項分布です。幾何分布は $r = 1$ の負の二項分布に相当します。

独立な幾何分布 $X_1, \ldots, X_r \sim \text{Geom}(p)$ の和 $S = X_1 + \cdots + X_r$ は負の二項分布 $\text{NegBin}(r, p)$ に従います。

指数分布との関係

ベルヌーイ試行の間隔を $\Delta t$ として、$p = \lambda \Delta t$ の幾何分布の極限 $\Delta t \to 0$ を取ると、指数分布 $\text{Exp}(\lambda)$ が得られます。

Pythonでの実装と可視化

幾何分布の基本的な可視化

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

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# (a) 異なるpでのPMF
ax = axes[0, 0]
p_values = [0.1, 0.3, 0.5, 0.7, 0.9]
colors = plt.cm.viridis(np.linspace(0, 0.9, len(p_values)))

for p, color in zip(p_values, colors):
    k = np.arange(1, 25)
    pmf = stats.geom.pmf(k, p)
    ax.bar(k + p_values.index(p) * 0.15 - 0.3, pmf, width=0.14,
           color=color, alpha=0.8, label=f'p = {p}')

ax.set_xlabel('k (number of trials)', fontsize=12)
ax.set_ylabel('P(X = k)', fontsize=12)
ax.set_title('Geometric Distribution PMF', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3, axis='y')
ax.set_xlim(0.5, 20)

# (b) CDF
ax = axes[0, 1]
for p, color in zip(p_values, colors):
    k = np.arange(0, 25)
    cdf = 1 - (1-p)**k
    ax.step(k, cdf, linewidth=2, color=color, where='post',
            label=f'p={p}, E[X]={1/p:.1f}')

ax.set_xlabel('k', fontsize=12)
ax.set_ylabel('F(k) = P(X ≤ k)', fontsize=12)
ax.set_title('Geometric Distribution CDF', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (c) 無記憶性のシミュレーション
ax = axes[1, 0]
np.random.seed(42)
p = 0.3
n_sim = 100000
X = np.random.geometric(p, n_sim)

# P(X > 5+n | X > 5) vs P(X > n)
m = 5
n_range = np.arange(1, 20)
cond_probs = []
uncond_probs = []

for n in n_range:
    cond = np.sum(X > m + n) / np.sum(X > m)
    uncond = np.mean(X > n)
    cond_probs.append(cond)
    uncond_probs.append(uncond)

theory = (1-p)**n_range

ax.plot(n_range, cond_probs, 'bo-', linewidth=1.5, markersize=5,
        label=f'$P(X>{m}+n | X>{m})$ (sim)')
ax.plot(n_range, uncond_probs, 'r^--', linewidth=1.5, markersize=5,
        label='$P(X>n)$ (sim)')
ax.plot(n_range, theory, 'g-', linewidth=2, alpha=0.5,
        label='$(1-p)^n$ (theory)')
ax.set_xlabel('n', fontsize=12)
ax.set_ylabel('Probability', fontsize=12)
ax.set_title(f'Memoryless Property (p={p}, m={m})', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (d) 期待値と分散
ax = axes[1, 1]
p_range = np.linspace(0.01, 0.99, 100)
mean_values = 1 / p_range
var_values = (1 - p_range) / p_range**2

ax.plot(p_range, mean_values, 'b-', linewidth=2.5, label='$E[X] = 1/p$')
ax.plot(p_range, var_values, 'r--', linewidth=2.5,
        label='$Var(X) = (1-p)/p^2$')
ax.set_xlabel('p (success probability)', fontsize=12)
ax.set_ylabel('Value', fontsize=12)
ax.set_title('Mean and Variance of Geometric Dist.', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.set_ylim(0, 50)
ax.set_xlim(0, 1)

plt.tight_layout()
plt.savefig('geometric_distribution.png', dpi=150, bbox_inches='tight')
plt.show()

この可視化から、幾何分布の特徴が明確に読み取れます。

  1. 左上(PMF): $p$ が大きいほどPMFは急速に減衰し、少ない試行回数で成功しやすいことがわかります。$p = 0.9$ ではほとんどの確率が $k = 1$ に集中していますが、$p = 0.1$ では裾が非常に長く、20回以上かかる確率も無視できません。

  2. 右上(CDF): $p$ が大きいほどCDFが早く1に近づきます。たとえば $p = 0.3$ のとき、10回以内に成功する確率は約97%です。

  3. 左下(無記憶性): $P(X > 5 + n | X > 5)$(青い丸)と $P(X > n)$(赤い三角)がほぼ完全に一致しており、無記憶性が数値的に確認されています。理論曲線(緑の実線)とも一致しています。

  4. 右下(期待値と分散): $p$ が0に近づくと期待値と分散が急激に増大します。成功確率が低いほど、待ち時間は長くなるだけでなく、ばらつきも大きくなります。

まとめ

本記事では、幾何分布の定義から性質、導出、応用まで解説しました。

  • 幾何分布 $P(X = k) = (1-p)^{k-1}p$ は、成功確率 $p$ のベルヌーイ試行で初めて成功するまでの試行回数の分布
  • 期待値 $E[X] = 1/p$、分散 $\text{Var}(X) = (1-p)/p^2$
  • 無記憶性 $P(X > m+n | X > m) = P(X > n)$ — 離散分布で無記憶性を持つのは幾何分布だけ
  • 幾何分布は負の二項分布($r = 1$)の特殊ケースであり、指数分布の離散版
  • 条件付き期待値による再帰的な導出が直感的

次のステップとして、以下の記事も参考にしてください。