潜在変数モデルと因子分析をわかりやすく解説

観測データの背後に直接観測できない潜在変数(latent variable)を仮定するモデルは、機械学習や統計学において広く利用されています。因子分析(Factor Analysis)はその代表的な手法で、高次元の観測データが少数の潜在因子によって生成されるという仮定に基づきます。

潜在変数モデルの考え方は、状態空間モデルや変分オートエンコーダ(VAE)など、多くの発展的な手法の基盤となっています。

本記事の内容

  • 潜在変数モデルの定義と直感的理解
  • 因子分析の数学的定式化
  • 主成分分析(PCA)との関係と違い
  • Pythonでの実装と可視化

前提知識

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

潜在変数モデルとは

潜在変数モデルとは、観測データ $\bm{t}$ の背後に直接は観測できない潜在変数 $\bm{x}$ が存在し、その潜在変数によって観測データが生成されると考えるモデルです。

イメージとしては、テストの点数(観測データ)の背後には「数学力」や「言語能力」といった直接測定できない能力(潜在因子)があり、これらの能力がテストの点数を決めている、と考えます。

潜在変数モデルの定義

$d$ 次元の観測ベクトル $\bm{t}$ に対し、$q$ 次元($q < d$)の潜在変数ベクトル $\bm{x}$ を用いて以下のようにモデル化します。

$$ \bm{t} = \bm{W}\bm{x} + \bm{\mu} + \bm{\epsilon} $$

ここで、

  • $\bm{W} \in \mathbb{R}^{d \times q}$: 因子負荷行列(factor loading matrix)
  • $\bm{\mu} \in \mathbb{R}^d$: 平均ベクトル
  • $\bm{\epsilon} \in \mathbb{R}^d$: ノイズ(潜在変数と独立)

潜在変数とノイズには以下の分布を仮定します。

$$ \bm{x} \sim \mathcal{N}(\bm{0}, \bm{I}_q) $$

$$ \bm{\epsilon} \sim \mathcal{N}(\bm{0}, \bm{\Psi}) $$

$\bm{\Psi}$ は対角行列で、各観測変数固有のノイズ分散を表します。

因子分析の数学的性質

観測データの周辺分布

潜在変数 $\bm{x}$ を周辺化すると、観測データ $\bm{t}$ の分布が求まります。

$$ \begin{align} \bm{t} &= \bm{W}\bm{x} + \bm{\mu} + \bm{\epsilon} \end{align} $$

$\bm{x}$ と $\bm{\epsilon}$ がそれぞれ正規分布に従い、互いに独立であることから、

$$ \begin{align} E[\bm{t}] &= \bm{W}E[\bm{x}] + \bm{\mu} + E[\bm{\epsilon}] = \bm{\mu} \end{align} $$

$$ \begin{align} \text{Cov}[\bm{t}] &= \bm{W}\text{Cov}[\bm{x}]\bm{W}^T + \text{Cov}[\bm{\epsilon}] \\ &= \bm{W}\bm{W}^T + \bm{\Psi} \end{align} $$

よって、

$$ \bm{t} \sim \mathcal{N}(\bm{\mu}, \bm{W}\bm{W}^T + \bm{\Psi}) $$

これは観測データの共分散行列が $\bm{W}\bm{W}^T + \bm{\Psi}$ と分解されることを意味します。$\bm{W}\bm{W}^T$ は潜在因子による共通の分散を、$\bm{\Psi}$ は各変数固有の分散を表します。

潜在変数の事後分布

データ $\bm{t}$ が与えられたときの潜在変数 $\bm{x}$ の事後分布を求めます。ガウス分布の条件付き分布の公式を用いると、

$$ p(\bm{x} | \bm{t}) = \mathcal{N}(\bm{x} | \bm{m}, \bm{V}) $$

$$ \bm{V} = (\bm{I}_q + \bm{W}^T \bm{\Psi}^{-1} \bm{W})^{-1} $$

$$ \bm{m} = \bm{V} \bm{W}^T \bm{\Psi}^{-1} (\bm{t} – \bm{\mu}) $$

主成分分析(PCA)との比較

因子分析とPCAはどちらも次元削減の手法ですが、以下の点で異なります。

因子分析 PCA
モデル 確率生成モデル 分散最大化の射影
ノイズ 各変数固有のノイズ $\bm{\Psi}$ を仮定 ノイズの明示的なモデルなし
目的 潜在因子の推定 データの分散を最もよく説明する方向
回転の不定性 あり(因子の回転) なし(固有ベクトルは一意)

特に $\bm{\Psi} = \sigma^2 \bm{I}$(等方的ノイズ)とした場合、因子分析は 確率的PCA (Probabilistic PCA) に一致します。

Pythonでの実装

scikit-learnのFactorAnalysisと、手動での因子分析的な実装を比較します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import FactorAnalysis, PCA
from sklearn.datasets import load_iris

# --- Irisデータセットの読み込み ---
iris = load_iris()
X = iris.data  # (150, 4)
y = iris.target

# --- 因子分析(2因子)---
fa = FactorAnalysis(n_components=2, random_state=42)
X_fa = fa.fit_transform(X)

# --- PCA(2成分)---
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# --- 結果の表示 ---
print("=== 因子分析 ===")
print(f"因子負荷行列 W:\n{fa.components_.T.round(3)}")
print(f"ノイズ分散 (Psi の対角): {fa.noise_variance_.round(4)}")
print(f"対数尤度: {fa.score(X).round(4)}")

print("\n=== PCA ===")
print(f"主成分の寄与率: {pca.explained_variance_ratio_.round(4)}")
print(f"累積寄与率: {pca.explained_variance_ratio_.sum():.4f}")

# --- 可視化 ---
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
target_names = iris.target_names
colors = ['blue', 'orange', 'green']

# 因子分析
ax1 = axes[0]
for i, (name, color) in enumerate(zip(target_names, colors)):
    mask = y == i
    ax1.scatter(X_fa[mask, 0], X_fa[mask, 1], c=color, alpha=0.6, label=name, s=30)
ax1.set_xlabel('Factor 1')
ax1.set_ylabel('Factor 2')
ax1.set_title('Factor Analysis (2 factors)')
ax1.legend()
ax1.grid(True, alpha=0.3)

# PCA
ax2 = axes[1]
for i, (name, color) in enumerate(zip(target_names, colors)):
    mask = y == i
    ax2.scatter(X_pca[mask, 0], X_pca[mask, 1], c=color, alpha=0.6, label=name, s=30)
ax2.set_xlabel('PC 1')
ax2.set_ylabel('PC 2')
ax2.set_title('PCA (2 components)')
ax2.legend()
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# --- 共分散行列の分解を確認 ---
W = fa.components_.T
Psi = np.diag(fa.noise_variance_)
cov_model = W @ W.T + Psi
cov_data = np.cov(X.T)

print("\n=== 共分散行列の比較 ===")
print(f"データの共分散行列:\n{cov_data.round(3)}")
print(f"\nモデルの共分散行列 (WW^T + Psi):\n{cov_model.round(3)}")
print(f"\n再構成誤差 (Frobenius norm): {np.linalg.norm(cov_data - cov_model):.4f}")

因子分析では、各変数固有のノイズ分散 $\bm{\Psi}$ が推定されていることがわかります。PCAとは異なり、変数ごとに異なるノイズレベルをモデル化できるのが因子分析の特徴です。

まとめ

本記事では、潜在変数モデルと因子分析について解説しました。

  • 潜在変数モデルは、観測データの背後に直接観測できない因子を仮定するモデル
  • 因子分析は $\bm{t} = \bm{W}\bm{x} + \bm{\mu} + \bm{\epsilon}$ という線形モデルで、観測データの共分散を $\bm{W}\bm{W}^T + \bm{\Psi}$ と分解する
  • PCAとの違いは、各変数固有のノイズ $\bm{\Psi}$ を明示的にモデル化する点
  • 潜在変数モデルの考え方はVAEや状態空間モデルなど、多くの手法の基盤となっている

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