方差是「离均值的平方的平均」,单位被平方了,不好讲给人听。 标准差是方差开根号,回到原来的单位,所以「标准差 8.99 分」这句话能说出口。 pandas 默认 ddof=1,numpy 默认 0。同一列数两个库算出来不一样,就是这里差的。
前两篇讲「中心在哪」,这一篇讲「散得多开」。两个班平均分一样,未必一样稳。 本表语文标准差 8.99、数学 10.66、英语 10.14——数学分得最开。
一、方差:var
语文 80.90、数学 113.56、英语 102.77。 算法是「每个数减均值、平方、加起来、再平均」。平方是为了让正负不抵消。 代价是单位变了:分变成「分的平方」。这个数没法直接讲给人听。
所以方差多用在推导里(比如方差分析),日常报数一律用标准差。
二、标准差:std
语文 8.99、数学 10.66、英语 10.14。方差开根号就是它。 验算:8.99 的平方是 80.90,正好等于方差——两个函数本来就是一家。 数学标准差最大,说明数学这科分得最开;语文最小,最集中。
标准差回到原单位才好讲。「语文标准差 8.99 分」别人一听就懂。 经验说法:正态分布下,约 68% 的数落在均值加减 1 个标准差里。
三、ddof:分母是 n 还是 n-1
pandas 的 std() 默认 ddof=1,分母是 n-1 = 9。
同一列语文:ddof=1 得 8.9944,ddof=0 得 8.5329。差了 0.46。
| 库 | 默认 ddof | 分母 | 算出来 |
|---|---|---|---|
| pandas | 1 | n-1 | 8.9944 |
| numpy | 0 | n | 8.5329 |
为什么默认 n-1?因为样本方差要用它才是总体方差的无偏估计。 这是「同一份数据两个结果」的经典来源。报标准差要么写清 ddof,要么统一用一个库。
四、变异系数:去掉量纲再比
语文标准差 8.99、均值 82.70,变异系数 0.109。 数学标准差 10.66、均值 83.00,变异系数 0.128。数学相对更散。 标准差只能比同量纲的东西。「语文的分散程度」和「月收入的分散程度」不能直接比。
变异系数等于标准差除以均值,没有单位,所以能跨指标比。 经验线:大于 1 通常说明数据很散,小于 0.1 说明相当集中。
五、动手 Demo:方差与标准差:谁的成绩更稳
先算三科方差,再开根号看标准差,然后比 ddof 两种口径的差。 最后算变异系数,给三科排个「相对分散」的顺序。
import pandas as pd
DF = pd.DataFrame({
"语文": [88, 92, 75, 85, 90, 68, 95, 72, 83, 79],
"数学": [92, 95, 68, 88, 73, 82, 91, 65, 86, 90],
"英语": [85, 90, 80, 79, 95, 71, 88, 60, 84, 87],
})
print("方差 %s" % DF.var().round(2).tolist())
print("标准差 %s" % DF.std().round(2).tolist())
S = DF["语文"]
print("ddof=1 %.4f ddof=0 %.4f" % (S.std(), S.std(ddof=0)))
print("8.99 的平方 %.2f" % (S.std() ** 2))
CV = (DF.std() / DF.mean()).round(3)
print("变异系数"); print(CV.to_string())
print("最散的是 %s" % CV.idxmax())
实跑输出:
--------------------------------------------------------------------
方差与标准差:谁的成绩更稳
--------------------------------------------------------------------
① 方差:var
--------------------------------------------------------------------
语文方差 80.90,数学 113.56,英语 102.77。
方差是「每个数减均值的平方,加起来再平均」,单位是原单位的平方。
语文方差 80.90 意思是「分的平方」,这个数没法直接讲给人听。
! 方差好用但不好讲——所以才有标准差:开个根号就回到「分」这个单位。
② 标准差:std
--------------------------------------------------------------------
语文标准差 8.99,数学 10.66,英语 10.14。
数学标准差最大,说明数学这科分得最开;语文最小,最集中。
验算:语文 8.99 的平方是 80.90,正好等于方差。
! 标准差回到原单位才好讲。「语文标准差 8.99 分」这句话别人一听就懂。
③ ddof:分母是 n 还是 n-1
--------------------------------------------------------------------
pandas 的 std() 默认 ddof=1,分母是 n-1=9。
ddof=1 得 8.9944,ddof=0 得 8.5329。
numpy 默认 ddof=0。同一列数,两个库算出来不一样,就是因为这个。
! 这是「同一份数据两个结果」的经典来源。报标准差要么写清 ddof,要么统一用一个库。
④ 变异系数:去掉量纲再比
--------------------------------------------------------------------
语文均值 82.70、标准差 8.99,变异系数 0.109。
数学均值 83.00、标准差 10.66,变异系数 0.128。
标准差只能比同量纲的东西。要拿语文的分散程度和「月收入」比,就得用变异系数。
! 变异系数 = 标准差除以均值,没有单位。大于 1 通常说明数据很散。
S.std() 平方一下等于 S.var(),打出来是同一个数——这是最省事的自检办法。
ddof 差一点点,报告里的数就差一位。两个库混用时一定要对齐口径。
30 秒实验
- 把某一行整体加 10 分(全班都加分),看标准差变不变。
- 把某一行改成 100 分,看标准差怎么跳。
- 想一想:如果两个班平均分一样,标准差一个 5 一个 15,哪个班更好带?
常见误区
- 报方差当分散程度讲:单位是平方,别人听不懂。
- pandas 和 numpy 混着算标准差:同一列数两个结果,对账对不上。
- 拿标准差跨指标比:分和万元比不了,得用变异系数。
- 以为标准差越小越好:考试分数越小越齐,但收益、创新这类指标太齐未必是好事。
自测三问(点开对答案)
1. 方差和标准差是什么关系? —— 标准差是方差开根号。开根号是为了把单位从「平方」拉回原单位。 2. 为什么 pandas 和 numpy 算出的标准差不一样? —— 分母不同:pandas 默认 n-1(ddof=1),numpy 默认 n(ddof=0)。 3. 什么时候该用变异系数? —— 要比两个量纲不同的东西谁更分散时。它等于标准差除以均值,没有单位。中心、分散都讲完了。下一篇是按位置切:分位数。
- ☐ (本篇完,下一篇 4.4 分位数:一刀切掉 35%)