资讯动态

SPSS因子分析实战:农民收入指标降维与综合得分计算

发布时间:2026/9/18 7:02:31 来源:尧图企业网站定制
简介这是一份关于SPSS因子分析完整操作流程的PDF文档主要面向想掌握多变量统计分析方法的本科生、研究生、数据分析初学者以及论文写作者。内容以农民收入影响因素为例先介绍七个研究变量的含义再演示如何在软件中定义变量、导入数据并完成标准化处理接着逐步操作因子分析模块选择主成分分析法和最大方差旋转法并对输出的KMO检验、巴特利特球形检验、总方差解释表、公因子方差比、旋转前后因子载荷矩阵以及得分系数矩阵进行细致解读。文档配有操作界面截图和关键结果表格读者可以对照步骤自行练习避免只点击菜单却看不懂输出结果的问题。资源仅包含一个PDF文件文件大小约546KB体量轻便目前已有565人学习使用。与单纯罗列步骤的教程不同该资料还解释了每个统计量对应的实际意义并结合案例说明如何根据载荷值命名公共因子从而帮助读者真正理解因子分析原理独立完成数据分析并规范撰写研究报告。1. 为什么农民收入分析要先跑因子分析思考农民收入的影响因素时多数人第一反应是把财政支农比重、二三产业从业人数占比、非农村人口比重、乡村从业人员占比、农业总产值占农林牧总产值的比重、农作物播种面积、农村用电量这7个指标一起放进回归。但真正跑起来会发现非农村人口比重与二三产业从业人数占比高度相关农作物播种面积和农村用电量也带着强烈的共变趋势直接进入回归轻则系数符号不稳重则模型整体显著而单个变量全不显著。因子分析在这个场景里的作用是先把7个可观测变量压缩成2个互相独立的公共因子让信息冗余被剥离再用因子得分去做收入解释或年份排序。这里以1986—2005年20组年度数据为例把SPSS里从标准化、KMO检验、主成分抽取、Varimax旋转到因子得分加权的完整链路拆开讲也指出来哪些默认参数会坑人。适合用SPSS做宏观指标降维或问卷结构效度分析的人也适合想用Syntax批量处理数据、不想每个项目都点菜单的人。2. 变量定义与标准化因子分析不是把原始数据直接丢进去2.1 量纲差异为什么会影响主成分抽取7个变量的单位和数值范围差得很远。只看原始数据财政用于农业的支出比重在7.12%到13.43%之间波动农作物播种面积在14.3万千公顷量级农村用电量则从253.1亿千瓦时一路涨到4375.7亿千瓦时量级差了接近两个数量级。因子分析如果基于协方差矩阵做特征值分解方差最大的变量会成为第一个主成分的绝对主导其他变量几乎失去发言权。SPSS的因子分析入口里有一个很容易被忽略的选项Factor对话框的Analyze区域提供Correlation matrix和Covariance matrix两种选择。选Correlation matrix就等同于对变量做标准化后分析选Covariance matrix则是保留原量纲。做社会学、经济学指标时我一般直接选相关性矩阵因为指标单位没有统一的经济含义如果指标本身已经是标准化分数比如Z score或者百分位等级再选Covariance matrix才可能有意外的解读价值。本案例使用原始比例和绝对量混搭的数据标准化的必要性很直观非农村人口比重从1986年的17.92%涨到2005年的42.99%而乡村从业人员占比同期从36.01%升到67.59%两列数据的均值、方差都不同不消除尺度差异后续KMO和相关矩阵都会偏向大方差变量。变量定义和数据取值范围可以整理成下面这张表方便后面核对标准化后的Z变量到底对应谁。变量含义单位1986—2005原始范围x1财政用于农业的支出比重%7.12—13.43x2第二、三产业从业人数占全社会从业人数比重%29.5—55.2x3非农村人口比重%17.92—42.99x4乡村从业人员占农村人口比重%36.01—67.59x5农业总产值占农林牧总产值比重%49.72—79.99x6农作物播种面积千公顷143625.87—156372.81x7农村用电量亿千瓦时253.1—4375.7从表里能直接看到x6的数值和方差会碾压其他变量。另一个容易忽略的点是各变量方向并不完全一致x5农业总产值占农林牧总产值比重在样本期内是下降的而x2、x3在不断上升这种反向趋势在相关矩阵里会形成负相关对后面因子旋转产生明显影响。2.2 用Descriptives完成标准化SPSS里做标准化的标准路径是Analyze—Descriptive Statistics—Descriptives把x1到x7移入Variable(s)然后勾选Save standardized values as variables点击OK后数据集会新增ZX1、ZX2直到ZX7分别对应每个原始变量的Z分数。这里不是选Compute Variable手动做公式自动生成的好处是SPSS会按当前样本的均值和标准差计算命名规则固定为原变量名前加Z变量标签也会继承后续操作不容易看错。标准化完成后建议先跑一次简单的Descriptives检查ZX1的均值应接近0标准差应接近1。如果标准差不是1通常说明系统里存在选择权重或者数据过滤没有清干净比如之前用了Select Cases但变量没解除过滤。还有一个实操细节标准化用全体样本的均值和标准差如果之后要把数据拆成训练集和验证集最好先用全样本标准化再用Split File分组跑因子分析否则两段数据的尺度基准不一致因子得分不可比。操作步骤可以简化为先做数据层的Checklist——变量视图里x1到x7均为Numeric缺失值统一用系统缺失不要用99或空格因为SPSS的LISTWISE会剔除含缺失值的年份。本案例只有20行数据任一缺失都会损失一整年信息。2.3 用Syntax一步完成标准化与因子抽取点菜单能完成但换到Syntax会更可控。我习惯把标准化和因子分析放在同一段命令里方便修改变量范围和验证不同旋转方法。下面这段是核心语法DATASET ACTIVATE DataSet1. DESCRIPTIVES VARIABLESx1 x2 x3 x4 x5 x6 x7 SAVE /STATISTICSMEAN STDDEV MIN MAX. FACTOR /VARIABLESzx1 zx2 zx3 zx4 zx5 zx6 zx7 /MISSING LISTWISE /ANALYSISzx1 zx2 zx3 zx4 zx5 zx6 zx7 /PRINTINITIAL CORRELATION EXTRACTION ROTATION /CRITERIAMINEIGEN(1) ITERATE(25) /EXTRACTIONPC /ROTATIONVARIMAX /METHODCORRELATION.第一段DESCRIPTIVES的SAVE子命令只生成标准化变量不弹出密密麻麻的输出表格。第二段FACTOR里/VARIABLES指定参与分析的七个Z变量/MISSING LISTWISE表示只要任一变量缺失就剔除该个案/EXTRACTIONPC指定主成分法/ROTATIONVARIMAX指定方差最大旋转/METHODCORRELATION确认基于相关矩阵。这里的CRITERIAMINEIGEN(1)先保留特征值大于1的因子后续结果如果只保留一个因子再手动改成固定提取两个因子继续跑不要在这一步就直接改参数。需要说明的是MINEIGEN(1)是SPSS默认的主成分保留标准。从后文你会看到本例第二特征值只有0.653严格按这个标准只会留下一个因子但固定提取两个因子在经济学解释上更有价值。Syntax的好处是当你想对比“特征值大于1”和“固定提取2个因子”两种方案时只需要改动CRITERIA和EXTRACTION两个子命令。提示跑完Syntax后再保存数据ZX1到ZX7会自动写入当前数据集不要手动重命名这些变量否则FACTOR命令里的/VARIABLES需要同步改。3. 主成分提取KMO、Bartlett与累积贡献率怎么读3.1 因子分析对话框四个入口的参数选择标准化完成后进入Analyze—Dimension Reduction—Factor。把zx1到zx7选入Variables后仔细过一遍四个按钮。Descriptives里至少勾选Initial solution、Coefficients和KMO and Bartletts test of sphericity。Initial solution输出每个变量的初始公因子方差和初始特征值Coefficients让输出相关矩阵可以用来快速排查变量间是否存在大量低于0.3的弱相关。Extraction里Method选择Principal componentsAnalyze选择Correlation matrixDisplay勾选Unrotated factor solution。Extract这一项是本例最关键的分岔口默认是Eigenvalues over 1即特征值大于1才保留按这个标准本数据集只会得到1个主成分但累积贡献率停在84.572%公因子方差也不好。参考总方差解释表和散点图可以接受固定提取2个因子。实操时先在Extract下选Fixed number of factors框内填2跑一次再对比默认结果记住两个方案在旋转后的解释差异。Rotation里选择VarimaxDisplay勾选Rotated solution和Loading plot(s)。Scores里勾选Save as variablesMethod选Regression继续勾选Display factor score coefficient matrix这样数据视图会生成FAC1_1和FAC2_1两个因子得分变量供后期计算综合得分。Options里的缺失值保持按LISTWISE排除系数显示格式选按大小排序会更容易识别高载荷变量。这里有一个常见误区有人把Scores面板的Save as variables理解成保存原始变量的标准化分数其实它是保存因子得分。不要在前面Descriptives已经存过ZX变量后又到这里再勾错地方二者概念不同。3.2 KMO与Bartlett球形检验的判读第一次跑出来后先看KMO and Bartletts Test这张表。本案例对应输出如下。指标数值Kaiser-Meyer-Olkin Measure of Sampling Adequacy0.725Bartletts Test of Sphericity: Approx. Chi-Square255.159df21Sig.0.000KMO的0.725处在0.7到0.8区间评价是“适合做因子分析”但谈不上优秀。判读规则是0.9以上极佳0.8以上良好0.7以上可接受0.6以上勉强0.6以下需要谨慎。Bartlett球形检验的p值小于0.001拒绝相关矩阵为单位阵的原假设说明变量之间存在可被公共因子解释的结构。KMO有个容易被忽略的陷阱它受样本量和变量间平均相关强度影响本案例只有20个年度样本KMO 0.725的稳定性一般。如果删除x6农作物播种面积再跑一次KMO可能跳到0.8以上但公因子方差的解释率也会变化。不要只盯着0.725这个数可以试着逐项删除变量比较删除前后旋转载荷和因子命名是否变化如果变化很大说明这个尺度本身不够稳健。3.3 总方差解释表与两个公共因子的取舍因子分析结果中的Total Variance Explained表前几行大致如下。成分初始特征值初始方差 %初始累积 %旋转后方差 %旋转后累积 %15.92084.57284.57247.26147.26120.6539.33093.90246.64193.90230.2493.55997.462--40.1261.79899.259--50.0420.59599.854--60.0080.10899.962--70.0030.038100.000--第一成分特征值5.920独自吸收84.572%的方差第二成分特征值0.653贡献9.330%前两个成分累计解释93.902%。第三成分特征值掉到0.249之后进入平缓尾部。所以肉眼判断和固定提取2因子的做法一致第一因子之后还有第二个能带来约9.3%解释增量的成分第二个成分之后曲线基本走平。注意这里不要踩“特征值大于1”的机械化陷阱。如果按默认规则0.653小于1最终只保留一个公共因子但这会让每个变量只由一个因子解释x2、x3、x4的共性方差无法同时超过0.9。固定2因子后公因子方差比Communalities全部在0.906到0.979之间说明两个因子保留住了每个原始变量超过九成的信息。用Python做同样的主成分特征值分解可以用factor_analyzer库快速校验SPSS输出的数字from factor_analyzer import FactorAnalyzer fa_0 FactorAnalyzer(n_factors7, rotationNone, methodprincipal) fa_0.fit(X) ev, _ fa_0.get_eigenvalues() print(前7个特征值:, ev.round(3)) print(特征值1的个数:, (ev 1).sum())这里的n_factors7是把七个变量全部作为主成分空间get_eigenvalues返回相关矩阵的七个特征值methodprincipal对应SPSS的Principal components和SPSS中初始特征值列应完全一致。如果两侧结果有细微差异要检查X矩阵标准化时是否用了样本标准差默认ddof1和SPSS口径一致。补充一个结果汇总公因子方差表中x1为0.906x2为0.940x3为0.979x4为0.977x5为0.943x6为0.909x7为0.918。这说明被压缩掉的信息量都在10%以内两个公共因子对原始指标的代表性足够强。4. 因子旋转与得分Varimax旋转后的命名与综合排名4.1 为什么旋转后载荷才能命名未旋转的主成分结果中第一个主成分往往在所有变量上都有较高的正载荷因为它是沿着数据整体变异最大的方向提取的很难说清楚这一因子背后对应什么经济含义。旋转的作用是在不改变公共因子方差、不改变每个变量公因子方差的前提下让载荷矩阵变得稀疏使每个变量尽量只在一个因子上有高载荷。Varimax是正交旋转它保持因子之间不相关。如果理论推导认为两个公共因子背后存在相关性比如农业基本发展条件和政府支持情况可能存在联动用斜交旋转如Direct Oblimin更合适。本案例最终要计算综合得分F并对年份排序正交旋转生成的因子得分互不相关加权计算时不存在共线性问题所以我优先保留Varimax方案。这也是原文选择的路径。旋转后的实际结果可以概括为第一公共因子主要由x6农作物播种面积、x7农村用电量解释同时载荷散点图中x2、x3、x4也朝第一因子方向偏移第二公共因子主要由x1财政用于农业的支出比重、x5农业总产值占农林牧总产值的比重解释。因此把第一因子称为“农业基本发展条件”第二因子称为“政府支持情况”。有个容易误解的点在未旋转的载荷散点图上第一因子可能看起来更偏向x1和x5第二因子偏向x2、x3、x4、x6、x7。这是旋转前后的视角差异不是SPSS报错。旋转后的因子命名以Rotated Component Matrix和旋转载荷散点图为准。4.2 因子命名表整理旋转后的变量归类如下。公共因子主要高载荷变量命名FAC1_1x6农作物播种面积、x7农村用电量x2/x3/x4部分参与农业基本发展条件FAC2_1x1财政用于农业的支出比重、x5农业总产值占农林牧总产值比重政府支持情况这个命名并不完美。x6播种面积和x7用电量放在因子一更接近资源投入与生产条件x1财政支农比重放到因子二时x5农业总产值占比其实是结果变量与政府支持并不完全是一回事。但考虑到样本量只有20个年度因子命名应优先遵从载荷结构而不是强行套政策逻辑。如果你是后续做解释性分析建议把x5从第二因子中拿掉再跑一次看x1能否单独撑起“政府支持”因子不过本案例变量数有限保留原结构更容易复现。4.3 因子得分与综合得分计算公式SPSS在Scores里选择Regression后输出中会给出Component Score Coefficient Matrix并把FAC1_1、FAC2_1写入数据视图。这两个变量是回归法估计的因子得分均值为0标准差约等于1它们可以直接用来做后续聚类或回归。计算农民收入综合得分时原文给出的公式是F f1 * 84.572 / 93.902 f2 * 9.330 / 93.902这里f1、f2是两个公共因子得分84.572和9.330来自提取前各自方差贡献百分比分母93.902是前两个因子的累计贡献率。这样加权的结果相当于用主成分的相对贡献确定权重综合得分高的年份会在两个因子上都有不错的水平而不是只依赖某一个因子。但需要提醒的是这套权重只适用于未旋转的主成分得分如果你用SPSS保存的是旋转后回归因子得分FAC1_1、FAC2_1仍然套用84.572和9.330这两个权重会高估第一个因子。这是因为旋转后两个因子的方差贡献已经重新分配为47.261%和46.641%。更严谨的加权公式是F_rotated FAC1_1 * 47.261 / 93.902 FAC2_1 * 46.641 / 93.902这个差异体现在排名上一般不会颠覆头部年份的位置但中间年份的排序会变化。做论文时应在方法部分写明使用的因子得分是旋转前还是旋转后以及权重来自哪一列方差百分比。下面用Python计算两种口径的综合得分并按年份排序import pandas as pd scores pd.DataFrame({ year: years, FAC1_1: fac1_scores, FAC2_1: fac2_scores }) w1_pre 84.572 / 93.902 w2_pre 9.330 / 93.902 w1_rot 47.261 / 93.902 w2_rot 46.641 / 93.902 scores[F_pre] scores[FAC1_1] * w1_pre scores[FAC2_1] * w2_pre scores[F_rot] scores[FAC1_1] * w1_rot scores[FAC2_1] * w2_rot scores.sort_values(F_rot, ascendingFalse, inplaceTrue) print(scores.head(5))fac1_scores和fac2_scores在SPSS中是FAC1_1和FAC2_1在Python里则由FactorAnalyzer的transform输出。代码中两个权重分别来自旋转前和旋转后的方差百分比目的是并排比较差异。实际分析中只需要保留一种口径不要两个公式混着用。4.4 从结果表读年份排序按原文的得分排序结果2004年总得分1.3386排在第一位2005年1.2253第二1998年1.2018第三最末端是1988年得分-2.1123。这个排序符合直观2004年和2005年的农村用电量已经增长到接近4000亿千瓦时x6播种面积也维持在15.35万公顷以上农业基本发展条件因子领先1988年农村用电量只有508.9亿千瓦时x1财政支农比重为7.66%两个因子得分都低所以综合排名垫底。读这类得分排序表时不要只看名次变化要看因子得分本身。比如1998年总得分高主要靠F1支撑x4乡村从业人员占比55.84%、x6播种面积15.57万千公顷都处在很高水平而2005年排在第二靠的是x6、x7所在因子得分和F2的正向拉动。把两个因子得分都列出来比只看综合分更能说明问题。5. 用碎石图和分半验证确认两个因子不是偶然5.1 碎石图与平行分析在Factor对话框Extraction里勾选Scree plot会输出一条特征值下降曲线。本例前几个特征值为5.920、0.653、0.249、0.126、0.042曲线在第二个点之后掉速明显放缓。看到这条曲线时常识判断是保留两个因子但注意第二个特征值小于1如果SPSS外部评审要求给出统计依据可以补一个平行分析。平行分析的做法是生成1000组与原始数据同样本量、同变量数的正态随机数分别计算相关矩阵特征值取95百分位作为比较基准。如果实际特征值大于随机特征值的95百分位说明该因子不是噪声。Python里可以这样算import numpy as np rng np.random.default_rng(42) n_sim, n_obs, n_var 1000, 20, 7 sim_eig np.zeros((n_sim, n_var)) for i in range(n_sim): Xr rng.standard_normal((n_obs, n_var)) corr np.corrcoef(Xr, rowvarFalse) sim_eig[i] np.linalg.eigvalsh(corr)[::-1] q95 np.percentile(sim_eig, 95, axis0) print(随机特征值95%分位, q95.round(3)) print(实际前2个特征值, [5.920, 0.653])np.linalg.eigvalsh按升序返回特征值[::-1]改为降序。这里n_obs20要与真实样本量一致否则平行分析结果会失真。如果实际第二特征值0.653大于模拟得到的95%分位固定2因子就更有底气如果小于则考虑只保留1因子或增加样本后再分析。5.2 分半验证载荷稳定性平行分析回答的是“该保留几个因子”分半验证回答的是“因子结构是否稳定”。具体做法是把1986—2005年按前十年、后十年拆成两段每段重新标准化后跑同样的固定2因子Varimax比较旋转后的因子载荷。for label, sub in [(1986-1995, df.iloc[:10]), (1996-2005, df.iloc[10:])]: X_sub scaler.fit_transform(sub[[x1,x2,x3,x4,x5,x6,x7]]) fa FactorAnalyzer(n_factors2, rotationvarimax, methodprincipal) fa.fit(X_sub) print(label, np.round(fa.loadings_, 2))反映到结果上如果前后十年的x6、x7仍然落在因子一x1、x5落在因子二说明两个公共因子的经济含义在样本期内稳定全样本综合得分可以放心使用。但如果1996—2005段因子二的重心明显向x2、x3偏移说明政府支持因子在后半段开始与劳动力转移混在一起这时再给2004、2005年的高排名下结论就不够严谨。分半验证还可以衍生出一种更实用的玩法把前半段拟合得到的因子得分系数应用到后半段原始数据计算后半段因子得分再和后半段单独跑的因子得分做相关。相关系数接近0.9说明因子结构跨时间稳定可以用来验证宏观经济指标是否适合做长期综合评分相关系数偏低时建议在论文里按时间段分别报告因子分析结果而不是只输出一个全样本综合排名。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价