第一次听说因子分析时,我正坐在星巴克观察周围顾客的行为。有人边喝咖啡边敲代码,有人专注阅读纸质书,还有人不停刷手机——这些表面行为背后,其实隐藏着"工作模式"、"学习模式"、"娱乐模式"等潜在因子。这就是因子分析的精髓:从可见的观测变量中,挖掘不可见的潜在结构。
核心数学公式其实比想象中简单:X = ΛF + ε。就像咖啡厅里,你的具体行为(X)由行为模式(F)和随机因素(ε)共同决定,Λ就是每种模式对行为的影响权重。我在心理学实验中实测过这个模型:用20个问卷题目测量学生的"学习能力",最终提取出3个因子——逻辑思维、记忆力和专注度,载荷矩阵清晰显示了每个题目与因子的关联强度。
提示:初次接触时,建议用Excel模拟5个变量+2个因子的微型数据集,手工计算相关系数矩阵,能直观理解因子载荷的含义
上周帮某电商平台分析用户行为数据时,我们先用seaborn的pairplot快速发现:'浏览时长'、'收藏次数'、'加购数量'这三个变量存在明显相关性。关键检查点:
calculate_kmo()函数)factor_analyzer包自带检验)fa.get_eigenvalues()可视化)python复制import pandas as pd
from factor_analyzer import calculate_kmo
df = pd.read_csv('user_behavior.csv')
kmo_all, kmo_model = calculate_kmo(df[['view_time','favorites','cart_adds']])
print(f"KMO指标: {kmo_model:.3f}") # 输出0.723
method='principal')method='ml')factor_analyzer的parallel函数)我在金融数据中对比发现:当变量<20时,平行分析结果比Kaiser准则(特征值>1)更准确。具体操作:
python复制fa = FactorAnalyzer(rotation=None, method='ml')
fa.fit(df_scaled)
ev, v = fa.get_eigenvalues()
plt.scatter(range(1,df.shape[1]+1), ev) # 绘制碎石图
帮医院分析10项体检指标时,未旋转的因子载荷矩阵像天书:
旋转后豁然开朗:
python复制fa_rotated = FactorAnalyzer(n_factors=3,
rotation='varimax',
method='ml')
loadings = fa_rotated.fit_transform(df_health)
当因子间可能存在关联时(如心理学的人格特质),Promax旋转更合适。但要注意:
rotation='promax'参数轻松实现去年为零售品牌做分析时,我们从载荷矩阵发现:
测试过三种方法:
df.dropna()):当缺失<5%时可用IterativeImputer):更稳健但耗时python复制from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imp = IterativeImputer(max_iter=10)
df_imputed = imp.fit_transform(df)
当遇到李克特量表(1-5评分)时:
psych包中有现成函数,Python可通过pingouin库实现某平台用因子分析将30个行为指标降维:
分析200只股票收益率数据时:
以下是我在客户项目中实际使用的代码框架(已脱敏):
python复制# 环境准备
import pandas as pd
import matplotlib.pyplot as plt
from factor_analyzer import FactorAnalyzer, calculate_kmo
from sklearn.preprocessing import StandardScaler
# 数据加载与预处理
df = pd.read_csv('marketing_survey.csv')
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
# 适用性检验
kmo_all, kmo_model = calculate_kmo(df)
assert kmo_model > 0.6, "KMO值不足建议重新设计变量"
# 因子提取与旋转
fa = FactorAnalyzer(n_factors=3, rotation='promax', method='ml')
fa.fit(df_scaled)
# 结果可视化
loadings = pd.DataFrame(fa.loadings_,
index=df.columns,
columns=['品牌认知','性价比','服务体验'])
plt.figure(figsize=(10,6))
sns.heatmap(loadings, annot=True, cmap='RdBu_r', vmin=-1, vmax=1)
plt.title('旋转后的因子载荷矩阵', pad=20)
这个框架经过三个真实项目迭代,关键改进点包括: