あるコインを10回投げたところ、7回表が出た。このコインの「表が出る確率」はいくらだろうか?
直感的には「\dfrac{7}{10} = 0.7」と答えたくなる。実際、これは正しい。では、なぜ 0.7 が「最も良い推定値」と言えるのか? 0.6 や 0.8 ではダメなのか?
最尤推定法(maximum likelihood estimation, MLE)は、この問いに明確な答えを与える。「観測されたデータが最も起こりやすくなるようなパラメータを選ぶ」という考え方に基づく、統計学で最も広く使われる推定法である。
直感的理解:「尤もらしさ」を最大化する
コインの例で考えよう。表が出る確率を p とする。10回中7回表が出る確率は、二項分布より
この式を p の関数として見ると、「パラメータ p のもとで、観測データがどれくらい起こりやすいか」を表す。これを尤度(likelihood)と呼ぶ。
下のグラフは、尤度を p の関数としてプロットしたものである(最大値で正規化)。
グラフから、p = 0.7 のとき尤度が最大になることがわかる。これが最尤推定値(maximum likelihood estimate)であり、\hat{p} = 0.7 と書く。
「観測されたデータが最も起こりやすくなる」ようなパラメータ値を推定値として採用する。
定義
尤度関数
確率分布のパラメータを \theta、確率密度関数(離散分布なら確率関数)を f(x; \theta) とする。独立な標本 x_1, x_2, \ldots, x_n が得られたとき、尤度関数(likelihood function)は
で定義される。尤度関数は「パラメータ \theta のもとで、観測データ x_1, \ldots, x_n がどれくらい生成されやすいか」を表す。
対数尤度関数
尤度関数は積の形なので、対数を取ると和の形になり計算しやすくなる。対数尤度関数(log-likelihood function)は
対数は単調増加なので、尤度を最大化することと対数尤度を最大化することは同じである。
最尤推定量
尤度関数(または対数尤度関数)を最大にするパラメータ値を最尤推定量(maximum likelihood estimator, MLE)と呼び、\hat{\theta} と書く。
多くの場合、対数尤度を \theta で微分して0とおいた方程式(尤度方程式)を解くことで求められる。
例1:ベルヌーイ分布(コイン投げ)
表が出る確率 p のコインを n 回投げて、k 回表が出たとする。p の最尤推定量を求めよう。
尤度関数
各試行は独立なベルヌーイ分布に従う。表を1、裏を0とすると、尤度関数は
対数尤度関数
最尤推定量の導出
p で微分して0とおく:
したがって、最尤推定量は
つまり、標本比率(表が出た割合)が最尤推定量である。10回中7回表なら \hat{p} = 0.7。
例2:正規分布
正規分布 N(\mu, \sigma^2) に従う標本 x_1, \ldots, x_n から、平均 \mu と分散 \sigma^2 を同時に推定する。
対数尤度関数
正規分布の確率密度関数は f(x; \mu, \sigma^2) = \dfrac{1}{\sqrt{2\pi\sigma^2}} \exp\left( -\dfrac{(x-\mu)^2}{2\sigma^2} \right) なので
μ の最尤推定量
\mu で偏微分して0とおく:
これを解くと
つまり、標本平均が \mu の最尤推定量である。
σ² の最尤推定量
\sigma^2 で偏微分して0とおく:
\mu = \bar{x} を代入して解くと
これは標本分散(n で割る)である。
最尤推定量の標本分散は n で割るが、不偏推定量は n-1 で割る。最尤推定量は必ずしも不偏ではない。
最尤推定量の性質
最尤推定量は、標本サイズ n が大きいとき、優れた性質をもつことが知られている。
一致性
n \to \infty のとき、最尤推定量は真のパラメータ値に確率収束する:
漸近正規性
n が十分大きいとき、最尤推定量は近似的に正規分布に従う:
ここで I(\theta) はフィッシャー情報量である。この性質により、デルタ法を用いて最尤推定量の関数の漸近分布も求められる。
不変性
\hat{\theta} が \theta の最尤推定量であれば、任意の関数 g に対して g(\hat{\theta}) は g(\theta) の最尤推定量である。たとえば、分散 \sigma^2 の最尤推定量が \hat{\sigma}^2 なら、標準偏差 \sigma の最尤推定量は \sqrt{\hat{\sigma}^2} である。
練習問題
ポアソン分布の確率関数は f(x; \lambda) = e^{-\lambda} \dfrac{\lambda^x}{x!} である。
対数尤度関数は
\lambda で微分して0とおくと
よって \hat{\lambda} = \dfrac{1}{n} \sum_{i=1}^{n} x_i = \bar{x}、つまり標本平均が最尤推定量である。
データを代入すると \hat{\lambda} = \dfrac{12+8+15+10+11+9+14}{7} = \dfrac{79}{7} \approx 11.3 人/日。
対数尤度関数は
\lambda で微分して0とおくと
よって
指数分布の期待値は \dfrac{1}{\lambda} なので、その最尤推定量は \bar{x}。不変性より、\lambda の最尤推定量は \dfrac{1}{\bar{x}} である。
ベルヌーイ分布の結果より、\hat{p} = \dfrac{3}{100} = 0.03。
漸近正規性より、\hat{p} の標準誤差は
95%信頼区間は \hat{p} \pm 1.96 \times \text{SE} より
よって95%信頼区間は約 [0, 0.063](下限は0で切る)。不良率は約0〜6.3%と推定される。
まとめ
| 項目 | 内容 |
|---|---|
| 考え方 | 観測データが最も起こりやすくなるパラメータを選ぶ |
| 尤度関数 | L(\theta) = \prod_{i=1}^{n} f(x_i; \theta) |
| 対数尤度 | \ell(\theta) = \sum_{i=1}^{n} \log f(x_i; \theta) |
| 最尤推定量 | 尤度(または対数尤度)を最大にする \hat{\theta} |
| 主な性質 | 一致性、漸近正規性、不変性 |
| 分布 | パラメータ | 最尤推定量 |
|---|---|---|
| ベルヌーイ分布 | p | \hat{p} = \dfrac{k}{n}(標本比率) |
| ポアソン分布 | \lambda | \hat{\lambda} = \bar{x}(標本平均) |
| 正規分布 | \mu | \hat{\mu} = \bar{x}(標本平均) |
| 正規分布 | \sigma^2 | \hat{\sigma}^2 = \dfrac{1}{n}\sum(x_i - \bar{x})^2(標本分散) |
| 指数分布 | \lambda | \hat{\lambda} = \dfrac{1}{\bar{x}} |
Pythonで実装する
正規分布の最尤推定をPythonで実装する。scipy.optimize を使った数値的な方法と、解析解による方法を比較する。
import numpy as np
from scipy import optimize
from scipy import stats
np.random.seed(42)
# サンプルデータを生成(真の値: μ=5, σ²=4)
true_mu, true_sigma2 = 5.0, 4.0
n = 100
data = np.random.normal(true_mu, np.sqrt(true_sigma2), n)
print("=== 正規分布の最尤推定 ===")
print(f"真の値: μ = {true_mu}, σ² = {true_sigma2}")
print(f"サンプルサイズ: n = {n}")
print()
# 方法1: 解析解
mu_hat = data.mean()
sigma2_hat = data.var(ddof=0) # n で割る(最尤推定量)
print("【解析解】")
print(f"μ の最尤推定量: {mu_hat:.4f}")
print(f"σ² の最尤推定量: {sigma2_hat:.4f}")
print()
# 方法2: 数値最適化(負の対数尤度を最小化)
def neg_log_likelihood(params, data):
mu, sigma2 = params
if sigma2 <= 0:
return np.inf
n = len(data)
ll = -n/2 * np.log(2*np.pi*sigma2) - np.sum((data - mu)**2) / (2*sigma2)
return -ll # 最小化するため負にする
result = optimize.minimize(
neg_log_likelihood,
x0=[0, 1], # 初期値
args=(data,),
method='Nelder-Mead'
)
print("【数値最適化】")
print(f"μ の最尤推定量: {result.x[0]:.4f}")
print(f"σ² の最尤推定量: {result.x[1]:.4f}")
print()
# 方法3: scipy.stats を使う
mu_fit, sigma_fit = stats.norm.fit(data)
print("【scipy.stats.norm.fit】")
print(f"μ の最尤推定量: {mu_fit:.4f}")
print(f"σ² の最尤推定量: {sigma_fit**2:.4f}")
3つの方法で同じ結果が得られた。解析解がある場合はそれを使うのが最も効率的だが、複雑な分布では数値最適化が必要になる。