中心極限定理とは?なぜ正規分布が至るところに現れるのか

身長、テストの点数、製品の寸法、株価の日次リターン — これらは全く異なる現象ですが、共通して正規分布(ベルカーブ)に近い分布を示します。なぜこれほど多くの現象が同じ「釣鐘型」の分布に従うのでしょうか?

答えは中心極限定理(Central Limit Theorem, CLT)にあります。多数の独立な要因の合計(あるいは平均)は、各要因がどんな分布に従っていようと、近似的に正規分布に従うのです。身長は遺伝子や栄養など多数の要因の積み重ね、テストの点数は多数の問題の正誤の合計、製造誤差は多数の工程の微小誤差の蓄積 — いずれも「多数の独立な要因の和」と解釈できます。

中心極限定理は、確率論で最も重要な定理の一つであり、現代統計学の根幹を支えています。

  • 信頼区間: 母平均の信頼区間を正規分布で構成できる理論的根拠
  • 仮説検定: z検定やt検定が正規分布に基づく理由
  • 品質管理: 管理図(Xbar管理図)の設計基盤
  • 金融工学: ポートフォリオの収益率分布の近似
  • 機械学習: 確率的勾配降下法の収束解析

本記事の内容

  • 中心極限定理の直感的な理解 — なぜ正規分布が現れるのか
  • 定理の数学的な定式化
  • 特性関数を用いた証明の概略
  • 大数の法則との関係
  • 適用限界(いつCLTが使えないか)
  • Pythonによるシミュレーション

前提知識

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

中心極限定理とは — 「和は正規分布になる」

日常的な直感

中心極限定理を直感的に理解するために、サイコロの例を考えましょう。

サイコロを1回振ったとき、出目の分布は $\{1, 2, 3, 4, 5, 6\}$ の離散一様分布で、全く正規分布らしくありません。

では2個のサイコロの和は?2から12の値を取り、7が最も出やすい三角形状の分布になります。少し「山」ができました。

5個の和は?5から30の値を取り、かなり正規分布に近い形になります。

10個の和は?ほぼ完全な正規分布(ベルカーブ)です。

元の分布が均一な離散分布であっても、その和を取るだけで正規分布が現れます。これが中心極限定理の驚くべき力です。

大数の法則との関係

大数の法則は「標本平均 $\bar{X}_n$ は $\mu$ に収束する」ことを教えてくれました。しかし、「$\bar{X}_n$ が $\mu$ からどれだけずれるか」の分布については何も語りませんでした。

中心極限定理は、大数の法則の「次のステップ」として、$\bar{X}_n$ と $\mu$ の差のスケーリングされた分布が何であるかを教えてくれます。

$$ \text{大数の法則}: \bar{X}_n \to \mu \quad (\text{どこに収束するか}) $$

$$ \text{中心極限定理}: \sqrt{n}(\bar{X}_n – \mu) \to N(0, \sigma^2) \quad (\text{どんな形で収束するか}) $$

大数の法則が「目的地」を教えるなら、中心極限定理は「目的地への道筋の形」を教えてくれるのです。

それでは、定理を正式に述べましょう。

中心極限定理の数学的定式化

定理の主張

$X_1, X_2, \ldots$ が i.i.d.で $E[X_i] = \mu$、$\text{Var}(X_i) = \sigma^2 < \infty$ のとき、標準化された標本平均の分布は標準正規分布に分布収束します。

$$ \begin{equation} Z_n = \frac{\bar{X}_n – \mu}{\sigma / \sqrt{n}} = \frac{\sum_{i=1}^{n} X_i – n\mu}{\sigma\sqrt{n}} \xrightarrow{d} N(0, 1) \end{equation} $$

すなわち、任意の $z \in \mathbb{R}$ に対して

$$ \lim_{n \to \infty} P(Z_n \leq z) = \Phi(z) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{z} e^{-t^2/2} dt $$

定理の意味

この定理が言っていることを、言葉で整理すると

  1. $n$ 個の i.i.d.確率変数の $S_n = \sum_{i=1}^n X_i$ を取る
  2. 平均を引いて中心化し($S_n – n\mu$)、標準偏差で割って標準化する($/ \sigma\sqrt{n}$)
  3. すると $n \to \infty$ で標準正規分布に近づく

重要なのは、元の確率変数 $X_i$ がどんな分布に従っていてもよいということです。ベルヌーイでも、一様でも、指数でも、ポアソンでも、分散が有限でありさえすれば中心極限定理が成り立ちます。

実用的な近似

中心極限定理は、十分大きな $n$ に対して

$$ \bar{X}_n \approx N\left(\mu, \frac{\sigma^2}{n}\right) $$

あるいは

$$ \sum_{i=1}^{n} X_i \approx N(n\mu, n\sigma^2) $$

という近似を正当化します。「十分大きな $n$」がどの程度かは元の分布の歪度に依存しますが、一般的な目安として $n \geq 30$ がよく使われます(ただしこの目安は経験則であり、歪みの大きい分布ではもっと大きな $n$ が必要です)。

証明の概略を見てみましょう。

特性関数を用いた証明の概略

特性関数(characteristic function)

証明の鍵は特性関数(characteristic function)です。確率変数 $X$ の特性関数は

$$ \varphi_X(t) = E[e^{itX}] $$

と定義されます。特性関数は常に存在し(期待値が有限でない場合も)、分布を一意に決定します。

特性関数の重要な性質として

  • $X$ と $Y$ が独立のとき: $\varphi_{X+Y}(t) = \varphi_X(t) \varphi_Y(t)$
  • 連続性定理: $\varphi_{X_n}(t) \to \varphi_X(t)$ ならば $X_n \xrightarrow{d} X$

証明のスケッチ

$Y_i = (X_i – \mu) / \sigma$(標準化した変数)とすると、$E[Y_i] = 0$、$\text{Var}(Y_i) = 1$ です。

$Z_n = (Y_1 + \cdots + Y_n) / \sqrt{n}$ の特性関数は

$$ \varphi_{Z_n}(t) = \left[\varphi_Y\left(\frac{t}{\sqrt{n}}\right)\right]^n $$

$Y_i$ が独立なので、和の特性関数は各特性関数の積になり、さらに同一分布なので $n$ 乗になります。

$\varphi_Y(t)$ を $t = 0$ の周りでテイラー展開すると、$E[Y] = 0$、$E[Y^2] = 1$ より

$$ \varphi_Y(s) = 1 + is \cdot E[Y] – \frac{s^2}{2} E[Y^2] + o(s^2) = 1 – \frac{s^2}{2} + o(s^2) $$

$s = t / \sqrt{n}$ を代入すると

$$ \varphi_Y\left(\frac{t}{\sqrt{n}}\right) = 1 – \frac{t^2}{2n} + o\left(\frac{1}{n}\right) $$

これを $n$ 乗すると

$$ \varphi_{Z_n}(t) = \left[1 – \frac{t^2}{2n} + o\left(\frac{1}{n}\right)\right]^n $$

$n \to \infty$ の極限で、$(1 + a/n)^n \to e^a$ の公式を適用すると

$$ \lim_{n \to \infty} \varphi_{Z_n}(t) = e^{-t^2/2} $$

これは標準正規分布 $N(0, 1)$ の特性関数です。連続性定理により $Z_n \xrightarrow{d} N(0, 1)$ が示されました。

証明のポイント

この証明の本質は

  1. 独立な確率変数の和の特性関数がになること
  2. 各特性関数を $t/\sqrt{n}$ で評価してテイラー展開すること
  3. $n \to \infty$ で指数関数の極限公式を使うこと

テイラー展開で必要なのは $E[Y] = 0$ と $E[Y^2] = 1$ の2つだけです。3次以降の積率は $o(1/n)$ に吸収されます。だからこそ、元の分布の形によらず同じ結果が得られるのです。

理論を確認したところで、Pythonで中心極限定理を実際に体験しましょう。

Pythonでの実装と可視化

様々な分布でのCLTの確認

元の分布が異なっていても、和の分布が正規分布に収束することを確認します。

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

np.random.seed(42)
n_sim = 50000  # シミュレーション回数
n_values = [1, 2, 5, 30]  # 加算する確率変数の数

# 4つの異なる分布
distributions = {
    'Bernoulli(0.3)': lambda n: np.random.binomial(1, 0.3, n),
    'Exponential(1)': lambda n: np.random.exponential(1.0, n),
    'Uniform(0,1)': lambda n: np.random.uniform(0, 1, n),
    'Poisson(3)': lambda n: np.random.poisson(3, n),
}

fig, axes = plt.subplots(4, 4, figsize=(16, 14))

for row, (dist_name, sampler) in enumerate(distributions.items()):
    for col, n in enumerate(n_values):
        ax = axes[row, col]

        # n個の和の標準化
        sums = np.zeros(n_sim)
        for i in range(n):
            sums += sampler(n_sim)

        # 標準化(平均0、分散1にする)
        z = (sums - sums.mean()) / sums.std()

        ax.hist(z, bins=60, density=True, color='steelblue', alpha=0.7,
                edgecolor='gray', linewidth=0.3)

        # 標準正規分布の理論曲線
        x_range = np.linspace(-4, 4, 200)
        ax.plot(x_range, stats.norm.pdf(x_range), 'r-', linewidth=2,
                label='N(0,1)')

        if row == 0:
            ax.set_title(f'n = {n}', fontsize=13, fontweight='bold')
        if col == 0:
            ax.set_ylabel(dist_name, fontsize=11, fontweight='bold')

        ax.set_xlim(-4, 4)
        ax.set_ylim(0, 0.55)
        ax.grid(True, alpha=0.2)
        if row == 0 and col == 3:
            ax.legend(fontsize=9)

plt.suptitle('Central Limit Theorem: Standardized Sum → N(0,1)',
             fontsize=15, y=1.02)
plt.tight_layout()
plt.savefig('clt_demonstration.png', dpi=150, bbox_inches='tight')
plt.show()

この16パネルの可視化は、中心極限定理の普遍性を劇的に示しています。

  1. $n = 1$(左端列): 各行は元の分布そのものです。ベルヌーイ(2つの棒)、指数(右に裾が長い)、一様(平坦)、ポアソン(右に歪んだ離散分布)と、全く異なる形をしています。

  2. $n = 2, 5$(中央列): 和を取るにつれて、全ての分布が徐々に正規分布(赤い曲線)に近づいていきます。特に対称的な一様分布は $n = 5$ でほぼ正規分布に一致しています。

  3. $n = 30$(右端列): 全ての分布が赤い正規分布曲線とほぼ完全に一致しています。元の分布がどんなに歪んでいても、30個の和を取れば正規近似が非常に良好であることがわかります。

  4. 収束速度の違い: 対称分布(一様)は非対称分布(指数、ベルヌーイ $p=0.3$)より速く正規分布に収束しています。これは歪度が0に近い分布ほどCLTの近似が早く良くなることを示唆しています。

収束の定量的評価

CLTの近似精度を定量的に評価するために、コルモゴロフ-スミルノフ統計量を計算します。

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

np.random.seed(42)
n_sim = 100000

# 収束速度を定量的に評価
distributions = {
    'Bernoulli(0.5)': {'sampler': lambda n: np.random.binomial(1, 0.5, n),
                       'skew': 0.0},
    'Bernoulli(0.1)': {'sampler': lambda n: np.random.binomial(1, 0.1, n),
                       'skew': 2.67},
    'Exponential(1)': {'sampler': lambda n: np.random.exponential(1.0, n),
                       'skew': 2.0},
    'Uniform(0,1)': {'sampler': lambda n: np.random.uniform(0, 1, n),
                     'skew': 0.0},
}

n_range = [2, 5, 10, 20, 30, 50, 100, 200, 500]

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

# (a) KS統計量 vs n
ax = axes[0]
for dist_name, info in distributions.items():
    ks_stats = []
    for n in n_range:
        sums = np.zeros(n_sim)
        for i in range(n):
            sums += info['sampler'](n_sim)
        z = (sums - sums.mean()) / sums.std()
        ks_stat, _ = stats.kstest(z, 'norm')
        ks_stats.append(ks_stat)

    ax.plot(n_range, ks_stats, 'o-', linewidth=2, markersize=5,
            label=f'{dist_name} (skew={info["skew"]:.1f})')

ax.set_xlabel('n (sample size for sum)', fontsize=12)
ax.set_ylabel('KS Statistic (distance from Normal)', fontsize=12)
ax.set_title('Convergence Rate to Normal Distribution', fontsize=13)
ax.set_xscale('log')
ax.set_yscale('log')
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (b) Berry-Esseen型の理論上界との比較
ax = axes[1]
# Berry-Esseen定理: sup|F_n(x) - Φ(x)| ≤ C * ρ / (σ^3 * sqrt(n))
# ここで ρ = E[|X-μ|^3]
for dist_name, info in distributions.items():
    # n=2,5,...に対する近似精度
    sample = info['sampler'](1000000)
    mu_est = sample.mean()
    sigma_est = sample.std()
    rho_est = np.mean(np.abs(sample - mu_est)**3)
    C_BE = 0.5  # Berry-Esseen定数(理論上界は約0.4748)

    be_bound = C_BE * rho_est / (sigma_est**3 * np.sqrt(np.array(n_range)))
    ax.plot(n_range, be_bound, '--', linewidth=1.5, alpha=0.7,
            label=f'{dist_name} (Berry-Esseen)')

ax.set_xlabel('n', fontsize=12)
ax.set_ylabel('Upper bound on CDF deviation', fontsize=12)
ax.set_title('Berry-Esseen Bound\n'
             r'$\sup|F_n(x) - \Phi(x)| \leq \frac{C\rho}{\sigma^3\sqrt{n}}$',
             fontsize=13)
ax.set_xscale('log')
ax.set_yscale('log')
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

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

この定量的な分析から、CLTの収束に関する重要な知見が得られます。

  1. 左図(KS統計量): 全ての分布で $n$ の増加とともにKS統計量(正規分布からの距離)が減少しています。対称分布(一様、ベルヌーイ(0.5))は非対称分布(指数、ベルヌーイ(0.1))より速く収束しています。対数-対数プロットでほぼ直線になっており、$O(1/\sqrt{n})$ の収束が確認できます。

  2. 右図(Berry-Esseen上界): Berry-Esseen定理は $\sup|F_n(x) – \Phi(x)| \leq C\rho / (\sigma^3\sqrt{n})$ という定量的な収束速度を保証します。歪度($\rho / \sigma^3$)が大きい分布ほど上界が大きく、正規近似の精度が低いことを示しています。

CLTが成り立たないケース

大数の法則と同様に、分散が無限大の場合はCLTが(通常の形では)成り立ちません。

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

np.random.seed(42)
n_sim = 50000

fig, axes = plt.subplots(2, 3, figsize=(16, 9))

# 上段: 分散有限 → CLT成立
# t分布 (df=5, 分散=5/3で有限)
for col, n in enumerate([1, 10, 100]):
    ax = axes[0, col]
    sums = np.zeros(n_sim)
    for _ in range(n):
        sums += np.random.standard_t(5, n_sim)
    z = (sums - sums.mean()) / sums.std()

    ax.hist(z, bins=80, density=True, color='steelblue', alpha=0.7,
            edgecolor='gray', linewidth=0.3)
    x_range = np.linspace(-5, 5, 200)
    ax.plot(x_range, stats.norm.pdf(x_range), 'r-', linewidth=2)
    ax.set_title(f't(df=5): n={n}', fontsize=12)
    ax.set_xlim(-5, 5)
    ax.grid(True, alpha=0.3)

axes[0, 0].set_ylabel('Density (CLT holds)', fontsize=11, fontweight='bold')

# 下段: 分散無限 → CLT不成立
# t分布 (df=2, 分散=∞)
for col, n in enumerate([1, 10, 100]):
    ax = axes[1, col]
    sums = np.zeros(n_sim)
    for _ in range(n):
        sums += np.random.standard_t(2, n_sim)
    z = (sums - sums.mean()) / sums.std()

    ax.hist(z, bins=80, density=True, color='coral', alpha=0.7,
            edgecolor='gray', linewidth=0.3, range=(-8, 8))
    x_range = np.linspace(-8, 8, 200)
    ax.plot(x_range, stats.norm.pdf(x_range), 'r-', linewidth=2)
    ax.set_title(f't(df=2): n={n}', fontsize=12)
    ax.set_xlim(-8, 8)
    ax.grid(True, alpha=0.3)

axes[1, 0].set_ylabel('Density (CLT fails)', fontsize=11, fontweight='bold')

plt.suptitle('CLT: Finite Variance Required', fontsize=14, y=1.02)
plt.tight_layout()
plt.savefig('clt_failure.png', dpi=150, bbox_inches='tight')
plt.show()

この比較から、分散の有限性がCLTにとって本質的な条件であることが明確に見えます。

  1. 上段($t(df=5)$, 分散有限): $n = 10$ で既にかなり正規分布に近く、$n = 100$ ではほぼ完全に一致しています。$t$ 分布は裾が重いですが、分散が有限($5/3$)なのでCLTが成り立ちます。

  2. 下段($t(df=2)$, 分散無限): $n = 100$ でも正規分布からの乖離が大きく、裾が重い分布のままです。分散が無限大の場合、標準化 $Z_n = (\bar{X}_n – \mu) / (\sigma / \sqrt{n})$ が意味をなさない($\sigma = \infty$)ため、通常のCLTは適用できません。このような場合は安定分布への収束(一般化CLT)が関連します。

中心極限定理の応用

信頼区間

中心極限定理の最も重要な応用が信頼区間の構成です。

$X_1, \ldots, X_n$ が i.i.d.で $E[X_i] = \mu$、$\text{Var}(X_i) = \sigma^2$ のとき、CLTから

$$ \frac{\bar{X}_n – \mu}{\sigma / \sqrt{n}} \approx N(0, 1) $$

$P(-z_{\alpha/2} \leq Z \leq z_{\alpha/2}) = 1 – \alpha$ なので

$$ P\left(\bar{X}_n – z_{\alpha/2}\frac{\sigma}{\sqrt{n}} \leq \mu \leq \bar{X}_n + z_{\alpha/2}\frac{\sigma}{\sqrt{n}}\right) \approx 1 – \alpha $$

これが母平均 $\mu$ の $100(1-\alpha)\%$ 信頼区間

$$ \bar{X}_n \pm z_{\alpha/2} \frac{\sigma}{\sqrt{n}} $$

です。95%信頼区間なら $z_{0.025} = 1.96$ です。

二項分布の正規近似

$X \sim \text{Binomial}(n, p)$ のとき、$X$ は $n$ 個の独立なベルヌーイ変数の和なので、CLTから

$$ \frac{X – np}{\sqrt{np(1-p)}} \approx N(0, 1) $$

この近似は、$np \geq 5$ かつ $n(1-p) \geq 5$ のとき良好です。

デルタ法

CLTを非線形関数に拡張するデルタ法(delta method)も重要な応用です。

$\sqrt{n}(\bar{X}_n – \mu) \xrightarrow{d} N(0, \sigma^2)$ のとき、微分可能な関数 $g$ に対して

$$ \sqrt{n}(g(\bar{X}_n) – g(\mu)) \xrightarrow{d} N(0, [g'(\mu)]^2 \sigma^2) $$

これにより、標本平均の関数(分散、標準偏差、比率など)の分布も近似的に求まります。

まとめ

本記事では、中心極限定理について直感的な理解から数学的な証明の概略まで解説しました。

  • 中心極限定理は、i.i.d.確率変数の標準化された和が標準正規分布に分布収束することを主張する
  • 元の分布がどんな形でも(分散が有限であれば)、和は正規分布に近づく — これが正規分布が自然界に偏在する理由
  • 大数の法則が「どこに」収束するかを教え、CLTが「どんな形で」収束するかを教える
  • 証明の鍵は特性関数のテイラー展開であり、2次の積率(分散)だけが重要
  • Berry-Esseen定理により、収束速度は $O(1/\sqrt{n})$ で、歪度が大きいほど遅い
  • 信頼区間、仮説検定、二項近似、デルタ法など、統計学の広範な応用の理論的基盤

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