対数正規分布(log-normal distribution)は、対数をとると正規分布に従う確率変数の分布である。正の値のみをとり、右に長い裾をもつ分布形状が特徴で、現実世界の多くの現象をモデル化するのに適している。
所得分布、株価の変動、生物の体重や寿命、粒子のサイズ分布など、「掛け算的に変動する量」は対数正規分布に従うことが多い。これは中心極限定理の「積」バージョンとして理解できる。多数の独立な正の確率変数の積は、対数正規分布に近づく。
定義
確率変数 Y が正規分布 N(\mu, \sigma^2) に従うとき、X = e^Y は対数正規分布に従う。
逆に言えば、X \sim \Lambda(\mu, \sigma^2) のとき \log X \sim N(\mu, \sigma^2) となる。パラメータ \mu と \sigma^2 は、対数をとった後の正規分布のパラメータであることに注意する。
確率密度関数
対数正規分布 \Lambda(\mu, \sigma^2) の確率密度関数は以下のようになる。
x \leq 0 では f(x) = 0 である。確率密度関数の特徴として、分母に x が現れることと、指数部分に \log x が含まれることが挙げられる。
グラフ
パラメータ \sigma を変化させたときの対数正規分布の形状を示す(\mu = 0 で固定)。
\sigma が小さいほど分布は左に集中し、\sigma が大きくなると右側に裾が長く伸びる。どの場合も正の値のみをとり、左側で 0 に漸近する。
確率密度関数の導出
Y \sim N(\mu, \sigma^2) のとき、X = e^Y の確率密度関数を変数変換により導出する。
正規分布 N(\mu, \sigma^2) の確率密度関数は
変換 X = e^Y の逆変換は Y = \log X である。ヤコビアンを計算すると
したがって、X の確率密度関数は
これが対数正規分布の確率密度関数である。
期待値と分散
対数正規分布 \Lambda(\mu, \sigma^2) の期待値と分散は次のようになる。
【導出】 X = e^Y、Y \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^2] は
よって分散は
一般に、k 次のモーメントは E[X^k] = M_Y(k) = \exp\left(k\mu + \dfrac{k^2\sigma^2}{2}\right) で与えられる。
中央値と最頻値
対数正規分布では、期待値・中央値・最頻値がすべて異なる値をとる。
【中央値の導出】 Y \sim N(\mu, \sigma^2) の中央値は \mu である。X = e^Y は単調増加変換なので、X の中央値は e^\mu となる。
【最頻値の導出】 確率密度関数 f(x) を x で微分して 0 とおく。
計算を進めると \log x = \mu - \sigma^2 が得られ、x = e^{\mu - \sigma^2} が最頻値となる。
これらの大小関係は常に
となり、分布が右に歪んでいることを反映している。
累積分布関数
対数正規分布の累積分布関数は、標準正規分布の累積分布関数 \Phi を用いて表される。
【導出】 X = e^Y、Y \sim N(\mu, \sigma^2) より
計算例
X \sim \Lambda(0, 1)(\mu = 0, \sigma = 1)のとき、各種統計量を求める。
期待値:
分散:
中央値:
最頻値:
P(X \leq 1):
中央値が 1 であることと整合している。
練習問題
期待値:
中央値:
期待値と中央値の差が大きく、分布が右に強く歪んでいることがわかる。
\log X \sim N(\mu, \sigma^2) より
したがって
対数正規分布に正の定数を掛けると、位置パラメータが \log c だけ平行移動する。
\log X_1, \log X_2 \sim N(\mu, \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を使って対数正規分布の計算やシミュレーションを行う。
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})")
scipy.stats.lognorm では、パラメータ s が \sigma、scale が e^\mu に対応することに注意する。シミュレーションにより、\log X が正規分布に従うことが確認できる。