ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

主成分得分与因子得分:计算逻辑、应用边界与常见误区

主成分得分与因子得分:计算逻辑、应用边界与常见误区 主成分得分和因子得分这两个词放在一起几乎就是多元统计里最容易被混用的组合。我见过不少资历不错的数据分析同学嘴上说着“我做了个主成分回归”手里的结果却是SPSS因子分析菜单里保存的回归法因子得分也见过论文里把“因子得分”写成“主成分得分”评审一问就说不清原理。上个月帮人审一篇硕士学位论文就是因为把这两类得分的计算方式写反了整章实证结论全部推倒重来。这篇博文就是想把这些年实操中积累的认知讲清楚两类得分各自的来源、计算路径、应用边界以及最容易被忽视的坑。无论你是要构建综合评价指数、做聚类特征输入还是准备写方法章节都值得把这两个概念彻底掰开揉碎。1. 先搞清楚底层模型为什么得分会被混用1.1 主成分分析与因子分析的逻辑起点不同很多人把主成分分析PCA和因子分析FA当成同一种方法的两个按钮其实它们的建模哲学差了十万八千里。主成分分析的出发点是“信息的压缩与重构”。它把所有观测变量做线性变换寻找一个新坐标轴方向使数据在这个方向上的投影方差最大化。这个方向就是第一主成分它贪婪地抓住了原始数据中尽可能多的变异信息。接下来的第二主成分在与第一主成分正交的约束下继续找最大方差方向。整个过程中没有任何关于“潜在结构”的假设纯粹是对数据协方差矩阵做特征分解本质是一种矩阵运算。因子分析则走的是另一条路。它的模型假设是观测变量背后的相关性是由少数几个不可观测的潜在变量公因子引起的。每个变量都可以拆成公共因子和特殊因子的叠加X A·F U其中A是载荷矩阵F是公因子U是特殊因子。因子分析的目标不是最大程度保留方差而是最好地解释变量之间的相关结构。它天然带着“因果”或“潜在变量”的影子。这两套模型的差异导致了核心输出物的差异。主成分是观测变量的精确线性组合你在知道特征向量的那一刻就能算出每个样本的主成分得分而且这个得分是唯一确定的。因子得分则不同——公因子本身从未被直接观测到你手里的只是载荷矩阵和相关矩阵要反过来推断每个样本在潜在因子上的位置这是一个估计问题估计方法不同结果就不一样。1.2 得分塌缩到操作层面时就容易混落到日常操作中大家最常用到的都是“那排得分数字”。PCA降维后存下来的坐标叫主成分得分因子分析做旋转后再保存的变量叫因子得分。如果只是在软件里勾选“保存为变量”输出的都是一列数值字段标签一改谁也分不清背后是什么。麻烦就麻烦在这。两者在很多场景下都能“构建综合指标”排序结果经常高度相关于是不少人得出结论差不多混着用吧。但真要到了需要解释权重含义、处理后续回归、或者做稳健性检验的时候二者细节上的差异就会被放大。我后面会用一个具体例子展示同样的三个变量主成分得分和因子得分的权重分布可能截然不同。2. 得分背后的计算路径一个算一个估2.1 主成分得分是“组合”出来的主成分得分可以从数学上直接写死。设原始变量标准化后为z1, z2, …, zp相关系数矩阵R的特征向量为v1, v2, …, vp则第j个主成分的得分为Yj v1j·z1 v2j·z2 … vpj·zp这里的vj就是R的特征向量它代表了新坐标系的方向。这一组权重是被特征分解唯一确定的没有任何自由参数。标准化后的主成分得分均值为0方差正好等于对应的特征值λj。如果想要方差为1的主成分得分只需要把上式再除以sqrt(λj)。理解这个计算逻辑的一个关键点是特征向量和“载荷”不是一回事。很多人在解读SPSS输出的“成分矩阵”时直接把里面的载荷数字当权重用这是常见的误解。成分矩阵的数值等于特征向量乘以特征值的平方根也就是主成分与原始变量的相关系数可以解释变量与主成分之间的关系强度而真正用来还原主成分得分的权重是特征向量本身。2.2 因子得分是“估计”出来的因子分析模型是X A·F UF是潜在的公因子。你需要根据X的值来推测F的值。单从矩阵角度解是F A·R?¹·X这看起来和主成分得分的线性组合形式差不多但在统计含义上完全是两回事。因子得分不是直接计算得到的唯一解而是通过某种准则估计出来的“最佳猜测”。最常用的估计有三种回归法Regression method假设因子得分与真实因子的回归关系通过最小化预测误差的期望平方和来得到得分系数矩阵。它的特点是得分与真实因子之间的相关性最大但得分会被拉向均值方差小于1而且不同因子得分之间存在一定相关性。Bartlett法从最小二乘的思想出发考虑特殊因子方差的异质性使得分的估计更有效率。由此得到的因子得分是无偏的适合后续用于进一步的模型分析。Anderson-Rubin法在Bartlett法的基础上做进一步约束保证调整后的因子得分均值是0、方差是1而且不同因子之间相互独立。如果你的后续分析是回归或多变量统计这通常是更安全的选择。正是因为存在多种估计准则同样的数据换一个估计方法因子得分的排序就可能微调这是它和主成分得分最本质的区别一个不需要“估计”另一个整个过程都是“估计”。2.3 旋转是另一个分水岭因子分析中常见的旋转操作进一步拉大了它和主成分分析的距离。主成分分析一般不旋转因为旋转会破坏主成分方差最大化和正交性的原始性质。因子分析却经常要旋转常见的有方差最大化正交旋转和最优斜交旋转。旋转的目的是让载荷矩阵结构更清晰便于解释公因子的实际含义——比如把题项和因子的对应关系呈现得更干净。旋转带来的直接后果是因子得分系数会变。同一个因子模型不旋转和旋转后保存出来的因子得分数值完全不同。而主成分得分没有这个“自由度”。这一点也提醒我们在做论文复现或者方法审查时一定要写明是否旋转、用什么旋转、用什么得分估计法否则结果无法复现。2.4 一个三变量小例子的数字推演为了把上面的差异落到实处我用一个简化例子演示。假设有三个标准化后的变量X1、X2、X3代表企业的盈利能力、运营效率和偿债能力相关系数矩阵如下X1X2X3X11.000.700.55X20.701.000.75X30.550.751.00对这个相关矩阵做特征分解特征值约为λ12.23λ20.53λ30.24。第一特征向量约为v1[0.58, 0.62, 0.53]那么第一主成分得分就是PC1 0.58·z1 0.62·z2 0.53·z3三个变量在这个得分中的权重比较均匀因为它关心的是从三个指标中抓取“共同变异”哪个变量都与整体高度相关所以权重就比较接近。如果在同一个数据上跑单因子分析单公因子的载荷矩阵大约为A[0.87, 0.93, 0.79]。用回归法计算因子得分系数代入公式F X·R?¹·A算出来的系数大约为[0.42, 0.50, 0.19]。也就是说因子得分的公式近似为F 0.42·z1 0.50·z2 0.19·z3注意到没有X3在主成分得分里的权重是0.53在因子得分里只剩下0.19权重结构出现了明显的“分化”。原因在于X2和X3相关性很高回归法因子得分会考虑变量之间的冗余信息把重叠的那部分方差归因于更核心的变量于是X3的独立贡献就被压缩了。这个例子直观地说明两类得分看似都在做“加权求和”但权重背后的逻辑完全不同。3. 实操主成分得分的完整计算流程3.1 数据预处理是关键中的关键主成分分析对尺度极其敏感。如果变量单位不同比如一个变量是收入万元、另一个是利润率百分比直接用协方差矩阵做主成分特征向量会集中在方差大的变量上你得到的主成分得分基本就是“那个大数变量的投影”其他变量形同虚设。所以我一般建议当变量量纲不同或者数值尺度差异较大时必须使用标准化后的变量也就是基于相关系数矩阵做特征分解。只有一种情况可以跳过标准化——所有变量的量纲和数量级本来就一致比如同一套量表的多个题项这时候协方差矩阵和相关系数矩阵的分析结果才可能接近。在代码实现层面标准化这一步要自己显式完成不要默认软件替你做了。princomp()这类老函数默认用的是协方差矩阵如果不指定corTRUE它就按协方差来算而SPSS的因子分析菜单里面抽取方式默认就是相关矩阵。这个差异经常导致两个软件输出对不上。3.2 特征值、累计贡献率与主成分个数确定主成分得分实际使用时很少把全部主成分都保留下来。最常用的经验法则是保留特征值大于1的主成分其次是看累计方差贡献率达到80%左右。这两个准则在南北方都通行但千万不能盲信。我的习惯是同时看碎石图和特征值大小再结合实际业务把每个主成分的故事讲一遍。如果一个主成分特征值大于1但商业含义说不通我倾向于降低维度如果两个主成分特征值相差不多业务上又必须二选一我会再看载荷分布再定。特征值大于1的准则在变量数较多时容易保留过多主成分这点要特别留意。下表是我常用的主成分保留决策参考判断依据做法注意事项特征值大于1保留λ1的主成分变量越多越容易高估个数累计贡献率达到80%附近结合业务解释力综合判断碎石图取拐点前的主成分拐点不明显时辅助其他准则可解释性检查每个主成分的载荷含义无法解释时宁可少保留3.3 从特征向量到得分的运算演示在Python中最常用的是sklearn.decomposition.PCA。它的核心要义是fit_transform之后的输出就是主成分得分。但要注意PCA类内部会做中心化默认不标准化变量如果你输入的是原始量纲数据得到的得分和基于相关矩阵做出来的结果完全不同。所以实操里我习惯先用StandardScaler标准化再喂给PCA。from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA import pandas as pd # 假设df里有三个列X1, X2, X3 X df[[X1, X2, X3]] # 标准化 scaler StandardScaler() X_std scaler.fit_transform(X) # 做PCA保留2个主成分 pca PCA(n_components2) scores pca.fit_transform(X_std) # 把主成分得分存回数据框 df[PC1] scores[:, 0] df[PC2] scores[:, 1] # 查看特征向量即得分权重 print(pca.components_)pca.components_输出的是一个2×3的矩阵每一行对应一个主成分的特征向量。比如第一行是[0.58, 0.62, 0.53]那么PC1就是0.58乘以标准化后的X1、0.62乘以标准化后的X2、0.53乘以标准化后的X3之和。这里有个细节容易踩雷sklearn的PCA分数是以特征向量为权重得到的原始主成分得分特点是方差递减第一主成分的方差最大但整体尺度不一定等于传统统计软件输出的主成分得分。SPSS和R中princomp()输出的主成分得分方差正好等于特征值而sklearn输出的分数方差也等于特征值在n_components小于变量数时与特征值成比例如果你在论文里直接报告软件计算的得分建议说明使用的计算途径避免审稿人追问。3.4 SPSS操作中的主成分得分获取SPSS没有独立的主成分分析菜单它把PCA藏在因子分析菜单里。操作路径是分析 → 降维 → 因子分析在“抽取”方法里选“主成分”在“得分”里勾选“保存为变量”。此时SPSS保存出来的变量本质上就是主成分得分但很多人在这时候已经分不清自己到底做的是哪一个了。建议的做法是输出结果后先看一眼“成分得分系数矩阵”这个矩阵才是真正的主成分得分权重。如果矩阵里的数值和成分矩阵不同别慌这正是上面说的特征向量与载荷的区别。牢记一件事成分得分系数矩阵是拿来算分的成分矩阵是拿来解释主成分含义的二者不可混用。4. 实操因子得分的估计方法与场景选择4.1 因子分析的标准流程回顾一个完整可复现的因子分析流程通常会走这几步先做KMO检验和Bartlett球形检验判断数据是否适合做因子分析然后指定提取公因子的方法常见的有主成分法、主轴法、最大似然法接着确定因子个数此时同样可以看特征值、累积方差、碎石图随后进行旋转让因子结构更清晰最后保存因子得分用于后续分析。因子得分的估计方法选择在整个流程中属于最后一环但往往被研究者在报告中忽略。我看到很多论文写了“采用因子分析法提取公司治理指数”方法描述却只有一行字没提是用什么方法估计的得分也没提旋转方式。这种模糊的描述在复现时基本等于没有方法。4.2 三种得分估计法的适用边界回归法在SPSS中默认使用也在实际应用中最常见。它的优点是得分与真实因子的相关最大适合做因子解释和结构的描述性研究缺点是得分存在向均值收缩的倾向方差偏小。如果你只是解释维度或排序问题不大但如果要做后续回归可能会低估关系强度。Bartlett法的核心优势是无偏。它假设你知道特殊因子的方差用加权最小二乘的思路对因子得分进行估计。有些研究者喜欢用它来做与财务指标相关的进一步统计分析因为得分不收缩系数解释更可信。不过Bartlett法计算出的得分并不保证不同因子之间完全正交需要留意。Anderson-Rubin法是最“严格”的一种它对得分进行了变换保证不同因子之间均值0、方差1且互不相关。这种得分非常适合作为聚类分析、回归分析、判别分析的输入因为它避免了多重共线性。代价是计算逻辑稍微复杂部分软件版本不直接支持。三种方法没有绝对的好坏只有适不适合当前的分析目的。我做一个选择的时候判断句式很直接如果后续要跑回归优先Bartlett或Anderson-Rubin如果只是描述和可视化用回归法就够了。4.3 软件实现与输出解读以Python的factor_analyzer库为例一个标准的因子得分计算可以是from factor_analyzer import FactorAnalyzer # 假设X_std是标准化后的数据 fa FactorAnalyzer(n_factors2, rotationvarimax, methodml) fa.fit(X_std) # 获取因子得分method可选regression、bartlett等 scores fa.transform(X_std, methodregression) df[F1] scores[:, 0] df[F2] scores[:, 1] # 查看旋转后的载荷 print(fa.loadings_)在SPSS中在“得分”选项里勾选“保存为变量”后可以从“方法”下拉框选择回归、Bartlett或Anderson-Rubin。保存出来的变量默认命名类似FAC1_1、FAC2_1。拿到变量后建议立即检查“因子得分协方差矩阵”——如果接近单位矩阵说明得分之间的正交性维持得不错如果不是说明你选的方法产生了因子得分之间的相关后面做回归时要格外小心。4.4 因子得分用于综合评级时的注意事项我见过不少人直接用因子得分作为“综合得分”对样本排序。这种做法不是不能用但有很多隐藏问题。如果因子分析选择了斜交旋转公因子之间本身存在相关直接用因子得分的简单平均或者加总作为综合分就存在逻辑上的重复计算。更稳妥的做法是采用结构方程风格让因子之间按相关性被建模或者改用主成分分析来构建综合得分。因子得分更适合用于“维度剖面分析”比如把样本分成几个类型比较不同类型在不同因子上的得分高低而不是简单地压成一个综合分。5. 不同业务场景下该选哪种得分5.1 综合评价与指数构建场景在“企业绩效评价”“城市综合实力排名”这类场景中核心诉求是把多维指标压缩成一个可排序的指数。这个目标其实和主成分分析的“方差最大化”非常契合。主成分得分天然按方差贡献排序第一主成分往往就是一个强力的综合指标后面的主成分则代表不同的维度。我通常的做法是用第一主成分或者按特征值加权后的多个主成分构建综合得分然后只看排序不看绝对数值。因子得分也能做类似的事但在指数构建这件事上因子得分因为存在估计误差和收缩问题指数稳定性通常略逊于主成分得分。这也是为什么综测排名类文章中PCA出现频率远高于FA的原因。5.2 聚类分析与样本细分场景如果打算对样本做聚类得分的用途是降维和去噪。此时得分应该是紧凑、低相关的特征变量Anderson-Rubin因子得分就是非常理想的输入。实测下来在样本量不大、变量相关性较高时使用Anderson-Rubin因子得分做聚类效果比直接使用原始变量聚类要干净也因为去掉了特殊因子噪声簇的形状更规整。主成分得分也可以用于聚类但要注意标准化后的主成分得分方差递减某些K-means算法对尺度敏感你需要在聚类前对主成分得分再做一次标准化或者明确告诉算法各维度方差特征不同。5.3 回归分析与因果推断场景这是两类得分差异最“致命”的场景。主成分回归是经典的处理多重共线性的手段。把原始变量替换为主成分得分后做回归系数可以通过特征向量映射回原始变量域解释起来仍然清晰。整个流程没有估计误差问题因为主成分得分是精确的变换。因子得分做自变量时要注意它本身是估计值带着测量误差。回归分析中如果自变量存在测量误差会导致回归系数向零压缩也就是衰减偏误。很多论文在这个地方不自觉地使用了因子得分做回归又没有报告测量误差修正得出来的系数其实是偏保守的。如果你想获得稳定结论可以考虑Bartlett法并在论文中补充说明测量误差影响。5.4 量表和心理学应用场景在心理测量、顾客满意度分析这类领域核心诉求是分离潜在特质而不是压缩变量。这时候因子分析几乎是不二选择。潜变量的概念本身就对应因子模型里的公因子因子得分也更有理论支撑。主成分得分在这里只能作为一个简化近似它的数学含义是“保留方差最大”不保证“提取出最纯粹的潜在特质”。如果后续要做信度分析、验证性因子分析甚至是结构方程模型那么标准的做法是直接用结构方程框架来估计潜在因子得分而不是从探索性因子分析里保存出来的一列数值。这一点很多新手掉过坑先EFA保存因子得分再丢进SEM里跑路径结果理论依据和统计口径都存在问题。6. 常见问题与实战排查技巧6.1 得分的方向反了主成分得分和因子得分的符号都不是固定的。特征向量和载荷矩阵的正负号本身具有任意性你这次跑出来第一主成分和X1正相关下一次数据稍微变化可能就变成负相关业务意义直接翻转。解决办法很简单第一步先看载荷和得分与核心业务变量的相关方向第二步如果需要手动对得分乘以负一使符号符合业务直觉。这个过程不是篡改数据而是消除特征分解的符号不确定性。论文写作时建议说明“得分方向已根据业务逻辑调整”。6.2 分数不唯一结果对不上同一份数据用R和SPSS算出来的因子得分数值对不上不一定是算错了很可能是用了不同的得分估计方法和旋转方式。比如R中psych包的fa()默认可能使用主轴估计而SPSS默认是主成分法起点不同结果自然不同。排查思路是先统一提取方法再统一旋转方法最后统一得分估计方法。我一般会保存一个分析配置清单里面至少包含标准化方式、相关矩阵/协方差矩阵、因子提取方法、旋转方式、得分估计方法。这样无论谁拿到都能复现。6.3 样本量不足导致得分不稳定因子分析对样本量的要求并不只有“越大越好”那么简单。经验上样本量至少是变量数的5到10倍且绝对数量最好不低于100。样本量太小时相关矩阵的估计方差很大载荷、特征向量、得分都会跟着抖动。这也是为什么同一批变量换一批样本得分排名就会大变的一个潜在原因。如果你遇到样本量受限的难题可以尝试用主轴法替代最大似然法它对小样本、低相关的数据适应更好。但无论怎么换都要在报告中明确样本量限制。6.4 得分的方差“对不上手册”很多人在检查输出结果时会发现保存出来的主成分得分方差并不等于对应的特征值。这通常不是错误而是不同的软件对得分做了额外标准化。SPSS的因子分析保存变量时会默认输出标准化得分也就是方差为1的形式而sklearn输出的是原始主成分得分方差和特征值挂钩。建议在报告前手动计算一次得分的均值和方差确认理解当前软件的输出约定。下表是实操中高频遇到问题的速查现象可能原因排查顺序得分与业务逻辑方向相反特征向量符号翻转检查载荷方向必要时乘-1R和SPSS结果不一致提取或旋转方式不同逐项统一方法配置因子得分存在较高相关使用回归法且斜交旋转改用Anderson-Rubin法主成分得分方差异常软件做了标准化检查得分的均值和方差变量量纲不同结果失真使用协方差矩阵分析改用相关矩阵并标准化数据6.5 一个额外提醒不要把“提取方法”当成“方法名称”SPSS的因子分析菜单里“方法”下拉框中有一个选项叫“主成分”。那其实是因子分析框架内的一种因子提取方法并不完全等于独立的PCA。很多教程用它做PCA结果分析框架仍然是因子分析的输出结构比如会输出KMO检验这在正统PCA中是不应该出现的。如果你把“SPSS因子分析菜单里选主成分方法”当成了“PCA”那最终保存的得分其实是因子框架下按主成分法提取因子后保存的因子得分而不是数学意义上的主成分得分。这个区别很绕但在严谨的论文方法描述中必须写清楚。我这几年实际操作中养成的习惯是用Python或R直接做主成分得分用SPSS做因子分析两边各司其职。主成分得分就是纯粹的线性组合看特征向量和贡献率因子得分则要仔细交代估计方法和旋转方式。遇到结论敏感或者投稿要用的结果我会额外换一种得分方法做稳健性检验看排序和结论方向是否改变。数据不会说话是分析者的每一步选择在替它发声。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进