📊 第4章 Pandas 进阶
📄 一句话概括

方差是「离均值的平方的平均」,单位被平方了,不好讲给人听。 标准差是方差开根号,回到原来的单位,所以「标准差 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 秒实验

  1. 把某一行整体加 10 分(全班都加分),看标准差变不变。
  2. 把某一行改成 100 分,看标准差怎么跳。
  3. 想一想:如果两个班平均分一样,标准差一个 5 一个 15,哪个班更好带?

常见误区

  1. 报方差当分散程度讲:单位是平方,别人听不懂。
  2. pandas 和 numpy 混着算标准差:同一列数两个结果,对账对不上。
  3. 拿标准差跨指标比:分和万元比不了,得用变异系数。
  4. 以为标准差越小越好:考试分数越小越齐,但收益、创新这类指标太齐未必是好事。
自测三问(点开对答案) 1. 方差和标准差是什么关系? —— 标准差是方差开根号。开根号是为了把单位从「平方」拉回原单位。 2. 为什么 pandas 和 numpy 算出的标准差不一样? —— 分母不同:pandas 默认 n-1(ddof=1),numpy 默认 n(ddof=0)。 3. 什么时候该用变异系数? —— 要比两个量纲不同的东西谁更分散时。它等于标准差除以均值,没有单位。

中心、分散都讲完了。下一篇是按位置切:分位数。

相关笔记