SPSS主成分分析全流程:9项经济指标降维到2个主成分与综合得分

发布时间:2026/10/28 11:21:06
SPSS主成分分析全流程:9项经济指标降维到2个主成分与综合得分

简介:面向数理统计与SPSS课程学习者的大作业参考文档,主题为主成分分析在区域经济指标评价中的应用。内容围绕2019年15个省市GDP、人均GDP、农林牧渔总产值、规模以上企业总资产、第三产业增加值、失业人员、固定投资增长率、社会消费品零售总额和地方财政收入等九项指标展开,依次说明数据标准化、相关系数矩阵与KMO和巴特利球形度检验、主成分提取、综合得分计算及结果解读,并配有SPSS操作截图与输出表。压缩包内共1个doc文档,约821KB,结构完整,适合用作课程作业撰写、实验复现与统计分析思路参考。已有2017人学习下载,可帮助读者理解降维流程、判断主成分保留个数,并借鉴经济指标综合评价的写作框架。

1. 从 9 个经济指标压到 2 个主成分:SPSS 菜单里没有“主成分分析”这四个字

SPSS 的菜单里翻不到“主成分分析”,它藏在【分析】→【降维】→【因子】下面,第一次做 spss 数理统计主成分分析作业的人,十有八九卡在这。这份资源处理的是一道典型降维题:15 个样本地区、9 项经济指标(地区生产总值、人均地区生产总值、农林牧渔总产值、规模以上企业总资产、第三产业增加值、失业人员、固定资产投资增速、社会消费品零售总额、地方财政收入),压成 2 个互不相关的主成分,累计解释 84.494% 的方差,再按综合得分 F 排序做地区经济评价。适合正在写多元统计课程作业、需要一套跑得通也解释得通流程的人,也适合按钮点得很熟、但说不清“系数为什么这么算”的从业者。下面按“标准化—检验—提取—加权排序”四步推,坑统一放倒数第二章。数据源是某年度公开统计年鉴,样本地区用代号指代。

2. 标准化这步别省:9 个不同量纲的指标怎么变成可比矩阵

2.1 量纲不统一,第一主成分就被“亿元”绑架

九个指标的尺子完全不同。地区生产总值、社会消费品零售总额、规模以上企业总资产、地方财政收入、第三产业增加值这几个都是千亿量级,失业人员是十万到百万量级,固定资产投资增速干脆是个位数百分比。直接拿原始数据算协方差矩阵,方差最大的那两三个总量指标会吸走绝大部分变异,第一特征向量上它们的系数接近 1、其余接近 0,第一主成分就退化成一个“谁的经济总量大谁赢”的排名,降维的意义没了。

主成分分析对尺度敏感,是因为它做的是方差最大化:谁的方差大,谁说了算。标准化把每一列拉成均值 0、标准差 1,协方差矩阵就等价于相关系数矩阵,九个指标各自在自己的相对位置上比高低,量纲不再参与投票。常见做法是先标准化再分析,用相关矩阵;不走这条路,就得在提取环节选协方差矩阵并接受“总量因子一家独大”的结论,写报告时说不清楚。

标准化的公式是 $z_{ij}=(x_{ij}-\bar{x}_j)/s_j$,关键是 $s_j$ 用样本标准差(除以 n−1)还是总体标准差(除以 n)。SPSS 的描述过程默认给样本标准差。样本量 15 时两者差 $\sqrt{15/14}\approx1.035$,即 3.5% 的量级,对特征值影响不算大,但对“复现别人论文里的数字”这件事足够翻车。血泪经验:数对不上时,第一件事就是看对方除的是 n 还是 n−1。

还有一层常被误读:标准化不是让数据变得“一样”,而是让每个指标只在自己内部比高低。原始数据里人均地区生产总值这一项标准差最大,说明地区间绝对差距最大;标准化之后所有列标准差都是 1,这个差距被抹平了,留下的是相对位次。

2.2 在 SPSS 里点出 Z 分数:一个勾选框和九列新变量

操作路径是【分析】→【描述统计】→【描述】,把九个原始变量全部丢进右侧“变量”框,勾左下角“将标准化得分另存为变量(Z)”,确定。回到数据视图会多出九列,SPSS 自动加 Z 前缀。这一步做完先别急着往下点,翻到输出窗口看描述统计表:N 是否等于 15、均值列是否全为 0、标准差列是否全为 1。对不上说明某列有缺失值被成列排除了,或者某个变量被误设成字符串类型。

变量命名建议提前想好。中文变量名 SPSS 能跑,但写语法、复制成分矩阵、拼 COMPUTE 表达式时,短英文名省事得多。我一般把原始变量命名成 GDP、PGDP、AGRI、ASSET、TERI、UNEMP、FINV、RETAIL、FISC,标准化后自然就是 ZGDP 到 ZFISC,后面手写加权求和时不容易串行。变量名一旦定下就别中途改,改了 Z 列名不跟着变,COMPUTE 会直接报“变量不存在”。

如果原始数据有缺失,描述过程默认按成列排除,Z 分数对应行是空的。后面的因子分析里有一个缺失值选项,必须和这里保持一致,否则两处删掉的样本不是同一批,N 从 15 变成 14 你都未必发现,最后排序结果会莫名其妙差一位。

2.3 用语法把标准化固定下来

按钮点一遍能出结果,但作业要复现、要交给别人跑,就得落成语法。下面这段是标准化加自检的完整写法:

* 对九个原始指标做描述统计,并把标准化值存为 Z 开头的新变量。. DESCRIPTIVES VARIABLES=GDP PGDP AGRI ASSET TERI UNEMP FINV RETAIL FISC /STATISTICS=MEAN STDDEV MIN MAX /SAVE. * 自检:Z 变量的均值应约等于 0,标准差应约等于 1。. DESCRIPTIVES VARIABLES=ZGDP ZPGDP ZAGRI ZASSET ZTERI ZUNEMP ZFINV ZRETAIL ZFISC /STATISTICS=MEAN STDDEV MIN MAX.

第一段里/SAVE后面不跟参数时,默认行为就是把标准化得分另存为变量;/STATISTICS决定输出哪几个描述统计量,只要结果不要描述表就把这一行删掉,但第一次跑建议留着,方便核对样本量。第二段是自检,Z 列的均值和标准差只要偏出 0.001 以上,就说明中间有缺失值或者变量类型不对。

不建议用【转换】→【计算变量】手写(GDP-MEAN(GDP))/SD(GDP),一是均值标准差要手抄,九个变量抄十八个数,错一个全盘皆错;二是跨年数据更新后公式里的常数不会自动变,没人记得回来改。语法文件存成 .sps,数据和脚本放一起,谁拿到都能一键复现,这比截图靠谱得多。

3. KMO 与巴特利特检验:15 个样本还能不能做主成分降维

3.1 相关系数矩阵先看指标有没有“抱团”

降维之前必须回答一个问题:这九个指标之间到底有没有共享信息。答案在相关系数矩阵里,9×9 的下三角表,SPSS 里要在因子分析的【描述】子对话框勾上“系数”才会输出,很多人漏勾,最后只看到一个 KMO 数字,不知道为什么合格或不合格。

看表的方法很朴素:找成组的高相关。地区生产总值、社会消费品零售总额、第三产业增加值、地方财政收入这四个通常彼此 0.8 以上,本质都在度量“经济体量”;人均地区生产总值和失业人员往往是负相关,一个高另一个就低;农林牧渔总产值的相关性结构又和工业、服务业指标不太一样。这种“分簇”正是主成分能压缩的前提——簇内的变量共享一个潜在维度。

反过来,如果整张表绝大多数 |r| 都低于 0.3,说明变量各自为政,硬做主成分只会得到一堆解释不了的成分,第一成分的方差贡献率可能连 30% 都不到。这时候该做的是回头检查指标选取,而不是继续调软件参数。

3.2 KMO 与巴特利特:两条门槛管的是不同的事

KMO 的定义是变量间简单相关平方和除以“简单相关平方和 + 偏相关平方和”。含义很直白:变量之间的共同相关越多、扣掉其他变量后的偏相关越少,KMO 越接近 1,说明这些变量确实在测同一些东西。经验门槛是 0.7 以上效果较好、0.6 到 0.7 尚可、0.5 以下不适合做因子分析。它不是显著性检验,没有 P 值,只是一个描述性的适配度指标。

巴特利特球形检验的零假设是“相关矩阵等于单位矩阵”,P 小于 0.05 就拒绝,说明至少存在一组变量有共同变异。这个检验对样本量极其敏感:样本上千的时候,|r| 只有 0.1 也能显著;样本只有十几个的时候,明明有清晰结构也可能不显著。所以它只能当入场券,不能当质量证明。两条件一起看:KMO 达标 + P<0.05,才继续往下走。

这份作业的样本结构是 15 个地区 × 9 个指标,样本变量比 1.67:1,远低于常见的 5:1 到 10:1 经验线。这意味着 KMO 的数值本身波动很大——换一批地区、增删一个指标,KMO 从 0.78 掉到 0.62 都很正常。写报告时必须把这个边界说出来:结论只在这 15 个样本地区范围内成立,不要外推成普遍规律。这是我看到最多人略过的地方,也是答辩时最容易被追问的一句。

3.3 KMO 不达标时的三条退路

第一条是合并共线指标。相关系数矩阵里 r 超过 0.9 的那一对,基本在测同一个东西,合成一个“财力规模”类指标或者直接删掉一个,信息损失很小,KMO 往往立刻回升。第二条是剔掉比率型指标。固定资产投资增速这类“增速”变量和“总量”变量混在一起,方向还可能相反——基数大的地区增速反而低,留着会把第一主成分的方向搅浑。第三条是换赋权方法。如果前两三个主成分的累计贡献率只有 65% 左右,继续加成分会让解释越来越牵强,这时候改用熵值法、CRITIC 或者 TOPSIS 做综合评价更省事,主成分分析从来不是唯一的路。

3.4 检验与提取的语法块

FACTOR /VARIABLES=ZGDP ZPGDP ZAGRI ZASSET ZTERI ZUNEMP ZFINV ZRETAIL ZFISC /MISSING=LISTWISE /PRINT=INITIAL CORRELATION KMO EXTRACTION /CRITERIA=MINEIGEN(1) ITERATE(25) /EXTRACTION=PC /ROTATION=NOROTATE /METHOD=CORRELATION.

逐个说关键参数。/PRINT里的CORRELATION出相关矩阵、KMO出 KMO 和巴特利特检验、EXTRACTION出总方差解释表和未旋转成分矩阵,三个都要留。/CRITERIA=MINEIGEN(1)是“特征值大于 1 才保留”,这是 SPSS 默认值,显式写出来是为了让别人一眼看到你的准则。/EXTRACTION=PC指定主成分法,别用默认的其它提取方法,否则算出来的载荷和后面手算的特征向量对不上。/ROTATION=NOROTATE表示不旋转——只要打算自己手算权重和综合得分,就必须不旋转,这一条下一章会解释原因。/METHOD=CORRELATION表示分析相关矩阵,数据已经标准化过,选它和选协方差矩阵结果一致,但写清楚能避免别人误以为你漏了标准化。

4. 提取与加权:把成分矩阵还原成特征向量再算综合得分

4.1 特征值大于 1 只是默认值:总方差解释表四列怎么读

总方差解释表有四组列:成分编号、初始特征值(合计、方差百分比、累积百分比)、提取载荷平方和。看的是“初始特征值”那三列。按这份作业给出的方差百分比反推,第一成分特征值约 5.31(占 58.970%),第二成分约 2.30(占 25.524%),两者累计 84.494%,第三成分往后特征值掉到 1 以下,方差百分比只剩个位数。九列变量的总方差是 9,特征值除以 9 就是方差百分比,这个换算关系可以用来验算输出的数字对不对。

保留几个成分有三条准则。第一条是 Kaiser 准则,特征值大于 1,优点是机械、不用动脑,缺点是变量多时容易多留。第二条是累计贡献率,一般要求到 85% 左右;这份数据 84.494%,差一点点但和前一条准则指向同一个结论,写报告时可以强调“双重准则一致”。第三条是碎石图,横轴成分、纵轴特征值,找曲线由陡转平的肘点。这份数据从 1 到 2 陡降,2 到 3 之后基本平了,肘点落在第二个成分之后,和前面两条对得上。

一个反直觉的情况要提前说:如果第一成分单独就占了 60% 以上,后面几个刚过 1,只留一个往往解释不动业务——单一成分意味着所有指标被一个维度概括,地区间的差异被压成一条线,评价会失真。留两个反而更稳,第二个成分通常携带的是“结构”信息,正好补上总量看不到的东西。

4.2 成分矩阵不等于特征向量,差一个根号

成分矩阵给出的是载荷 $l_{ij}$,它和特征向量 $a_{ij}$ 的关系是 $l_{ij}=a_{ij}\sqrt{\lambda_j}$。所以要拿系数去乘标准化数据,必须先除回去:$a_{ij}=l_{ij}/\sqrt{\lambda_j}$。这一步是整个流程里最容易被跳过的地方,跳过之后算出的 F 值量级完全不对,但因为排序看起来还像回事,很多人发现不了。

操作上,把成分矩阵两列数字复制进一个新的数据集,命名 V1、V2,再用计算变量生成系数列。原文就是这么干的,我在语法里也照这个思路写:

* 载荷转特征向量系数:除以对应特征值的平方根。. COMPUTE a1_1 = V1 / SQRT(5.307). COMPUTE a2_1 = V2 / SQRT(2.297). EXECUTE.

5.307 和 2.297 是上面反推出来的特征值,实际使用时替换成自己总方差解释表里的数字,别照抄。做完必须自检:每一列系数的平方和应该等于 1,用DESCRIPTIVES对 a1_1 到 a1_9 的平方求和就能验证。这一步通过,说明系数没算错,后面的加权才有意义。

还要记住一点:特征向量的整体符号是任意的,求解过程只保证方向,不保证正负。换一个软件、换一个算法实现,整列系数可能全部取反,得分排序完全一样,但载荷的解释要跟着翻转。看结果时以绝对值和相对大小为准,别盯着正负号较劲。

4.3 综合得分 F 的加权公式与排序

两个主成分得分分别是指标系数与标准化数据的乘积和:F1 用第一列系数,F2 用第二列。综合得分不能简单相加,要按各自的方差贡献率加权,并且分母用累计贡献率而不是 100,这样 F 的量纲才回到标准化指标的量级:

COMPUTE F1 = a1_1*ZGDP + a1_2*ZPGDP + a1_3*ZAGRI + a1_4*ZASSET + a1_5*ZTERI + a1_6*ZUNEMP + a1_7*ZFINV + a1_8*ZRETAIL + a1_9*ZFISC. COMPUTE F2 = a2_1*ZGDP + a2_2*ZPGDP + a2_3*ZAGRI + a2_4*ZASSET + a2_5*ZTERI + a2_6*ZUNEMP + a2_7*ZFINV + a2_8*ZRETAIL + a2_9*ZFISC. COMPUTE F = (58.970*F1 + 25.524*F2) / 84.494. EXECUTE. SORT CASES BY F (D).

三个参数要盯住:系数变量名和上一步生成的完全对应;58.970和25.524是方差百分比,不是小数;分母84.494是累计贡献率,写成 100 会把分数整体缩小约 15%,和别人的结果永远对不上。SORT CASES BY F (D)是降序排列,如果不想打乱原始数据顺序,改用RANK VARIABLES=F (D) /RANK生成一个新排名列更安全。

按这份数据排下来,总量指标全线领先的样本地区得分最高,总量靠后但人均产出相对不弱的地区排在末尾。加权时第一主成分的实际权重是 58.970/84.494≈0.70,第二主成分约 0.30,所以结果是“规模主导、结构微调”,这个权重结构写进报告里比只贴一个排名表有说服力得多。

4.4 载荷矩阵怎么读成“规模因子”和“结构因子”

第一主成分上载荷高的指标是地区生产总值、社会消费品零售总额、第三产业增加值、规模以上企业总资产、地方财政收入、固定资产投资增速,清一色的总量或投入类变量,命名“经济规模与总量因子”。它的现实含义是:一个地区在这条轴上位置越高,经济体量越大、市场容量越大、财政和资产盘子越大。

第二主成分上载荷高的是人均地区生产总值、农林牧渔总产值、失业人员。人均和农业占比同向、失业规模反向,可以读成“人均产出与就业结构因子”——人均产出高的地区,往往农业占比也不低(分母小),同时失业人员相对少。这个解释不需要多精巧,只要和指标的经济含义对得上、能自圆其说就行。载荷的正负号只表示方向,负号不代表“差”,要看它在因子上的相对位置。

5. 避坑与排查:五条跑 SPSS 主成分分析时最容易翻车的地方

5.1 现象:自己算的系数和网上例子对不上,载荷全是反的

原因:特征向量求解时整体符号可以取反,这是数学性质,不是软件错误。同一个相关矩阵,不同算法给出的特征向量可能差一个负号,特征值完全相同。

解决:核查时只比绝对值和相对大小,符号统一按“第一主成分与总量指标正相关”这个方向调整即可。如果一定要和某份参考结果逐位对齐,把所有系数同乘 −1 再比。这个坑在新手复现时出现频率最高,但影响最小,排序结果一模一样。

5.2 现象:N 从 15 变成 13,排序结果差了两三位

原因:原始数据里有空格。描述过程按成列排除,因子分析默认也是成列排除,哪一步的变量集合不同,删掉的行就不同。中间如果有人手工补过一列 Z 值,行数就更乱。

解决:分析前先跑一次缺失值检查,把有缺失的案例列出来看清楚是哪几个地区、哪几个指标缺。真缺得多的指标直接剔除,别指望插补。之后所有分析步骤统一用/MISSING=LISTWISE,并在报告里写明有效样本量。这是那种“不看不知道、一看一身汗”的问题。

5.3 现象:勾了最大方差旋转,算出的综合得分和成分矩阵对不上

原因:旋转改变的是载荷的坐标系,旋转后的载荷不再对应原始主成分方向,方差贡献率也被重新分配。用手工公式拿旋转后载荷除以旋转前特征值的平方根,两边根本不是一套东西。

解决:只做综合评价、要手算权重时,一律不旋转。旋转的价值在于给因子起名、做可解释性分析,那属于因子分析的用法。如果确实想要旋转后的结果,就别手工算得分,直接用 SPSS 保存的因子得分变量(回归法),但那已经不是主成分得分,报告里要说清楚区别。

5.4 现象:把成分矩阵的载荷直接乘标准化数据,F 值量级离谱

原因:载荷和特征向量差一个 $\sqrt{\lambda}$ 的倍数。第一特征值 5.31 开方约 2.30,直接乘会让得分放大两倍多,两个主成分之间的权重关系也全乱了。

解决:先做系数转换再做加权,转换后必须自检每列系数平方和为 1。这个自检花不了两分钟,但能挡掉九成的计算错误,我一般把它写成语法里的固定一段,跑完自动出结果。

5.5 现象:换一年数据重跑,排名整体大变,去年第三今年掉到第十

原因:Z 分数是样本内标准化,均值和标准差都来自当年这 15 个地区。换一批样本,基准就变了,同一個地区在不同年份的 Z 值没有可比性。这是面板数据做综合评价时最隐蔽的坑。

解决:要做跨年份比较,就不能每年各算各的,得用固定基准标准化——比如统一用基期的均值和标准差,或者直接用原始指标除以某个固定参考值。另一种做法是每年单独评价、只做当年横向对比,在报告里明确写“本结果不具跨年可比性”。两种都行,含糊其辞不行。

6. 指标层权重与结果复核:让一份作业经得起别人拿计算器怼

主成分得分只是第一步,真正能体现分析深度的是把权重拆回到九个指标上。做法是把两个主成分的系数按方差贡献率加权合并:$w_i=(a_{1i}\times58.970+a_{2i}\times25.524)/84.494$,得到每个指标对综合得分的贡献系数,再按绝对值排序,就能回答“到底哪几个指标在决定排名”这个问题。这一步在 SPSS 里加一行 COMPUTE 就够,但它把“黑匣子输出”变成了可解释的结论,答辩时非常好用。

复核环节我会做三件事,写成一个固定清单:

检查项期望结果不符时先查什么
Z 变量均值与标准差0 和 1缺失值、变量类型
KMO 与巴特利特 P 值KMO>0.6,P<0.05指标共线性、样本量
系数列平方和每列等于 1是否漏除 √特征值
累计贡献率与总方差解释表一致加权分母是否写错
综合得分排序与原始指标排名大体吻合符号方向、权重口径

想彻底放心,可以拿 Python 独立算一遍交叉验证,两边特征值和方差百分比对得上,基本就能排除操作失误:

import numpy as np # X 为 15x9 原始指标矩阵,列顺序与 SPSS 变量顺序一致 Z = (X - X.mean(axis=0)) / X.std(axis=0, ddof=1) # ddof=1 对齐 SPSS 的样本标准差 R = np.corrcoef(Z, rowvar=False) # 相关矩阵 vals, vecs = np.linalg.eigh(R) # 对称矩阵用 eigh 更稳 order = np.argsort(vals)[::-1] vals, vecs = vals[order], vecs[:, order] print(vals[:3], vals[:2].sum() / vals.sum()) # 对照总方差解释表

ddof=1是这段代码的关键,默认的ddof=0会把标准差算小,特征值跟着偏,和 SPSS 差一点点,正好落在“看起来像对但复现不了”的区间里。eigh专用于对称矩阵,特征值天然按升序返回,所以要手动倒序;特征向量的符号同样可能和 SPSS 相反,比绝对值即可。

从那以后我每次跑主成分分析,都会把总方差解释表的累计贡献率、系数平方和的自检结果、综合得分的排序打印在同一页上对照着看一遍才交出去——这三样一致,结果基本不会翻车。这份作业的 SPSS 语法文件和数据表我整理在一起了,按上面的顺序从头跑一遍、跟自己的输出逐项比对,比翻十页讲义都快。希望帮到你。

本文还有配套的精品资源,点击获取