ヘロログ
統計学

対数正規分布

対数正規分布(log-normal distribution)は、対数をとると正規分布に従う確率変数の分布である。正の値のみをとり、右に長い裾をもつ分布形状が特徴で、現実世界の多くの現象をモデル化するのに適している。

所得分布、株価の変動、生物の体重や寿命、粒子のサイズ分布など、「掛け算的に変動する量」は対数正規分布に従うことが多い。これは中心極限定理の「積」バージョンとして理解できる。多数の独立な正の確率変数の積は、対数正規分布に近づく。

定義

確率変数 Y が正規分布 N(\mu, \sigma^2) に従うとき、X = e^Y対数正規分布に従う。

対数正規分布の定義
Y \sim N(\mu, \sigma^2) \quad \Rightarrow \quad X = e^Y \sim \Lambda(\mu, \sigma^2)

逆に言えば、X \sim \Lambda(\mu, \sigma^2) のとき \log X \sim N(\mu, \sigma^2) となる。パラメータ \mu\sigma^2 は、対数をとった後の正規分布のパラメータであることに注意する。

確率密度関数

対数正規分布 \Lambda(\mu, \sigma^2) の確率密度関数は以下のようになる。

確率密度関数
f(x) = \dfrac{1}{\sqrt{2\pi}\sigma x} \exp\left(-\dfrac{(\log x - \mu)^2}{2\sigma^2}\right), \quad x > 0

x \leq 0 では f(x) = 0 である。確率密度関数の特徴として、分母に x が現れることと、指数部分に \log x が含まれることが挙げられる。

グラフ

パラメータ \sigma を変化させたときの対数正規分布の形状を示す(\mu = 0 で固定)。

f(x) 1.0 0.75 0.5 0.25 0 x 0 1 2 3 4 5
━━ \sigma = 0.5
━━ \sigma = 1.0
━━ \sigma = 1.5
図1: 対数正規分布の確率密度関数(μ=0)

\sigma が小さいほど分布は左に集中し、\sigma が大きくなると右側に裾が長く伸びる。どの場合も正の値のみをとり、左側で 0 に漸近する。

確率密度関数の導出

Y \sim N(\mu, \sigma^2) のとき、X = e^Y の確率密度関数を変数変換により導出する。

正規分布 N(\mu, \sigma^2) の確率密度関数は

f_Y(y) = \dfrac{1}{\sqrt{2\pi}\sigma} \exp\left(-\dfrac{(y - \mu)^2}{2\sigma^2}\right)

変換 X = e^Y の逆変換は Y = \log X である。ヤコビアンを計算すると

\left|\dfrac{dy}{dx}\right| = \left|\dfrac{d(\log x)}{dx}\right| = \dfrac{1}{x}

したがって、X の確率密度関数は

\begin{aligned} f_X(x) &= f_Y(\log x) \cdot \left|\dfrac{dy}{dx}\right| \\[5pt] &= \dfrac{1}{\sqrt{2\pi}\sigma} \exp\left(-\dfrac{(\log x - \mu)^2}{2\sigma^2}\right) \cdot \dfrac{1}{x} \\[5pt] &= \dfrac{1}{\sqrt{2\pi}\sigma x} \exp\left(-\dfrac{(\log x - \mu)^2}{2\sigma^2}\right) \end{aligned}

これが対数正規分布の確率密度関数である。

期待値と分散

対数正規分布 \Lambda(\mu, \sigma^2) の期待値と分散は次のようになる。

期待値と分散
E[X] = \exp\left(\mu + \dfrac{\sigma^2}{2}\right), \quad V[X] = \exp(2\mu + \sigma^2)\left(\exp(\sigma^2) - 1\right)

【導出】 X = e^YY \sim N(\mu, \sigma^2) のとき、正規分布のモーメント母関数 M_Y(t) = E[e^{tY}] = \exp\left(\mu t + \dfrac{\sigma^2 t^2}{2}\right) を利用する。

期待値 E[X]

E[X] = E[e^Y] = M_Y(1) = \exp\left(\mu + \dfrac{\sigma^2}{2}\right)

E[X^2]

E[X^2] = E[e^{2Y}] = M_Y(2) = \exp\left(2\mu + 2\sigma^2\right)

よって分散は

\begin{aligned} V[X] &= E[X^2] - (E[X])^2 \\[5pt] &= \exp(2\mu + 2\sigma^2) - \exp\left(2\mu + \sigma^2\right) \\[5pt] &= \exp(2\mu + \sigma^2)\left(\exp(\sigma^2) - 1\right) \end{aligned}

一般に、k 次のモーメントは E[X^k] = M_Y(k) = \exp\left(k\mu + \dfrac{k^2\sigma^2}{2}\right) で与えられる。

中央値と最頻値

対数正規分布では、期待値・中央値・最頻値がすべて異なる値をとる。

中央値と最頻値
\text{中央値} = e^\mu, \quad \text{最頻値} = e^{\mu - \sigma^2}

【中央値の導出】 Y \sim N(\mu, \sigma^2) の中央値は \mu である。X = e^Y は単調増加変換なので、X の中央値は e^\mu となる。

【最頻値の導出】 確率密度関数 f(x)x で微分して 0 とおく。

\dfrac{d}{dx}\left[\dfrac{1}{x} \exp\left(-\dfrac{(\log x - \mu)^2}{2\sigma^2}\right)\right] = 0

計算を進めると \log x = \mu - \sigma^2 が得られ、x = e^{\mu - \sigma^2} が最頻値となる。

これらの大小関係は常に

\text{最頻値} < \text{中央値} < \text{期待値}

となり、分布が右に歪んでいることを反映している。

累積分布関数

対数正規分布の累積分布関数は、標準正規分布の累積分布関数 \Phi を用いて表される。

累積分布関数
F(x) = \Phi\left(\dfrac{\log x - \mu}{\sigma}\right), \quad x > 0

【導出】 X = e^YY \sim N(\mu, \sigma^2) より

\begin{aligned} F(x) = P(X \leq x) &= P(e^Y \leq x) = P(Y \leq \log x) \\[5pt] &= P\left(\dfrac{Y - \mu}{\sigma} \leq \dfrac{\log x - \mu}{\sigma}\right) = \Phi\left(\dfrac{\log x - \mu}{\sigma}\right) \end{aligned}

計算例

X \sim \Lambda(0, 1)\mu = 0, \sigma = 1)のとき、各種統計量を求める。

期待値:

E[X] = \exp\left(0 + \dfrac{1}{2}\right) = e^{0.5} \approx 1.6487

分散:

V[X] = \exp(0 + 1)(e^1 - 1) = e(e - 1) \approx 4.6708

中央値:

e^0 = 1

最頻値:

e^{0 - 1} = e^{-1} \approx 0.3679

P(X \leq 1)

P(X \leq 1) = \Phi\left(\dfrac{\log 1 - 0}{1}\right) = \Phi(0) = 0.5

中央値が 1 であることと整合している。

練習問題

問1. X \sim \Lambda(1, 4)\mu = 1, \sigma^2 = 4)のとき、期待値と中央値を求めよ。

期待値:

E[X] = \exp\left(1 + \dfrac{4}{2}\right) = e^3 \approx 20.09

中央値:

e^\mu = e^1 = e \approx 2.718

期待値と中央値の差が大きく、分布が右に強く歪んでいることがわかる。

問2. X \sim \Lambda(\mu, \sigma^2) のとき、Y = cXc > 0)の従う分布を求めよ。

\log X \sim N(\mu, \sigma^2) より

\log Y = \log(cX) = \log c + \log X \sim N(\mu + \log c, \sigma^2)

したがって

Y = cX \sim \Lambda(\mu + \log c, \sigma^2)

対数正規分布に正の定数を掛けると、位置パラメータが \log c だけ平行移動する。

問3. X_1, X_2 が独立に \Lambda(\mu, \sigma^2) に従うとき、X_1 X_2 の従う分布を求めよ。

\log X_1, \log X_2 \sim N(\mu, \sigma^2) が独立なので

\log(X_1 X_2) = \log X_1 + \log X_2 \sim N(2\mu, 2\sigma^2)

したがって

X_1 X_2 \sim \Lambda(2\mu, 2\sigma^2)

対数正規分布の積は再び対数正規分布に従う(再生性)。

まとめ

項目 内容
分布名 対数正規分布(log-normal distribution)
記号 \Lambda(\mu, \sigma^2)
パラメータ \mu \in \mathbb{R}(対数の平均)、\sigma > 0(対数の標準偏差)
確率密度関数 f(x) = \dfrac{1}{\sqrt{2\pi}\sigma x} \exp\left(-\dfrac{(\log x - \mu)^2}{2\sigma^2}\right) (x > 0
累積分布関数 F(x) = \Phi\left(\dfrac{\log x - \mu}{\sigma}\right)
期待値 \exp\left(\mu + \dfrac{\sigma^2}{2}\right)
分散 \exp(2\mu + \sigma^2)(\exp(\sigma^2) - 1)
中央値 e^\mu
最頻値 e^{\mu - \sigma^2}
正規分布との関係 X \sim \Lambda(\mu, \sigma^2) \Leftrightarrow \log X \sim N(\mu, \sigma^2)

Pythonで実装する

Pythonを使って対数正規分布の計算やシミュレーションを行う。

lognormal_distribution.py
import numpy as np
from scipy import stats

print("=== 対数正規分布 Λ(μ=0, σ²=1) ===")

# scipy.stats.lognorm のパラメータ
# s = σ (shape parameter)
# scale = exp(μ) (scale parameter)
mu, sigma = 0, 1
dist = stats.lognorm(s=sigma, scale=np.exp(mu))

# 期待値と分散(理論値)
E_theory = np.exp(mu + sigma**2 / 2)
V_theory = np.exp(2*mu + sigma**2) * (np.exp(sigma**2) - 1)
print(f"\n期待値: {dist.mean():.4f} (理論値: {E_theory:.4f})")
print(f"分散:   {dist.var():.4f} (理論値: {V_theory:.4f})")

# 中央値と最頻値
median_theory = np.exp(mu)
mode_theory = np.exp(mu - sigma**2)
print(f"\n中央値: {dist.median():.4f} (理論値: {median_theory:.4f})")
print(f"最頻値: {mode_theory:.4f}")

# 確率密度関数
print("\n確率密度関数の値:")
for x in [0.5, 1.0, 2.0, 3.0]:
    print(f"  f({x}) = {dist.pdf(x):.4f}")

# 累積分布関数
print("\n累積分布関数:")
for x in [0.5, 1.0, 2.0, 3.0]:
    print(f"  P(X ≤ {x}) = {dist.cdf(x):.4f}")

# パラメータを変えた場合
print("\n=== パラメータによる比較 ===")
params = [(0, 0.5), (0, 1.0), (0, 1.5)]
print(f"{'μ':>5} {'σ':>5} {'E[X]':>10} {'V[X]':>12} {'中央値':>10} {'最頻値':>10}")
print("-" * 55)
for mu, sigma in params:
    d = stats.lognorm(s=sigma, scale=np.exp(mu))
    E = np.exp(mu + sigma**2 / 2)
    V = np.exp(2*mu + sigma**2) * (np.exp(sigma**2) - 1)
    mode = np.exp(mu - sigma**2)
    print(f"{mu:>5} {sigma:>5} {E:>10.4f} {V:>12.4f} {np.exp(mu):>10.4f} {mode:>10.4f}")

# 正規分布との関係を確認
print("\n=== 正規分布との関係 ===")
np.random.seed(42)
n = 100000
Y = np.random.normal(mu, sigma, n)  # Y ~ N(0, 1)
X = np.exp(Y)  # X ~ Λ(0, 1)

print(f"サンプル数: {n}")
print(f"log(X) の平均: {np.mean(np.log(X)):.4f} (理論値: {mu})")
print(f"log(X) の分散: {np.var(np.log(X)):.4f} (理論値: {sigma**2})")
print(f"X の標本平均: {np.mean(X):.4f} (理論値: {E_theory:.4f})")
print(f"X の標本中央値: {np.median(X):.4f} (理論値: {median_theory:.4f})")
=== 対数正規分布 Λ(μ=0, σ²=1) === 期待値: 1.6487 (理論値: 1.6487) 分散: 4.6708 (理論値: 4.6708) 中央値: 1.0000 (理論値: 1.0000) 最頻値: 0.3679 確率密度関数の値: f(0.5) = 0.6275 f(1.0) = 0.3989 f(2.0) = 0.1569 f(3.0) = 0.0727 累積分布関数: P(X ≤ 0.5) = 0.2441 P(X ≤ 1.0) = 0.5000 P(X ≤ 2.0) = 0.7559 P(X ≤ 3.0) = 0.8640 === パラメータによる比較 === μ σ E[X] V[X] 中央値 最頻値 ------------------------------------------------------- 0 0.5 1.1331 0.3647 1.0000 0.7788 0 1.0 1.6487 4.6708 1.0000 0.3679 0 1.5 3.0802 80.5294 1.0000 0.1054 === 正規分布との関係 === サンプル数: 100000 log(X) の平均: 0.0006 (理論値: 0) log(X) の分散: 0.9981 (理論値: 1) X の標本平均: 1.6522 (理論値: 1.6487) X の標本中央値: 1.0006 (理論値: 1.0000)

scipy.stats.lognorm では、パラメータ s\sigmascalee^\mu に対応することに注意する。シミュレーションにより、\log X が正規分布に従うことが確認できる。