はじめに
年末になりましたね。この時期、アンケート調査やデータ分析の依頼が増えるのを感じます。特に消費者満足度や市場調査といったデータ解析では、「潜在因子」を見つけるカテゴリカル因子分析が重要な役割を果たします。
カテゴリカル因子分析は、アンケートデータのようなカテゴリカルデータを解析する手法で、データの背後に潜む潜在因子(latent factors)を特定するために用いられます。本記事では、この手法の理論的背景を数式とともに説明し、具体例を通じてその実践的な流れを紹介します。
因子分析の数式モデル
因子分析の基本モデルは以下のように表されます。
$$
X = \Lambda F + \epsilon
$$
ここで:
-$X$: $p$-次元の観測変数ベクトル
-$\Lambda$: $p \times m$ 次元の因子負荷行列(観測変数と潜在因子の関係)
-$F$: $m$-次元の潜在因子ベクトル
-$\epsilon$: 誤差項($p$-次元)
観測変数 $X$ は、潜在因子 $F$ と誤差項 $\epsilon$ の線形結合で表されます。
カテゴリカルデータへの拡張
カテゴリカル因子分析では、観測変数 $X$ がカテゴリカルデータであるため、以下のように拡張します。
-
潜在連続変数の仮定:
カテゴリカルデータを連続潜在変数 $Z$ によってモデル化します。$$
Z_{ij} = \lambda_j F_i + \epsilon_{ij}
$$ここで:
-$Z_{ij}$: 個体 $i$ の観測変数 $j$ に対応する連続潜在変数
-$\lambda_j$: 因子負荷量(観測変数 $j$ と因子の関連性)
-$F_i$: 個体 $i$ の潜在因子スコア -
カテゴリカルデータの閾値モデル:
観測変数 $X$ は、潜在変数 $Z$ が閾値を超えた場合に特定のカテゴリを取ります。$$
X_{ij} = c \quad \text{if } \tau_{j,c-1} < Z_{ij} \leq \tau_{j,c}
$$ここで:
-$c$: カテゴリ番号
-$\tau_{j,c}$: 変数 $j$ のカテゴリ $c$ に対応する閾値
因子数の決定
因子数を決定する際には、スクリープロットが役立ちます。これは相関行列の固有値をグラフ化し、「どの因子までが重要か」を視覚的に判断するということです。
-
スクリープロットの描画:
因子分析では、相関行列の固有値を計算し、各因子がデータの分散をどれだけ説明しているかを確認します。固有値を降順にプロットしたものがスクリープロットです。 -
因子数の基準:
- 固有値 > 1: カイザー基準として知られ、固有値が 1 を超える因子が保持されます。
- スクリープロットの折れ曲がり点: プロット上で固有値が急激に減少する点を選びます(エルボー基準)。
以下はスクリープロットのコード例です。
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt
# スクリープロット
fa = FactorAnalyzer(n_factors=5, method="ml", rotation=None)
fa.fit(df)
ev, v = fa.get_eigenvalues()
# 固有値プロット
plt.plot(range(1, len(ev)+1), ev, marker="o")
plt.axhline(y=1, color="r", linestyle="--")
plt.title("スクリープロット")
plt.xlabel("因子数")
plt.ylabel("固有値")
plt.show()
因子負荷量を用いた設問分類
因子負荷量は、各観測変数がどの因子に関連しているかを示す指標です。これを基に設問を分類します。
1. 因子負荷量の基準
一般的に、因子負荷量$\lambda$ の絶対値が 0.4以上 の因子に設問を分類します。
2. 例: 因子負荷行列の解釈
質問項目 | 因子1(価格・品質) | 因子2(サービス体験) |
---|---|---|
商品の価格は妥当だと思いますか? | 0.75 | 0.10 |
商品のデザインに満足していますか? | 0.68 | 0.15 |
商品の品質は期待通りですか? | 0.85 | 0.20 |
商品の購入体験に満足していますか? | 0.25 | 0.70 |
カスタマーサービスは良かったですか? | 0.10 | 0.80 |
この例では、以下の分類が可能です。
-
因子1(価格・品質):
- 「商品の価格は妥当だと思いますか?」 ($\lambda = 0.75$)
- 「商品のデザインに満足していますか?」 ($\lambda = 0.68$)
- 「商品の品質は期待通りですか?」 ($\lambda = 0.85$)
-
因子2(サービス体験):
- 「商品の購入体験に満足していますか?」 ($\lambda = 0.70$)
- 「カスタマーサービスは良かったですか?」 ($\lambda = 0.80$)
3. 二重負荷の処理
一部の設問が複数の因子に高い負荷を持つ場合(例:$\lambda_{11} = 0.45, \lambda_{12} = 0.50$)、最も高い負荷量を持つ因子に分類するか、調査の文脈に応じて判断します。
実験の流れ
1. データ準備
カテゴリカルデータを数値に変換します。
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
# 仮のデータセット
data = {
"価格の妥当性": ["妥当", "高い", "安い", "妥当", "安い", "高い", "妥当", "妥当", "高い", "安い"],
"デザイン満足度": ["満足", "やや満足", "不満", "満足", "やや満足", "不満", "満足", "満足", "やや満足", "不満"],
"品質の期待": ["良い", "普通", "悪い", "良い", "普通", "悪い", "良い", "良い", "普通", "悪い"],
"購入体験": ["満足", "やや満足", "不満", "満足", "やや満足", "不満", "満足", "満足", "やや満足", "不満"],
"カスタマーサービス": ["良い", "普通", "悪い", "良い", "普通", "悪い", "良い", "良い", "普通", "悪い"],
}
df = pd.DataFrame(data)
# エンコード
encoder = LabelEncoder()
for col in df.columns:
df[col] = encoder.fit_transform(df[col])
2. 因子分析と回転
from factor_analyzer import FactorAnalyzer, Rotator
# 因子分析
fa = FactorAnalyzer(n_factors=2, method="ml", rotation=None)
fa.fit(df)
# プロマックス回転
rotator = Rotator(method="promax")
rotated_loadings = rotator.fit_transform(fa.loadings_)
# 結果の表示
print("プロマックス回転後の因子負荷行列:\n", rotated_loadings)
数量化理論
カテゴリカルデータの多変量解析には、「数量化理論」という手法があります。
🐣 この方法は、日本の統計学者 林知己夫先生 が提案したものです!
この理論にはいくつかの分類があり、カテゴリカルデータを効率よく解析するための強力なツールを提供します。特に今回紹介したカテゴリカル因子分析と近いのは数量化 3 類です。これは、カテゴリカルな目的変数を説明するために、カテゴリカルな説明変数を利用する方法です。
一方、数量化 4 類は多次元尺度法 (MDS) を用いて、対象間の類似性を視覚的に表現する手法であり、こちらも非常に有用です。マーケティングや顧客分析などで、ブランドや製品の位置関係をマッピングする際に頻繁に使われています。数量化理論は、質的データを数値化し、解析可能にする日本発の独創的なアプローチとして、現在でも多くの研究者や実務家に活用されています。
数量化理論には他にも「1 類」や「2 類」がありますが、それぞれ異なる解析の目的に対応しています。カテゴリカルデータの解析方法は奥が深く、まだまだ魅力的な手法がたくさんあります。今後、数量化 4 類を含む他の手法についても、機会があればぜひ紹介したいと思います。
おわりに
カテゴリカル因子分析は、カテゴリカルデータの背後に潜む潜在因子を特定し、データを解釈する強力なツールです。今回はスクリープロットを用いて因子数を決定し、因子負荷量に基づいて設問を分類しました。この手法は、マーケティング調査や顧客満足度分析で特に有効です。興味のある方は、実際のデータを用いて試してみてください! では次の記事でお会いしましょう。