積率母関数(モーメント母関数、Moment Generating Function; MGF)は、数理統計学で非常によく登場する概念です。積率母関数を理解することで、確率分布の期待値や分散、歪度や尖度といった統計量を体系的に導出できるようになります。
今回はモーメント母関数の定義と性質について、できるだけわかりやすく解説します。
本記事の内容
- モーメント母関数の定義
- 微分によるモーメントの導出
- 正規分布、ポアソン分布での具体例
- Python での可視化
前提知識
- 確率変数の期待値の定義
- テイラー展開の基本
モーメント母関数の定義
確率変数 $X$ のモーメント母関数は次のように定義されます。
$$ \begin{equation} M_X(t) = E[e^{tX}] \end{equation} $$
離散確率分布と連続確率分布で具体的に書き下すと、
離散確率分布: $$ \begin{equation} M_X(t) = \sum_{i} e^{tx_i} p(x_i) \end{equation} $$
連続確率分布: $$ \begin{equation} M_X(t) = \int_{-\infty}^{\infty} e^{tx} p(x) \, dx \end{equation} $$
モーメントの導出
モーメント母関数の最大の利点は、$t = 0$ での微分によって各次のモーメントが得られることです。
$e^{tX}$ をテイラー展開すると、
$$ e^{tX} = 1 + tX + \frac{(tX)^2}{2!} + \frac{(tX)^3}{3!} + \cdots $$
期待値を取ると、
$$ M_X(t) = 1 + tE[X] + \frac{t^2}{2!}E[X^2] + \frac{t^3}{3!}E[X^3] + \cdots $$
ここで $t$ で微分して $t = 0$ を代入すると、
$$ \begin{align} M_X'(0) &= E[X] \quad (\text{1次モーメント = 期待値}) \\ M_X”(0) &= E[X^2] \quad (\text{2次モーメント}) \\ M_X^{(n)}(0) &= E[X^n] \quad (n\text{次モーメント}) \end{align} $$
分散は2次までのモーメントから計算できます。
$$ \text{Var}(X) = E[X^2] – (E[X])^2 = M_X”(0) – (M_X'(0))^2 $$
具体例1: 正規分布
$X \sim \mathcal{N}(\mu, \sigma^2)$ のモーメント母関数を導出します。
$$ \begin{align} M_X(t) &= E[e^{tX}] = \int_{-\infty}^{\infty} e^{tx} \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) dx \end{align} $$
指数部分をまとめると、
$$ tx – \frac{(x-\mu)^2}{2\sigma^2} = -\frac{(x – (\mu + \sigma^2 t))^2}{2\sigma^2} + \mu t + \frac{\sigma^2 t^2}{2} $$
積分すると(ガウス積分の公式を利用)、
$$ \begin{equation} M_X(t) = \exp\left(\mu t + \frac{\sigma^2 t^2}{2}\right) \end{equation} $$
検証として、
$$ M_X'(t) = (\mu + \sigma^2 t) \exp\left(\mu t + \frac{\sigma^2 t^2}{2}\right) $$
$$ M_X'(0) = \mu \quad (\text{期待値に一致}) $$
$$ M_X”(0) = \sigma^2 + \mu^2 \implies \text{Var}(X) = \sigma^2 + \mu^2 – \mu^2 = \sigma^2 \quad \checkmark $$
具体例2: ポアソン分布
$X \sim \text{Poi}(\lambda)$ のモーメント母関数を導出します。
$$ \begin{align} M_X(t) &= \sum_{k=0}^{\infty} e^{tk} \frac{\lambda^k e^{-\lambda}}{k!} = e^{-\lambda} \sum_{k=0}^{\infty} \frac{(\lambda e^t)^k}{k!} = e^{-\lambda} e^{\lambda e^t} \end{align} $$
$$ \begin{equation} M_X(t) = \exp(\lambda(e^t – 1)) \end{equation} $$
検証:
$$ M_X'(t) = \lambda e^t \exp(\lambda(e^t – 1)) \implies M_X'(0) = \lambda $$
モーメント母関数の一意性
モーメント母関数が存在するとき、確率分布を一意に決定するという重要な性質があります。つまり、2つの確率変数のモーメント母関数が一致すれば、同じ確率分布に従います。
この性質は、正規分布の再生性の証明などで活用されます。
Python での可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, poisson
# 正規分布のモーメント母関数
mu, sigma = 2.0, 1.5
t = np.linspace(-2, 2, 200)
# 理論的なMGF
mgf_theory = np.exp(mu * t + sigma**2 * t**2 / 2)
# モンテカルロ推定
np.random.seed(42)
n_samples = 100000
X = np.random.normal(mu, sigma, n_samples)
mgf_mc = np.array([np.mean(np.exp(ti * X)) for ti in t])
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# 左: MGFの比較
ax1 = axes[0]
ax1.plot(t, mgf_theory, 'r-', linewidth=2, label='Theory')
ax1.plot(t, mgf_mc, 'b--', linewidth=1.5, label='Monte Carlo')
ax1.set_xlabel('t', fontsize=12)
ax1.set_ylabel('M_X(t)', fontsize=12)
ax1.set_title(f'MGF of Normal(mu={mu}, sigma={sigma})', fontsize=12)
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
# 中央: MGFの微分から期待値・分散を推定
ax2 = axes[1]
dt = 0.001
t_eval = np.linspace(-1, 1, 100)
mgf_vals = np.exp(mu * t_eval + sigma**2 * t_eval**2 / 2)
mgf_deriv1 = np.gradient(mgf_vals, t_eval)
mgf_deriv2 = np.gradient(mgf_deriv1, t_eval)
ax2.plot(t_eval, mgf_deriv1, 'b-', linewidth=2, label="M'(t)")
ax2.plot(t_eval, mgf_deriv2, 'g-', linewidth=2, label="M''(t)")
ax2.axvline(x=0, color='k', linestyle='--', alpha=0.3)
# t=0での値を表示
idx_0 = np.argmin(np.abs(t_eval))
ax2.scatter(0, mgf_deriv1[idx_0], s=100, color='blue', zorder=5)
ax2.scatter(0, mgf_deriv2[idx_0], s=100, color='green', zorder=5)
ax2.annotate(f"E[X] = {mgf_deriv1[idx_0]:.2f}", (0.05, mgf_deriv1[idx_0]+0.3), fontsize=11)
ax2.annotate(f"E[X^2] = {mgf_deriv2[idx_0]:.2f}", (0.05, mgf_deriv2[idx_0]+0.3), fontsize=11)
ax2.set_xlabel('t', fontsize=12)
ax2.set_ylabel('Value', fontsize=12)
ax2.set_title('Derivatives of MGF at t=0', fontsize=12)
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)
# 右: ポアソン分布のMGF
ax3 = axes[2]
lam = 3.0
mgf_poisson = np.exp(lam * (np.exp(t) - 1))
X_poi = np.random.poisson(lam, n_samples)
mgf_poi_mc = np.array([np.mean(np.exp(ti * X_poi)) for ti in t])
ax3.plot(t, mgf_poisson, 'r-', linewidth=2, label='Theory')
ax3.plot(t, mgf_poi_mc, 'b--', linewidth=1.5, label='Monte Carlo')
ax3.set_xlabel('t', fontsize=12)
ax3.set_ylabel('M_X(t)', fontsize=12)
ax3.set_title(f'MGF of Poisson(lambda={lam})', fontsize=12)
ax3.legend(fontsize=10)
ax3.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
まとめ
本記事では、モーメント母関数について解説しました。
- モーメント母関数 $M_X(t) = E[e^{tX}]$ は確率分布の特性を完全に記述する関数
- $t = 0$ での $n$ 階微分が $n$ 次モーメントを与える
- 正規分布のMGFは $\exp(\mu t + \sigma^2 t^2/2)$、ポアソン分布のMGFは $\exp(\lambda(e^t – 1))$
- モーメント母関数が一致すれば確率分布も一致する(一意性)
次のステップとして、以下の記事も参考にしてください。