资讯详情

SPSS主成分分析全流程:标准化、得分排序与避坑校验

📅 2026/10/28 11:21:01 | 华诺云谱 👁 阅读
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 / 9k 从 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 VARIABLESGDP PGDP AGRI ASSET TERI UNEMP FIXINV RETAIL FISCAL /SAVE /STATISTICSMEAN 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 /VARIABLESZGDP ZPGDP ZAGRI ZASSET ZTERI ZUNEMP ZFIXINV ZRETAIL ZFISCAL /MISSINGLISTWISE /PRINTINITIAL CORRELATION KMO EXTRACTION /CRITERIAMINEIGEN(1) ITERATE(25) /EXTRACTIONPC /ROTATIONNOROTATE /SAVEREG(all) /METHODCORRELATION./CRITERIAMINEIGEN(1)就是特征值大于 1ITERATE(25)是迭代上限主成分提取其实不需要迭代保留默认值即可。/ROTATIONNOROTATE明确关掉旋转保证成分矩阵是未旋转的原始载荷。/SAVEREG(all)保存全部主成分的回归得分。这段跑完再用ROTATIONVARIMAX单独跑一次拿旋转解做解释两份输出互不干扰。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 里写了ROTATIONVARIMAX记得再补一段ROTATIONNOROTATE单独产出未旋转解两套输出分开存。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用的是总体标准差ddof0SPSS 的 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*1000.01载荷矩阵成分矩阵vecs[:, :2] * sqrt(vals[:2])0.01符号可反综合得分计算变量 FX vecs[:, :2] w0.001表里最后一行w是按贡献率归一化后的权重向量实现时把vals[:2]/vals[:2].sum()代进去就行。四行校验全过基本可以确定 SPSS 那边没有漏项、没有用错矩阵、没有符号错误。血泪经验是这么来的早几年交出去的一份分析SPSS 里 F1、F2 的表达式漏掉了农林牧渔总产值那一项排名看起来差不多对直到用 Python 复算才发现综合得分和回归法得分对不上回头补了一项前三名直接换位。从那以后我每次做完主成分分析都强制走一遍特征值—载荷—得分三段交叉验证哪怕数据只有十几行也不省这一步。这套流程和这份作业的资源放在一起改改数据就能直接用希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑