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

中位数是排队站中间那个,改一个极端值它几乎不动。 众数是出现最多的值,可能不止一个,也可能一堆值全算众数。 均值、中位数、众数三个数不一样是正常的,报哪个要说清。

📝 本章和前面几章的关系

上一篇的四个量都吃全部数据,一个极端值就能带跑。这一篇讲两个抗造的量。 本表的语文中位数 84.0、均值 82.70,两个数已经不一样了。

一、中位数:median

语文 84.0、数学 87.0、英语 84.5。 10 个数是偶数个,中位数取中间两个的平均,所以会出现 84.5 这种值。 中位数只看「排第几」,不看「值多大」。所以它天然不怕极端值。

语文均值 82.70、中位数 84.0——均值偏低,说明低分那几个人把均值往下拉了。

二、改一个极端值看差别

把张伟的语文从 88 改成 200(模拟一个录错的分数)。 改完均值 93.90,涨了 11.20 分;中位数一点没动,还是 84.0。

指标 改之前 改之后 变化
均值 82.70 93.90 +11.20
中位数 84.0 84.0 0

一个数就把均值带跑了 11 分,中位数纹丝不动。这就是「抗极端值」。 看收入、房价、客单价这类数据,第一眼要看中位数。 少数极高值能把均值抬到失真,中位数抬不动,因为它只关心中间站的是谁。

三、众数:mode

语文的 mode 返回 10 个值,数学也返回 10 个——这两列都没有重复分。 mode 不会说「没有众数」,它把每个值都当成众数还回来,等于没给答案。 造一列 80、80、90、90、85,众数是 80、90 两个——众数可以不止一个。

再加一个 90 变成 80、80、90、90、90、85,众数只剩 90——谁多谁赢。 用 mode 之前先数一下返回了几个:1 个有用,10 个等于白跑。

四、三个「平均数」怎么选

指标 抗极端值 适合什么数据
均值 mean 不抗 分布比较对称
中位数 median 抗 有极端值、偏斜分布
众数 mode 抗 分类数据、看最常见

语文这三个数:均值 82.70、中位数 84.0、众数一堆。三个数不一样完全正常。 报数的时候要说清报的是哪一个,不然「平均分」这三个字能引出三种答案。 严谨的写法:「语文平均分 82.70(中位数 84.0)」——两个都给,读者自己判断。

五、动手 Demo:中位数与众数

先算三科中位数,再造一个 200 分的极端值看均值和中位数各动多少。 最后用两列小编号演示众数的两种情形。

import pandas as pd

A = pd.Series([88, 92, 75, 85, 90, 68, 95, 72, 83, 79])
B = pd.Series([92, 95, 68, 88, 73, 82, 91, 65, 86, 90])

print("中位数 %.1f  均值 %.2f" % (A.median(), A.mean()))

C = A.copy()
C[0] = 200
print("改 200 后:中位数 %.1f  均值 %.2f" % (C.median(), C.mean()))
print("均值涨了 %.2f,中位数动了 %.1f"
      % (C.mean() - A.mean(), C.median() - A.median()))

print("语文众数 %d 个,数学众数 %d 个" % (A.mode().size, B.mode().size))
print("80/80/90/90/85 的众数:%s" % pd.Series([80, 80, 90, 90, 85]).mode().tolist())
print("再来一个 90:%s" % pd.Series([80, 80, 90, 90, 90, 85]).mode().tolist())

实跑输出:

--------------------------------------------------------------------
中位数与众数
--------------------------------------------------------------------

  ① 中位数:median
  --------------------------------------------------------------------
  语文中位数 84.0,数学 87.0,英语 84.5。
  10 个数是偶数个,中位数取中间两个的平均,所以会出现 .5 这种值。
  语文均值 82.70、中位数 84.0,两个数不一样:均值被极端分拉着走,中位数不受影响。
  ! 看收入、房价这类数据要看中位数。少数极大值能把均值抬到失真,中位数抬不动。

  ② 造一个极端值看看差多少
  --------------------------------------------------------------------
  把张伟的语文从 88 改成 200(一个录错的分数)。
  改完均值 93.90,中位数 84.0。
  均值涨了 11.20 分,中位数只动了 0.0 分。一个数就把均值带跑了。
  ! 这就是「抗极端值」的意思:中位数只看排队站中间那个人,不管队尾站了多高的。

  ③ 众数:mode
  --------------------------------------------------------------------
  语文的 mode 返回 10 个值,数学也返回 10 个——两列都没有重复分。
  mode 不会说「没有众数」,它把每个值都当成众数还回来,等于没给答案。
  造一列 80、80、90、90、85:众数是 80、90,两个。
  再加一个 90 变成 80、80、90、90、90、85:众数只剩 90。
  ! 众数可能不止一个,也可能全都能算。用之前先数一下返回了几个值。

  ④ 三个「平均数」怎么选
  --------------------------------------------------------------------

| 指标 | 抗极端值 | 适合什么数据 |
|---|---|---|
| 均值 mean | 不抗 | 分布比较对称 |
| 中位数 median | 抗 | 有极端值、偏斜分布 |
| 众数 mode | 抗 | 分类数据、看最常见 |

  语文这三个数:均值 82.70、中位数 84.0、众数一堆。三个数不一样是正常的。
  报数的时候要说清报的是哪一个,不然「平均分」这三个字能引出三种答案。

S2[0] = 200 是按行标签改,第 0 号就是张伟——这里没换过标签,标签 0 就是第 1 行。 均值和标准差会被极端值带跑,中位数和众数不会。这是选指标时最要紧的一条。

30 秒实验

  1. 把 200 改成 60(极低),看均值往哪边动、中位数动没动。
  2. 给语文加一个 88(和原来重复),再看 mode 返回几个值。
  3. 想一想:如果一份收入数据里 90% 的人月薪 5000,1% 的人月薪 100 万,均值和中位数差多少?

常见误区

  1. 只报均值不报中位数:极端值把这一个数带跑了,读者还以为看懂了。
  2. 以为 mode 一定给一个值:可能给十个,也可能给零个(全是缺失时)。
  3. 把中位数当均值用:中位数不参与加减,算总额还得用均值乘人数。
  4. 偶数个数据以为中位数是某个真实值:它是插出来的平均,可能没人考这个分。
自测三问(点开对答案) 1. 为什么中位数抗极端值? —— 它只看排名位置,不看数值大小。把一个数改成 200 或 2000,它还是排最后,中间那个人不变。 2. mode 返回 10 个值说明什么? —— 说明这一列没有重复值,每个值都出现一次,mode 把它们全算成众数了。 3. 报「平均分」时最稳妥的写法是什么? —— 均值和中位数一起给,例如「平均 82.70(中位数 84.0)」,读者能看出有没有被极端值拉偏。

均值和中间值都有了,但它们只说「中心在哪」。下一篇说「散得有多开」。

相关笔记