所得分布、株価の変動率、粒子のサイズ、生物の体重、製品の寿命——これらのデータに共通する特徴は何でしょうか。答えは、「正の値のみをとり、右に長い裾を持つ分布」に従うということです。
正規分布は対称で負の値もとりますが、所得や株価が負になることはありません。このような正の値に制約されたデータを自然にモデル化できるのが対数正規分布(log-normal distribution)です。
対数正規分布は驚くほどシンプルな定義を持っています。確率変数 $X$ の対数 $\ln X$ が正規分布に従うとき、$X$ は対数正規分布に従います。つまり、正規分布を「指数関数で変換」しただけなのです。
対数正規分布を理解すると、以下のような応用が開けます。
- 金融工学: 株価の変動モデル(ブラック・ショールズモデルの前提)
- 信頼性工学: 製品の寿命分布のモデリング
- 環境科学: 汚染物質の濃度分布、粒径分布
- 生物学: 細胞サイズ、体重、種の個体数
本記事では、対数正規分布が「乗法的な偶然の積み重ね」から自然に現れることを直感的に理解し、確率密度関数を導出します。さらに、モーメントの計算と特異な性質、そしてPythonによる可視化と応用例を示します。
本記事の内容
- 対数正規分布の直感的理解(乗法的過程)
- 確率密度関数の導出
- 幾何平均・モーメント・最頻値の計算
- モーメント母関数が存在しない理由
- Pythonによる可視化とシミュレーション
- 金融工学と信頼性工学への応用
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
対数正規分布とは — 直感的な理解
乗法的な過程から生まれる分布
正規分布が「多数の独立な微小効果の加法的な積み重ね」から生まれることは、中心極限定理が教えてくれます。では、微小効果が乗法的に積み重なる場合はどうなるでしょうか。
たとえば、ある企業の株価を考えましょう。株価は毎日、前日の株価に対して一定の倍率で変動します。月曜に1.02倍、火曜に0.98倍、水曜に1.03倍……というように。$n$ 日後の株価 $S_n$ は初期価格 $S_0$ に対して次のように表されます。
$$ S_n = S_0 \cdot R_1 \cdot R_2 \cdots R_n $$
ここで $R_i$ は $i$ 日目の変動率(正の値)です。この式の対数を取ると、
$$ \ln S_n = \ln S_0 + \ln R_1 + \ln R_2 + \cdots + \ln R_n $$
$\ln R_i$ たちが独立同分布の確率変数であれば、中心極限定理により $\ln S_n$ は正規分布に近づきます。$\ln S_n$ が正規分布に従うならば、$S_n$ は対数正規分布に従うのです。
このように、乗法的な効果の積み重ねは対数正規分布を生む という原理を乗法的中心極限定理と呼ぶことがあります。
なぜ多くの現象が対数正規に従うのか
所得分布が対数正規分布に近い理由も、同じ原理で説明できます。年収は多くの乗法的要因(教育レベルによる倍率、業界による倍率、経験年数による倍率、運による倍率……)の積として決まります。これらの要因がおおよそ独立であれば、その積の分布は対数正規分布に近づきます。
粒子のサイズ分布も同様です。粒子が砕けるとき、元のサイズの一定割合として破片が生じるという乗法的なプロセスが繰り返されると、粒径分布は対数正規分布に従います。
加法的なプロセス → 正規分布、乗法的なプロセス → 対数正規分布。この対応関係が、対数正規分布を理解するための最も重要な鍵です。
この直感を数学的に定式化しましょう。
対数正規分布の数学的定義
確率変数 $X > 0$ が次の条件を満たすとき、$X$ は対数正規分布に従うといい、$X \sim \text{LogNormal}(\mu, \sigma^2)$ と書きます。
$$ \begin{equation} \ln X \sim N(\mu, \sigma^2) \end{equation} $$
ここで $\mu$ と $\sigma^2$ は $\ln X$ の平均と分散です。$\mu$ と $\sigma^2$ は $X$ そのものの平均と分散ではないことに注意が必要です。
同値な表現として、$Z \sim N(0, 1)$(標準正規分布)のとき
$$ X = e^{\mu + \sigma Z} $$
は $\text{LogNormal}(\mu, \sigma^2)$ に従います。
次に、この定義から確率密度関数を導出します。
確率密度関数の導出
$Y = \ln X \sim N(\mu, \sigma^2)$ とします。$X = e^Y$ なので、変数変換 $y = \ln x$ を用います。
$Y$ の確率密度関数は
$$ f_Y(y) = \frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(y-\mu)^2}{2\sigma^2}\right) $$
変数変換の公式 $f_X(x) = f_Y(g^{-1}(x)) \cdot |dg^{-1}/dx|$ において、$g^{-1}(x) = \ln x$ なので $|dg^{-1}/dx| = 1/x$ です。
$$ f_X(x) = f_Y(\ln x) \cdot \frac{1}{x} $$
代入して整理すると、
$$ \begin{equation} f(x;\, \mu, \sigma) = \frac{1}{x\sigma\sqrt{2\pi}}\exp\left(-\frac{(\ln x – \mu)^2}{2\sigma^2}\right), \quad x > 0 \end{equation} $$
$x \leq 0$ では $f(x) = 0$ です。
この式の構造を読み解きましょう。正規分布の確率密度関数と比較すると、$x$ が $\ln x$ に、$dx$ が $dx/x = d(\ln x)$ に置き換わっています。因子 $1/x$ は変数変換のヤコビアンから来ており、$x$ が大きいところで確率密度を「圧縮」する効果があります。これが対数正規分布の右裾が長くなる原因です。
累積分布関数(CDF)は、正規分布の累積分布関数 $\Phi$ を使って次のように書けます。
$$ \begin{equation} F(x) = \Phi\left(\frac{\ln x – \mu}{\sigma}\right) \end{equation} $$
これは「対数を取ったら正規分布になる」という定義の直接的な帰結です。
確率密度関数が得られたので、次にモーメントを計算しましょう。
期待値・分散・モーメント
$n$ 次モーメント
対数正規分布の $n$ 次モーメントは、正規分布のモーメント母関数を利用して計算できます。
$$ E[X^n] = E[e^{nY}] \quad (Y = \ln X \sim N(\mu, \sigma^2)) $$
正規分布 $Y \sim N(\mu, \sigma^2)$ のモーメント母関数は $M_Y(t) = e^{\mu t + \sigma^2 t^2/2}$ なので、$t = n$ として
$$ \begin{equation} E[X^n] = \exp\left(n\mu + \frac{n^2\sigma^2}{2}\right) \end{equation} $$
この一般式から各統計量が得られます。
期待値
$n = 1$ とおくと、
$$ \begin{equation} E[X] = e^{\mu + \sigma^2/2} \end{equation} $$
注目すべき点は、$\mu > 0$ でなくても $E[X] > 0$ であること(当然、$X > 0$ なので)、そして $\sigma^2$ が大きいほど期待値が大きくなることです。後者は一見奇妙に思えますが、右裾が重くなることで平均が引き上げられるためです。
分散
$E[X^2] = e^{2\mu + 2\sigma^2}$ を使って、
$$ \text{Var}(X) = E[X^2] – (E[X])^2 = e^{2\mu + \sigma^2}(e^{\sigma^2} – 1) $$
$$ \begin{equation} \text{Var}(X) = (E[X])^2(e^{\sigma^2} – 1) \end{equation} $$
変動係数 $\text{CV} = \sqrt{\text{Var}(X)}/E[X] = \sqrt{e^{\sigma^2} – 1}$ は $\mu$ に依存せず、$\sigma$ のみで決まります。
中央値と最頻値
中央値: $\ln X$ の中央値は $\mu$ なので、$X$ の中央値は
$$ \begin{equation} \text{median} = e^{\mu} \end{equation} $$
最頻値: $f(x)$ の微分をゼロとおくと($\frac{d}{dx}[\ln f(x)] = 0$ を解く)、
$$ \begin{equation} \text{mode} = e^{\mu – \sigma^2} \end{equation} $$
これら3つの代表値には次の順序関係が常に成り立ちます。
$$ \text{mode} \leq \text{median} \leq \text{mean} $$
$$ e^{\mu – \sigma^2} \leq e^{\mu} \leq e^{\mu + \sigma^2/2} $$
$\sigma$ が大きいほど3つの値の差が広がり、分布の非対称性(右裾の重さ)が顕著になります。$\sigma \to 0$ の極限では3つの値が $e^{\mu}$ に収束し、分布はデルタ関数に近づきます。
幾何平均との関係
対数正規分布において、幾何平均(geometric mean)$G = \exp(E[\ln X]) = e^{\mu}$ は中央値に等しくなります。
これは実用的に重要です。対数正規分布に従うデータの「代表的な値」としては、算術平均よりも幾何平均(= 中央値)の方が適切であることが多いです。所得データで「平均年収」が多くの人の実感とずれるのは、算術平均が右裾の富裕層に引っ張られるためです。
次に、対数正規分布の興味深い理論的性質を見てみましょう。
モーメント母関数が存在しない
対数正規分布の特異な性質として、モーメント母関数が $t \neq 0$ で存在しないことが挙げられます。
$$ M_X(t) = E[e^{tX}] = E[e^{te^Y}] \quad (Y \sim N(\mu, \sigma^2)) $$
$t > 0$ のとき、$e^{te^y}$ は $y \to \infty$ で超指数関数的に増大するため、正規分布の裾による減衰 $e^{-y^2/(2\sigma^2)}$ では抑えきれず、積分が発散します。
$$ M_X(t) = \int_{-\infty}^{\infty} e^{te^y} \cdot \frac{1}{\sqrt{2\pi}\sigma}e^{-(y-\mu)^2/(2\sigma^2)} dy = \infty \quad (t > 0) $$
これは全てのモーメント $E[X^n]$ が存在するにもかかわらず、モーメント母関数が存在しないという注目すべき例です。対数正規分布は「モーメントの系列 $\{E[X^n]\}_{n=1}^{\infty}$ によって一意に特徴づけられない」分布の一つであり、ハンバーガーのモーメント問題の反例としても知られています。
この性質は理論的な好奇心に留まらず、実用的な含意もあります。対数正規分布の裾は正規分布よりもはるかに重いため、極端な値(外れ値)が出やすいのです。
代替として、確率母関数($E[t^X]$)やキュムラント母関数($\ln M_Y(t)$)を使うことで分布の特性を議論できます。
Pythonで対数正規分布の形状を可視化してみましょう。
Pythonによる確率密度関数の可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
fig, axes = plt.subplots(1, 2, figsize=(14, 5.5))
# (a) σを変化(μ = 0 固定)
ax = axes[0]
mu = 0
x = np.linspace(0.001, 8, 1000)
for sigma in [0.25, 0.5, 1.0, 1.5, 2.0]:
pdf = stats.lognorm.pdf(x, s=sigma, scale=np.exp(mu))
ax.plot(x, pdf, linewidth=2, label=rf"$\sigma = {sigma}$")
# 中央値と期待値を表示(σ=1.0のみ)
if sigma == 1.0:
median = np.exp(mu)
mean = np.exp(mu + sigma**2 / 2)
ax.axvline(median, color="gray", linewidth=1, linestyle=":")
ax.axvline(mean, color="gray", linewidth=1, linestyle="--")
ax.set_xlabel("x", fontsize=12)
ax.set_ylabel("f(x)", fontsize=12)
ax.set_title(r"LogNormal PDF: varying $\sigma$ ($\mu = 0$)", fontsize=13)
ax.legend(fontsize=10)
ax.set_ylim(0, 2.0)
ax.grid(True, alpha=0.3)
# (b) 対数スケールでの表示
ax = axes[1]
x_log = np.linspace(0.001, 30, 1000)
for sigma in [0.5, 1.0, 1.5]:
pdf = stats.lognorm.pdf(x_log, s=sigma, scale=np.exp(0))
# 通常スケール
ax.plot(x_log, pdf, linewidth=2, label=rf"$\sigma = {sigma}$")
ax.set_xlabel("x", fontsize=12)
ax.set_ylabel("f(x)", fontsize=12)
ax.set_title("LogNormal PDF: right tail behavior", fontsize=13)
ax.legend(fontsize=10)
ax.set_xlim(0, 30)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("lognormal_pdf.png", dpi=150, bbox_inches="tight")
plt.show()
このグラフから、対数正規分布の形状について以下の特徴が読み取れます。
-
$\sigma$ が小さいとき、分布は鋭いピークを持ち、正規分布に近い形 です。$\sigma = 0.25$ では対称に近い形をしていますが、$\sigma$ が大きくなると右裾が急速に伸びます
-
$\sigma = 1.0$ のとき、中央値($e^0 = 1$、点線)と期待値($e^{0.5} \approx 1.65$、破線)のずれが明確 です。算術平均が中央値よりも大きいのは、右裾の重さに引っ張られるためです
-
右図: 右裾の重さが $\sigma$ に強く依存する 。$\sigma = 1.5$ では $x = 30$ でもまだ有意な確率密度を持っています。この重い裾が、対数正規分布が「極端な値」を生みやすい性質の原因です
乗法的中心極限定理の検証
理論で述べた「乗法的な過程が対数正規分布を生む」ことをシミュレーションで確認します。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
fig, axes = plt.subplots(1, 2, figsize=(14, 5.5))
# 乗法的過程のシミュレーション
n_samples = 50000
ax = axes[0]
for n_factors in [2, 5, 20, 100]:
# 独立な正の確率変数の積
# 各因子は一様分布 U(0.5, 1.5) に従う
factors = np.random.uniform(0.5, 1.5, size=(n_samples, n_factors))
products = np.prod(factors, axis=1)
ax.hist(products, bins=100, density=True, alpha=0.5,
label=rf"$n = {n_factors}$ factors")
ax.set_xlabel("Product value", fontsize=12)
ax.set_ylabel("Density", fontsize=12)
ax.set_title("Multiplicative CLT: product of random variables", fontsize=13)
ax.legend(fontsize=10)
ax.set_xlim(0, 3)
ax.grid(True, alpha=0.3)
# 対数を取って正規性を確認
ax = axes[1]
n_factors = 100
factors = np.random.uniform(0.5, 1.5, size=(n_samples, n_factors))
products = np.prod(factors, axis=1)
log_products = np.log(products)
ax.hist(log_products, bins=100, density=True, alpha=0.6,
color="steelblue", edgecolor="white", label="ln(product)")
# 正規分布のフィット
mu_fit = log_products.mean()
sigma_fit = log_products.std()
x = np.linspace(log_products.min(), log_products.max(), 200)
ax.plot(x, stats.norm.pdf(x, mu_fit, sigma_fit), "r-", linewidth=2.5,
label=rf"$N({mu_fit:.2f}, {sigma_fit:.2f}^2)$ fit")
ax.set_xlabel("ln(Product)", fontsize=12)
ax.set_ylabel("Density", fontsize=12)
ax.set_title(f"Log of product ({n_factors} factors)", fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("lognormal_multiplicative_clt.png", dpi=150, bbox_inches="tight")
plt.show()
この検証結果から、以下のことが確認できます。
-
左図: 因子の数が増えるにつれて、積の分布が右に裾を引く非対称な形に収束していく 。$n = 2$ の場合はまだ対称に近い形ですが、$n = 100$ では典型的な対数正規分布の形状です
-
右図: 積の対数を取ると、ヒストグラムが正規分布と非常によく一致する 。赤の理論曲線がヒストグラムの輪郭を忠実にトレースしています。これは中心極限定理の帰結です。$\ln(\prod R_i) = \sum \ln R_i$ が正規分布に従うので、積自体は対数正規分布に従います
金融工学への応用 — 幾何ブラウン運動
ブラック・ショールズモデル
金融工学において最も有名な対数正規分布の応用が、ブラック・ショールズモデル(Black-Scholes model)です。株価 $S(t)$ の変動が幾何ブラウン運動(geometric Brownian motion)に従うと仮定します。
$$ \begin{equation} dS = \mu S\,dt + \sigma S\,dW \end{equation} $$
ここで $\mu$ はドリフト率、$\sigma$ はボラティリティ、$dW$ はウィーナー過程の増分です。この確率微分方程式の解は
$$ S(t) = S(0)\exp\left[\left(\mu – \frac{\sigma^2}{2}\right)t + \sigma W(t)\right] $$
$W(t) \sim N(0, t)$ なので、$\ln S(t)$ は正規分布に従い、$S(t)$ は対数正規分布に従います。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
# 幾何ブラウン運動のシミュレーション
S0 = 100 # 初期株価
mu = 0.08 # 年間ドリフト率(8%)
sigma = 0.25 # 年間ボラティリティ(25%)
T = 1.0 # 1年後
n_paths = 10000
n_steps = 252 # 取引日数
dt = T / n_steps
t = np.linspace(0, T, n_steps + 1)
# パスの生成
fig, axes = plt.subplots(1, 2, figsize=(14, 5.5))
# (a) サンプルパス
ax = axes[0]
for i in range(20):
dW = np.random.normal(0, np.sqrt(dt), n_steps)
W = np.concatenate([[0], np.cumsum(dW)])
S = S0 * np.exp((mu - sigma**2/2) * t + sigma * W)
ax.plot(t, S, linewidth=0.8, alpha=0.7)
ax.axhline(S0, color="black", linewidth=1, linestyle="--", alpha=0.5)
ax.set_xlabel("Time (years)", fontsize=12)
ax.set_ylabel("Stock price", fontsize=12)
ax.set_title("Geometric Brownian motion (sample paths)", fontsize=13)
ax.grid(True, alpha=0.3)
# (b) 1年後の株価分布
ax = axes[1]
dW_total = np.random.normal(0, np.sqrt(T), n_paths)
S_T = S0 * np.exp((mu - sigma**2/2) * T + sigma * dW_total)
ax.hist(S_T, bins=100, density=True, alpha=0.6, color="steelblue",
edgecolor="white", label="Simulated S(T)")
# 理論的な対数正規分布
mu_ln = np.log(S0) + (mu - sigma**2/2) * T
sigma_ln = sigma * np.sqrt(T)
x = np.linspace(30, 250, 500)
pdf_theory = stats.lognorm.pdf(x, s=sigma_ln, scale=np.exp(mu_ln))
ax.plot(x, pdf_theory, "r-", linewidth=2.5, label="LogNormal PDF (theory)")
# 統計量
median_theory = np.exp(mu_ln)
mean_theory = np.exp(mu_ln + sigma_ln**2/2)
ax.axvline(median_theory, color="green", linewidth=2, linestyle="--",
label=f"Median = {median_theory:.1f}")
ax.axvline(mean_theory, color="orange", linewidth=2, linestyle="--",
label=f"Mean = {mean_theory:.1f}")
ax.set_xlabel("Stock price S(T)", fontsize=12)
ax.set_ylabel("Density", fontsize=12)
ax.set_title("Distribution of stock price after 1 year", fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("lognormal_finance.png", dpi=150, bbox_inches="tight")
plt.show()
print(f"理論値:")
print(f" 中央値: {median_theory:.2f}")
print(f" 期待値: {mean_theory:.2f}")
print(f" P(S < S0): {stats.lognorm.cdf(S0, s=sigma_ln, scale=np.exp(mu_ln)):.4f}")
この金融シミュレーションから、以下の知見が得られます。
-
左図: 幾何ブラウン運動のパスは多様な軌跡を描く 。ほとんどのパスは初期値付近にとどまりますが、一部のパスは大きく上昇しています。株価が常に正であること(対数正規分布の定義域が正)は、株価モデルとして自然な性質です
-
右図: 1年後の株価分布は対数正規分布に従う 。シミュレーションのヒストグラムが理論曲線(赤)と一致しています。中央値(緑の破線)は期待値(オレンジの破線)よりも小さく、「典型的な」投資家は期待リターンよりも低い収益を得ることが多い、ということを示唆しています
-
株価が初期値を下回る確率が50%に近い のは、ドリフト率が正であっても中央値が $S_0 e^{(\mu – \sigma^2/2)T}$ と、$\sigma^2/2$ の分だけ引き下げられるためです。これは対数正規分布の非対称性の帰結です
信頼性工学への応用
対数正規分布は、製品の寿命分布としても広く使われています。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 信頼性関数(生存関数)の可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 5.5))
# (a) ワイブル分布との比較
ax = axes[0]
t = np.linspace(0.01, 10, 500)
# 対数正規分布(μ=1, σ=0.5)
mu_ln, sigma_ln = 1.0, 0.5
R_lognorm = 1 - stats.lognorm.cdf(t, s=sigma_ln, scale=np.exp(mu_ln))
ax.plot(t, R_lognorm, "b-", linewidth=2, label=rf"LogNormal ($\mu={mu_ln}$, $\sigma={sigma_ln}$)")
# 指数分布(同じ平均寿命)
mean_life = np.exp(mu_ln + sigma_ln**2/2)
R_exp = np.exp(-t / mean_life)
ax.plot(t, R_exp, "r--", linewidth=2, label=f"Exponential (mean={mean_life:.2f})")
# ワイブル分布(形状を合わせて)
R_weibull = np.exp(-(t / 3.0)**2.5)
ax.plot(t, R_weibull, "g:", linewidth=2, label="Weibull (k=2.5)")
ax.set_xlabel("Time t", fontsize=12)
ax.set_ylabel("Reliability R(t)", fontsize=12)
ax.set_title("Reliability functions comparison", fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
# (b) 故障率(ハザード関数)
ax = axes[1]
eps = 1e-10
f_lognorm = stats.lognorm.pdf(t, s=sigma_ln, scale=np.exp(mu_ln))
h_lognorm = f_lognorm / (R_lognorm + eps)
f_exp = (1 / mean_life) * np.exp(-t / mean_life)
h_exp = f_exp / (R_exp + eps)
ax.plot(t, h_lognorm, "b-", linewidth=2, label="LogNormal")
ax.plot(t, h_exp, "r--", linewidth=2, label="Exponential (constant)")
ax.set_xlabel("Time t", fontsize=12)
ax.set_ylabel("Hazard rate h(t)", fontsize=12)
ax.set_title("Hazard function comparison", fontsize=13)
ax.legend(fontsize=10)
ax.set_ylim(0, 2)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("lognormal_reliability.png", dpi=150, bbox_inches="tight")
plt.show()
この信頼性解析から、以下の特徴が読み取れます。
-
左図: 対数正規分布の信頼性関数は、初期に急速に低下し、その後緩やかに下降する 。指数分布(一定故障率)やワイブル分布とは異なる減衰パターンを示しています。初期故障が多く、その後「生き残った」製品は長持ちするという特性を持つ製品に適しています
-
右図: 対数正規分布のハザード関数(故障率)は非単調 。最初は上昇し、ある時点でピークに達した後、減少に転じます。この「故障率が最終的に減少する」性質は、対数正規分布特有のものであり、摩耗故障が支配的なワイブル分布(故障率が単調増加)とは本質的に異なります。修理に出して直ったものが再故障しにくい、というような状況をモデル化できます
対数正規分布と正規分布の判別
実データが正規分布と対数正規分布のどちらに従うかを判定する方法を示します。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
# 対数正規分布に従うデータの生成
n = 500
mu_true, sigma_true = 2.0, 0.8
data = np.random.lognormal(mean=mu_true, sigma=sigma_true, size=n)
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# (a) 元データのヒストグラム
ax = axes[0, 0]
ax.hist(data, bins=50, density=True, alpha=0.6, color="steelblue",
edgecolor="white")
ax.set_xlabel("x", fontsize=12)
ax.set_ylabel("Density", fontsize=12)
ax.set_title("Original data (right-skewed)", fontsize=13)
ax.grid(True, alpha=0.3)
# (b) 対数変換後のヒストグラム
ax = axes[0, 1]
log_data = np.log(data)
ax.hist(log_data, bins=50, density=True, alpha=0.6, color="salmon",
edgecolor="white")
# 正規分布のフィット
x = np.linspace(log_data.min(), log_data.max(), 200)
ax.plot(x, stats.norm.pdf(x, log_data.mean(), log_data.std()),
"r-", linewidth=2.5)
ax.set_xlabel("ln(x)", fontsize=12)
ax.set_ylabel("Density", fontsize=12)
ax.set_title("Log-transformed data (approx. normal)", fontsize=13)
ax.grid(True, alpha=0.3)
# (c) 正規QQプロット(元データ)
ax = axes[1, 0]
stats.probplot(data, dist="norm", plot=ax)
ax.set_title("Normal Q-Q plot (original)", fontsize=13)
ax.grid(True, alpha=0.3)
# (d) 正規QQプロット(対数変換後)
ax = axes[1, 1]
stats.probplot(log_data, dist="norm", plot=ax)
ax.set_title("Normal Q-Q plot (log-transformed)", fontsize=13)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("lognormal_diagnosis.png", dpi=150, bbox_inches="tight")
plt.show()
# 正規性の検定(シャピロ・ウィルク検定)
_, p_orig = stats.shapiro(data[:200])
_, p_log = stats.shapiro(log_data[:200])
print(f"シャピロ・ウィルク検定:")
print(f" 元データ: p = {p_orig:.6f} ({'正規ではない' if p_orig < 0.05 else '正規'})")
print(f" 対数変換後: p = {p_log:.6f} ({'正規ではない' if p_log < 0.05 else '正規'})")
この診断分析から、以下のことが読み取れます。
-
左上: 元データは明らかに右に歪んでおり、正規分布ではない 。このようなデータに対して正規分布を仮定した統計分析を行うと、誤った結論に至る可能性があります
-
右上: 対数変換すると、ヒストグラムが対称な釣り鐘型になり、正規分布でフィットできる 。これが「対数を取ったら正規分布」という対数正規分布の定義を直接確認した結果です
-
左下: 元データの正規QQプロットは両端で大きく曲がっている 。特に右側の上方への逸脱は、右裾が正規分布よりも重いことを示しています
-
右下: 対数変換後のQQプロットはほぼ直線上に乗っている 。対数変換後のデータが正規分布によく適合していることの視覚的な確認です
まとめ
本記事では、対数正規分布の定義から導出、性質、応用までを解説しました。
- 対数正規分布は「対数が正規分布に従う」分布 であり、$\ln X \sim N(\mu, \sigma^2)$ で定義されます。正の値のみをとり、右に裾が長い分布です
- 確率密度関数 $f(x) = \frac{1}{x\sigma\sqrt{2\pi}}\exp\left(-\frac{(\ln x – \mu)^2}{2\sigma^2}\right)$ は正規分布の変数変換から導出されます
- モーメント $E[X^n] = \exp(n\mu + n^2\sigma^2/2)$ は明示的に計算でき、期待値 $e^{\mu+\sigma^2/2}$、中央値 $e^{\mu}$、最頻値 $e^{\mu-\sigma^2}$ の順に常に最頻値 < 中央値 < 期待値が成り立ちます
- 乗法的中心極限定理により、独立な正の確率変数の積が対数正規分布に近づきます。所得、株価、粒径などが対数正規分布に従う理由です
- モーメント母関数は存在しないにもかかわらず、全てのモーメントが有限であるという注目すべき性質を持ちます
- 金融工学では幾何ブラウン運動のモデルとして、信頼性工学では寿命分布として応用されます
次のステップとして、以下の記事も参考にしてください。