SPSS主成分分析全流程:标准化、得分排序与避坑校验
简介:面向数理统计课程学生与数据分析初学者的SPSS主成分分析大作业案例,围绕2019年15个省市九项经济指标的降维评价展开,可用于完成课程作业、理解主成分分析流程或复现综合排名。压缩包内仅含1个doc文档,约821KB,以完整实验报告形式组织,涵盖研究背景、数据来源、主成分原理、SPSS标准化与因子分析操作、KMO和巴特利球形检验、总方差解释及结果解读,并配有相应图表。已有2017人学习。读者可据此掌握从指标选取、适用性检验、主成分提取到得分计算的完整思路,也能参考其报告结构、图表呈现和结论写法,适合作为SPSS主成分分析作业模板与案例学习材料。
1. 一份能直接落地的SPSS主成分分析:15个样本地区、9项指标、2个主成分
期末周前后,总有人拿着 Excel 里九列经济指标来问:十五个样本地区、九项指标,直接排名说不清谁强谁弱,指标之间还高度相关,SPSS 主成分分析到底该怎么一步步做出来。这份大作业资源干的就是这件事——用数学降维的思路,把地区生产总值、人均地区生产总值、农林牧渔总产值、规模以上企业总资产、第三产业增加值、失业人员、固定资产投资增长率、社会消费品零售总额、地方财政收入这九项指标,压成两三个互不相关的综合变量,再按方差贡献率加权算出综合得分 F,给样本地区排序。它适合三类人:数理统计课程要交一份完整可复现的成品作业;实证论文需要一个能解释清楚的降维结果;数据分析岗想搞清楚 SPSS 因子分析界面里那些勾选项到底在算什么。整套流程从数据标准化一路做到排序出表,中间还有一段手算权重系数的环节,恰恰是最容易翻车的地方。
2. 主成分分析的数学骨架:标准化、相关系数矩阵与特征值分解
2.1 九项指标量纲差三个数量级,不标准化第一主成分只会被 GDP 绑架
先把九项指标的原始量纲摆出来看,问题就很清楚了。地区生产总值是万亿元级别,人均地区生产总值是万元/人,失业人员是万人,固定资产投资增长率干脆是个百分数。这些数字放在同一个矩阵里做方差分解,方差大的变量天然占据主导,第一主成分的载荷会被那几个绝对值大的指标吃满,后面的小量纲指标基本等于没参与。常见做法是先做 Z-score 标准化,公式是Z_ij = (x_ij - x̄_j) / s_j,其中x̄_j是第 j 项指标在 15 个样本上的均值,s_j是样本标准差。标准化之后每个变量的均值是 0、标准差是 1,九项指标在方差这个维度上被拉到同一起跑线,谁也别想靠量纲占便宜。
SPSS 里对应的操作路径是【分析】→【描述统计】→【描述】,把九个原始变量全部放进右侧"变量"框,勾上左下角"将标准化得分另存为变量(Z)",确定之后数据视图里会多出九列Z开头的变量。这一步的输出里还有一张描述统计表,给出每个变量的最小值、最大值、均值和标准差,从标准差那一列的相对大小能直接看出哪个指标在 15 个样本间的离散程度最大——离散程度大的指标,在后续主成分里更容易拿到高载荷,这是后面解读结果时的重要参照。
这里有个很多人绕不过去的细节:SPSS 的【分析】→【降维】→【因子】对话框里,"分析"那一栏默认选的就是"相关性矩阵",也就是说即便你不手动标准化,SPSS 内部也会先把原始变量转成相关系数矩阵再提取,等价于做了一次标准化。那手工标准化还有什么意义?两个作用。一是作业和论文里需要展示"我确实处理了量纲",过程可追溯;二是标准化后的 Z 变量是后面手算主成分得分 F1、F2 的直接输入,不先存成变量,到计算那一步还得回头补。所以我一般会坚持先标准化、再进因子分析,宁可多一步,也不在复现时给自己留坑。
注意:如果用了"协方差矩阵"而不是"相关性矩阵"作为分析入口,标准化就变成必须项,否则结果会被大量纲变量完全主导。两种入口的数值结果在标准化前提下才等价。
2.2 相关系数矩阵与 KMO:先确认数据"够不够格"做降维
主成分分析不是拿什么数据都能跑的,它的前提是变量之间存在足够的相关性——九个指标如果彼此八竿子打不着,降维就失去了合并信息的基础。所以第二步是看相关系数矩阵,SPSS 因子分析对话框点【描述】,在"相关性矩阵"里勾上"系数",输出里会有一张 9×9 的表格,对角线是 1,其余格子是两两相关系数。判断标准很朴素:大量格子落在 0.3 以下,说明变量之间接近正交,硬做降维得到的主成分解释不了什么;出现成片的 0.7 以上,说明有信息重叠,降维有戏。这份作业的九项指标里,地区生产总值、社会消费品零售总额、第三产业增加值、地方财政收入这几项之间相关系数普遍偏高,它们本质上都在刻画"经济体量",这正是第一主成分能吸收掉大半方差的原因。
光看相关系数矩阵还不够,得有一个整体性的检验指标,SPSS 在同一面板里勾上"KMO 和巴特利球形度检验"就能拿到。KMO 统计量取值在 0 到 1 之间,衡量的是变量间的简单相关与偏相关之比,越接近 1 说明公共因子能解释的方差占比越高、降维越合适。经验阈值是这样的:0.9 以上极好,0.8 到 0.9 良好,0.7 到 0.8 中等,0.6 到 0.7 勉强,0.5 以下就不建议再做因子分析了,得回头检查指标设计或者更换方法。巴特利球形度检验看最后一行的 P 值,原假设是"相关系数矩阵为单位阵",P 小于 0.05 就拒绝原假设,说明变量间确实存在相关结构。
两个指标要合起来看,不能只看一个。KMO 高但球形检验不显著的情况很少见,反过来球形检验显著、KMO 却只有 0.4 出头的情况倒是常见——样本量够大时球形检验几乎必然显著,但 KMO 低说明相关结构并不适合做降维。这时候硬着头皮往下跑,出来的主成分载荷会非常分散,每个变量在每根主成分上都摊一点,解释起来全是玄学。我见过不止一次有人跳过这一步直接点确定,最后拿着一堆没法命名的成分矩阵来问怎么办,返工成本比一开始多花两分钟看 KMO 高得多。
2.3 特征值、贡献率与碎石图:主成分到底留几个
相关系数矩阵算出来之后,对矩阵做特征值分解,得到九个特征值 λ1 到 λ9 和对应的特征向量。特征值的大小代表对应主成分所解释的方差,因为用的是相关矩阵,九个特征值之和恒等于变量个数 9,所以第 k 个主成分的方差贡献率就是λk / 9,前 p 个主成分的累计贡献率就是Σλk / 9(k 从 1 到 p)。SPSS 输出的"总方差解释"表里,第二列是特征值,第三列是单个贡献率,第四列是累计贡献率,三列对着看就行。
留几个主成分,行业里有两条常用线。第一条是 Kaiser 准则,保留特征值大于 1 的主成分,逻辑是每个原始变量标准化后方差为 1,主成分解释的方差还不如单个变量多就没必要留。这条线在变量数不多的时候比较稳,变量数超过 20 之后容易保留过多成分。第二条是累计贡献率线,一般要求前 p 个主成分累计解释 85% 以上的方差,社会科学里也有放宽到 80% 的做法。这份作业九项指标跑出来的结果是:第一主成分特征值占 58.970%,第二主成分占 25.524%,两者累计 84.494%,SPSS 默认按特征值大于 1 提取,正好留下这两个,累计贡献率贴着 85% 这条线。
84.494% 这个数字值得多说两句。它没有达到严格的 85%,但已经非常接近,而且第三个主成分的特征值已经掉到 1 以下、对累计贡献率的边际提升很小,这种情况下保留两个主成分是合理的。如果有人死抠 85% 硬留三个,第三个主成分往往只能解释 7% 到 8% 的方差,载荷还分散在几个不相关的指标上,解释成本远大于收益。碎石图在这个时候是一个直观的辅助判断:横轴是成分序号,纵轴是特征值,前两个点陡峭下降,从第三个点开始曲线走平形成"肘部",肘部左侧就是要保留的成分。这份作业的碎石图在成分 3 处明显折平,和特征值准则给出的答案一致,两条线互相印证,结论比较硬。
提示:主成分个数一旦定下来,后面所有的权重计算、得分合成都要围绕这个 p 展开。中途改主意换个数,前面手算的系数全部作废,所以这一步要一次定死。
3. SPSS全流程实操:从数据导入到综合得分F排序
3.1 数据录入与标准化变量生成
原始数据是 15 行 9 列,行是样本地区,列是九项指标。录入时建议把变量名统一成英文短名,中文变量名在 SPSS Syntax 和后续计算变量表达式里容易出编码问题,尤其跨机器复现时更明显。常用的一套映射如下表,变量名和含义一一对应,后面所有对话框和语句都用这套名字。
| 原始指标 | 变量名 | 常见量级 |
|---|---|---|
| 地区生产总值 | GDP | 万亿元 |
| 人均地区生产总值 | PGDP | 万元/人 |
| 农林牧渔总产值 | AGRI | 千亿元 |
| 规模以上企业总资产 | ASSET | 千亿元 |
| 第三产业增加值 | TERI | 千亿元 |
| 失业人员 | UNEMP | 万人 |
| 固定资产投资增长率 | FIXINV | % |
| 社会消费品零售总额 | RETAIL | 千亿元 |
| 地方财政收入 | FISCAL | 千亿元 |
数据结构设成"变量在列、样本在行",缺失值不要用 0 填充,直接留空,后面在因子分析的【选项】里把缺失值处理设成"成列排除个案",SPSS 会自动按变量对做删除,不会因为一个空格子把整行样本丢掉。录入完成后先存一份原始数据备份,再另存一份分析用的副本,标准化变量生成在副本上做,原始数据任何时候都能回滚。
标准化这一步用对话框操作就行,但如果想留一份可复现的记录,用 Syntax 更稳。下面这段可以直接粘进 SPSS 的语法编辑器运行,/SAVE子命令负责把 Z 变量写回数据集:
* 对九项原始指标做描述统计,并把标准化得分存为新变量. DESCRIPTIVES VARIABLES=GDP PGDP AGRI ASSET TERI UNEMP FIXINV RETAIL FISCAL /SAVE /STATISTICS=MEAN STDDEV MIN MAX./SAVE不带参数时默认按 Z 分数保存,生成ZGDP、ZPGDP一直到ZFISCAL九列。/STATISTICS后面跟的四个关键字分别对应均值、标准差、最小值、最大值,输出里那张描述统计表就是靠它拉出来的。跑完之后回到数据视图,确认新变量列名和数量都对,再往下走。这一步的意义不只是消除量纲,更是把"每个样本在每项指标上偏离均值多少个标准差"这件事显式地存下来,后面手算主成分得分时直接引用这些 Z 变量,不用再回头查原始值。
3.2 因子分析对话框五个面板的填法
进入【分析】→【降维】→【因子】,把九个 Z 变量移进右侧变量框。接下来五个按钮面板依次填,顺序和逻辑对应如下。
第一个是【描述】面板。统计量里勾"初始解",相关性矩阵里勾"系数"和"KMO 和巴特利球形度检验"。初始解给出每个变量的公因子方差,也就是该变量被所有主成分共同解释的比例,1 减去它就是特殊方差;系数和 KMO 就是 2.2 节讲的那两张诊断表。这一面板的作用是"先体检再开刀",别跳过。
第二个是【提取】面板。方法选"主成分",分析选"相关性矩阵",输出勾"未旋转因子解"和"碎石图",提取依据选"基于特征值"、阈值保持默认的 1。这一面板决定了主成分怎么算出来、留几个。特别要强调"未旋转因子解"必须勾,因为后面算权重系数用的是未旋转的成分矩阵,如果只输出旋转后的解,手算那一步就没有原始载荷可用。
第三个是【旋转】面板。方法选"最大方差法",输出勾"旋转后的解"。旋转不改变模型对数据的拟合程度,只是把载荷矩阵做一个正交变换,让每个变量在更少的成分上有高载荷、更容易命名。它主要服务于"解释主成分含义"这个目的,不服务于"计算综合得分"。这一点在避坑章还会展开。
第四个是【得分】面板。勾"显示因子得分系数矩阵",同时建议勾上"保存为变量"里的回归法得分。前者给出的是标准化的得分系数,后者是 SPSS 直接算好的 FAC1_1、FAC2_1 两列,两者可以用来互相验算,后面第 6 章会用到。
第五个是【选项】面板。缺失值选"成列排除个案",系数显示格式选"按大小排序"。按大小排序会让成分矩阵里每根主成分的载荷从大到小排列,肉眼扫一遍就知道哪些指标主导了这根成分,比乱序的矩阵好读太多。
这五个面板填完点确定,输出窗口会一次性吐出相关系数矩阵、KMO 检验、公因子方差、总方差解释、碎石图、成分矩阵、旋转后的成分矩阵、成分得分系数矩阵这一整套。把这份输出另存为独立的查看器文件,和数据集放同一个目录,复现时对得上。
如果想把整套流程固化成一句话就能重跑的脚本,可以用下面这段 Syntax,参数和上面五个面板一一对应:
* 主成分提取:相关矩阵入口,Kaiser 准则,不旋转,保存回归得分. FACTOR /VARIABLES=ZGDP ZPGDP ZAGRI ZASSET ZTERI ZUNEMP ZFIXINV ZRETAIL ZFISCAL /MISSING=LISTWISE /PRINT=INITIAL CORRELATION KMO EXTRACTION /CRITERIA=MINEIGEN(1) ITERATE(25) /EXTRACTION=PC /ROTATION=NOROTATE /SAVE=REG(all) /METHOD=CORRELATION./CRITERIA=MINEIGEN(1)就是"特征值大于 1",ITERATE(25)是迭代上限,主成分提取其实不需要迭代,保留默认值即可。/ROTATION=NOROTATE明确关掉旋转,保证成分矩阵是未旋转的原始载荷。/SAVE=REG(all)保存全部主成分的回归得分。这段跑完,再用ROTATION=VARIMAX单独跑一次拿旋转解做解释,两份输出互不干扰。
3.3 成分矩阵转权重系数:a1、a2 怎么手算
到了这一步,SPSS 已经给出了两根主成分的载荷,但载荷本身不是权重,不能直接拿去乘标准化变量。正确的换算关系是:第 k 个主成分在第 j 个变量上的系数,等于该变量在成分矩阵里的载荷除以第 k 个主成分特征值的算术平方根,即a_kj = v_kj / sqrt(λk)。这个式子的来源是特征向量的单位化——成分矩阵里的载荷是"变量与主成分的相关系数",乘上主成分标准差(也就是 sqrt(λk))才是原始尺度下的贡献,反过来除就得到单位特征向量分量。
具体操作是把成分矩阵的两列载荷复制到一个新数据集里,定义成v1、v2两个变量,样本行对应九个指标。然后从"总方差解释"表第二列读出两根主成分的特征值,本例按贡献率反推:九变量相关矩阵特征值总和为 9,第一主成分 58.970% 对应 λ1≈5.307,第二主成分 25.524% 对应 λ2≈2.297。数值以实际输出表为准,下面代码里的数字只是占位,跑之前先替换成自己表里的值。
* 步骤一:填入从"总方差解释"表读到的特征值. COMPUTE lambda1 = 5.307. COMPUTE lambda2 = 2.297. EXECUTE. * 步骤二:载荷除以特征值开方,得到单位特征向量分量. COMPUTE a1 = v1 / SQRT(lambda1). COMPUTE a2 = v2 / SQRT(lambda2). EXECUTE. * 步骤三:核对每个主成分的系数平方和是否接近 1. COMPUTE check1 = a1 * a1. COMPUTE check2 = a2 * a2. EXECUTE.SQRT(lambda1)就是特征值的开方,a1、a2是两根主成分各自对应的九个系数。步骤三那个平方和自检很关键,主成分的性质要求每根成分的系数平方和等于 1,跑完用【分析】→【描述统计】对check1求和,结果在 1.000 附近才算算对。如果算出来是 0.85 或者 1.2,八成是特征值填错了行,或者把旋转后的载荷当成未旋转载荷用了。
系数算好之后,回到主数据集,用【转换】→【计算变量】把九项 Z 变量按系数加权求和,得到 F1 和 F2。九个变量乘九个系数再相加,手写表达式容易漏项,建议按指标顺序编号,写完对着清单核一遍。F1 对应第一主成分,F2 对应第二主成分,两列都是标准化尺度上的得分,均值为 0,有正有负,负值不代表经济差,只代表低于 15 个样本的平均水平。
3.4 综合得分F合成与排序出表
有了 F1、F2 和各自的方差贡献率,综合得分按加权平均合成,公式是F = (w1*F1 + w2*F2) / (w1 + w2),其中 w1、w2 是前两根主成分的方差贡献率,本例分别是 58.970 和 25.524,分母是累计贡献率 84.494。用累计贡献率做分母而不是用 100,是因为被舍弃的那部分主成分方差不再参与评价,只在前 p 个主成分内部做归一化,这样算出来的 F 才是这 p 个维度上的加权平均。
* 综合得分:按方差贡献率加权,分母用累计贡献率. COMPUTE F = (58.970 * F1 + 25.524 * F2) / 84.494. EXECUTE. * 按综合得分降序排,方便直接出排名表. SORT CASES BY F (D).第一行里三个数字都要和"总方差解释"表严格对应,贡献率抄错一位,整个排名就会变形。第二行SORT CASES BY F (D)里的(D)表示降序,SPSS 默认是升序,不加这个括号排出来的就是倒数第一在最上面,很容易看反。排完序之后可以用【数据】→【个案排秩】生成一列排名变量,或者直接在 Excel 里拉一个序号列,报告里一般要求"地区—F1—F2—F—排名"五列并排,方便读者对照。
输出阶段要注意一件事:SPSS 的查看器里 F1、F2、F 这些计算变量不会自动出现在报表里,得在【分析】→【报告】或者直接复制数据视图的对应列到表格软件里排版。九项原始指标、两列主成分得分、一列综合得分、一列排名,加上表头和单位说明,就是一整套能直接进论文的结果表。原始数据、Z 变量、F1/F2/F 三列建议分三个 sheet 存,别人拿到文件能一眼看清哪一步产出了什么。
4. 结果怎么读:成分矩阵载荷、碎石图拐点与综合得分校验
4.1 成分矩阵的载荷怎么翻译成人话
未旋转的成分矩阵是一张九行两列的载荷表,每一格是某个指标与某根主成分的相关系数,取值在 -1 到 1 之间。读法是按列读、按绝对值排序:先看第一列,绝对值大的那几个指标就是第一主成分的主要构成;再看第二列,找出在第一主成分上载荷不高、但在第二主成分上载荷突出的指标。这份作业的结果是,地区生产总值、社会消费品零售总额、第三产业增加值、规模以上企业总资产、地方财政收入、固定资产投资增长率在第一主成分上载荷较高,人均地区生产总值、失业人员、农林牧渔总产值在第二主成分上载荷较高。
翻译成业务语言,第一主成分基本就是"经济体量与市场规模"的综合代理,六项指标全都在描述一个地区的总量盘子有多大;第二主成分更像是"发展水平与产业结构"的代理,人均产出高、农业占比形态不同、失业规模不同,这三项刻画的是结构而不是总量。命名这件事没有标准答案,但必须满足两个约束:一是名字能覆盖该成分上所有高载荷指标的共同点,二是不能和另一根成分的含义重叠。如果两根成分都叫"经济水平",那降维就白做了。
载荷的正负号也要看。同一根主成分上,如果两项指标载荷一正一负且绝对值都大,说明它们在样本间的变化方向相反,解读时要把这层反向关系说出来。第二主成分上失业人员的载荷符号如果和其他指标相反,很可能是指标方向没做正向化处理导致的,这一点在第 5 章会单独拆开讲。
4.2 碎石图肘部与累计贡献率怎么对齐
碎石图的横轴是成分序号 1 到 9,纵轴是特征值。判读方法就一句:找曲线从陡峭转向平缓的那个拐点,拐点左侧的成分保留。本例前两个点从高位快速下落,第三个点之后基本贴着横轴走,肘部落在成分 2 和成分 3 之间,所以保留两个。这条结论要和"总方差解释"表对齐看:前两个成分累计 84.494%,第三个成分的特征值已经小于 1,两个判据指向同一个答案,结论才稳。
碎石图容易看错的地方是把"平缓段"当成还有信息。曲线尾部的特征值都在 0.5 以下,对应主成分解释的方差不到单个变量的一半,这种成分即便保留下来,载荷也会散落在互不相关的指标上,既解释不了业务,又会把综合得分的权重稀释掉。另一种误判是只看碎石图不看累计贡献率,图上肘部明显但前两个成分累计只有 60% 出头,这时候要么增加样本量,要么承认这两根成分只能覆盖六成信息,在报告里明确写出局限,不能假装 84% 那样报。
提示:碎石图的纵轴刻度 SPSS 默认自动缩放,两次分析的图看起来陡峭程度可能不一样,比较时以特征值数值为准,不要只凭视觉印象判断拐点。
4.3 综合得分排序的合理性校验
排名表出来之后不要直接交,先做三组校验。第一组是量级校验:F 的均值应该接近 0(因为 F1、F2 都是标准化得分加权,权重之和为 1),如果均值明显偏离 0,说明权重分母用错了。第二组是极值校验:排在第一和最后的样本,回去看它们的原始九项指标,第一名是不是在多数总量指标上都靠前、最后一名是不是在多数指标上都靠后。如果出现"总量指标全垫底但综合得分排第一"这种反常,基本可以断定某根主成分的系数符号反了。
第三组是交叉校验:把 F1、F2 单独排名,和综合得分 F 的排名对照。如果某个样本 F1 排前三、F2 排倒数第三,而 F 排在中游,这是正常的——加权平均本来就会把两个维度的极端值拉回中间,解读时要说明它是"总量强、结构弱"的类型,而不是简单说它"经济中等"。反过来,如果 F1、F2 排名都靠前、F 却掉到中游,那就是权重或者分母算错了,回去查 3.4 节那行公式。
这三组校验花不了十分钟,但能挡掉绝大多数低级错误。我带过的作业里,排名反常的案例十有八九不是数据问题,而是 F1、F2 的表达式漏了某一项,或者综合得分公式里把累计贡献率写成了 100。校验的本质是给结果找一个独立于计算过程的参照系,光盯着 SPSS 输出窗口是发现不了符号错误的。
5. 避坑与排查:5个把主成分分析做废的高频翻车点
5.1 KMO卡在0.4还硬点确定
现象:KMO 输出 0.4 出头,球形检验 P 值小于 0.05,觉得"显著了就说明能做",直接往下提取,最后成分矩阵里每个变量在两根主成分上的载荷都在 0.4 到 0.6 之间,命名根本没法起。
原因:球形检验的原假设是相关矩阵为单位阵,样本量一大会轻易拒绝,它只能证明"存在相关",不能证明"相关结构适合降维"。KMO 才是衡量公共方差占比的指标,0.5 以下意味着变量间的共同成分不足以支撑合并。
解决:KMO 低于 0.5 时先回头查指标设计,看是不是混进了方向相反或者量纲完全不同的变量;把明显离群的指标剔除后重跑;仍然上不去就换方法,比如对指标先做聚类再挑代表变量,或者改用偏最小二乘。不要靠删样本硬把 KMO 凑上去,那是另一种意义上的数据操纵。
5.2 原始变量不标准化直接进因子分析
现象:分析入口选了"协方差矩阵",九个原始变量直接进模型,输出的总方差解释表里第一主成分贡献率高达 99%,成分矩阵里只有地区生产总值一个变量载荷接近 1,其余全是 0.0x。
原因:协方差矩阵保留量纲,方差大的变量独占第一主成分,这不是降维,是把最大量纲的变量单独拎出来。
解决:要么把"分析"改成"相关性矩阵"(等价于内部标准化),要么先做 Z-score 再进模型。两种做法选一种,不要混用。判断有没有踩这个坑,看第一主成分贡献率是否异常高、第二主成分是否几乎为零,这两个特征同时出现基本可以确诊。
5.3 用旋转后的载荷算权重,贡献率对不上
现象:手算系数时用的是旋转后的成分矩阵,算出来的 F1、F2 平方和自检不过,综合得分排名和未旋转版本差别很大,方差贡献率也没法对应到具体某一根成分。
原因:最大方差旋转是正交变换,旋转后各成分的方差会被重新分配,SPSS 输出的"旋转载荷平方和"那一列数值已经变了,而"总方差解释"表里前两行的初始特征值还是未旋转的,两套数字对不上。主成分得分系数必须从未旋转的载荷推。
解决:算权重一律用"成分矩阵"(未旋转),旋转后的矩阵只用于命名和解释。如果 Syntax 里写了ROTATION=VARIMAX,记得再补一段ROTATION=NOROTATE单独产出未旋转解,两套输出分开存。
5.4 综合得分公式的分母写成100
现象:F 的均值明显不为 0,整体偏小,排名顺序没错但数值大小和论文里其他表格对不上。
原因:综合得分是前 p 个主成分的加权平均,分母应该是这 p 个成分的累计贡献率,不是 100。用 100 做分母相当于把被舍弃成分的方差也摊进来,等于默认剩下的 15% 信息也有贡献,实际上那部分已经被丢掉了。
解决:公式写成F = (w1*F1 + w2*F2) / (w1 + w2),分母用累计贡献率。本例就是 84.494。改完之后 F 的均值应该回到 0 附近,可以作为自检依据。
5.5 逆向指标没正向化,失业人员越多得分越高
现象:综合得分排名里,某个失业人员数量明显偏高的样本反而排在前列,回去看第二主成分的载荷,失业人员那一格是正号。
原因:失业人员是逆向指标,数值越大代表经济状况越差,但在主成分分析里,所有指标默认被当成同向处理,谁的数值大谁就在该成分上拿正分。不做正向化,这根主成分的经济含义就是反的。
解决:建模前对逆向指标做正向化,常用做法是取倒数1/x或者取相反数-x,也可以先取倒数再做标准化。正向化之后重新跑一遍全流程,第二主成分的载荷符号会翻转,排名随之修正。这一步在指标清单确定时就要标出来,不要等到排名反常了才回头找。
6. 用Python复算一遍:SPSS主成分结果的交叉验证与报告出表
SPSS 的输出是黑匣子式的,点完确定只给你结果,中间过程看不到。要确认手算的权重没出错,最省事的办法是用 Python 把特征值分解重跑一遍,两边对齐。核心就三行:对标准化后的矩阵求相关矩阵,对相关矩阵求特征值和特征向量,把特征值按降序排列后和 SPSS 的"总方差解释"表逐行比对。
import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler df = pd.read_csv("econ_2019.csv") # 15 行 9 列,列名为九项指标 cols = ["GDP","PGDP","AGRI","ASSET","TERI","UNEMP","FIXINV","RETAIL","FISCAL"] X = StandardScaler().fit_transform(df[cols]) # 与 SPSS 的 Z 变量等价 R = np.corrcoef(X.T) # 相关系数矩阵,9x9 vals, vecs = np.linalg.eigh(R) # 对称矩阵,用 eigh 更稳 idx = np.argsort(vals)[::-1] # 特征值降序 vals, vecs = vals[idx], vecs[:, idx] print("特征值:", np.round(vals, 3)) print("贡献率:", np.round(vals / vals.sum() * 100, 3)) print("累计贡献率:", np.round(np.cumsum(vals) / vals.sum() * 100, 3))StandardScaler用的是总体标准差(ddof=0),SPSS 的 DESCRIPTIVES 用的也是总体标准差,两边口径一致,所以 Z 矩阵能对得上。np.linalg.eigh专门针对对称矩阵,比eig数值更稳定,特征向量符号可能有正负差异,但绝对值应该和 SPSS 的成分矩阵完全一致。贡献率那一行跑出来,前两个数应该贴着 58.970 和 25.524,第三个以后的累计值也要和"总方差解释"表逐格对齐,差 0.01 以内都算正常舍入。
第二段验证是得分。Python 里主成分得分可以按X @ vecs[:, :2]算,也可以直接用 SPSS 保存的 FAC1_1、FAC2_1 两列对照。这里有个细节:SPSS 的回归法得分和手工"载荷除以 sqrt(特征值)再乘 Z 变量"在正交主成分模型下数值一致,如果不一致,多半是特征向量符号反了,把 Python 结果的对应列乘 -1 再比。这一步能同时验证 3.3 节的手算系数和 3.4 节的综合得分,一处出错两处对不上,排查范围立刻缩小。
| 校验项 | SPSS 来源 | Python 来源 | 允许偏差 |
|---|---|---|---|
| 前两个特征值 | 总方差解释表第二列 | vals[:2] | 0.01 |
| 前两个贡献率 | 总方差解释表第三列 | vals[:2]/9*100 | 0.01 |
| 载荷矩阵 | 成分矩阵 | vecs[:, :2] * sqrt(vals[:2]) | 0.01,符号可反 |
| 综合得分 | 计算变量 F | X @ vecs[:, :2] @ w | 0.001 |
表里最后一行w是按贡献率归一化后的权重向量,实现时把vals[:2]/vals[:2].sum()代进去就行。四行校验全过,基本可以确定 SPSS 那边没有漏项、没有用错矩阵、没有符号错误。
血泪经验是这么来的:早几年交出去的一份分析,SPSS 里 F1、F2 的表达式漏掉了农林牧渔总产值那一项,排名看起来"差不多对",直到用 Python 复算才发现综合得分和回归法得分对不上,回头补了一项,前三名直接换位。从那以后我每次做完主成分分析,都强制走一遍"特征值—载荷—得分"三段交叉验证,哪怕数据只有十几行也不省这一步。这套流程和这份作业的资源放在一起,改改数据就能直接用,希望帮到你。
本文还有配套的精品资源,点击获取