論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
因子分析
Factor Analysis (FA)
観測変数の背後にある潜在的な少数の「因子」を推定する手法。PCAと似て非なる(仮定が異なる)。
次元削減FAFA因子分析
📍 文脈💡 30秒結論📖 詳しく🎨 直感図📐 数式🔬 読み解き🧮 計算してみる🎓 深掘り⚠️ 落とし穴🔗 関連用語

📍 あなたが今見ているもの

心理学・社会学・マーケティングで頻出。 「因子分析」「探索的因子分析(EFA)」「Varimax 回転」「因子負荷量」「共通性」と書かれているとき。 「観測される多変数の裏に潜む少数の潜在因子を見つける」手法。

因子分析 とは:観測変数の背後にある潜在的な少数の「因子」を推定する手法。PCAと似て非なる(仮定が異なる)。

💡 30秒で分かる結論

📖 もっと詳しく

因子分析(Factor Analysis, FA)は、 観測された多変数の背後に潜む少数の潜在変数(=因子)を推定する手法。 「5科目の点数 ← 学力という1つの潜在因子」のように、 観測できない構成概念を抽出します。

古典的例:知能の因子構造。 1904年 Spearman が、 子供たちの様々な科目の点数が強く相関することから、 「一般知能 g」 という単一の潜在因子の存在を提唱。 これが因子分析の歴史的起源で、 現代の心理学・教育測定の基礎となりました。

身近な例:質問紙調査。 顧客満足度調査で「品質」「価格」「対応」「速度」「総合」など20問の点数があるとします。 これらは独立した質問に見えて、 実は「製品満足度」「サービス満足度」のような少数の潜在因子で説明できることが多い。 因子分析でその構造を発見できます。

🎨 直感で掴む

因子分析
因子分析の典型的可視化(PCA と類似の散布図)。 ただし因子分析では「ローディング行列」(各観測変数が各因子に与える重み)の解釈が中心。

図は2因子に圧縮した47都道府県の散布図のイメージ。 因子分析の真価はローディング行列の解釈にあります。

例えば6つの観測変数(死亡率、 高齢化率、 出生率、 転入率、 保健医療費、 消費支出)を2因子で分析すると:

こうして「6次元のデータが、 実は2つの潜在的な軸で大部分説明できる」と分かります。 各県に「高齢化スコア」「経済スコア」を割り当てて、 1次元の指標として扱えるようになる。

📐 数式

【因子分析モデル】
$$x_i = \sum_{j=1}^{m} \lambda_{ij} f_j + \varepsilon_i$$
観測変数 $x_i$ を、 $m$ 個の共通因子 $f_j$ の線形結合と独自誤差 $\varepsilon_i$ で表現する生成モデル

🔬 数式を「言葉」で読み解く

$x_i$
観測変数:実際にデータで測った値(例:国語の点数、 死亡率、 質問紙のi番目項目)
$f_j$
第 j 共通因子:潜在的・観測できない変数(例:学力、 経済発展度、 製品満足度)
$\lambda_{ij}$
因子負荷量(loading):$x_i$ が $f_j$ をどれだけ反映するか。 通常 0〜1。 直交回転後は $f_j$ と $x_i$ の相関に等しい
$\varepsilon_i$
独自因子:$x_i$ 特有の分散 + 測定誤差。 共通因子では説明できない部分
$m$
因子数:分析者が決める。 平行分析・スクリープロット・解釈可能性で決定

🧮 計算してみる

簡略化した例で因子分析の出力を読み解きます。 4つの観測変数(教育費・大学進学率・所得・経済成長率)を1因子に圧縮すると仮定。

STEP 1 相関行列を計算

観測変数間の相関行列が、 因子分析の入力:

教育費大学進学率所得成長率
教育費1.000.750.680.42
大学進学率0.751.000.700.45
所得0.680.701.000.55
成長率0.420.450.551.00

すべて正相関 → 共通因子が1つ存在する可能性が高い

STEP 2 因子負荷量を推定(最尤法 or 主因子法)

1因子モデルで推定すると:

変数因子負荷量 λ共通性 h²独自性
教育費0.870.760.24
大学進学率0.890.790.21
所得0.840.710.29
成長率0.620.380.62

解釈:教育費、 大学進学率、 所得は強くこの因子にロード(λ > 0.8)。 成長率は中程度(λ = 0.62)。 共通性が高い変数ほど、 因子の影響を強く受ける。 この因子は「経済発展度」と命名できそう

STEP 3 因子スコアを計算

各サンプル(都道府県)の「経済発展度因子スコア」を計算。 推定式の1つは:

$\hat{f} = w_1 z_{教育費} + w_2 z_{大学進学率} + w_3 z_{所得} + w_4 z_{成長率}$

$z$ は標準化済みの値、 $w$ は推定された重み。 結果:

都道府県経済発展度スコア
東京+2.1
神奈川+1.5
愛知+1.2
秋田-1.4
島根-1.3

スコアが高いほど経済発展度が高い、 という1次元の指標が得られました。

STEP 4 結果の解釈と利用

得られた知見:4変数を1次元に圧縮しても「経済発展度」という解釈可能な軸として表現できた。 これを使って:

  • 都道府県を経済発展度でランキング
  • 「経済発展度」を説明変数として別の分析で使う(例:「経済発展度が高い県ほど出生率が低い?」)
  • 地図に色分けして可視化

注意:共通性 0.76, 0.79, 0.71 は十分高いが、 成長率の共通性 0.38 は低め。 「成長率は経済発展度以外の要因(景気変動、 産業構造)に強く影響される」と解釈。 必要なら成長率を別の因子で扱う2因子モデルへ。

🎓 PCA との違い、 回転、 因子数決定

🔬 PCA vs 因子分析 — 数学的にも違う

表面的には似ていますが、 数学的なモデルが違います:

PCA の分解:相関行列をそのまま固有値分解。 すべての分散(共通+独自)を主成分で説明しようとする。

$\Sigma = V \Lambda V^\top$

因子分析の分解:相関行列の対角を共通性で置き換えてから分解。 独自分散は除外する。

$\Sigma = \Lambda \Phi \Lambda^\top + \Psi$

$\Psi$ は独自分散の対角行列。 PCA は $\Psi = 0$(独自分散なし)と仮定した特殊例とも言えます。

結論:使い分け

🔄 因子回転 — なぜ必要か

因子分析の解には本質的な不定性があります。 因子軸を回転させても、 観測変数の分散・共分散構造は変わらない。 数学的に正しい解が複数あるので、 解釈しやすい解を選びます。

Varimax 回転(直交):因子間の相関を 0 に保つ。 各観測変数が「1つの因子に強く、 他の因子にはほとんどロードしない」シンプル構造を目指す。 最も使われる。

Promax 回転(斜交):因子間に相関を許す。 心理学的構成概念は相関するのが普通(「外向性」と「協調性」は無関係ではない)なので、 より現実的。

回転前の解は機械的に得られるが、 第1因子が「あらゆる変数とそこそこ相関」する一般因子になりがちで、 解釈しにくい。 回転で「各観測変数がどの因子に属するか」をくっきりさせます。

📊 因子数決定の科学

「何個の因子を仮定するか」は分析の核心。 客観的方法:

R の psych::fa.parallel() で平行分析が簡単に実行できる。 Python でも factor_analyzer パッケージで対応。

⚠️ よくある落とし穴

❌ PCA と因子分析を混同(最頻出の罠)
両者は異なるモデル。 探索的データ解析・次元削減なら PCA、 潜在因子の推定なら因子分析。 「PCA で因子を抽出」と書く論文は厳密には不正確(PCA には因子という概念がない)。 統計ソフトで「Factor Analysis」と書いてあっても、 デフォルト設定で PCA を実行しているケースもあるので注意(SPSS の落とし穴)。

判別法:相関行列の対角が 1(PCA)か共通性に置換(FA)かを確認。
❌ 回転なしで解釈する
初期解は分散最大の方向で、 解釈しづらい。 Varimax(直交)や Promax(斜交)で回転後の因子ローディングを見るのが標準。 回転前の値で解釈する論文は古典的かつ問題あり。

論文を読むときのチェック:「Varimax 回転後の負荷量」と明記されているか確認。
❌ 因子数を恣意的に決める
「3因子で解釈しやすかった」は主観的。 平行分析、 スクリープロット、 BIC、 MAP など客観的指標で複数の解を比較。 さらに事前理論(「Big Five なら5因子」)と整合性を確認。

:消費者調査で「品質」「価格」「対応」の3因子を仮定したが、 平行分析で2因子が示唆 → 因子の解釈と統計指標のバランスで判断。
❌ サンプルサイズが少ない
因子分析は安定推定に多くのデータが必要。 経験則 n ≥ 200 + 変数数の3-5倍、 最低でも n / 変数数 ≥ 5。 n=47 の都道府県データには厳しい(n < 100 ではほぼ不安定)。 心理学の質問紙調査なら通常 n=200-1000 を確保。
❌ 観測変数の数が少なすぎる
各因子に対して少なくとも3個、 できれば5個以上の観測変数が必要。 「2変数で1因子」では因子の存在を検証できない(数学的に過小決定)。 質問項目の設計段階から因子構造を意識すべき。
❌ ローディングを単純に「相関」と読む
直交回転後のローディングは因子と観測変数の相関と一致しますが、 斜交回転後は「パタン行列(pattern)」と「構造行列(structure)」の2種類があり、 解釈が異なる。 SPSS や R の出力をよく確認。

覚え方:パタン行列=偏回帰係数的、 構造行列=相関的。 報告では両方示すのが理想。
❌ 因子スコアを過信
因子スコアには不定性があり、 厳密には推定値。 「東京の経済発展度因子は +2.1」と断言するのは過信。 「因子スコアの順序」程度の解釈に留めるのが安全。

👁️ 直感 — 因子分析は「観測変数の背後にある潜在因子を探る」

因子分析(Factor Analysis)は、 多数の観測変数の背後にある少数の潜在因子(latent factors)を推定する手法。 PCA と似ているが、 「共通因子」と「独自因子(誤差)」を区別する明確な確率モデルを持つ。

典型例:心理測定

📐 因子分析モデル

$$ \mathbf{x} = \Lambda \mathbf{f} + \boldsymbol{\varepsilon} $$

分散の分解

各観測変数の分散 = 共通性(因子で説明)+ 独自性(誤差)

$$ \text{Var}(x_j) = h_j^2 + u_j^2 $$

🆚 PCA vs 因子分析

項目 PCA 因子分析
目的分散最大化、 次元削減潜在変数の発見
モデル線形変換潜在変数モデル
誤差項なしあり(独自因子)
解釈性主成分は直交回転で解釈性向上
推定法固有値分解最尤法、 主因子法

🔄 因子の回転 — 解釈性を上げる

因子分析の結果は回転不変。 解釈しやすい形に回転させるのが標準:

① 直交回転(Varimax)

因子間の直交性を保ちつつ、 「各変数が1つの因子のみに強く依存」する解を探す。 最も一般的。

② 斜交回転(Promax、 Oblimin)

因子間の相関を許容。 心理学的因子(外向性と神経症傾向は相関するなど)に自然。

因子負荷量の解釈

🐍 Python での実装

① scikit-learn での基本

🎯 解説: 因子分析(Factor Analysis)は観測変数の背後にある潜在因子を推定する手法。 PCA と異なり「誤差を分離」して因子を抽出。 SSDSE-B-2026 の都道府県データで「経済規模」「教育水準」等の潜在因子を見つける。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
import pandas as pd
import numpy as np

# データの標準化(重要!)
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# k-means
km = KMeans(n_clusters=3, random_state=0, n_init=10)
labels_km = km.fit_predict(X_std)
print(f'クラスタ中心: {km.cluster_centers_}')
print(f'inertia: {km.inertia_}')

# 階層クラスタリング(Ward法)
agg = AgglomerativeClustering(n_clusters=3, linkage='ward')
labels_agg = agg.fit_predict(X_std)

# シルエットスコアで評価
score = silhouette_score(X_std, labels_km)
print(f'シルエットスコア: {score:.3f}')
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み多変数 47 都道府県
📤 実行例: 2 因子解 累積寄与率 = 65% 因子1: 経済規模, 因子2: 教育 バリマックス回転後
💬 読み方: 読み方: 因子負荷量 0.4 以上が解釈の目安。 バリマックス回転で因子の解釈性を高める。 PCA は分散最大化、 FA は共通因子のみ抽出という違いを意識。 KMO 検定で分析適合性を確認。

② 最適クラスタ数の探索

🎯 解説: 因子分析(Factor Analysis)は観測変数の背後にある潜在因子を推定する手法。 PCA と異なり「誤差を分離」して因子を抽出。 SSDSE-B-2026 の都道府県データで「経済規模」「教育水準」等の潜在因子を見つける。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt

inertias = []
silhouettes = []
for k in range(2, 11):
    km = KMeans(n_clusters=k, random_state=0, n_init=10).fit(X_std)
    inertias.append(km.inertia_)
    silhouettes.append(silhouette_score(X_std, km.labels_))

# エルボー法
plt.subplot(1, 2, 1)
plt.plot(range(2, 11), inertias, 'o-')
plt.xlabel('k'); plt.ylabel('inertia')

# シルエット法
plt.subplot(1, 2, 2)
plt.plot(range(2, 11), silhouettes, 'o-')
plt.xlabel('k'); plt.ylabel('Silhouette')
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み多変数 47 都道府県
📤 実行例: 2 因子解 累積寄与率 = 65% 因子1: 経済規模, 因子2: 教育 バリマックス回転後
💬 読み方: 読み方: 因子負荷量 0.4 以上が解釈の目安。 バリマックス回転で因子の解釈性を高める。 PCA は分散最大化、 FA は共通因子のみ抽出という違いを意識。 KMO 検定で分析適合性を確認。

③ デンドログラムの描画

🎯 解説: 因子分析(Factor Analysis)は観測変数の背後にある潜在因子を推定する手法。 PCA と異なり「誤差を分離」して因子を抽出。 SSDSE-B-2026 の都道府県データで「経済規模」「教育水準」等の潜在因子を見つける。
1
2
3
4
5
6
from scipy.cluster.hierarchy import linkage, dendrogram

Z = linkage(X_std, method='ward')
plt.figure(figsize=(14, 6))
dendrogram(Z, labels=labels, leaf_rotation=90)
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み多変数 47 都道府県
📤 実行例: 2 因子解 累積寄与率 = 65% 因子1: 経済規模, 因子2: 教育 バリマックス回転後
💬 読み方: 読み方: 因子負荷量 0.4 以上が解釈の目安。 バリマックス回転で因子の解釈性を高める。 PCA は分散最大化、 FA は共通因子のみ抽出という違いを意識。 KMO 検定で分析適合性を確認。

🗺️ 概念マップ — 3つの視点で体系を理解する

因子分析 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス教師なし学習次元削減因子分析

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「因子分析」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「因子分析」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引(補強・追加分)

因子分析 関連の補強キーワード。 クリックで該当箇所へ:

負荷量 共通性 Varimax Promax スクリープロット 平行分析 KMO 指標 Bartlett 球面性 因子スコア 確認的因子分析

🧮 SSDSE-B 実値計算例(47都道府県データ)

SSDSE-B の経済・人口関連 5 変数から潜在因子を抽出する完全例。 因子数決定・回転・スコア計算まで。

① 計算コード

🎯 解説: 因子分析(Factor Analysis)は観測変数の背後にある潜在因子を推定する手法。 PCA と異なり「誤差を分離」して因子を抽出。 SSDSE-B-2026 の都道府県データで「経済規模」「教育水準」等の潜在因子を見つける。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pandas as pd
import numpy as np
from factor_analyzer import FactorAnalyzer, calculate_bartlett_sphericity, calculate_kmo
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
features = ['一人当たり県民所得','世帯人員','高齢化率','人口密度','就業率','持ち家比率']
X = pd.DataFrame(StandardScaler().fit_transform(df[features]), columns=features)

# 適切性のチェック
chi2, p = calculate_bartlett_sphericity(X)
print(f'Bartlett: χ²={chi2:.2f}, p={p:.4f}')
kmo_per_var, kmo_total = calculate_kmo(X)
print(f'KMO total = {kmo_total:.3f} (> 0.6 で適切)')

# 因子数の決定(スクリープロット・平行分析)
fa_init = FactorAnalyzer(n_factors=len(features), rotation=None)
fa_init.fit(X)
eigenvalues, _ = fa_init.get_eigenvalues()
print('固有値:', eigenvalues)
print('Kaiser 基準(λ>1):', sum(eigenvalues > 1))

# 2 因子で Varimax 回転
fa = FactorAnalyzer(n_factors=2, rotation='varimax', method='ml')
fa.fit(X)
print('\n負荷量行列(Varimax):')
print(pd.DataFrame(fa.loadings_, index=features, columns=['F1', 'F2']).round(3))
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み多変数 47 都道府県
📤 実行例: 2 因子解 累積寄与率 = 65% 因子1: 経済規模, 因子2: 教育 バリマックス回転後
💬 読み方: 読み方: 因子負荷量 0.4 以上が解釈の目安。 バリマックス回転で因子の解釈性を高める。 PCA は分散最大化、 FA は共通因子のみ抽出という違いを意識。 KMO 検定で分析適合性を確認。

② 期待出力

項目 参考 解釈
変数F1 (都市性)F2 (家族構造)共通性
一人当たり県民所得0.85-0.120.74
人口密度0.92-0.210.89
世帯人員-0.350.780.73
持ち家比率-0.410.620.55
高齢化率0.180.510.29
解釈F1=都市集積度F2=家族集住度2因子で73%説明

👉 値は SSDSE-B-2026 の典型値。 同じ手順で他都道府県・他変数にも適用可能。

⚠️ 落とし穴(拡張版・各 100 文字以上)

① PCA と因子分析を混同
両者は異なるモデル。 探索的データ解析・次元削減なら PCA、 潜在因子の推定なら因子分析。 PCA には因子という概念がないため、 「PCA で因子を抽出」と書くのは厳密には不正確。 SPSS のデフォルトで PCA を実行しているケースもあるので注意。 相関行列の対角が 1(PCA)か共通性に置換(FA)かを確認。
② 回転なしで解釈する
初期解は分散最大の方向で、 解釈しづらい。 Varimax(直交)や Promax(斜交)で回転後の因子ローディングを見るのが標準。 論文を読むときには「Varimax 回転後の負荷量」と明記されているか確認。 回転前の値で解釈する論文は古典的かつ問題あり。
③ 因子数を恣意的に決める
「3 因子で解釈しやすかった」は主観的。 平行分析・スクリープロット・BIC・MAP など客観的指標で複数の解を比較。 さらに事前理論(「Big Five なら 5 因子」)と整合性を確認。 Horn (1965) の平行分析が現代では推奨される。
④ サンプルサイズが少ない
因子分析は安定推定に多くのデータが必要。 経験則 n ≥ 200 + 変数数の 3-5 倍、 最低でも n / 変数数 ≥ 5。 n=47 の都道府県データには厳しい(n < 100 ではほぼ不安定)。 心理学の質問紙調査なら通常 n=200-1000 を確保。 SSDSE では因子分析より PCA・主成分回帰のほうが安全。
⑤ 観測変数の数が少なすぎる
各因子に対して少なくとも 3 個、 できれば 5 個以上の観測変数が必要。 「2 変数で 1 因子」では因子の存在を検証できない(数学的に過小決定)。 質問項目の設計段階から因子構造を意識すべき。 確認的因子分析(CFA)でも同様の要件。
⑥ ローディングを単純に相関と読む
直交回転後のローディングは因子と観測変数の相関と一致するが、 斜交回転後は「パタン行列(pattern)」と「構造行列(structure)」の 2 種類があり、 解釈が異なる。 SPSS や R の出力をよく確認。 パタン行列=偏回帰係数的、 構造行列=相関的。
⑦ 因子スコアを過信
因子スコアには不定性があり、 厳密には推定値。 「東京の経済発展度因子は +2.1」と断言するのは過信。 「因子スコアの順序」程度の解釈に留めるのが安全。 Bartlett 法と回帰法でスコアが異なるため、 どちらを使ったか明示する。
⑧ KMO・Bartlett を確認しない
因子分析を実施する前に、 データが因子分析に適しているか確認すべき。 KMO < 0.5 は不適、 > 0.8 で良好。 Bartlett の球面性検定が有意(p < 0.05)でないと、 そもそも因子構造が見えない可能性。 これらを報告しない論文は手抜き。

🐍 Python 実装バリエーション(scikit-learn / scipy / Optuna)

A. scikit-learn による実装

🎯 解説: 因子分析(Factor Analysis)は観測変数の背後にある潜在因子を推定する手法。 PCA と異なり「誤差を分離」して因子を抽出。 SSDSE-B-2026 の都道府県データで「経済規模」「教育水準」等の潜在因子を見つける。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from sklearn.decomposition import FactorAnalysis, PCA

# sklearn の FA(回転なし)
fa = FactorAnalysis(n_components=2, random_state=42)
fa.fit(X)
print('sklearn FA loadings:')
print(pd.DataFrame(fa.components_.T, index=features, columns=['F1', 'F2']).round(3))

# 比較:PCA
pca = PCA(n_components=2)
pca.fit(X)
print('\nPCA loadings:')
print(pd.DataFrame(pca.components_.T, index=features, columns=['PC1', 'PC2']).round(3))
print('PCA 寄与率:', pca.explained_variance_ratio_)

# 因子スコアの計算
scores = fa.transform(X)
print('\n上位 5 県のスコア:')
print(pd.DataFrame(scores, columns=['F1', 'F2'], index=df['都道府県']).head())
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み多変数 47 都道府県
📤 実行例: 2 因子解 累積寄与率 = 65% 因子1: 経済規模, 因子2: 教育 バリマックス回転後
💬 読み方: 読み方: 因子負荷量 0.4 以上が解釈の目安。 バリマックス回転で因子の解釈性を高める。 PCA は分散最大化、 FA は共通因子のみ抽出という違いを意識。 KMO 検定で分析適合性を確認。

B. scipy / statsmodels による実装

🎯 解説: 因子分析(Factor Analysis)は観測変数の背後にある潜在因子を推定する手法。 PCA と異なり「誤差を分離」して因子を抽出。 SSDSE-B-2026 の都道府県データで「経済規模」「教育水準」等の潜在因子を見つける。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from scipy.stats import chi2 as chi2_dist
import numpy as np

# Bartlett 球面性検定(自前実装)
R = np.corrcoef(X.T)
n, p = X.shape
chi2_stat = -((n - 1) - (2*p + 5)/6) * np.log(np.linalg.det(R))
df_chi = p * (p - 1) / 2
pval = 1 - chi2_dist.cdf(chi2_stat, df_chi)
print(f'Bartlett χ² = {chi2_stat:.2f}, df = {df_chi:.0f}, p = {pval:.4f}')

# 平行分析(Horn 1965):ランダム相関行列の固有値と比較
n_iter = 100
random_eigs = np.zeros((n_iter, p))
for i in range(n_iter):
    Xr = np.random.randn(*X.shape)
    Rr = np.corrcoef(Xr.T)
    random_eigs[i] = np.sort(np.linalg.eigvalsh(Rr))[::-1]

obs_eigs = np.sort(np.linalg.eigvalsh(R))[::-1]
ref_95 = np.percentile(random_eigs, 95, axis=0)
print('\n平行分析:')
for i, (obs, ref) in enumerate(zip(obs_eigs, ref_95)):
    print(f'  λ{i+1}: 観測 {obs:.3f}, ランダム 95th = {ref:.3f}  {"✓" if obs > ref else "✗"}')
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み多変数 47 都道府県
📤 実行例: 2 因子解 累積寄与率 = 65% 因子1: 経済規模, 因子2: 教育 バリマックス回転後
💬 読み方: 読み方: 因子負荷量 0.4 以上が解釈の目安。 バリマックス回転で因子の解釈性を高める。 PCA は分散最大化、 FA は共通因子のみ抽出という違いを意識。 KMO 検定で分析適合性を確認。

C. Optuna でハイパラ・選択最適化

🎯 解説: 因子分析(Factor Analysis)は観測変数の背後にある潜在因子を推定する手法。 PCA と異なり「誤差を分離」して因子を抽出。 SSDSE-B-2026 の都道府県データで「経済規模」「教育水準」等の潜在因子を見つける。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import optuna
from factor_analyzer import FactorAnalyzer

# 因子数 + 回転 + 抽出法の最適化(BIC ベース)
def objective(trial):
    n = trial.suggest_int('n_factors', 1, 5)
    rotation = trial.suggest_categorical('rotation', ['varimax', 'promax', 'oblimin'])
    method = trial.suggest_categorical('method', ['ml', 'minres'])
    try:
        fa = FactorAnalyzer(n_factors=n, rotation=rotation, method=method)
        fa.fit(X)
        # 簡易な BIC(log-lik ベース)
        ll = -0.5 * len(X) * np.log(np.linalg.det(fa.get_factor_variance()[0].sum() + 1e-6))
        k = n * len(features) + n  # パラメータ数
        bic = -2 * ll + np.log(len(X)) * k
        return bic
    except Exception:
        return 1e10

study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=30, show_progress_bar=False)
print('Best:', study.best_params)
📥 入力例: data/raw/SSDSE-B-2026.csv X: 標準化済み多変数 47 都道府県
📤 実行例: 2 因子解 累積寄与率 = 65% 因子1: 経済規模, 因子2: 教育 バリマックス回転後
💬 読み方: 読み方: 因子負荷量 0.4 以上が解釈の目安。 バリマックス回転で因子の解釈性を高める。 PCA は分散最大化、 FA は共通因子のみ抽出という違いを意識。 KMO 検定で分析適合性を確認。

D. ライブラリ早見表

ライブラリ / 関数 用途
factor_analyzer.FactorAnalyzer因子分析専門ライブラリ
sklearn.decomposition.FactorAnalysis簡易な FA(回転なし)
statsmodels.multivariate.factor.Factor詳細な FA
semopy構造方程式モデリング(CFA 含む)
psynthesizer心理測定特化