確率変数 X の分布がわかっているとき、X を変換した新しい確率変数 Y = g(X) の分布はどうなるだろうか。
この問題は実世界で頻繁に登場する。金融工学では、株価が対数正規分布に従うとき、対数収益率は正規分布に従う。品質管理では、測定誤差 X が正規分布に従うとき、誤差の二乗 X^2 はカイ二乗分布に従う。信頼性工学では、部品の寿命 X_1, X_2 が指数分布に従うとき、合計寿命 X_1 + X_2 はガンマ分布に従う。
変数変換の公式を使えば、元の分布から変換後の分布を数学的に導出できる。本記事では、1変数の変換と2変数の変換(ヤコビアン)を学ぶ。
1変数の変数変換
変換公式の導出
連続型確率変数 X の確率密度関数を f_X(x) とする。Y = g(X) という変換を考える(g は単調関数で逆関数 g^{-1} が存在するとする)。
累積分布関数から考えよう。g が単調増加のとき、
両辺を y で微分すると、
g が単調減少の場合は符号が逆になるため、一般に絶対値をとって次の公式を得る。
X の確率密度関数が f_X(x)、Y = g(X) のとき、
ここで x = g^{-1}(y) である。
直感的には、\left| \frac{dx}{dy} \right| は「y の微小区間に対応する x の区間の長さの比」を表す。確率密度は「単位区間あたりの確率」なので、この補正が必要になる。
2変数の変数変換(ヤコビアン)
ヤコビアンの定義
2つの確率変数 (X, Y) の同時確率密度関数を f(x, y) とする。変数変換 (Z, W) = (u(X, Y), v(X, Y)) を考え、逆変換 (X, Y) = (s(Z, W), t(Z, W)) が存在するとする。
1変数の場合と同様に、逆変換のヤコビアン(Jacobian)を次の行列式で定義する。
これは1変数における \left| \frac{dx}{dy} \right| の2変数版である。
順変換のヤコビアン J' = \frac{\partial(z, w)}{\partial(x, y)} を使う流儀もある。逆行列の行列式の性質から J = 1/J' が成り立つので、その場合の公式は f_{Z,W} = f_{X,Y} \cdot |1/J'| となる。
和の分布(畳み込み)
独立な2つの確率変数 X, Y の和 Z = X + Y の分布を求めたい。これは変数変換の重要な応用である。
変換を Z = X + Y、W = Y と設定する。逆変換は X = Z - W、Y = W となる。逆変換のヤコビアンを計算すると、
X と Y が独立のとき、(Z, W) の同時密度関数は f_{Z,W}(z, w) = f_X(z - w) \cdot f_Y(w) となる。Z の周辺密度関数は W について積分して、
この積分を畳み込み(convolution)と呼ぶ。
計算例
例1:一様分布から指数分布を導く
X \sim U(0, 1)(一様分布)のとき、Y = -\log(X) の分布を求める。
一様分布 U(0, 1) の確率密度関数は f_X(x) = 1(0 < x < 1)である。変換 y = -\log(x) より、逆変換は x = e^{-y} である。
\left| \frac{dx}{dy} \right| を計算すると、
変数変換公式より、
これはパラメータ \lambda = 1 の指数分布である。
この結果は「逆関数法」の基礎となる。一様乱数から任意の分布に従う乱数を生成できる。
例2:標準正規分布からカイ二乗分布を導く
X \sim N(0, 1)(標準正規分布)のとき、Y = X^2 の分布を求める。
標準正規分布の確率密度関数は f_X(x) = \frac{1}{\sqrt{2\pi}} \exp\left(-\frac{x^2}{2}\right) である。
変換 y = x^2 は1対1ではない(x = \sqrt{y} と x = -\sqrt{y} の2通り)。そこで x > 0 の場合のみ考え、確率密度を2倍する。
x = \sqrt{y} より \left| \frac{dx}{dy} \right| = \frac{1}{2\sqrt{y}} である。
これは自由度1のカイ二乗分布 \chi^2(1) である。
例3:指数分布の和(畳み込みの応用)
X, Y が独立に指数分布 \text{Exp}(\lambda) に従うとき、Z = X + Y の分布を求める。
指数分布の確率密度関数は f(t) = \lambda e^{-\lambda t}(t > 0)である。畳み込み公式を使う。X, Y \geq 0 より、z が与えられたとき w は 0 \leq w \leq z の範囲をとる。
これは形状母数 \alpha = 2、尺度母数 \beta = 1/\lambda のガンマ分布 \text{Ga}(2, 1/\lambda) である。一般に、n 個の独立な \text{Exp}(\lambda) の和は \text{Ga}(n, 1/\lambda) に従う。
例4:対数正規分布
正規分布 N(\mu, \sigma^2) に従う X を指数変換した Y = e^X の分布を導出しよう。
正規分布の確率密度関数は f_X(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right) である。
変換 y = e^x より、逆変換は x = \log(y) である。\left| \frac{dx}{dy} \right| = \frac{1}{y} である。変数変換公式より、
これが対数正規分布の確率密度関数である。対数正規分布は右に裾が長い非対称な形状を持ち、株価や所得分布のモデルとしてよく使われる。
期待値と分散は次の通りである。
練習問題
y = x^2 より x = \sqrt{y}(0 < x < 1 なので正の根のみ)。\left| \frac{dx}{dy} \right| = \frac{1}{2\sqrt{y}} である。
f_Y(y) = f_X(\sqrt{y}) \cdot \frac{1}{2\sqrt{y}} = 1 \cdot \frac{1}{2\sqrt{y}} = \frac{1}{2\sqrt{y}}(0 < y < 1)
y = \sqrt{x} より x = y^2。\left| \frac{dx}{dy} \right| = 2y である。
f_Y(y) = f_X(y^2) \cdot 2y = \lambda e^{-\lambda y^2} \cdot 2y = 2\lambda y e^{-\lambda y^2}(y > 0)
これはレイリー分布の一種である。
f_X(x) = f_Y(y) = 1(0 < x, y < 1)。畳み込み f_Z(z) = \int f_X(z - w) \cdot f_Y(w) \, dw を計算する。
被積分関数が1になるには、次の2つの条件を同時に満たす必要がある。
- 0 < w < 1(Y の定義域)
- 0 < z - w < 1、つまり z - 1 < w < z(X = z - w が定義域内)
この2条件の共通部分が積分範囲となる。
0 \leq z \leq 1 のとき:共通部分は 0 \leq w \leq z なので f_Z(z) = z
1 < z \leq 2 のとき:共通部分は z - 1 \leq w \leq 1 なので f_Z(z) = 1 - (z-1) = 2 - z
まとめ
| 変換の種類 | 公式 | ポイント |
|---|---|---|
| 1変数 Y = g(X) | f_Y(y) = f_X(g^{-1}(y)) \cdot \left| \frac{dx}{dy} \right| | 逆関数と微分の絶対値を計算 |
| 2変数(ヤコビアン) | f_{Z,W} = f_{X,Y} \cdot |J| | 逆変換のヤコビアンを掛ける |
| 和 Z = X + Y | f_Z(z) = \int f_X(z-w) f_Y(w) \, dw | 畳み込み積分 |
重要な変換例
| 元の分布 | 変換 | 結果の分布 |
|---|---|---|
| U(0, 1) | Y = -\log(X) | \text{Exp}(1) |
| N(0, 1) | Y = X^2 | \chi^2(1) |
| N(\mu, \sigma^2) | Y = e^X | 対数正規分布 |
| \text{Exp}(\lambda) × 2個 | Z = X + Y | \text{Ga}(2, 1/\lambda) |
Pythonで実装する
変数変換の結果をシミュレーションで確認してみよう。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
n = 100000
# 1. 一様分布 → 指数分布
X_uniform = np.random.uniform(0, 1, n)
Y_exp = -np.log(X_uniform)
# 2. 標準正規分布 → カイ二乗分布
X_normal = np.random.standard_normal(n)
Y_chi2 = X_normal ** 2
# 3. 指数分布の和 → ガンマ分布
X1 = np.random.exponential(1, n)
X2 = np.random.exponential(1, n)
Y_gamma = X1 + X2
# 4. 正規分布 → 対数正規分布
X_norm = np.random.normal(0, 1, n)
Y_lognorm = np.exp(X_norm)
# 結果の確認
print("=== 一様分布 → 指数分布 ===")
print(f"シミュレーション平均: {Y_exp.mean():.4f} (理論値: 1.0)")
print("\n=== 標準正規分布 → カイ二乗分布 ===")
print(f"シミュレーション平均: {Y_chi2.mean():.4f} (理論値: 1.0)")
print(f"シミュレーション分散: {Y_chi2.var():.4f} (理論値: 2.0)")
print("\n=== 指数分布の和 → ガンマ分布 ===")
print(f"シミュレーション平均: {Y_gamma.mean():.4f} (理論値: 2.0)")
print("\n=== 正規分布 → 対数正規分布 ===")
print(f"シミュレーション平均: {Y_lognorm.mean():.4f} (理論値: 1.6487)")
シミュレーション結果と理論値がよく一致しており、変数変換の公式が正しいことが確認できる。