ヘロログ
統計学

最尤推定法

あるコインを10回投げたところ、7回表が出た。このコインの「表が出る確率」はいくらだろうか?

直感的には「\dfrac{7}{10} = 0.7」と答えたくなる。実際、これは正しい。では、なぜ 0.7 が「最も良い推定値」と言えるのか? 0.6 や 0.8 ではダメなのか?

最尤推定法(maximum likelihood estimation, MLE)は、この問いに明確な答えを与える。「観測されたデータが最も起こりやすくなるようなパラメータを選ぶ」という考え方に基づく、統計学で最も広く使われる推定法である。

直感的理解:「尤もらしさ」を最大化する

コインの例で考えよう。表が出る確率を p とする。10回中7回表が出る確率は、二項分布より

P(\text{7回表}) = {}_{10}C_{7} \, p^7 (1-p)^3

この式を p の関数として見ると、「パラメータ p のもとで、観測データがどれくらい起こりやすいか」を表す。これを尤度(likelihood)と呼ぶ。

下のグラフは、尤度を p の関数としてプロットしたものである(最大値で正規化)。

L(p) 0 0.25 0.5 0.75 1 p 0 0.2 0.4 0.6 0.8 1 p̂ = 0.7 最大
図1: 尤度関数 L(p)。10回中7回表が出たとき、p = 0.7 で尤度が最大になる

グラフから、p = 0.7 のとき尤度が最大になることがわかる。これが最尤推定値(maximum likelihood estimate)であり、\hat{p} = 0.7 と書く。

最尤推定法の考え方

「観測されたデータが最も起こりやすくなる」ようなパラメータ値を推定値として採用する。

定義

尤度関数

確率分布のパラメータを \theta、確率密度関数(離散分布なら確率関数)を f(x; \theta) とする。独立な標本 x_1, x_2, \ldots, x_n が得られたとき、尤度関数(likelihood function)は

尤度関数
L(\theta) = \prod_{i=1}^{n} f(x_i; \theta)

で定義される。尤度関数は「パラメータ \theta のもとで、観測データ x_1, \ldots, x_n がどれくらい生成されやすいか」を表す。

対数尤度関数

尤度関数は積の形なので、対数を取ると和の形になり計算しやすくなる。対数尤度関数(log-likelihood function)は

\ell(\theta) = \log L(\theta) = \sum_{i=1}^{n} \log f(x_i; \theta)

対数は単調増加なので、尤度を最大化することと対数尤度を最大化することは同じである。

最尤推定量

尤度関数(または対数尤度関数)を最大にするパラメータ値を最尤推定量(maximum likelihood estimator, MLE)と呼び、\hat{\theta} と書く。

最尤推定量
\hat{\theta} = \underset{\theta}{\operatorname{argmax}} \, L(\theta) = \underset{\theta}{\operatorname{argmax}} \, \ell(\theta)

多くの場合、対数尤度を \theta で微分して0とおいた方程式(尤度方程式)を解くことで求められる。

\dfrac{\partial \ell(\theta)}{\partial \theta} = 0

例1:ベルヌーイ分布(コイン投げ)

表が出る確率 p のコインを n 回投げて、k 回表が出たとする。p の最尤推定量を求めよう。

尤度関数

各試行は独立なベルヌーイ分布に従う。表を1、裏を0とすると、尤度関数は

L(p) = p^k (1-p)^{n-k}

対数尤度関数

\ell(p) = k \log p + (n-k) \log(1-p)

最尤推定量の導出

p で微分して0とおく:

\begin{aligned} \dfrac{d\ell}{dp} &= \dfrac{k}{p} - \dfrac{n-k}{1-p} = 0 \\[5pt] \dfrac{k}{p} &= \dfrac{n-k}{1-p} \\[5pt] k(1-p) &= p(n-k) \\[5pt] k &= np \end{aligned}

したがって、最尤推定量は

\hat{p} = \dfrac{k}{n}

つまり、標本比率(表が出た割合)が最尤推定量である。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) なので

\ell(\mu, \sigma^2) = -\dfrac{n}{2} \log(2\pi\sigma^2) - \dfrac{1}{2\sigma^2} \sum_{i=1}^{n} (x_i - \mu)^2

μ の最尤推定量

\mu で偏微分して0とおく:

\dfrac{\partial \ell}{\partial \mu} = \dfrac{1}{\sigma^2} \sum_{i=1}^{n} (x_i - \mu) = 0

これを解くと

\hat{\mu} = \dfrac{1}{n} \sum_{i=1}^{n} x_i = \bar{x}

つまり、標本平均\mu の最尤推定量である。

σ² の最尤推定量

\sigma^2 で偏微分して0とおく:

\dfrac{\partial \ell}{\partial \sigma^2} = -\dfrac{n}{2\sigma^2} + \dfrac{1}{2(\sigma^2)^2} \sum_{i=1}^{n} (x_i - \mu)^2 = 0

\mu = \bar{x} を代入して解くと

\hat{\sigma}^2 = \dfrac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^2

これは標本分散(n で割る)である。

注意

最尤推定量の標本分散は n で割るが、不偏推定量n-1 で割る。最尤推定量は必ずしも不偏ではない。

最尤推定量の性質

最尤推定量は、標本サイズ n が大きいとき、優れた性質をもつことが知られている。

一致性

n \to \infty のとき、最尤推定量は真のパラメータ値に確率収束する:

\hat{\theta} \xrightarrow{p} \theta

漸近正規性

n が十分大きいとき、最尤推定量は近似的に正規分布に従う:

\sqrt{n}(\hat{\theta} - \theta) \xrightarrow{d} N(0, I(\theta)^{-1})

ここで I(\theta)フィッシャー情報量である。この性質により、デルタ法を用いて最尤推定量の関数の漸近分布も求められる。

不変性

\hat{\theta}\theta の最尤推定量であれば、任意の関数 g に対して g(\hat{\theta})g(\theta) の最尤推定量である。たとえば、分散 \sigma^2 の最尤推定量が \hat{\sigma}^2 なら、標準偏差 \sigma の最尤推定量は \sqrt{\hat{\sigma}^2} である。

練習問題

問1. ある店に来店する客数を1週間記録したところ、1日あたりの来客数は 12, 8, 15, 10, 11, 9, 14 人だった。来客数がポアソン分布 \text{Po}(\lambda) に従うとして、\lambda の最尤推定値を求めよ。

ポアソン分布の確率関数は f(x; \lambda) = e^{-\lambda} \dfrac{\lambda^x}{x!} である。

対数尤度関数は

\ell(\lambda) = \sum_{i=1}^{n} \left( -\lambda + x_i \log \lambda - \log x_i! \right) = -n\lambda + \log \lambda \sum_{i=1}^{n} x_i - \sum_{i=1}^{n} \log x_i!

\lambda で微分して0とおくと

\dfrac{d\ell}{d\lambda} = -n + \dfrac{1}{\lambda} \sum_{i=1}^{n} x_i = 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 人/日。

問2. 指数分布 \text{Exp}(\lambda)(確率密度関数 f(x; \lambda) = \lambda e^{-\lambda x}x \geq 0)に従う標本 x_1, \ldots, x_n から、\lambda の最尤推定量を求めよ。

対数尤度関数は

\ell(\lambda) = \sum_{i=1}^{n} (\log \lambda - \lambda x_i) = n \log \lambda - \lambda \sum_{i=1}^{n} x_i

\lambda で微分して0とおくと

\dfrac{d\ell}{d\lambda} = \dfrac{n}{\lambda} - \sum_{i=1}^{n} x_i = 0

よって

\hat{\lambda} = \dfrac{n}{\sum_{i=1}^{n} x_i} = \dfrac{1}{\bar{x}}

指数分布の期待値は \dfrac{1}{\lambda} なので、その最尤推定量は \bar{x}。不変性より、\lambda の最尤推定量は \dfrac{1}{\bar{x}} である。

問3. ある製品の不良率を調べるため、100個の製品を検査したところ、3個が不良品だった。不良率 p の最尤推定値と、その95%信頼区間の近似値を求めよ。ただし、\hat{p} は近似的に正規分布 N\left(p, \dfrac{p(1-p)}{n}\right) に従うことを用いてよい。

ベルヌーイ分布の結果より、\hat{p} = \dfrac{3}{100} = 0.03

漸近正規性より、\hat{p} の標準誤差は

\text{SE} = \sqrt{\dfrac{\hat{p}(1-\hat{p})}{n}} = \sqrt{\dfrac{0.03 \times 0.97}{100}} \approx 0.017

95%信頼区間は \hat{p} \pm 1.96 \times \text{SE} より

0.03 \pm 1.96 \times 0.017 = 0.03 \pm 0.033

よって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 を使った数値的な方法と、解析解による方法を比較する。

mle.py
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}")
=== 正規分布の最尤推定 === 真の値: μ = 5.0, σ² = 4.0 サンプルサイズ: n = 100 【解析解】 μ の最尤推定量: 4.7923 σ² の最尤推定量: 3.2661 【数値最適化】 μ の最尤推定量: 4.7923 σ² の最尤推定量: 3.2661 【scipy.stats.norm.fit】 μ の最尤推定量: 4.7923 σ² の最尤推定量: 3.2661

3つの方法で同じ結果が得られた。解析解がある場合はそれを使うのが最も効率的だが、複雑な分布では数値最適化が必要になる。