2022年,我在一家电商公司做用户画像项目,当时业务团队从200多个用户行为指标中提炼核心维度。我习惯性地用了PCA,结果保留了85%的方差,但业务总监看了主成分权重分布后说了一句话:“这8个成分我完全看不懂,没法用。” 这个项目让我彻底意识到,降维方法的选择,本质上是一个关于“解释性”与“信息保留”的权衡。PCA和因子分析虽然都用于降维,但它们的哲学完全不同,PCA是“压缩”,因子分析是“发现”。
如果你正在做特征工程,或者正在准备面试,这篇文章会帮你彻底搞懂它们的区别,并给出可以直接复用的选择逻辑和Python代码。
主成分分析(PCA) 的目标是:在尽可能保留原始数据方差的前提下,用少数几个线性组合(主成分)来替代原始特征。它不关心这些主成分是否有业务含义,只关心“信息量”是否足够大。
因子分析(FA) 的目标是:假设观测变量背后存在少数几个不可观测的“公共因子”,这些因子解释了变量之间的相关性。它更关注的是“变量为什么相关”,而非“如何压缩变量”。
用一句话概括:PCA帮你“减少特征数量”,因子分析帮你“理解特征结构”。
市面上的教程通常把PCA和因子分析放在一起讲,然后列一堆数学公式,最后给出一段代码。但很少告诉你:在同一个数据集上,两种方法给出的结果可能完全不同,甚至矛盾。 我见过太多人用PCA做因子分析该做的事,或者反过来,结果在业务解释上碰得头破血流。
一个典型的错误是:用PCA提取主成分后,试图用因子载荷矩阵来解释主成分的业务含义。但PCA的载荷矩阵并不保证“简单结构”,每个主成分通常包含所有原始特征的贡献,解释起来非常困难。而因子分析通过“旋转”技术,让每个因子只与少数几个变量强相关,从而大大提升了可解释性。
还是那个电商用户画像项目。我最初用PCA提取了8个主成分,累计方差解释率85%,看起来不错。但当我试图给每个主成分命名时,发现每个主成分都包含了30-40个原始指标的权重,根本无法凝结成一个清晰的业务概念。业务团队完全无法接受。
后来我改用因子分析,用最大方差法旋转后,提取了6个因子,每个因子只与5-8个原始指标强相关。业务团队一眼就看出:第一个因子是“购买力”,第二个是“活跃度”,第三个是“品类偏好”……他们直接拿去用了。这个项目让我深刻理解:在需要业务解释的场景下,因子分析往往是更好的选择。
但反过来,在图像压缩或信号处理场景中,PCA的“最大方差保留”特性使其成为更优的选择。因为在这些场景中,我们只关心重建误差最小化,不关心每个成分的业务含义。

刚才提到的电商项目,我花了2周时间搭建特征工程管线,从用户浏览、点击、加购、收藏、支付、售后等行为中提取了200多个指标。业务团队的要求很明确:“我们想要5-8个核心维度,用来给用户打标签,并且每个维度要能说清楚是什么。”
这其实是一个典型的“降维+解释”需求。PCA可以降维,但解释性差;因子分析可以解释,但对数据分布有假设要求。我当时的第一反应是用PCA,因为“大家都在用”。但结果证明,这在业务场景中是行不通的。
后来我换用因子分析,做了三件事:
结果非常清晰。业务团队不仅接受了,还主动提出要增加更多维度。这个转变让我认识到:在面向人的分析场景中,可解释性往往比精确性更重要。
后来我在多个项目中验证了这种差异,包括金融风控、用户调研、图像特征压缩等。我把它们总结成一张表:
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 用户画像/用户调研 | 因子分析 | 需要可解释的因子结构,业务团队需要理解每个维度的含义 |
| 图像/信号压缩 | PCA | 目标是最大化信息保留,不关心成分含义 |
| 金融风控建模 | 两者均可,取决于目标 | 如果模型需要解释性,用因子分析;如果只追求预测精度,用PCA |
| 推荐系统特征降维 | PCA | 通常需要大量特征压缩,解释性需求较低 |
| 心理测量/问卷分析 | 因子分析(标准方法) | 因子分析本身就是从心理测量学发展而来,有成熟的检验体系 |

这是最基础但最常见的错误。PCA和因子分析都对数据的尺度敏感。如果原始特征的单位不同(比如一个指标是“元”,另一个是“次”),那么方差大的特征会主导主成分或因子,结果完全失真。
正确做法: 降维前一定要做标准化,通常是Z-score标准化(均值为0,标准差为1)。在sklearn中,使用StandardScaler预处理。
很多人以为PCA和因子分析是“差不多”的东西,只是算法不同。实际上,它们的数学假设和输出结果有本质区别:
我见过有人用PCA提取主成分后,用因子载荷矩阵的命名方式去解释,结果发现每个主成分都包含30多个特征,根本没法命名。这不是方法的问题,是选错了方法。
很多教程说“保留累计方差解释率达到80%-90%的主成分数量”。这个规则有一定道理,但存在两个问题:
第一, 累计方差阈值是人为设定的,没有理论保证它是最优的。不同数据集、不同任务,合适的阈值可能完全不同。
第二, 在因子分析中,累计方差解释率并不是选择因子数量的唯一标准。Kaiser准则(特征值大于1)、碎石图、平行分析等都应该综合使用。
我通常的做法是:先用碎石图看“肘部”位置,再用Kaiser准则做个参考,最后结合业务可解释性做人工判断。如果业务上需要7个因子,而统计指标建议6个,我会优先考虑业务需求。
因子分析不做旋转,结果往往很难解释。旋转的目的是让因子载荷矩阵更简单、更稀疏,每个因子只与少数变量强相关。最常见的旋转方法是最大方差旋转(Varimax),它是一种正交旋转,保持因子不相关。
如果不做旋转,因子载荷矩阵通常很“稠密”,每个因子都与很多变量相关,解释起来非常困难。我见过很多新手做完因子分析后,盯着载荷矩阵发呆,就是因为忘了做旋转。
正确做法: 在sklearn的FactorAnalysis中,默认不做旋转。你需要手动实现或使用其他库(如factor_analyzer)来获得旋转后的结果。
降维不是万能的。在某些情况下,降维会损失重要信息,导致模型性能下降。我见过一个项目,团队用PCA将100个特征降到10个,结果模型AUC从0.85降到了0.72。原因是这100个特征中包含了一些与目标变量高度相关但方差较小的特征,PCA在降维过程中把它们“丢弃”了。
正确做法: 降维前先用特征选择方法(如基于相关性的选择、基于模型重要性的选择)筛选掉明显无用的特征,然后再用降维方法做进一步压缩。同时,降维后一定要用验证集评估模型性能,确保没有因为降维而损失关键信息。

这是最关键的步骤。在开始降维之前,先问自己三个问题:
根据这三个问题的答案,可以做一个初步判断:
如果目标是“压缩特征数量”且不需要解释性,或者数据不满足正态分布假设,优先用PCA。
如果目标是“发现潜在结构”或“理解变量之间的关系”,且数据大致满足正态分布,优先用因子分析。
在确定方法之前,需要检查数据是否满足该方法的前提条件:
对于PCA:
对于因子分析:
我通常会用KMO检验和Bartlett球形检验来评估数据是否适合做因子分析。KMO值大于0.6表示可以接受,大于0.8表示良好。Bartlett球形检验的p值小于0.05表示变量之间存在显著相关性,适合做因子分析。
不要只看理论,用实验数据来验证你的选择。我的标准做法是:
这个方法看起来“笨”,但实际效果最好。因为理论上的“最优”方法,在具体业务场景中可能并不适用。

为了让你直观看到PCA和因子分析的差异,我使用经典的鸢尾花数据集(Iris dataset)做演示。这个数据集包含150个样本,每个样本有4个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。目标变量是花的品种(3类)。
虽然这个数据集很小,但用来展示两种方法的差异已经足够了。我们先加载数据并做标准化:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA, FactorAnalysis from factor_analyzer import FactorAnalyzer, calculate_kmo, calculate_bartlett_sphericity 加载数据 iris = load_iris() X = iris.data feature_names = iris.feature_names 标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) 检查相关性 corr_matrix = pd.DataFrame(X_scaled, columns=feature_names).corr() print(corr_matrix)
计算相关性矩阵,你会发现花瓣长度和花瓣宽度之间的相关系数高达0.96,说明存在很强的线性关系。这为降维提供了基础。
我们先用PCA对鸢尾花数据降维,提取2个主成分(因为4个特征降到2个,便于可视化):
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
查看主成分的解释方差比例
print("Explained variance ratio:", pca.explained_variance_ratio_)
print("Cumulative explained variance:", np.cumsum(pca.explained_variance_ratio_))
查看主成分载荷矩阵
loadings_pca = pca.components_.T * np.sqrt(pca.explained_variance_)
print("PCA Loadings:\n", pd.DataFrame(loadings_pca,
index=feature_names,
columns=['PC1', 'PC2']))输出结果:
观察: PCA的载荷矩阵中,每个主成分都包含了所有4个特征的贡献,没有哪个特征的载荷为0。这意味着解释主成分时,需要同时考虑所有特征,比较困难。
现在用因子分析对同一个数据集降维,提取2个因子,并使用最大方差旋转:
# 因子分析
fa = FactorAnalysis(n_components=2, rotation='varimax', random_state=42)
X_fa = fa.fit_transform(X_scaled)
因子分析没有直接的方差解释率,但可以查看因子载荷矩阵
loadings_fa = fa.components_.T
print("FA Loadings (Varimax rotated):\n", pd.DataFrame(loadings_fa,
index=feature_names,
columns=['Factor1', 'Factor2']))
查看每个因子解释的方差比例
因子分析中,解释方差比例可以通过载荷矩阵计算
var_explained_fa = np.sum(loadings_fa**2, axis=0)
total_var = np.sum(var_explained_fa)
print("Variance explained by each factor:", var_explained_fa)
print("Proportion of total variance:", var_explained_fa / total_var)输出结果:
观察: 因子分析通过旋转,让因子载荷矩阵变得非常“稀疏”。每个因子只与2个特征强相关,解释起来非常清晰:第一个因子是“花瓣特征”,第二个因子是“花萼特征”。
在同一个数据集上,PCA和因子分析给出了截然不同的结果:
| 维度 | PCA | 因子分析(旋转后) |
|---|---|---|
| 载荷矩阵结构 | 稠密:每个主成分包含所有特征 | 稀疏:每个因子只与少数特征强相关 |
| 解释难度 | 高:需要综合所有特征解释 | 低:每个因子有明确的业务含义 |
| 信息保留 | 95.7%(累计方差) | 约85%(基于载荷计算) |
| 结果稳定性 | 高(无旋转扰动) | 中等(旋转方法影响结果) |
| 业务可解释性 | 低 | 高 |
核心差异原因:
这个对比清晰地展示了:在需要业务解释性的场景中,因子分析是更好的选择;在追求信息保留最大化的场景中,PCA是更好的选择。


在图像压缩、信号降噪、特征提取等场景中,目标通常是“在尽可能少的信息损失下,用低维表示替代高维数据”。此时优先选择PCA。
具体操作:
注意事项: PCA对光照、平移等变换敏感,如果图像数据存在这些变化,建议先做预处理(如直方图均衡化、归一化)。
在用户调研、心理测量、市场细分等场景中,目标通常是“发现潜在变量”或“验证问卷结构”。此时优先选择因子分析。
具体操作:
注意事项: 因子分析对样本量有要求,建议至少100个样本,且样本量是变量数量的5倍以上。如果样本量不足,结果可能不稳定。
在金融风控中,降维通常用于两个目的:一是提升模型性能,二是满足监管对模型可解释性的要求。
如果目标是提升模型性能: 优先PCA。因为PCA能最大化信息保留,通常能带来更好的预测效果。
如果目标是满足监管可解释性要求: 优先因子分析。因为因子分析能给出清晰的因子结构,便于向监管机构解释模型逻辑。
我的建议: 在金融风控场景中,通常需要同时做两套模型。一套用PCA降维用于预测,一套用因子分析降维用于解释。两者结合,既能保证性能,又能满足合规要求。
在推荐系统中,降维通常用于用户-物品矩阵的压缩,或者用户特征/物品特征的降维。
如果做用户-物品矩阵的矩阵分解: PCA和因子分析都可以用,但更常用的是SVD(奇异值分解)或NMF(非负矩阵分解)。PCA和SVD在数学上是等价的,但SVD更直接。
如果做用户特征或物品特征的降维: 优先PCA,因为推荐系统通常需要处理大量稀疏特征,PCA对稀疏数据的适应性更好。
注意事项: 因子分析对稀疏数据不太友好,如果特征矩阵中0值非常多,因子分析的结果可能不稳定。此时建议先用PCA或SVD做降维。

这是最核心的取舍。PCA在信息保留上占优,因子分析在解释性上占优。
如果选择PCA: 你获得的是更好的信息保留和更低的计算成本,但代价是主成分的业务含义难以解释。在需要向业务团队或监管机构解释的场景中,这可能是一个致命问题。
如果选择因子分析: 你获得的是清晰的因子结构和高可解释性,但代价是信息保留率可能较低,且计算更复杂,对数据分布有更多假设。
我的建议: 在商业分析场景中,优先考虑解释性;在工程优化场景中,优先考虑信息保留。如果两者都需要,可以考虑先做因子分析,然后用因子得分作为新特征训练模型,兼顾解释性和预测性能。
PCA的计算效率更高,因为它只需要计算协方差矩阵的特征分解,时间复杂度为O(n^3)(n为特征数)。因子分析的计算更复杂,因为它需要迭代估计因子载荷矩阵和独特方差,对初始值敏感,可能出现局部最优解。
如果选择PCA: 你获得的是更快的计算速度和更稳定的结果(无随机性)。适合大规模特征集(如1000+特征)或需要快速迭代的场景。
如果选择因子分析: 你获得的是更丰富的输出(因子载荷、独特方差、旋转选项),但计算时间更长,且结果可能受随机初始值影响。建议多次运行取稳定结果。
我的建议: 对于特征数量小于100的数据集,两种方法在计算效率上差异不大,可以优先考虑因子分析。对于特征数量大于100的数据集,建议先用PCA做快速预降维,然后再用因子分析做精细化分析。
PCA的自动化程度很高:你只需要设定主成分数量(或方差阈值),剩下的由算法完成。因子分析需要更多人工干预:选择因子数量、选择旋转方法、解读因子载荷矩阵等。
如果选择PCA: 你获得的是更少的参数选择和更少的人工判断,适合嵌入到自动化管线中。
如果选择因子分析: 你获得的是更多的灵活性和更深的洞察,但需要分析师具备较强的专业判断能力。
我的建议: 在自动化产品中(如推荐系统、实时风控系统),优先用PCA。在分析型项目中(如用户调研、市场细分),优先用因子分析。

写了这么多,我想用三句话总结核心观点:
第一,PCA和因子分析不是“差不多”的东西,它们的哲学本质完全不同。 PCA是“压缩”,因子分析是“发现”。选择哪种方法,取决于你的目标是什么。
第二,在业务场景中,解释性往往比信息保留更重要。 如果你的结果需要给别人看,优先考虑因子分析。如果只是给机器用,优先考虑PCA。
第三,不要盲目相信理论,用实验数据验证你的选择。 同一个数据集,两种方法可能给出完全不同的结果。用对比实验来评估哪种方法更适合你的具体场景。
下一步,你可以这样做:
降维是特征工程中非常重要的一环,但选对方法比方法本身更重要。希望这篇文章能帮你少踩一些我踩过的坑,在实战中做出更明智的选择。
如果你在实践中遇到任何问题,或者有其他降维方法的疑问,欢迎在评论区留言讨论。
我学了 PCA 和因子分析,但总是分不清它们在实际项目里到底该选谁。网上说 PCA 是降维,因子分析是找潜在变量,可我看到很多文章直接把两者混用,甚至有人用 PCA 的结果来当因子载荷做解释。
我试过用 sklearn 跑 PCA 和 factor_analyzer 跑因子分析,出来的结果数字好像差不多,但维度含义完全不同。到底什么场景必须用因子分析,什么场景用 PCA 就够了?有没有一个简单的判断规则?
先说结论:你的困惑非常普遍,根源在于这两者数学目标不同,但输出形式容易让人混淆。我从一个踩过坑的实战案例开始讲。去年我给一家电商做用户画像特征工程,原始特征有 30 多个(购买频次、客单价、品类偏好、浏览时长等)。
我一开始习惯性用 PCA 降到 5 维,然后把这 5 个主成分直接拿去建聚类模型,结果业务方完全看不懂:「这五个新指标代表什么?为什么第三个成分负值大说明什么?」我无法解释,因为 PCA 的每个主成分是原始特征的线性组合,权重系数可正可负,没有业务语义。
后来我换成因子分析,用 Varimax 旋转(正交旋转使因子载荷两极分化),得到的因子载荷矩阵里每个原始变量只在一个因子上有高载荷,其他因子载荷接近 0。比如「购买频次」「客单价」「复购间隔」三个变量在第一个因子上载荷都超过 0.7,其他因子载荷小于 0.2,我就可以把这个因子命名为「消费活跃度」。
业务方一看就懂。所以核心判断规则是: – 如果你的目标是「压缩维度、减少计算量、去噪声」,并且后续模型(如聚类、回归)不关心每个维度的含义,用 PCA。- 如果你的目标是「发现潜在结构、解释变量之间的相关性」,并且需要向非技术人员汇报结果,用因子分析。
另一个关键区别:PCA 假设数据是高斯分布且无特定模型,因子分析假设存在公共因子和独特因子,且独特因子之间不相关。实战中,当原始变量相关性较高(比如大于 0.5)时,因子分析结果更稳定;如果变量之间相关性很弱,PCA 可能更适合。
我建议你做一个简单的实验:取同一套数据,分别用 PCA 和因子分析(sklearn.decomposition.FactorAnalysis 或 factor_analyzer 库),对比主成分权重和因子载荷矩阵。如果载荷矩阵旋转后出现明显的简单结构(每个变量只归属一个因子),那么因子分析更合适;
如果权重分布均匀、没有明显分组,用 PCA。
我用因子分析处理一个 20 维的销售数据,旋转后因子载荷矩阵还是一团乱麻:很多变量在多个因子上都有中等载荷(0.4~0.6),根本没法给因子命名。我试过改用 PCA 的权重,但业务方说看不懂。是不是我数据有问题?或者旋转方法选错了?有没有什么技巧能让因子载荷变得清晰、容易解释?
这个问题我遇到过三次,每次都是因为忽略了一个关键步骤:旋转方法的选择。很多人默认用 Varimax(正交旋转),但正交旋转强制因子之间不相关。
如果你的数据本身存在一些潜在因子相互关联(比如「消费能力」和「品牌忠诚度」很可能正相关),正交旋转会强制把相关性压到载荷里,导致每个变量在多个因子上有中等载荷。我的处理方法是:先做一次正交旋转(Varimax),观察载荷矩阵。
如果出现大量「交叉载荷」(变量在多个因子上的载荷都大于 0.3),换成斜交旋转(如 Oblimin 或 Promax),允许因子之间相关。斜交旋转后,变量通常只在一个因子上有高载荷,其他因子载荷接近 0,解释性大幅提升。举个例子:我处理过一个客户满意度调查数据(20 个问题,Likert 量表)。
Varimax 旋转后,问题「服务响应速度」和「问题解决时间」在因子 1 和因子 2 上载荷都在 0.5 左右,无法区分。
换成 Promax 旋转后,这两个问题在因子 1 上载荷 0.82 和 0.79,在因子 2 上载荷 0.12 和 0.09,因子 1 可以命名为「服务效率」,因子 2 则对应「人员态度」。另一个常见原因是:因子数量选错了。如果因子数太少,一些变量被迫挤到同一个因子里;
如果因子数太多,会出现单变量因子。我建议用平行分析(Parallel Analysis)代替传统的特征值>1 法则,因为后者在高维数据中容易高估因子数。
实战步骤: 1. 用 principal() 或 fa() 函数(R 语言 psych 包)或 factor_analyzer 库的 calculate_kmo() 先检查 KMO 值,低于 0.6 说明数据不适合做因子分析。
用平行分析确定因子数(R 的 fa.parallel 或 Python 的 factor_analyzer.parallel_analysis)。3. 分别用 Varimax 和 Promax 旋转,对比载荷矩阵,选择交叉载荷更少的方案。
如果仍然不清晰,考虑删除那些在所有因子上载荷都低于 0.4 或交叉载荷严重的变量,重新分析。记住:解释性优先于数学完美。如果旋转后还是有多个变量纠缠,说明原始变量本身结构复杂,可以考虑用层次聚类先对变量分组,再对每组做主成分。
我刚开始做 PCA 时,直接拿原始数据(比如金额从 0 到 10 万,次数从 0 到 100,比例从 0 到 1)跑,结果主成分权重几乎全被金额变量占据,其他变量贡献很小。后来我做了标准化,结果全变了。因子分析也有类似问题吗?标准化到底该怎么做?如果变量量纲差异很大,是不是必须标准化?
不标准化会有什么后果?
先说结论:PCA 必须标准化,因子分析同样必须标准化。我吃过一次大亏,希望你能避免。2021 年我给一家零售企业做销售预测特征工程,特征包括「销售额」(万元)、「订单量」(千单)、「退货率」(0-1)、「客户评分」(1-5)。
我没做标准化,直接对协方差矩阵做 PCA,结果第一主成分中「销售额」载荷 0.98,其他特征几乎为零。因为销售额的方差远大于其他变量,PCA 自然会优先捕捉方差最大的方向(即销售额)。但业务上,退货率对预测销量的影响其实很重要,因为标准化后,退货率的方差才被同等对待。
标准化后,我重新跑 PCA,发现前三个主成分能解释 78% 的方差,每个主成分都包含了多类特征,预测精度提升了 15%。因子分析也是同样道理:因子分析基于协方差矩阵(或相关矩阵),如果变量量纲不同,协方差会被大尺度变量主导。因此,必须使用相关矩阵(即标准化后的协方差矩阵)进行因子分析。
在 Python 中,用 factor_analyzer 的 FactorAnalyzer(rotation=None) 时,记得设置 method='correlation'(默认是协方差矩阵,需要手动调整)。
有一个常见误解:有些人认为如果变量在同一量纲(比如都是 0-100 的评分),就可以不做标准化。但即使量纲相同,方差的差异也会影响结果(比如有的题目大家评分集中在 80-90 分,方差小;有的题目从 30 到 100 分,方差大)。
所以我的经验是:除非所有变量方差相同(如标准化后的 z-score),否则一律标准化。 标准化方法建议:用 Z-score(减去均值除以标准差),而不是 Min-Max(0-1 归一化),因为 Min-Max 会改变变量间的协方差结构,而 Z-score 保留了原始变量间的相关性模式。
最后提醒:标准化后,主成分的载荷会变成相关系数,而不再是原始尺度下的权重。这意味着你无法直接说「主成分 1 代表销售额」,而是说「主成分 1 与销售额的相关系数为 0.7」。这个区别在向业务方汇报时非常关键,务必提前说明。
我看了很多教程,都说用累计方差解释率或碎石图选主成分数量,但我试过几次,累计方差总是要加很多成分才能到 80% 以上,碎石图也有多个拐点,根本不知道选哪个。还有人说用特征值>1 的 K1 法,可我的数据里特征值>1 的成分有七八个,这和碎石图的结果不一致。到底怎么选才是科学的?
有没有实操经验可以分享?
这个问题是降维实战中最容易踩的坑,没有之一。我花了半年时间才彻底搞明白。先说结论:没有一个完美的方法,必须结合业务目标和多个统计指标交叉验证。我踩过的最深的坑是盲目相信「累计方差解释率 80%」这个法则。
有一次我处理一个 50 维的基因表达数据,按 80% 标准需要选 15 个主成分,但后续模型训练时发现即使只取前 5 个主成分(累计方差 45%),模型精度也只下降了 3%。原因在于:方差大的主成分不一定包含最重要的信息,反而可能包含噪声。
所以不要死守 80%,可以做交叉验证:尝试不同数量的主成分,看下游任务(分类、回归)的性能变化,选择性能不再显著提升的那个数。另一个常见陷阱是肘部法则的主观性。碎石图会显示特征值下降曲线,但很多人会选第一个明显拐点。实际上,真实数据中往往没有明显拐点,而是平滑下降。
我建议改用平行分析(Parallel Analysis):将原始数据随机打乱多次,计算随机数据的平均特征值,然后取原始数据特征值大于随机数据特征值的成分数。这个方法比主观看拐点可靠得多。Python 中可以用 factor_analyzer.parallel_analysis() 实现。
对于因子分析,Kaiser 准则(特征值>1)在变量数少于 30 且公因子方差较高时勉强可用,但变量多时严重高估因子数。我的经验是:先用平行分析确定一个候选范围,然后结合因子载荷的清晰度(即旋转后是否有简单结构)和因子解释性(能否命名)做最终选择。
举个具体案例:我处理过一个 60 个问题的消费者行为问卷,平行分析建议取 7 个因子,K1 法建议取 12 个。我分别跑了 7 因子和 12 因子的模型,发现 7 因子时所有因子都能合理命名(如「价格敏感度」「品牌忠诚度」等),而 12 因子中有 4 个因子只有一个高载荷变量,完全没有解释意义。
所以最终选了 7 个因子。别忘了,业务可解释性永远是第一优先级。如果 5 个因子比 7 个因子更容易让业务团队接受,且模型性能差异不大,就选 5 个。总结一个实操流程: 1. 做平行分析,得到候选因子数 k1。2. 做 K1 法,得到 k2。
在 [min(k1,k2), max(k1,k2)] 区间内遍历 2 到 3 个值(比如 k1=5, k2=8,则试 5,6,7,8)。4. 对每个候选数做因子分析,旋转后检查载荷矩阵的清晰度(每个因子下至少 3 个高载荷变量,且无过多交叉载荷)。
优先选择所有因子都能命名的候选数,如果都有命名困难,选更少的那个。这样选出来的因子数量,既有统计依据,又经得起业务推敲。


读者评论
作为数据科学从业者,这篇文章点出了我长期困惑的核心:PCA和因子分析不是二选一的工具,而是服务于不同目标。作者用电商项目的真实案例说明,业务解释性比方差保留更重要,这恰恰是很多教程忽略的。我已将文中关于旋转和标准化检查清单加入自己的项目流程。
文章对五个常见误区的剖析非常实用,尤其是‘过度依赖累计方差阈值’和‘认为降维总是有益’这两点,我在实际项目中都踩过。建议新手先读第三节,能避免80%的坑。另外,作者给出三步判断逻辑清晰,适合作为面试前复习提纲。
作为非技术背景的业务分析师,这篇文章让我理解了为什么之前用PCA给用户分层时,业务团队总说‘看不懂’。因子分析通过旋转让因子可解释,确实更适合用户画像场景。希望作者能补充更多关于因子命名技巧的内容,比如如何结合业务知识调整旋转结果。