多変量t分布の定義・性質と正規分布との比較

2次元の正規分布に従うデータがあったとしましょう。大半のデータは楕円状にまとまりますが、ごく稀に平均から大きく外れた値(外れ値)が現れます。こうした外れ値を含むデータに正規分布を当てはめると、平均や共分散の推定が大きく歪んでしまいます。

「正規分布のような形をしているけれど、裾がもっと重い分布はないだろうか?」

この問いに答えるのが多変量t分布(multivariate t-distribution)です。1変量のt分布が正規分布の裾を重くした分布であるのと同様に、多変量t分布は多変量正規分布の裾を重くした一般化です。

多変量t分布を理解すると、以下のような応用が開けます。

  • ロバスト統計: 外れ値に強いパラメータ推定(ロバスト回帰、ロバスト主成分分析)
  • ベイズ推論: 正規分布の分散が未知のときの予測分布として自然に出現する
  • 金融工学: 株価リターンのモデリング(正規分布よりも裾リスクを適切に捉える)
  • 機械学習: 混合t分布によるロバストなクラスタリング

本記事の内容

  • 1変量t分布の復習と多変量への動機
  • 多変量t分布の定義と確率密度関数
  • 多変量t分布の諸性質(周辺分布・条件付き分布・モーメント)
  • 多変量正規分布との比較
  • Pythonによる可視化と実装

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

1変量t分布の復習

多変量t分布を定義する前に、1変量t分布がどのようにして生まれるかを思い出しておきましょう。

正規分布 $Z \sim N(0, 1)$ と、独立なカイ二乗分布 $V \sim \chi^2_\nu$ があるとき、

$$ T = \frac{Z}{\sqrt{V/\nu}} $$

は自由度 $\nu$ のt分布に従います。直感的には、$Z$ を「信号」、$\sqrt{V/\nu}$ を「ノイズのスケール推定量」と見ることができます。ノイズのスケールが確率的に変動するため、t分布は正規分布よりも裾が重くなります。

$\nu$ が小さいとき裾は非常に重く、$\nu \to \infty$ で正規分布に収束します。この「自由度パラメータで裾の重さを制御できる」という性質は、多変量に拡張しても保たれます。

では、この構成をベクトルに拡張すると、どのような分布が得られるのでしょうか。

多変量t分布とは

日常のアナロジー

天気予報を例に考えてみましょう。気温と湿度の関係を多変量正規分布でモデル化していたとします。しかし、実際の気象データには台風や寒波のような異常気象が含まれ、これらは「正規分布の裾」が予測するよりもずっと頻繁に起こります。

多変量t分布は、こうした「予想外に大きな変動がたまに起きる」状況をモデル化します。普段は多変量正規分布と似た振る舞いをしますが、「たまに大きく外れる」確率が正規分布より高いのです。

数学的には、多変量正規分布のスケール(分散)がガンマ分布に従って確率的に揺らいだものとして理解できます。

構成的定義

$d$ 次元の多変量t分布は、多変量正規分布とカイ二乗分布の比として定義されます。

$\bm{Z} \sim N_d(\bm{0}, \bm{\Sigma})$ と、$\bm{Z}$ とは独立な $V \sim \chi^2_\nu$ があるとき、

$$ \begin{equation} \bm{X} = \bm{\mu} + \frac{\bm{Z}}{\sqrt{V/\nu}} \end{equation} $$

は位置パラメータ $\bm{\mu}$、スケール行列 $\bm{\Sigma}$、自由度 $\nu$ の多変量t分布に従います。これを $\bm{X} \sim t_d(\nu, \bm{\mu}, \bm{\Sigma})$ と書きます。

この定義は1変量の場合のベクトル版です。$\sqrt{V/\nu}$ は共通のスカラーであり、$\bm{Z}$ のすべての成分を同じ割合でスケーリングします。つまり、「全方向に一様にスケールが変動する」という構造を持っています。

正規分散混合としての表現

多変量t分布には、もう一つの重要な表現があります。

逆ガンマ分布(あるいはガンマ分布の逆数)に従う潜在変数 $w$ を導入すると、

$$ w \sim \text{Gamma}(\nu/2, \nu/2), \quad \bm{X} | w \sim N_d(\bm{\mu}, \bm{\Sigma}/w) $$

このとき $\bm{X}$ の周辺分布が多変量t分布になります。つまり、多変量t分布は分散が確率的に変動する正規分布の混合(正規分散混合; normal variance mixture)として表現できるのです。

$w$ が大きいとき分散は小さくなり(データは平均に近い)、$w$ が小さいとき分散は大きくなります(データは平均から離れる)。$w$ の分布はガンマ分布なので、たまに非常に小さい値を取り、そのとき大きな外れ値が生まれます。

この表現は、EMアルゴリズムによるロバスト推定やベイズ推論で重要な役割を果たします。

では、多変量t分布の確率密度関数を具体的に求めてみましょう。

確率密度関数の導出

結果

多変量t分布 $t_d(\nu, \bm{\mu}, \bm{\Sigma})$ の確率密度関数は次のようになります。

$$ \begin{equation} f(\bm{x}) = \frac{\Gamma\left(\frac{\nu + d}{2}\right)}{\Gamma\left(\frac{\nu}{2}\right)(\nu\pi)^{d/2}|\bm{\Sigma}|^{1/2}} \left(1 + \frac{1}{\nu}(\bm{x} – \bm{\mu})^T \bm{\Sigma}^{-1}(\bm{x} – \bm{\mu})\right)^{-(\nu+d)/2} \end{equation} $$

ここで $\Gamma(\cdot)$ はガンマ関数、$|\bm{\Sigma}|$ は $\bm{\Sigma}$ の行列式、$d$ は次元数です。

この式の構造を理解するために、各部分の意味を見ていきます。

  • $(\bm{x} – \bm{\mu})^T \bm{\Sigma}^{-1}(\bm{x} – \bm{\mu})$ はマハラノビス距離の二乗です。多変量正規分布でも同じ量が現れますが、正規分布では $\exp(-\cdot/2)$ の指数関数の中に入るのに対し、t分布では $(1 + \cdot/\nu)^{-(\nu+d)/2}$ というべき関数で減衰します
  • べき関数は指数関数より緩やかに減衰するため、マハラノビス距離が大きい点(=外れ値)にも有限の確率密度を与えます。これが「裾が重い」ことの数学的な意味です
  • $\nu \to \infty$ のとき、$(1 + q/\nu)^{-(\nu+d)/2} \to \exp(-q/2)$ となり、多変量正規分布に収束します

導出

正規分散混合の表現から出発します。$w \sim \text{Gamma}(\nu/2, \nu/2)$ のもとで $\bm{X}|w \sim N_d(\bm{\mu}, \bm{\Sigma}/w)$ とすると、$\bm{X}$ の周辺密度は条件付き密度をガンマ分布で積分したものです。

$$ f(\bm{x}) = \int_0^\infty f(\bm{x} | w) \cdot p(w) \, dw $$

条件付き密度は $d$ 次元正規分布の密度です。

$$ f(\bm{x}|w) = \frac{w^{d/2}}{(2\pi)^{d/2}|\bm{\Sigma}|^{1/2}} \exp\left(-\frac{w}{2}(\bm{x}-\bm{\mu})^T\bm{\Sigma}^{-1}(\bm{x}-\bm{\mu})\right) $$

ガンマ分布の密度は

$$ p(w) = \frac{(\nu/2)^{\nu/2}}{\Gamma(\nu/2)} w^{\nu/2 – 1} \exp(-\nu w/2) $$

これらを掛けて $w$ について積分します。マハラノビス距離の二乗を $q = (\bm{x}-\bm{\mu})^T\bm{\Sigma}^{-1}(\bm{x}-\bm{\mu})$ と略記すると、

$$ f(\bm{x}) = \frac{(\nu/2)^{\nu/2}}{(2\pi)^{d/2}|\bm{\Sigma}|^{1/2}\Gamma(\nu/2)} \int_0^\infty w^{(\nu+d)/2 – 1} \exp\left(-\frac{w}{2}(q + \nu)\right) dw $$

被積分関数は $w$ に関するガンマ分布の核(形状パラメータ $(\nu+d)/2$、レートパラメータ $(q+\nu)/2$)の形をしています。ガンマ積分の公式 $\int_0^\infty w^{a-1}e^{-bw}dw = \Gamma(a)/b^a$ を適用すると、

$$ \int_0^\infty w^{(\nu+d)/2 – 1} \exp\left(-\frac{q+\nu}{2}w\right) dw = \frac{\Gamma((\nu+d)/2)}{((q+\nu)/2)^{(\nu+d)/2}} $$

これを代入して整理します。

$$ f(\bm{x}) = \frac{(\nu/2)^{\nu/2}}{(2\pi)^{d/2}|\bm{\Sigma}|^{1/2}\Gamma(\nu/2)} \cdot \frac{\Gamma((\nu+d)/2)}{((q+\nu)/2)^{(\nu+d)/2}} $$

$(\nu/2)^{\nu/2}$ と $((q+\nu)/2)^{(\nu+d)/2}$ を整理するために、後者を分解します。

$$ \frac{(\nu/2)^{\nu/2}}{((q+\nu)/2)^{(\nu+d)/2}} = \frac{(\nu/2)^{\nu/2}}{(\nu/2)^{(\nu+d)/2}} \cdot \frac{1}{((q+\nu)/\nu)^{(\nu+d)/2}} $$

ここで $(\nu/2)^{\nu/2} / (\nu/2)^{(\nu+d)/2} = (\nu/2)^{-d/2}$ なので、

$$ = \frac{1}{(\nu/2)^{d/2}} \cdot \left(1 + \frac{q}{\nu}\right)^{-(\nu+d)/2} $$

また $(2\pi)^{d/2} \cdot (\nu/2)^{d/2} = (\nu\pi)^{d/2}$ なので、最終的に

$$ \begin{equation} f(\bm{x}) = \frac{\Gamma((\nu+d)/2)}{\Gamma(\nu/2)(\nu\pi)^{d/2}|\bm{\Sigma}|^{1/2}} \left(1 + \frac{q}{\nu}\right)^{-(\nu+d)/2} \end{equation} $$

が得られました。$d = 1$、$\bm{\Sigma} = 1$ とすれば、おなじみの1変量t分布の密度関数に一致することが確認できます。

導出が完了しました。得られた密度関数はマハラノビス距離のべき関数減衰という形をしており、正規分布の指数関数減衰と対照的です。次に、この分布の性質を調べていきましょう。

多変量t分布の性質

平均と共分散

多変量t分布の期待値と共分散行列は、自由度 $\nu$ に条件があります。

$$ E[\bm{X}] = \bm{\mu} \quad (\nu > 1) $$

$$ \text{Cov}[\bm{X}] = \frac{\nu}{\nu – 2}\bm{\Sigma} \quad (\nu > 2) $$

$\nu \leq 1$ のとき期待値は存在せず(コーシー分布の多変量版)、$\nu \leq 2$ のとき分散は無限大です。

共分散がスケール行列 $\bm{\Sigma}$ の $\nu/(\nu-2)$ 倍であることに注意してください。$\nu$ が小さいほど分散が大きくなり、$\nu \to \infty$ で $\text{Cov}[\bm{X}] \to \bm{\Sigma}$ に収束します(正規分布の場合に一致)。

周辺分布

多変量t分布の便利な性質として、任意の部分ベクトルの周辺分布もまたt分布になることがあります。

$\bm{X} = (X_1, \ldots, X_d)^T \sim t_d(\nu, \bm{\mu}, \bm{\Sigma})$ のとき、部分ベクトル $\bm{X}_A$($A \subset \{1, \ldots, d\}$)は

$$ \bm{X}_A \sim t_{|A|}(\nu, \bm{\mu}_A, \bm{\Sigma}_{AA}) $$

ここで $\bm{\mu}_A$ と $\bm{\Sigma}_{AA}$ は $\bm{\mu}$ と $\bm{\Sigma}$ の対応する部分です。自由度 $\nu$ は変わりません。

これは多変量正規分布の周辺分布の性質と全く同じ構造ですが、重要な違いがあります。多変量正規分布では無相関と独立が同値ですが、多変量t分布では無相関であっても独立とは限りません。これはt分布が共通のスケーリング変数 $V$ を共有しているためです。

条件付き分布

$\bm{X} = (\bm{X}_1^T, \bm{X}_2^T)^T$ と分割し、

$$ \bm{\mu} = \begin{pmatrix}\bm{\mu}_1 \\ \bm{\mu}_2\end{pmatrix}, \quad \bm{\Sigma} = \begin{pmatrix}\bm{\Sigma}_{11} & \bm{\Sigma}_{12} \\ \bm{\Sigma}_{21} & \bm{\Sigma}_{22}\end{pmatrix} $$

とするとき、$\bm{X}_1 | \bm{X}_2 = \bm{x}_2$ の条件付き分布は

$$ \bm{X}_1 | \bm{X}_2 = \bm{x}_2 \sim t_{d_1}\left(\nu + d_2, \; \bm{\mu}_{1|2}, \; \frac{\nu + q_2}{\nu + d_2}\bm{\Sigma}_{1|2}\right) $$

ここで

$$ \bm{\mu}_{1|2} = \bm{\mu}_1 + \bm{\Sigma}_{12}\bm{\Sigma}_{22}^{-1}(\bm{x}_2 – \bm{\mu}_2) $$

$$ \bm{\Sigma}_{1|2} = \bm{\Sigma}_{11} – \bm{\Sigma}_{12}\bm{\Sigma}_{22}^{-1}\bm{\Sigma}_{21} $$

$$ q_2 = (\bm{x}_2 – \bm{\mu}_2)^T\bm{\Sigma}_{22}^{-1}(\bm{x}_2 – \bm{\mu}_2) $$

多変量正規分布との重要な違いが2つあります。

  1. 自由度が増加する: 条件付けると自由度が $\nu$ から $\nu + d_2$ に増えます。つまり、データを条件付けるほど(情報が増えるほど)分布の裾は軽くなります
  2. スケールがデータに依存する: 係数 $(\nu + q_2)/(\nu + d_2)$ が現れ、$\bm{x}_2$ が平均から離れている($q_2$ が大きい)ほどスケールが大きくなります

この非線形な依存関係は、多変量正規分布には見られない特徴です。

次に、多変量正規分布との違いをより具体的に、視覚的に比較してみましょう。

多変量正規分布との比較

等高線の形状

多変量正規分布と多変量t分布の等高線はどちらも楕円ですが、その間隔が異なります。

正規分布の等密度面は

$$ f(\bm{x}) \propto \exp\left(-\frac{q}{2}\right) = c \quad \Leftrightarrow \quad q = -2\ln c $$

t分布の等密度面は

$$ f(\bm{x}) \propto \left(1 + \frac{q}{\nu}\right)^{-(\nu+d)/2} = c \quad \Leftrightarrow \quad q = \nu(c^{-2/(\nu+d)} – 1) $$

いずれの場合もマハラノビス距離 $q$ が一定の面(楕円)が等高線になりますが、$q$ と密度 $c$ の関係が異なります。t分布の方が外側の等高線の間隔が広く、裾に向かって密度がゆっくり減衰することを反映しています。

裾の重さ

2次元の場合、原点からのマハラノビス距離が $r$ を超える確率は

$$ P(q > r^2) = 1 – F_{\chi^2_2}(r^2) \quad \text{(正規分布)} $$

$$ P(q > r^2) = \left(1 + \frac{r^2}{\nu}\right)^{-\nu/2} \quad \text{(t分布、近似)} $$

$r$ が大きいとき、正規分布の裾確率は $\exp(-r^2/2)$ のオーダーで減衰するのに対し、t分布は $r^{-\nu}$ のべき関数で減衰します。$\nu = 3$ なら $r^{-3}$、$\nu = 5$ なら $r^{-5}$ です。この違いが外れ値の頻度に直接影響します。

ベイズ推論での出現

多変量t分布は、ベイズ推論において自然に出現します。

正規分布 $\bm{X} | \bm{\mu}, \sigma^2 \sim N_d(\bm{\mu}, \sigma^2\bm{I})$ に対し、$\sigma^2$ に逆ガンマ事前分布 $\sigma^2 \sim \text{InvGamma}(\nu/2, \nu s^2/2)$ を置くと、$\sigma^2$ を積分消去した $\bm{X}$ の周辺分布は多変量t分布になります。

つまり、「分散が不明な正規モデルの予測分布」は多変量t分布です。これは統計的推論において「分散の不確実性を考慮した予測をする」ことに対応しています。

それでは、Pythonで多変量t分布を実装し、正規分布との違いを視覚的に確認しましょう。

Pythonでの実装と可視化

2次元t分布の確率密度関数と等高線

まず、2次元のt分布と正規分布の等高線を比較します。等高線の間隔の違いから、裾の重さの違いが視覚的にわかることを確認します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from scipy.special import gammaln

# 2次元多変量t分布の確率密度関数
def multivariate_t_pdf(x, mu, Sigma, nu):
    """多変量t分布の確率密度関数"""
    d = len(mu)
    diff = x - mu
    Sigma_inv = np.linalg.inv(Sigma)
    q = np.einsum('...i,ij,...j', diff, Sigma_inv, diff)  # マハラノビス距離の二乗

    log_norm = (gammaln((nu + d) / 2) - gammaln(nu / 2)
                - d / 2 * np.log(nu * np.pi)
                - 0.5 * np.log(np.linalg.det(Sigma)))
    log_pdf = log_norm - (nu + d) / 2 * np.log(1 + q / nu)
    return np.exp(log_pdf)

# パラメータ設定
mu = np.array([0.0, 0.0])
Sigma = np.array([[1.0, 0.6],
                   [0.6, 1.0]])

# グリッド作成
x = np.linspace(-5, 5, 200)
y = np.linspace(-5, 5, 200)
X, Y = np.meshgrid(x, y)
pos = np.stack([X, Y], axis=-1)

# 多変量正規分布
rv_normal = stats.multivariate_normal(mean=mu, cov=Sigma)
Z_normal = rv_normal.pdf(pos)

# 多変量t分布(自由度3, 5, 30)
nu_values = [3, 5, 30]

fig, axes = plt.subplots(1, 4, figsize=(20, 5))

# 正規分布
ax = axes[0]
levels = np.logspace(-4, -0.5, 12)
cs = ax.contour(X, Y, Z_normal, levels=levels, cmap='Blues')
ax.set_title(r'Normal ($\nu = \infty$)', fontsize=13)
ax.set_xlabel('$x_1$', fontsize=11)
ax.set_ylabel('$x_2$', fontsize=11)
ax.set_aspect('equal')
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.grid(True, alpha=0.3)

# t分布
for i, nu in enumerate(nu_values):
    ax = axes[i + 1]
    Z_t = multivariate_t_pdf(pos, mu, Sigma, nu)
    cs = ax.contour(X, Y, Z_t, levels=levels, cmap='Reds')
    ax.set_title(rf'$t$ distribution ($\nu = {nu}$)', fontsize=13)
    ax.set_xlabel('$x_1$', fontsize=11)
    ax.set_ylabel('$x_2$', fontsize=11)
    ax.set_aspect('equal')
    ax.set_xlim(-5, 5)
    ax.set_ylim(-5, 5)
    ax.grid(True, alpha=0.3)

plt.suptitle('Contour Comparison: Normal vs Multivariate t', fontsize=14, y=1.02)
plt.tight_layout()
plt.savefig('multivariate_t_contours.png', dpi=150, bbox_inches='tight')
plt.show()

上のグラフから、多変量t分布と正規分布の違いが明確に読み取れます。

  1. 等高線の広がり: 正規分布(左端)は外側の等高線の間隔が急速に狭まり、密度が急減少することを示しています。一方、$\nu = 3$ のt分布(左から2番目)では外側の等高線が比較的広く離れており、裾に向かって密度がゆっくり減衰しています
  2. 自由度による変化: $\nu$ が増えるにつれて等高線パターンは正規分布に近づきます。$\nu = 30$ ではほぼ正規分布と区別がつきません。これは $\nu \to \infty$ での正規分布への収束を視覚的に示しています
  3. 楕円形状の維持: どの自由度でも等高線は楕円のままで、スケール行列 $\bm{\Sigma}$ の構造(相関 $\rho = 0.6$)を反映した傾きを保っています

裾の確率の比較

次に、中心からの距離に対する裾の確率を定量的に比較します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 裾の確率: P(マハラノビス距離 > r) の比較
d = 2
r_values = np.linspace(0, 6, 200)
nu_values = [2, 3, 5, 10, 30]

fig, axes = plt.subplots(1, 2, figsize=(14, 5.5))

# (a) 裾の確率(対数スケール)
ax = axes[0]
# 正規分布: マハラノビス距離^2 ~ chi^2(d)
p_normal = 1 - stats.chi2.cdf(r_values**2, df=d)
ax.semilogy(r_values, p_normal, 'k-', linewidth=2.5, label=r'Normal ($\nu=\infty$)')

for nu in nu_values:
    # t分布: マハラノビス距離^2 / d ~ F(d, nu) なので q ~ d * F(d, nu)
    p_t = 1 - stats.f.cdf(r_values**2 / d, dfn=d, dfd=nu)
    ax.semilogy(r_values, p_t, linewidth=1.8, label=rf'$t$ ($\nu={nu}$)')

ax.set_xlabel('Mahalanobis distance $r$', fontsize=12)
ax.set_ylabel(r'$P(\sqrt{q} > r)$', fontsize=12)
ax.set_title('Tail Probability Comparison', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_ylim(1e-8, 1)
ax.set_xlim(0, 6)

# (b) サンプリングによる外れ値の比較
ax = axes[1]
np.random.seed(42)
n_samples = 2000
mu = np.array([0.0, 0.0])
Sigma = np.array([[1.0, 0.5], [0.5, 1.0]])
L = np.linalg.cholesky(Sigma)

# 正規分布からサンプリング
z_normal = np.random.multivariate_normal(mu, Sigma, n_samples)

# t分布からサンプリング (nu=3)
nu = 3
z_std = np.random.standard_normal((n_samples, 2))
z_corr = z_std @ L.T  # 相関を持たせる
v = np.random.chisquare(nu, n_samples)
scale = np.sqrt(nu / v)
z_t = mu + z_corr * scale[:, np.newaxis]

ax.scatter(z_normal[:, 0], z_normal[:, 1], s=8, alpha=0.3, color='blue', label='Normal')
ax.scatter(z_t[:, 0], z_t[:, 1], s=8, alpha=0.3, color='red', label=rf'$t$ ($\nu={nu}$)')

# 3σ楕円
theta = np.linspace(0, 2*np.pi, 100)
circle = np.column_stack([np.cos(theta), np.sin(theta)])
ellipse = circle @ (3 * L.T)
ax.plot(ellipse[:, 0], ellipse[:, 1], 'k--', linewidth=1.5, label=r'$3\sigma$ ellipse')

ax.set_xlabel('$x_1$', fontsize=12)
ax.set_ylabel('$x_2$', fontsize=12)
ax.set_title(rf'Samples: Normal vs $t$ ($\nu={nu}$)', fontsize=13)
ax.legend(fontsize=9, loc='upper left')
ax.set_aspect('equal')
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('multivariate_t_tails.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから裾の重さの違いが定量的に確認できます。

  1. 左図(裾の確率): マハラノビス距離 $r = 4$ で比較すると、正規分布の裾確率は約 $10^{-3.5}$ ですが、$\nu = 3$ のt分布では約 $10^{-1.5}$ と約100倍大きくなっています。$r = 6$ ではその差はさらに広がります。$\nu$ が増えるにつれてt分布の曲線が正規分布に漸近していく様子も確認できます

  2. 右図(サンプル比較): 正規分布(青)のサンプルは $3\sigma$ 楕円の内側にほぼ収まりますが、t分布(赤、$\nu = 3$)のサンプルは楕円の外側にも多数散らばっています。これが「外れ値が生じやすい」ことの具体的なイメージです

正規分布への収束の確認

最後に、自由度 $\nu$ を変化させたとき、t分布が正規分布に収束する様子を確認します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import gammaln

def multivariate_t_pdf_1d_slice(x, mu, sigma2, nu):
    """1次元スライスでの多変量t分布の密度"""
    d = 1
    q = (x - mu)**2 / sigma2
    log_norm = (gammaln((nu + d) / 2) - gammaln(nu / 2)
                - d / 2 * np.log(nu * np.pi)
                - 0.5 * np.log(sigma2))
    log_pdf = log_norm - (nu + d) / 2 * np.log(1 + q / nu)
    return np.exp(log_pdf)

x = np.linspace(-6, 6, 500)
nu_list = [1, 2, 5, 10, 30, 100]
mu, sigma2 = 0.0, 1.0

fig, axes = plt.subplots(1, 2, figsize=(14, 5.5))

# (a) 密度関数の比較
ax = axes[0]
from scipy.stats import norm
ax.plot(x, norm.pdf(x, mu, np.sqrt(sigma2)), 'k-', linewidth=2.5, label=r'Normal ($\nu=\infty$)')

for nu in nu_list:
    y = multivariate_t_pdf_1d_slice(x, mu, sigma2, nu)
    ax.plot(x, y, linewidth=1.5, label=rf'$t$ ($\nu={nu}$)')

ax.set_xlabel('$x$', fontsize=12)
ax.set_ylabel('Density', fontsize=12)
ax.set_title('Convergence of $t$ to Normal', fontsize=13)
ax.legend(fontsize=9, ncol=2)
ax.grid(True, alpha=0.3)

# (b) KLダイバージェンスの変化
ax = axes[1]
nu_range = np.arange(2, 101)
kl_values = []

for nu in nu_range:
    # KL(t_nu || normal) のモンテカルロ推定
    n_mc = 50000
    samples = np.random.standard_t(nu, n_mc)
    log_t = np.log(np.maximum(multivariate_t_pdf_1d_slice(samples, 0, 1, nu), 1e-300))
    log_n = norm.logpdf(samples, 0, 1)
    kl = np.mean(log_t - log_n)
    kl_values.append(max(0, kl))

ax.semilogy(nu_range, kl_values, 'b-', linewidth=2)
ax.set_xlabel(r'Degrees of freedom $\nu$', fontsize=12)
ax.set_ylabel(r'$D_{KL}(t_\nu \| \mathcal{N})$', fontsize=12)
ax.set_title('KL Divergence from Normal', fontsize=13)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('multivariate_t_convergence.png', dpi=150, bbox_inches='tight')
plt.show()

上のグラフから、t分布が正規分布に収束していく様子が確認できます。

  1. 左図(密度関数の比較): $\nu = 1$(コーシー分布)では裾が非常に重く、ピークが低い分布ですが、$\nu$ が増えるにつれてピークが高くなり裾が軽くなって、正規分布の形に近づいていきます。$\nu = 30$ では正規分布とほとんど区別がつかず、$\nu = 100$ では実質的に同一です

  2. 右図(KLダイバージェンス): t分布と正規分布のKLダイバージェンスは $\nu$ の増加とともに単調に減少し、対数スケールでほぼ線形に減衰しています。$\nu = 30$ で約 $10^{-2}$ のオーダーまで下がり、実用上は正規近似が十分であることを示唆しています

まとめ

本記事では、多変量t分布の定義・性質・可視化について解説しました。

  • 多変量t分布は、多変量正規分布のスケールがカイ二乗分布に従って変動する分布(正規分散混合)として定義される
  • 確率密度関数は、マハラノビス距離のべき関数減衰の形をしており、正規分布の指数関数減衰と比べて裾が重い
  • 周辺分布は自由度を保ったままt分布になるが、無相関でも独立とは限らない点が正規分布と異なる
  • 条件付き分布は自由度が増加する非自明な構造を持ち、観測データのマハラノビス距離がスケールに影響する
  • 自由度 $\nu \to \infty$ で多変量正規分布に収束し、$\nu = 30$ 程度で実用上はほぼ同一となる

多変量t分布は、外れ値を含むデータのモデリングやベイズ推論での予測分布として重要な役割を果たします。

次のステップとして、以下の記事も参考にしてください。