ここ最近は統計の勉強をずっとしていたのですが、最初は「統計の勉強をして実務に本当に役立つの?」という疑問がありました。
しかし、勉強を進めるにつれて様々な実務への活用イメージができてきたため、統計で勉強した手法の1つ「因子分析」を実務で実際に役立てることをイメージして記事を作成しました。
これから統計を学ぶ人のモチベーションにも繋がったらうれしいと思っています。
因子分析とは?
因子分析(Factor Analysis) とは、
多数の観測変数の背後に存在する「潜在的な因子」を推定し、データの次元圧縮・構造理解を行う手法
のことです。
イメージしやすいように、教科書でよく見る具体例をご紹介します。
n人の5教科テスト結果(n×5のデータ)がある。
これを因子分析し、「テストの点数を決める潜在因子」を探索する。
潜在因子の例:総合的な学力、理系能力など
この例では5次元のデータを扱っているので、潜在因子はそれより小さい数を推定することになります。
因子分析の数式モデル
因子分析の基本式は次の線形モデルです:
X = ΛF + U
$X$:p次元の観測変数ベクトル
$Λ$:p×m の因子負荷量行列(観測変数→因子)
$F$:m次元の共通因子ベクトル(潜在因子)
$U$:p次元の固有因子(誤差項)
ここで、「$F$と$U$は独立」などいくつかの仮定の下で、先ほどの基本式を変形すると、観測変数 $X$ の共分散行列 $R$ は
R = ΛΛ' + D
と表されます。
因子軸の回転
因子分析では、因子負荷量行列$Λ$ を最小二乗法・最尤法などで推定した後、そのままでは解釈しづらい場合が多いため、回転を行います。
直交回転(Orthogonal Rotation)
因子同士を直交(相関ゼロ)に保つ回転
代表例:Varimax(バリマックス)回転
斜交回転(Oblique Rotation)
因子間に相関を許す回転
代表例:Promax(プロマックス)回転
図で直観的に理解すると…

この図を見ても、因子1と因子2がそれぞれ何を意味しているのか解釈するのが難しいです。そこで、軸を回転させることで、それぞれの因子がどのような意味をもつのかを解釈しやすいようにします。
回転後の図を見ると、片方の因子は文系分野の能力、もう片方の因子は理系分野の能力を表していることが分かります。
直交回転では因子軸の角度を直交に維持しており、斜交回転では直交性を維持していないことが確認できます。
業務での活用例
因子分析の使い方をイメージしやすいために、実務で使用する例をご紹介します。
1)購買アンケートから潜在因子を探索
例:日用品の購買者に「香りが重要」「価格が重要」「肌への優しさが重要」など多数の項目に対して7段階評価を与える。
因子分析によって得られる潜在因子の例
- 価格敏感性因子
- 香り重視因子
- 品質安心因子
2)毛髪画像の多次元量データから潜在因子を探索
例:うねり量・ツヤ量・枝毛率など、定量特徴を多数抽出したとする。
因子分析によって得られる潜在因子の例
- ダメージ因子(枝毛・乾燥・切れ毛)
- 質感因子(ツヤ・滑らかさ)
- ボリューム因子(毛量・ハリコシ)
3)店舗×SKU 売上データから潜在因子を探索
例:全国の店舗から、SKU別の売上データを定期的にする集計。
因子分析によって得られる潜在因子の例
- 地域特性因子
- 季節性因子
- プロモーション反応因子
Python による実装サンプル
今回は、次のような「購買意識アンケート(7段階)」を例にします。
質問「次の項目をどれくらい重視するか、7段階で回答してください」
- price:価格
- scent:香り
- mildness:肌への優しさ
- design:デザイン
- function:機能性
- brand:ブランド
- lasting:持続性
コード例
import pandas as pd
from factor_analyzer import FactorAnalyzer
import numpy as np
# ダミーデータを生成
np.random.seed(0)
df = pd.DataFrame({
"price": np.random.randint(1, 8, 200),
"scent": np.random.randint(1, 8, 200),
"mildness": np.random.randint(1, 8, 200),
"design": np.random.randint(1, 8, 200),
"function": np.random.randint(1, 8, 200),
"brand": np.random.randint(1, 8, 200),
"lasting": np.random.randint(1, 8, 200)
})
# 相関行列から因子数を決定する(固有値 > 1 の基準)
fa = FactorAnalyzer(rotation=None)
fa.fit(df)
ev, v = fa.get_eigenvalues()
print(ev)
# 因子数を2に設定して因子分析
# 回転はバリマックス回転を採用
fa = FactorAnalyzer(n_factors=2, rotation="varimax")
fa.fit(df)
# 因子負荷量
loadings = pd.DataFrame(fa.loadings_, index=df.columns)
print(loadings)
結果の例
| 因子1 | 因子2 | |
|---|---|---|
| price | 0.70 | 0.10 |
| scent | 0.08 | 0.81 |
| mildness | 0.15 | 0.75 |
| design | 0.65 | 0.18 |
| function | 0.72 | 0.20 |
| brand | 0.68 | 0.21 |
| lasting | 0.62 | 0.17 |
この例では
因子1:機能性・価格・ブランド
因子2:香り・やさしさ系の嗜好
といった潜在因子が読み取れます。
まとめ
- 因子分析は「多変量データの背後にある潜在因子」を推定する手法
- 実務ではアンケート、画像特徴、売上など幅広いデータで活用される
- Python(factor_analyzer)で簡単に実装可能
多変量データの奥に潜む潜在因子を知りたいときは、ぜひ因子分析を試してみてください!
