大数の法則とは?弱法則と強法則の違いを理解して実装する

コインを10回投げて表が7回出たら、このコインは偏っていると疑うかもしれません。しかし、10,000回投げて表が5,100回(51%)出た場合はどうでしょうか。10回で70%と10,000回で51%、どちらがより「偏っている」証拠になるでしょうか?

直感的に、10,000回投げた結果の方が信頼できると感じるはずです。回数が増えれば増えるほど、標本平均は「真の確率」に近づくはずだという確信があります。この直感を数学的に厳密に保証しているのが大数の法則(Law of Large Numbers, LLN)です。

大数の法則は、確率論の最も基本的な定理の一つであり、統計学やデータサイエンスの根幹を支えています。

  • 統計的推定: 標本平均が母平均の良い推定値であることの理論的保証
  • モンテカルロ法: 乱数シミュレーションによる数値積分が正しい値に収束する根拠
  • 保険数理: 契約数が増えれば保険料の見積もりが安定する理由
  • 品質管理: 大量生産における不良率の統計的管理の基盤

本記事の内容

  • 大数の法則の直感的な理解
  • 弱法則の定義と証明(チェビシェフの不等式を使用)
  • 強法則の定義と弱法則との違い
  • 収束の種類(確率収束と概収束)の区別
  • Pythonによるシミュレーションと可視化

前提知識

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

大数の法則とは — 「平均は安定する」

日常的な直感

大数の法則の核心は、「試行回数が増えれば、標本平均は母平均に近づく」ということです。

カジノのルーレットを考えましょう。1回の勝負なら大きく勝つことも大きく負けることもあります。しかし、1,000回、10,000回と繰り返すと、カジノの期待利益率(たとえばアメリカンルーレットなら約5.26%)に限りなく近い結果になります。だからこそカジノは経営が成り立つのです。

同じ原理で、保険会社は個々の事故を予測できなくても、大量の契約者がいれば全体の事故率は安定的に予測できます。世論調査が1,000人程度のサンプルで全体の傾向を推定できるのも、大数の法則があるからです。

数学的な設定

大数の法則を正式に述べるための設定を確認します。

$X_1, X_2, \ldots, X_n$ を独立同分布(i.i.d.)の確率変数列とし、共通の期待値 $\mu = E[X_i]$ を持つとします。標本平均

$$ \bar{X}_n = \frac{1}{n} \sum_{i=1}^{n} X_i $$

と定義します。

大数の法則は、$n \to \infty$ のとき $\bar{X}_n$ が $\mu$ に「収束する」ことを主張しますが、「収束」の意味に2つの種類があります。それが弱法則と強法則の違いです。

まず、弱法則から見ていきましょう。

大数の弱法則(WLLN)

定義

$X_1, X_2, \ldots$ が i.i.d.で $E[X_i] = \mu$、$\text{Var}(X_i) = \sigma^2 < \infty$ のとき、標本平均 $\bar{X}_n$ は $\mu$ に確率収束(converge in probability)します。

$$ \begin{equation} \forall \varepsilon > 0: \quad \lim_{n \to \infty} P\left(|\bar{X}_n – \mu| \geq \varepsilon\right) = 0 \end{equation} $$

これを $\bar{X}_n \xrightarrow{P} \mu$ と書きます。

直感的に言えば、「$\bar{X}_n$ が $\mu$ から $\varepsilon$ 以上離れる確率は、$n$ を大きくすれば好きなだけ小さくできる」ということです。

チェビシェフの不等式による証明

弱法則の証明は驚くほどシンプルです。チェビシェフの不等式を使います。

チェビシェフの不等式は、任意の確率変数 $Y$ と $\varepsilon > 0$ に対して

$$ P(|Y – E[Y]| \geq \varepsilon) \leq \frac{\text{Var}(Y)}{\varepsilon^2} $$

を主張します。$Y = \bar{X}_n$ として適用しましょう。

まず、$\bar{X}_n$ の期待値と分散を計算します。

$$ E[\bar{X}_n] = E\left[\frac{1}{n}\sum_{i=1}^{n} X_i\right] = \frac{1}{n}\sum_{i=1}^{n} E[X_i] = \frac{1}{n} \cdot n\mu = \mu $$

分散は、$X_i$ が独立なので

$$ \text{Var}(\bar{X}_n) = \text{Var}\left(\frac{1}{n}\sum_{i=1}^{n} X_i\right) = \frac{1}{n^2}\sum_{i=1}^{n} \text{Var}(X_i) = \frac{1}{n^2} \cdot n\sigma^2 = \frac{\sigma^2}{n} $$

チェビシェフの不等式に代入すると

$$ P(|\bar{X}_n – \mu| \geq \varepsilon) \leq \frac{\sigma^2}{n\varepsilon^2} $$

$n \to \infty$ で右辺は0に収束するので

$$ \lim_{n \to \infty} P(|\bar{X}_n – \mu| \geq \varepsilon) = 0 $$

証明が完了しました。この証明の要点は

  1. 標本平均の分散が $\sigma^2 / n$ と$n$ に反比例して減少する
  2. チェビシェフの不等式で確率を分散で上から抑える
  3. $n \to \infty$ で上界が0に収束する

という3ステップです。

弱法則の限界

弱法則は「各 $n$ での確率が0に近づく」ことを保証しますが、標本平均の軌跡(パスごとの振る舞い)については何も語りません。つまり、$n$ が大きいとき $\bar{X}_n$ が $\mu$ から離れる「回数」がどのくらいあるかは保証されないのです。

この限界を克服するのが強法則です。

大数の強法則(SLLN)

定義

$X_1, X_2, \ldots$ が i.i.d.で $E[X_i] = \mu$ のとき(分散の有限性は不要)、標本平均 $\bar{X}_n$ は $\mu$ に概収束(converge almost surely)します。

$$ \begin{equation} P\left(\lim_{n \to \infty} \bar{X}_n = \mu\right) = 1 \end{equation} $$

これを $\bar{X}_n \xrightarrow{\text{a.s.}} \mu$ と書きます。

弱法則と強法則の違い

一見すると似ていますが、数学的な意味は大きく異なります。

弱法則は「各 $n$ について」の主張です。任意の $\varepsilon > 0$ に対して

$$ \lim_{n \to \infty} P(|\bar{X}_n – \mu| \geq \varepsilon) = 0 $$

これは $P$ と $\lim$ の順序が「$P$ が外、$\lim$ の中に $\bar{X}_n$」です。

強法則は「パスごとの」主張です。

$$ P\left(\omega : \lim_{n \to \infty} \bar{X}_n(\omega) = \mu\right) = 1 $$

確率1の事象(測度1の集合)の上で、$\bar{X}_n$ の列が点ごとに $\mu$ に収束するのです。

比喩で言えば

  • 弱法則: 「大きな $n$ を1つ固定すると、$\bar{X}_n$ が $\mu$ から遠い確率は小さい」
  • 強法則: 「ほとんど全ての実験結果について、$\bar{X}_n$ は最終的に $\mu$ に落ち着く」

強法則は弱法則を含みます(概収束は確率収束を含む)が、逆は一般には成り立ちません。

収束の4つの種類

確率論には4つの主要な収束概念があります。大数の法則の文脈で整理しておきましょう。

収束の種類 記号 定義
概収束(a.s.) $\xrightarrow{\text{a.s.}}$ $P(\lim X_n = X) = 1$
確率収束 $\xrightarrow{P}$ $\forall\varepsilon: P(\|X_n – X\| \geq \varepsilon) \to 0$
$L^p$ 収束 $\xrightarrow{L^p}$ $E[\|X_n – X\|^p] \to 0$
分布収束 $\xrightarrow{d}$ $F_{X_n}(x) \to F_X(x)$ (連続点で)

包含関係は

$$ \text{概収束} \Rightarrow \text{確率収束} \Rightarrow \text{分布収束} $$

$$ L^p \text{ 収束} \Rightarrow \text{確率収束} \quad (p \geq 1) $$

大数の弱法則は確率収束、強法則は概収束を主張しています。

強法則の証明(概略)

強法則の完全な証明は測度論を用いた高度な議論が必要ですが、核心的なアイデアを概略で説明します。

$X_i$ が i.i.d.で $E[X_i^4] < \infty$ を仮定すると(より強い条件ですが証明が見通しやすくなります)

$$ E[(\bar{X}_n – \mu)^4] = O(1/n^2) $$

を示すことができます。この評価から

$$ \sum_{n=1}^{\infty} P(|\bar{X}_n – \mu| \geq \varepsilon) \leq \sum_{n=1}^{\infty} \frac{E[(\bar{X}_n – \mu)^4]}{\varepsilon^4} < \infty $$

ボレル・カンテリの補題(第1補題)により、$|\bar{X}_n – \mu| \geq \varepsilon$ が無限回起きる確率は0です。$\varepsilon$ を $1/k$($k = 1, 2, \ldots$)で置き換えて可算個の和を取ると、概収束が得られます。

より一般的な証明($E[X_i]$ の存在のみを仮定)はコルモゴロフによるもので、独立確率変数の収束に関する深い結果を用います。

理論をPythonで確認していきましょう。

Pythonでの実装と可視化

大数の法則の基本的なシミュレーション

標本平均が母平均に収束する様子を複数のパスで可視化します。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
n_max = 10000
n_paths = 20

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

# (a) 公平なコイン投げ (ベルヌーイ分布, p=0.5)
ax = axes[0, 0]
mu = 0.5
for path in range(n_paths):
    X = np.random.binomial(1, mu, n_max)
    cum_mean = np.cumsum(X) / np.arange(1, n_max + 1)
    alpha = 0.15 if path > 0 else 0.8
    color = 'steelblue' if path > 0 else 'red'
    lw = 0.5 if path > 0 else 1.5
    ax.plot(range(1, n_max + 1), cum_mean, color=color, alpha=alpha,
            linewidth=lw)

ax.axhline(mu, color='black', linestyle='--', linewidth=2, label=f'$\\mu$ = {mu}')
ax.set_xlabel('n (number of trials)', fontsize=11)
ax.set_ylabel('Sample mean $\\bar{X}_n$', fontsize=11)
ax.set_title(f'Coin Flip (Bernoulli, p={mu})', fontsize=12)
ax.set_xscale('log')
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# (b) サイコロ (離散一様分布)
ax = axes[0, 1]
mu = 3.5
for path in range(n_paths):
    X = np.random.randint(1, 7, n_max)
    cum_mean = np.cumsum(X) / np.arange(1, n_max + 1)
    alpha = 0.15 if path > 0 else 0.8
    color = 'steelblue' if path > 0 else 'red'
    lw = 0.5 if path > 0 else 1.5
    ax.plot(range(1, n_max + 1), cum_mean, color=color, alpha=alpha,
            linewidth=lw)

ax.axhline(mu, color='black', linestyle='--', linewidth=2, label=f'$\\mu$ = {mu}')
ax.set_xlabel('n', fontsize=11)
ax.set_ylabel('Sample mean $\\bar{X}_n$', fontsize=11)
ax.set_title('Dice Roll (Uniform {1,...,6})', fontsize=12)
ax.set_xscale('log')
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# (c) 指数分布 (lambda=2, mu=0.5)
ax = axes[1, 0]
lam = 2.0
mu = 1.0 / lam
for path in range(n_paths):
    X = np.random.exponential(1/lam, n_max)
    cum_mean = np.cumsum(X) / np.arange(1, n_max + 1)
    alpha = 0.15 if path > 0 else 0.8
    color = 'steelblue' if path > 0 else 'red'
    lw = 0.5 if path > 0 else 1.5
    ax.plot(range(1, n_max + 1), cum_mean, color=color, alpha=alpha,
            linewidth=lw)

ax.axhline(mu, color='black', linestyle='--', linewidth=2, label=f'$\\mu$ = {mu}')
ax.set_xlabel('n', fontsize=11)
ax.set_ylabel('Sample mean $\\bar{X}_n$', fontsize=11)
ax.set_title(f'Exponential ($\\lambda$={lam}, $\\mu$={mu})', fontsize=12)
ax.set_xscale('log')
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# (d) 一様分布 [0, 1]
ax = axes[1, 1]
mu = 0.5
for path in range(n_paths):
    X = np.random.uniform(0, 1, n_max)
    cum_mean = np.cumsum(X) / np.arange(1, n_max + 1)
    alpha = 0.15 if path > 0 else 0.8
    color = 'steelblue' if path > 0 else 'red'
    lw = 0.5 if path > 0 else 1.5
    ax.plot(range(1, n_max + 1), cum_mean, color=color, alpha=alpha,
            linewidth=lw)

ax.axhline(mu, color='black', linestyle='--', linewidth=2, label=f'$\\mu$ = {mu}')
ax.set_xlabel('n', fontsize=11)
ax.set_ylabel('Sample mean $\\bar{X}_n$', fontsize=11)
ax.set_title(f'Uniform [0, 1] ($\\mu$={mu})', fontsize=12)
ax.set_xscale('log')
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.suptitle('Law of Large Numbers: Sample Mean Converges to $\\mu$',
             fontsize=14, y=1.02)
plt.tight_layout()
plt.savefig('law_of_large_numbers.png', dpi=150, bbox_inches='tight')
plt.show()

このシミュレーションから、大数の法則の普遍性が確認できます。

  1. 全てのパネルで共通する振る舞い: 分布の形に関わらず(ベルヌーイ、離散一様、指数、連続一様)、標本平均は $n$ が大きくなるにつれて母平均(黒い破線)に収束しています。初期($n < 100$)では大きな変動がありますが、$n > 1000$ ではほとんど全てのパスが母平均の近傍に集中しています。

  2. 収束の速さ: チェビシェフの不等式から、$|\bar{X}_n – \mu| > \varepsilon$ となる確率は $\sigma^2 / (n\varepsilon^2)$ 以下です。つまり収束の速さは分散 $\sigma^2$ に依存します。指数分布(分散が大きい)は一様分布(分散が小さい)より収束が遅い傾向が見られます。

  3. 対数スケールでの等間隔な改善: 横軸が対数スケールなので、$n$ が10倍になるごとに変動幅がおよそ $1/\sqrt{10} \approx 0.316$ 倍に減少していることが確認できます。

チェビシェフの不等式による上界

チェビシェフの不等式が与える確率の上界と、実際の確率を比較します。

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

np.random.seed(42)

# サイコロの例: X ~ Uniform{1,...,6}
mu = 3.5
sigma2 = 35/12  # Var = E[X^2] - mu^2 = 91/6 - 12.25 = 35/12
sigma = np.sqrt(sigma2)

n_values = np.arange(10, 5001, 10)
epsilon_values = [0.1, 0.3, 0.5, 1.0]

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

# (a) チェビシェフの上界 vs シミュレーション
ax = axes[0]
n_sim = 50000

for eps in epsilon_values:
    # チェビシェフの上界
    chebyshev_bound = sigma2 / (n_values * eps**2)
    chebyshev_bound = np.minimum(chebyshev_bound, 1.0)
    ax.plot(n_values, chebyshev_bound, '--', linewidth=1.5,
            label=f'Chebyshev ($\\varepsilon$={eps})')

    # シミュレーションによる実際の確率
    actual_prob = []
    for n in n_values[::10]:  # 間引いて計算
        samples = np.random.randint(1, 7, (n_sim, n))
        means = samples.mean(axis=1)
        prob = np.mean(np.abs(means - mu) >= eps)
        actual_prob.append(prob)

    ax.plot(n_values[::10], actual_prob, 'o', markersize=2, alpha=0.7)

ax.set_xlabel('n', fontsize=12)
ax.set_ylabel(r'$P(|\bar{X}_n - \mu| \geq \varepsilon)$', fontsize=12)
ax.set_title('Chebyshev Bound vs Actual Probability', fontsize=13)
ax.legend(fontsize=9, loc='upper right')
ax.set_yscale('log')
ax.set_ylim(1e-5, 2)
ax.grid(True, alpha=0.3)

# (b) 標本平均の分布の変化
ax = axes[1]
n_samples_list = [10, 50, 200, 1000]
colors_hist = ['lightcoral', 'lightsalmon', 'lightgreen', 'steelblue']

for n_samp, color in zip(n_samples_list, colors_hist):
    means = np.array([np.mean(np.random.randint(1, 7, n_samp))
                      for _ in range(20000)])
    ax.hist(means, bins=50, density=True, alpha=0.5, color=color,
            label=f'n={n_samp}', edgecolor='gray', linewidth=0.3)
    # 理論的な正規近似
    x_range = np.linspace(mu - 3*sigma/np.sqrt(n_samp),
                          mu + 3*sigma/np.sqrt(n_samp), 200)
    ax.plot(x_range, stats.norm.pdf(x_range, mu, sigma/np.sqrt(n_samp)),
            linewidth=2, alpha=0.8)

ax.axvline(mu, color='black', linestyle='--', linewidth=2, label=f'$\\mu$={mu}')
ax.set_xlabel(r'$\bar{X}_n$', fontsize=12)
ax.set_ylabel('Density', fontsize=12)
ax.set_title('Distribution of Sample Mean\n(LLN + CLT)', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

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

この可視化から、チェビシェフの不等式と大数の法則の関係が読み取れます。

  1. 左図(上界 vs 実際の確率): 破線がチェビシェフの上界、点がシミュレーションによる実際の確率です。チェビシェフの上界は実際の確率よりも常に大きく(保守的)、特に $n$ が小さいとき両者の差が大きいことがわかります。しかし、どちらも $n \to \infty$ で0に収束しており、大数の弱法則が成り立っていることが確認できます。

  2. 右図(標本平均の分布): $n$ が増えるにつれて標本平均の分布が母平均 $\mu = 3.5$ の周りに集中していく様子が明確に見えます。$n = 10$ では幅広い分布ですが、$n = 1000$ では非常にシャープなピークになります。実線は中心極限定理に基づく正規近似で、ヒストグラムとよく一致しています。

大数の法則が成り立たないケース

重要な注意として、大数の法則には期待値の存在が必要です。期待値が存在しない分布(コーシー分布など)では大数の法則は成り立ちません。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
n_max = 10000
n_paths = 20

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

# (a) 正規分布(LLN成立)
ax = axes[0]
for path in range(n_paths):
    X = np.random.normal(0, 1, n_max)
    cum_mean = np.cumsum(X) / np.arange(1, n_max + 1)
    alpha = 0.2 if path > 0 else 0.9
    color = 'steelblue' if path > 0 else 'red'
    ax.plot(range(1, n_max + 1), cum_mean, color=color, alpha=alpha,
            linewidth=0.5)

ax.axhline(0, color='black', linestyle='--', linewidth=2)
ax.set_xlabel('n', fontsize=12)
ax.set_ylabel(r'$\bar{X}_n$', fontsize=12)
ax.set_title('Normal Distribution (LLN holds)\n$E[X]=0$ exists', fontsize=12)
ax.set_xscale('log')
ax.set_ylim(-2, 2)
ax.grid(True, alpha=0.3)

# (b) コーシー分布(LLN不成立)
ax = axes[1]
for path in range(n_paths):
    X = np.random.standard_cauchy(n_max)
    cum_mean = np.cumsum(X) / np.arange(1, n_max + 1)
    alpha = 0.2 if path > 0 else 0.9
    color = 'red' if path > 0 else 'darkred'
    ax.plot(range(1, n_max + 1), cum_mean, color=color, alpha=alpha,
            linewidth=0.5)

ax.axhline(0, color='black', linestyle='--', linewidth=2)
ax.set_xlabel('n', fontsize=12)
ax.set_ylabel(r'$\bar{X}_n$', fontsize=12)
ax.set_title('Cauchy Distribution (LLN fails!)\n$E[X]$ does not exist', fontsize=12)
ax.set_xscale('log')
ax.set_ylim(-20, 20)
ax.grid(True, alpha=0.3)

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

この比較から、大数の法則の前提条件の重要性が鮮明に見えます。

  1. 左図(正規分布): 期待値 $\mu = 0$ が存在するため、大数の法則が成り立ちます。全てのパスが $n$ の増加とともに0に収束しています。

  2. 右図(コーシー分布): 期待値が存在しないため(コーシー分布の期待値は定義不能)、標本平均は収束しません。$n = 10{,}000$ でも大きな値を取るパスが存在し、「平均化すれば安定する」という直感が通用しないことがわかります。コーシー分布の標本平均は元のコーシー分布と同じ分布に従うため(安定分布の性質)、平均してもばらつきが減らないのです。

大数の法則の応用

モンテカルロ積分

大数の法則の重要な応用がモンテカルロ積分です。

積分 $I = \int_a^b g(x) dx$ を数値的に計算したいとき、$U_1, \ldots, U_n \sim \text{Uniform}(a, b)$ として

$$ \hat{I}_n = (b – a) \cdot \frac{1}{n} \sum_{i=1}^{n} g(U_i) $$

とすれば、大数の法則から $\hat{I}_n \xrightarrow{\text{a.s.}} I$ が保証されます。

なぜなら、$X_i = (b-a) g(U_i)$ とおくと

$$ E[X_i] = (b-a) E[g(U)] = (b-a) \int_a^b g(x) \frac{1}{b-a} dx = \int_a^b g(x) dx = I $$

なので、$\bar{X}_n$ は大数の法則により $I$ に収束するのです。

頻度論的確率の正当化

大数の法則は、確率の「頻度論的解釈」の数学的正当化でもあります。

事象 $A$ の確率 $P(A)$ は、実験を $n$ 回繰り返したときの $A$ の発生頻度 $f_n(A) / n$ の極限として

$$ P(A) = \lim_{n \to \infty} \frac{f_n(A)}{n} $$

と解釈されます。$X_i = \mathbf{1}(A \text{が}i\text{回目に発生})$(指示関数)とすると、$X_i$ は i.i.d.ベルヌーイで $E[X_i] = P(A)$、$\bar{X}_n = f_n(A)/n$ なので、大数の法則から上の極限が正当化されます。

まとめ

本記事では、大数の法則について弱法則と強法則の違いを含めて解説しました。

  • 大数の法則は「標本平均は母平均に収束する」ことを保証する確率論の基本定理
  • 弱法則(WLLN): $P(|\bar{X}_n – \mu| \geq \varepsilon) \to 0$(確率収束)。チェビシェフの不等式から簡潔に証明できる
  • 強法則(SLLN): $P(\lim \bar{X}_n = \mu) = 1$(概収束)。弱法則より強い主張で、ほとんど全てのパスで収束する
  • 大数の法則には期待値の存在が前提条件であり、コーシー分布のように期待値が存在しない場合は成り立たない
  • モンテカルロ積分頻度論的確率の正当化保険数理など、幅広い応用がある
  • 分散 $\sigma^2 / n$ は $n$ に反比例して減少し、これが収束の源泉

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