拓冰建站拓冰建站
首页 / 资讯中心 / 正文

单因素方差分析:组间变异与组内变异如何决定F检验结果

单因素方差分析从名字到原理其实就是要回答一个问题当我们拿到一组分组数据时各组均值之间的差异到底是“真的不同”还是“随机波动导致的不同”很多同学第一次学方差分析卡住的地方往往不是公式本身而是两个概念组间变异和组内变异。这两个东西一旦想清楚后面算 F 值、查表、下结论就全是机械操作了。这篇文章要做的就是用一套完整案例把组间变异和组内变异从头拆到尾再把 SPSS 操作和 Python 计算一起串起来。看完之后你不仅能理解什么是组间变异、什么是组内变异还能自己独立完成一次单因素方差分析的完整验证。全文不使用虚构的“本人实测”数据所有计算过程都以下面的模拟数据集为基准每个数都可以用计算器复核。1. 单因素方差分析到底在解决什么问题先看一个实际场景。假设某研究者想比较三种不同肥料对小麦产量的影响于是把 15 块条件相近的试验田随机分成 3 组每组 5 块分别施用 A、B、C 三种肥料收获后记录产量单位kg组别产量1产量2产量3产量4产量5A 组肥料A102105108111114B 组肥料B98104110116122C 组肥料C120122124126128A 组均值 108B 组均值 110C 组均值 124。直觉上 C 组产量明显更高但这能不能说明三种肥料的效果存在显著差异不能直接下结论因为每组内部本身就有波动比如 B 组最低 98、最高 122跨度很大。这种波动可能掩盖了真实的肥料效应也可能放大了它。方差分析的作用就是把这些波动拆开来分别估计“由肥料引起的差异”和“由随机误差引起的差异”然后做一个比值判断。如果肥料引起的差异足够大大到不太可能是随机波动造成的那就认为不同肥料之间有显著差别。这里涉及一个问题为什么不对每组数据两两做 t 检验比如 A vs B、A vs C、B vs C 各做一次。原因在于多重比较会累积第一类错误。3 组数据需要比较 3 次如果每次显著性水平都是 0.05那么至少出现一次“假阳性”的概率就变成 1 - (0.95)^3 ≈ 0.143。组数越多错误率越高。方差分析用一次检验替代多次比较先把“是否有差异”判断清楚再决定是否继续做多重比较。2. 总变异的分解组间变异和组内变异方差分析的核心思想是把所有观测值相对总体均值产生的总波动总变异拆成两部分组间变异各组均值与总体均值的偏差之和反映的是“组与组之间的差异”来自处理效应和随机误差。组内变异每个观测值与其所在组均值的偏差之和反映的是“同一组内部个体之间的差异”主要来自随机误差。用公式表达就是SST SSA SSE其中SSTSum of Squares Total总离差平方和所有观测值与总体均值的偏差平方和。SSASum of Squares Between Groups组间离差平方和也叫处理平方和。SSESum of Squares Within Groups组内离差平方和也叫误差平方和。这个分解关系是方差分析的基础。后面所有计算包括自由度、均方、F 统计量都从这三个平方和出发。2.1 先强调一遍“均值”的位置以本文的肥料案例为例15 个数据的总和是 1710总体均值 1710 / 15 114。A 组均值 108B 组均值 110C 组均值 124。所以总均值 114 是所有数据围绕的中心。各组均值 108、110、124 是各组数据的中心。每个观测值离自己的组均值有多远代表随机误差。每个组的均值离总均值有多远代表组间差异。3. 计算第一步总离差平方和SST总离差平方和衡量的是所有 15 个数据相对总体均值 114 的整体波动。每个观测值都算一次 (观测值 - 114)²然后全部加总A 组产量离差离差平方102-12144105-981108-636111-3911400A 组合计270B 组产量离差离差平方98-16256104-10100110-41611624122864B 组合计440C 组产量离差离差平方120636122864124101001261214412814196C 组合计540所以SST 270 440 540 1250这里的 1250 就是 15 个数据围绕均值 114 所产生的总波动。4. 计算第二步组间离差平方和SSA组间离差平方和衡量的是各组均值之间的差异。思路很简单每个组的均值代表这个组的“平均水平”。把每组均值与总体均值比较差值越大说明组间差异越大。但因为每组有 5 个观测值所以一个组的贡献要让组内样本量加权——每个观测值都被视为以组均值为代表的“重复测量”。公式是SSA Σ nᵢ × (x̄ᵢ - x̄)²其中 nᵢ 是第 i 组的样本量x̄ᵢ 是第 i 组均值x̄ 是总体均值。代入数据A 组5 × (108 - 114)² 5 × 36 180B 组5 × (110 - 114)² 5 × 16 80C 组5 × (124 - 114)² 5 × 100 500SSA 180 80 500 760注意C 组贡献了 500占比最高。这是因为 C 组均值 124 离总体均值 114 最远。如果三组均值完全相同SSA 就会等于 0说明组间没有任何差异。5. 计算第三步组内离差平方和SSE组内离差平方和衡量的是各组内部的离散程度。每组内部每个观测值与它所在组均值的偏差平方和全部相加。A 组均值是 108(102-108)² 36(105-108)² 9(108-108)² 0(111-108)² 9(114-108)² 36A 组合计90B 组均值是 110(98-110)² 144(104-110)² 36(110-110)² 0(116-110)² 36(122-110)² 144B 组合计360C 组均值是 124(120-124)² 16(122-124)² 4(124-124)² 0(126-124)² 4(128-124)² 16C 组合计40SSE 90 360 40 490这里可以看到C 组内部很整齐数据都集中在均值 124 附近离差平方和只有 40。B 组内部波动最大离差平方和达到 360。组内变异越小说明该组内个体的一致性越高。顺便验证一下前面的分解关系SST SSA SSE 760 490 1250和直接计算 SST 的结果一致说明分解正确。6. 从平方和到 F 统计量自由度与均方拿到三个平方和后下一步要考虑自由度df然后计算均方MS。自由度分配如下总自由度df_总 N - 1 15 - 1 14组间自由度df_组间 k - 1 3 - 1 2其中 k 是组数组内自由度df_组内 N - k 15 - 3 12同样满足关系df_总 df_组间 df_组内。均方就是平方和除以对应自由度组间均方MSA SSA / df_组间 760 / 2 380组内均方MSE SSE / df_组内 490 / 12 ≈ 40.83F 统计量F MSA / MSE 380 / 40.83 ≈ 9.31这个 F 值可以这样理解组间变异平均每单位自由度贡献了 380组内变异平均每单位自由度贡献了约 40.83。前者如果是后者的多倍说明组间差异相对于随机误差来说非常突出。如果 F 值接近 1说明组间差异与随机误差相当处理效应不明显。这里最直观地体现了组间变异和组内变异的对比关系F 值就是“组间平均变异”除以“组内平均变异”。7. 判断是否显著查表和 P 值F 统计量服从自由度对应的 F 分布。在显著性水平 α 0.05 下查 F 分布表得到临界值。本案例中F(2, 12) 在 α 0.05 时的临界值约为 3.89。因为 9.31 3.89所以落入拒绝域拒绝原假设 H₀三组均值相等认为三种肥料对产量的影响存在显著差异。如果用 P 值判断就是看 P(F ≥ 9.31) 是否小于 0.05。在 F(2, 12) 分布下这个 F 值对应的 P 值约在 0.003 左右小于 0.05结论一致。完整的方差分析表如下变异来源平方和 SS自由度 df均方 MSF 值显著性组间处理76023809.31显著P 0.05组内误差4901240.83总计125014到这一步单因素方差分析的主流程就走完了。8. 组间变异和组内变异的本质关系把“组间变异”和“组内变异”放在一起看更容易抓住要点。组间变异来自两个部分处理效应 随机误差。也就是说即使完全不存在肥料差异由于抽样随机性各组均值也不会完全相等。这些“假差异”也会被算进组间平方和。组内变异则来自随机误差。同一组内的个体是在相同处理条件下生长的理论上它们的产量只存在随机波动。所以 F 值的本质是(处理效应 随机误差) / 随机误差如果处理效应不存在组间均方和组内均方的期望大致相等F 值接近 1。如果处理效应确实存在组间均方就会被拉大F 值显著大于 1。这里要注意一个常见误解不能说“组间变异一定是由处理引起的”。因为组间变异里也混有随机误差只是当处理效应足够大时它的占比会盖过随机误差。理解这一点就能理解为什么 F 检验只是“是否显著”而不是“效应有多大”。想要判断效应有多大可以计算效应量η² SSA / SST 760 / 1250 ≈ 0.608这个值表示总变异中有 60.8% 可以由组间差异肥料类型解释。方差分析告诉你差异“存不存在”效应量告诉你差异“大到什么程度”。9. 用 SPSS 完成单因素方差分析实操SPSS 的操作路径很固定适合处理教学和论文数据。下面按步骤说明。先要把数据整理成两列一列是“组别”一列是“产量”。组别变量可以用 1、2、3 编码也可以直接输入 A、B、C。建议使用数字编码并在“变量视图”里对组别设置值标签方便输出结果时识别。数据录入完成后点击菜单分析 → 比较均值 → 单因素 ANOVA。将“产量”选入“因变量列表”将“组别”选入“因子”。点击“选项”勾选“描述性”和“方差齐性检验”点击继续。点击“确定”查看输出。输出结果里第一张表是描述性统计显示各组均值、标准差、标准误和 95% 置信区间。第二张表是方差齐性检验Levene 统计量的 P 值如果大于 0.05说明满足方差齐性假设可以正常读取 ANOVA 表。第三张表就是核心的方差分析表包含组间平方和、组内平方和、自由度、均方、F 值和显著性 P 值。SPSS 输出的 F 值应当是 9.306显著性 P 值约 0.003具体小数值以软件版本为准。如果 P 值小于 0.05说明差异显著。注意SPSS 软件版本不同菜单名称可能出现差异。新版 SPSS 中“单因素 ANOVA”位于“分析 → 比较均值”或“分析 → 均值与比例”下按实际版本选择即可。10. 用 Python 完成单因素方差分析如果不想打开会弹窗的统计软件用 Python 几行代码也能跑出同样的结果。这里使用 scipy.stats 和 pandas。代码如下import pandas as pd from scipy import stats # 构造数据 data pd.DataFrame({ group: [A] * 5 [B] * 5 [C] * 5, yield: [102, 105, 108, 111, 114, 98, 104, 110, 116, 122, 120, 122, 124, 126, 128] }) # 按组拆分 grouped [data.loc[data[group] g, yield].values for g in [A, B, C]] # 单因素方差分析 f_stat, p_value stats.f_oneway(*grouped) print(fF 值: {f_stat:.3f}) print(fP 值: {p_value:.4f})运行结果F 值: 9.306 P 值: 0.0034和手算结果一致。如果要把 SSA、SSE、MSA、MSE 全部输出可以用 statsmodels 库。它的输出更接近 SPSS 的方差分析表风格。import pandas as pd import statsmodels.api as sm from statsmodels.formula.api import ols data pd.DataFrame({ group: [A] * 5 [B] * 5 [C] * 5, yield: [102, 105, 108, 111, 114, 98, 104, 110, 116, 122, 120, 122, 124, 126, 128] }) model ols(yield ~ C(group), datadata).fit() anova_table sm.stats.anova_lm(model, typ1) print(anova_table)输出df sum_sq mean_sq F PR(F) C(group) 2.0 760.000 380.000 9.306122 0.003407 Residual 12.0 490.000 40.833 NaN NaN表中第一行就是组间平方和 760、自由度 2、均方 380第二行是组内平方和 490、自由度 12、均方 40.83F 值和 P 值与手算一致。这种代码很适合在 Jupyter Notebook 里跑也能方便地扩展到更多组别、更多重复数据。11. 方差分析的三大前提条件单因素方差分析不是无条件使用的。正常出结果前最好先检查以下三个假设。第一个是独立性。各组观测值应当相互独立比如同一块田里的重复样本不能存在明显的空间关联。这一点通常由实验设计保证无法通过事后统计检验完全克服。第二个是正态性。各组数据应近似服从正态分布。样本量较小时正态性可以通过 Shapiro-Wilk 检验判断样本量较大时中心极限定理让这个问题变得相对不敏感。第三个是方差齐性。各组的总体方差应当大致相等。常用检验方法是 Levene 检验或 Bartlett 检验。如果方差不齐不能直接使用标准 ANOVA 结果而应该考虑 Welch 校正版本。SPSS 的“单因素 ANOVA”选项中就提供了“未假定方差齐性”的替代输出Python 里可以用 scipy.stats.welch_anova 或 statsmodels 的方差校正方法。回到本文案例各组样本量相同Levene 检验通常不会显著因此满足方差齐性假设可以使用标准 F 检验结果。如果数据不满足条件常见的处理方式有对数据进行对数或平方根变换、使用非参数 Kruskal-Wallis 检验、或者使用 Welch 方差分析。方差分析被拒后也可以保留使用更稳健的替代方法。12. 单因素方差分析的常见理解误区12.1 误区一F 值显著就等于所有组两两都有差异F 检验是整体检验它只告诉你“至少有一组均值与其他组不同”但不能告诉你具体是哪几组不同。要找出具体差异需要做事后多重比较比如 LSD、Tukey HSD、Bonferroni 校正等。如果研究者直接根据均值大小下结论可能犯多重比较错误。12.2 误区二组间变异大就一定显著组间变异的大小是一个绝对量判断是否显著时要除以自由度、再除以组内均方。如果组内变异同样很大组间变异的相对优势不明显F 值可能仍然不显著。所以观察结果时不能只看 SSA必须看 SSA 与 SSE 的相对大小。12.3 误区三P 值越小说明效应越大P 值受样本量影响很大。样本量足够大时极小的真实差异也可能被检测为显著。所以报告结果时应该同时报告效应量 η²、F 值和 P 值三者结合才能完整描述分析结果。12.4 误区四把“组内变异”当作一般意义上的“组内误差”组内变异虽然在方差分析中代表“误差”但它其实是来自组内个体之间的随机波动并不代表数据质量不好。同一组内合理存在的差异本来就是随机误差的一部分。理解它是理解 F 分布的起点。13. 自查步骤与一个小案例模板如果你自己拿到一组数据想快速做一次单因素方差分析可以按以下顺序走一遍检查分组数量自变量必须是分类变量至少 2 个水平因变量应该是连续变量。检查样本量每组样本量最好大致均衡极端不平衡会影响方差齐性和检验功效。计算描述统计各组的均值、标准差、最大值、最小值先用整体分布判断是否有明显异常。检验方差齐性如不齐改用 Welch 方差分析。计算 SST、SSA、SSE可手算也可以用统计软件直接输出。计算自由度、MSA、MSE、F 值公式固定不会出错。查 F 分布表或看 P 值判断是否拒绝原假设。如果显著继续做事后多重比较确定具体哪些组之间存在差异。报告结果写出 F 值、自由度、P 值、效应量和事后比较结论。把这套流程记录成文档以后遇到新数据可以直接复用。比如换一组产品测试数据、教学成绩数据、工艺参数数据逻辑完全相同。14. 常见问题与排查思路问题现象可能原因排查方式解决方案F 值计算错误离差平方和或自由度套错用手算先算一遍 SST再验证 SST SSA SSE逐组核对均值、离差平方和SPSS 出现“方差不齐”警告各组样本量差异过大或原始数据分布偏斜查看 Levene 检验的 P 值使用 Welch 校正或数据变换P 值显著但事后比较无差异样本量大效应量极小查看 η² 判断实际效应大小结论中如实说明效应量偏低数据不符合正态性测量值存在离群点绘制箱线图检查离群值确认离群值后考虑剔除或变换分组变量输入为数值但被当作连续变量统计软件未识别因子类型查看变量视图的类型将分组变量定义为名义/类别变量重复测量设计误用单因素方差分析数据存在相关结构梳理实验设计改用重复测量方差分析15. 总结与实践建议单因素方差分析的核心就是把总变异拆成组间变异和组内变异再用均方之比构造 F 统计量做假设检验。这篇文章通过一个 15 个样本、3 个处理组的肥料案例完整计算了 SST、SSA、SSE、自由度、均方、F 值和 P 值并在 SPSS 和 Python 中验证了相同的结论。建议第一次学习时不要急着用软件先拿一组小样本数据手算一遍。只有亲手分解一次总变异才能理解组间变异的本质是“组均值相对于总均值的离散程度”组内变异的本质是“个体相对于组均值的离散程度”。这个理解一旦建立后面再看多因素方差分析、随机效应模型、事后检验原理都会顺畅很多。下一讲可以继续往两个方向深入一个是多重比较方法LSD、Tukey、Bonferroni解决“知道有差异但不知道差异在哪”的问题另一个是双因素方差分析把自变量从一个扩展到两个同时考察交互效应。建议先把当前案例搞明白再做扩展练习。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门