样本方差是除以 n-1,样本的二阶中心矩是除以 n。这个区别初学者第一次遇到时几乎都会懵:明明公式长得就差一个分母,为什么统计学家要搞出两个这么像的东西?而且更让人头疼的是,打开 Excel 算出的是“方差”,用 Python 的 numpy 算出的是另一个“方差”,自己拿计算器按出来的又是第三个值,到底哪个是对的?
这个问题不只是考试里的概念辨析,它直接决定你在做数据分析、写报表、跑实验时,结论会不会系统性地偏移。尤其当数据量只有几十条甚至十几条时,用错分母,标准差的差别能达到百分之十几,这足以影响业务决策或者论文结论。这篇文章就把这件事彻底讲透:两个指标各自想表达什么,n-1 背后的自由度到底是什么,算数据时应该用哪一个,以及我在实际工作中踩过的那些坑。
1. 先分清两个“长得几乎一样”的公式
1.1 一字之差的两个定义
假设有一组样本数据 $x_1, x_2, \dots, x_n$,样本均值记为 $\bar{x}$,那么:
样本的二阶中心矩定义为:
[ m_2 = \frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})^2 ]
而样本方差(更准确地说,是无偏样本方差)定义为:
[ s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})^2 ]
两者唯一的区别就是分母。一个是 n,一个是 n-1。也正是这个“-1”,让它们在实际含义上分道扬镳。
先别被术语吓到。“二阶中心矩”这个名字听起来很数学,但拆开看也不难:“矩”可以理解成数据分布形状的特征值,“二阶”对应的是平方项,“中心”指的是以均值为中心计算距离。所以二阶中心矩本质就是“离均值的平方距离的平均值”,也就是我们直觉里对“分散程度”的第一反应。而样本方差,则是统计学里为了“用样本估计总体”而特意修正过的版本。
1.2 从数据视角看两者分别想表达什么
如果拿到一组数据,只想单纯描述这一组数字本身的波动有多大,不打算推断任何外部总体,那么二阶中心矩就是最直观的选择。它计算的就是“这 n 个点偏离它们自身均值的平均平方距离”,除以 n 非常自然,因为你拥有 n 个点,就按 n 个点来平均。
但如果这组数据只是从一个更大的总体里随机抽出来的样本,你想通过它去估计总体的真实方差,直接用二阶中心矩就会出事——它会系统性低估总体方差。这也是为什么统计学家要引入 n-1 的原因:为了让估计量在“平均意义”上对准总体真实方差,必须把分母调小一点,补偿因为使用了样本均值而产生的偏差。
用最直白的话概括:二阶中心矩是“描述样本本身”,样本方差是“推断样本背后的总体”。前者是描述统计的范畴,后者是推断统计的范畴。理解了这句话,后面所有的推导都会顺理成章。
2. 拆开 n-1:均值吃掉的那个自由度
2.1 均值一旦算出来,n 个离差就只剩 n-1 个自由
“自由度”是理解 n-1 的关键,但也是很多教材讲得最含糊的地方。我试着用一个类比把它讲清楚。
想象你有 3 个未知数,没有任何限制时,它们可以自由取任意值,自由度是 3。但如果我告诉你这 3 个数的平均数必须是 10,那么一旦前两个数定了,第三个数就被锁死了,没有自由选择的余地。比如前两个数取 9 和 11,第三个数只能是 10。所以,在“和为 30”(等价于均值为 10)这个约束下,自由变量的数量从 3 变成了 2。
同样的道理,样本里有 n 个数据点,每个点看起来都能自由变化。但当你把 $\bar{x}$ 算出来的那一刻,就相当于给这 n 个数施加了一个约束:所有 $x_i$ 的离差之和必须为 0,因为
[ \sum_{i=1}^{n}(x_i - \bar{x}) = \sum_{i=1}^{n}x_i - n\bar{x} = 0 ]
这个约束是硬性的。所以 n 个离差 $x_i - \bar{x}$ 中,只有 n-1 个是可以独立变动的,最后一个会被“推”出来。这就是“自由度”的含义。
计算离差平方和的时候,你实际上是拿着这 n-1 个独立信息去计算的,而不是 n 个。在分母上用 n,相当于把不存在的“自由度”也算进去了,平均的结果自然会偏低。
2.2 用一组小数字亲手算一遍
光说理论不够,拿一组实际数字走一遍流程。假设有 5 个样本值:2, 4, 6, 8, 10。
样本均值是:
[ \bar{x} = \frac{2+4+6+8+10}{5} = 6 ]
各点离均值的差分别是 -4、-2、0、2、4。注意看,这 5 个离差的和为 0,所以只要知道了前 4 个(-4、-2、0、2),最后一个自然就是 4。这组数据虽然表面上给了你 5 个数字,但在离差这个维度上,真正的独立信息只有 4 份。
离差平方和为:
[ (-4)^2 + (-2)^2 + 0^2 + 2^2 + 4^2 = 16 + 4 + 0 + 4 + 16 = 40 ]
二阶中心矩就是:
[ m_2 = \frac{40}{5} = 8 ]
样本方差则是:
[ s^2 = \frac{40}{4} = 10 ]
两者差了 2,标准差则分别是约 2.83 和约 3.16。如果你是在用样本估计某个总体的分散程度,那么 8 这个数字就偏小了,10 才是更接近总体的估计。在这个例子里,因为 n 只有 5,差了整整百分之十以上,完全不能忽略。
3. 猜对与猜准:无偏性是怎么一回事
3.1 估计量会“系统性地偏低”?
有人可能会问:自由度解释听起来有道理,但“除以 n 会系统性偏低”这个说法到底是怎么来的?能不能直观感受一下?
当然可以。想象你从一个大总体里反复抽小样本,比如总体均值已知的情况下,每次抽 3 个数据点,计算二阶中心矩。你会发现,大多数时候,这个值小于总体的真实方差,偶尔等于或大于,但平均下来就是不到真实值。
原因是,样本均值 $\bar{x}$ 本身是通过这 n 个数据拟合出来的,它总是落在数据点的“中心附近”,所以大多数点到 $\bar{x}$ 的平方距离,必然小于它们到总体真实均值 $\mu$ 的平方距离。数据离 $\bar{x}$ 越近,计算出来的离差平方和就越小。把 n 个距离平方后除以 n,得到的是一个偏小的值。只有当样本量足够大,$\bar{x}$ 足够接近 $\mu$ 时,这个偏差才会缩小。
统计上,这种“平均而言偏低”的性质叫“有偏”。我们不喜欢有偏的估计量,因为在使用估计量时,我们希望它在重复抽样下的期望值等于真实值,这样至少方向上不会骗人。
3.2 数学上的严格推演
既然要做数据分析,光有直觉不够,最好还是把期望算一遍,这样以后任何变体都不会再难倒你。
对于独立同分布的样本 $x_i$,记总体均值为 $\mu$,总体方差为 $\sigma^2$。首先有:
[ E\left[\sum_{i=1}^{n}(x_i - \bar{x})^2\right] = E\left[\sum_{i=1}^{n}\big((x_i - \mu) - (\bar{x} - \mu)\big)^2\right] ]
展开得到:
[ E\left[\sum_{i=1}^{n}(x_i - \mu)^2 - n(\bar{x} - \mu)^2\right] ]
因为:
[ E\left[\sum_{i=1}^{n}(x_i - \mu)^2\right] = n\sigma^2 ]
而 $\bar{x}$ 的方差是 $\sigma^2 / n$,所以:
[ E\left[n(\bar{x} - \mu)^2\right] = n \cdot \frac{\sigma^2}{n} = \sigma^2 ]
因此:
[ E\left[\sum_{i=1}^{n}(x_i - \bar{x})^2\right] = (n-1)\sigma^2 ]
也就是说,离差平方和的期望恰好是 $(n-1)\sigma^2$。为了让估计量的期望等于 $\sigma^2$,就必须除以 n-1:
[ E[s^2] = E\left[\frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})^2\right] = \sigma^2 ]
这就是“无偏性”的数学来源。整个过程的核心就是:样本均值代替总体均值,平均而言会“吃掉”一个单位的 $\sigma^2$,所以要在分母上还回来。这比死记“自由度 n-1”更根本,也更不容易忘。
4. 实操中应该用哪个:工具默认值一览
4.1 主流工具默认分母各是什么
理论清楚了,落到实际工具上还是容易踩坑。因为不同软件、不同函数的默认设置并不一样,同样的数据,换个工具结果可能就变了。我把常见工具的默认行为整理成一个表,方便对照。
| 工具/函数 | 默认分母 | 对应统计量 | 使用建议 |
|---|---|---|---|
| Excel STDEV.S | n-1 | 样本标准差 | 默认推断总体时用 |
| Excel STDEV.P | n | 总体标准差 | 明确知道数据是全部总体时用 |
| Excel VAR.S | n-1 | 样本方差 | 同上 |
| Excel VAR.P | n | 总体方差 | 同上 |
| NumPy np.var(x) | n | 二阶中心矩 | 手动指定 ddof=1 才是样本方差 |
| np.std(x) | n | 总体标准差 | ddof=1 与 Excel STDEV.S 对齐 |
| Pandas df.var() | n-1 | 样本方差 | 默认无偏,符合统计习惯 |
| Pandas df.std() | n-1 | 样本标准差 | 默认无偏 |
| R var() | n-1 | 样本方差 | 默认无偏 |
| R sd() | n-1 | 样本标准差 | 默认无偏 |
| SPSS 默认描述统计 | n-1 | 样本方差 | 描述统计里的“方差”指样本方差 |
| SQL STDDEV() | n-1 | 样本标准差 | 视数据库实现而定 |
| SQL STDDEV_POP() | n | 总体标准差 | 显式总体版本 |
从这张表能看出一个规律:偏数学/工程取向的函数(比如 NumPy)默认用 n,偏统计推断取向的函数(比如 Pandas 和 R)默认用 n-1。这个差异不是bug,是设计取向不同。但如果你不懂原理,就很容易拿 NumPy 直接算完当样本方差汇报,结果数值偏小。
4.2 描述性分析与推断分析的正确选择
那么,实际分析时到底该用哪个?这里给出我自己的判断标准。
如果目标只是“描述这批数据本身”,数据就是全部关心的对象,不打算推广到更大范围,那描述统计量完全可以用二阶中心矩。比如业务报表里描述一周七天的销量波动,这七天就是全部,不打算用它们推断其他周,那除以 7 无可厚非。
一旦目标变成“用这批样本去估计某个总体参数”,就必须用样本方差 n-1。比如从一万个用户里随机抽 500 人做调研,用这 500 人的消费波动去估计全体用户的消费波动,属于推断统计,必须用 n-1。这时如果用了 n,估计值就会系统性偏低,而且在样本量较小时偏差明显。
还有个折中的实用建议:在报告或代码中,只要不是明确做“总体穷尽”统计,一律用样本方差。这个习惯可以帮你避免绝大多数问题。判断不明确时,优先 n-1 总是更安全的选择,因为统计教科书的默认语境就是推断。
5. 常见问题与避坑清单
5.1 样本量大了以后,两者几乎没差别,要不要在乎?
当 n 达到几百几千时,n 和 n-1 的差别已经很小。比如 n=1000 时,比值是 1000/999,差距千分之一,通常不影响结论。于是有人会想:既然差不多,那我统一用 n 不是更省事吗?
我的看法是:省事可以,但前提是你清楚自己在舍弃什么。在小样本场景(比如实验组只有 20 个样本),这个差异会放大到百分之五,已经绝非可忽略的噪声。更重要的是,如果协作团队里有统计学背景的人,看到分母用的是 n,第一反应往往是“这个分析的人不懂统计”,这会严重影响报告的可信度。所以,不管数值差多少,该用 n-1 的场景就老老实实用 n-1,这既是技术正确,也是职业信用。
5.2 为什么用 NumPy 算出来的“方差”总是比 Excel 小?
这是我最常被问到的实操问题。原因其实就一句话:NumPy 的 np.var(x) 默认算的是总体方差/二阶中心矩,分母是 n;Excel 的 VAR.S 算的是样本方差,分母是 n-1。两个函数根本不是同一个指标。
解决办法很简单,在 NumPy 里显式指定 ddof:
import numpy as np x = np.array([2, 4, 6, 8, 10]) # 二阶中心矩,分母为 n m2 = np.var(x) # 8.0 # 样本方差,分母为 n-1 sample_var = np.var(x, ddof=1) # 10.0 # 样本标准差 sample_std = np.std(x, ddof=1) # 3.162...pandas 的 Series/DataFrame 的 var() 默认已经是 n-1,但同样也有一个 ddof 参数可以调整。我的建议是:所有关键分析代码里,显式写明 ddof 参数,不依赖默认值。这样既防止自己记忆模糊,也让看代码的人一眼明白你算的是哪个指标。
5.3 数据分析时的实际避坑经验
下面几条是我在实际项目里积累的小经验,也算踩坑后的总结,分享出来供参考。
第一,写 SQL 时最好先确认数据库的方差函数语义。不同数据库对 STDDEV、VAR 这类函数的定义可能不同,有的默认 n-1,有的是总体版本。最稳妥的做法是直接用 VAR_POP 和 VAR_SAMP 这样带明确后缀的函数,让脚本的语义自解释。
第二,在实验报告中,建议同时标明“样本量 n”和“用的是什么分母”,因为审稿人或业务方经常会追问数值差异。如果你不说清楚,别人默认你用的是无偏样本方差,一旦他手算用的是分母 n,两个结果对不上,解释成本很高。
第三,处理加权数据时要额外小心。加权后的方差公式不只是把权重乘进平方项那么简单,分母的选择在不同加权方案下差异更大。遇到加权场景,建议直接查权威文档,不要凭经验想当然。
最后一条是关于直觉的:每当你看到“某个统计量在公式里有个奇怪的分母”时,不要直接跳过。这些“奇怪”往往是对称性补偿的结果,理解它远比记住它有价值。
6. 无偏性之外:还有哪些关于方差的重要思维
6.1 为什么样本标准差“无偏修正”不管用
讲到样本方差,就不得不提一个容易混淆的进阶问题:既然样本方差要除以 n-1 才是无偏估计,那样本标准差是不是应该开根号就行?答案是:开根号后,期望就不再等于总体标准差。
原因在于平方根是一个非线性函数。即使 $s^2$ 的期望正好等于 $\sigma^2$,$E[\sqrt{s^2}]$ 也不会等于 $\sqrt{\sigma^2}$。严格来说,样本标准差在“平均意义”下仍然偏小。但实践中,我们依然把 $s = \sqrt{s^2}$ 当作总体标准差的估计,因为它简单且在大样本下偏差趋于零。这个问题在很多统计教材里都是一笔带过,但理解它,可以帮你避免和较真的人讨论时被问住。
6.2 方差的量纲与稳健性
方差的一大缺点是量纲是原始单位的平方,所以实际分析中更多使用标准差来沟通,因为它和原始数据同单位。而二阶中心矩这个概念在机器学习中更常见于“矩”的系统框架里:一阶矩是均值,二阶中心矩是方差,三阶中心矩偏度,四阶中心矩峰度。在这个框架下,二阶中心矩不会刻意区分 n 和 n-1,因为机器学习更关注数据本身的形态特征,而不是总体推断。
理解这个背景之后,你就明白为什么很多机器学习/深度学习框架的默认统计量都基于 n,而传统统计分析软件普遍校准到 n-1。不同学科、不同场景的取舍,塑造了工具的默认行为。这也就是文章标题那句“样本的方差和样本的二阶中心矩并不一样”背后最核心的答案:两者根本就是两个不同目的下的产物,分母的差异只是表象。
我在实际项目中的体会是,这个东西一旦理解透了,以后看到任何统计函数,第一反应就是确认它的分母设计,而不用靠记忆硬背。这份确定性,是真正调过无数报表、啃过不少文档之后才获得的。