中位数是排队站中间那个,改一个极端值它几乎不动。 众数是出现最多的值,可能不止一个,也可能一堆值全算众数。 均值、中位数、众数三个数不一样是正常的,报哪个要说清。
上一篇的四个量都吃全部数据,一个极端值就能带跑。这一篇讲两个抗造的量。 本表的语文中位数 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 秒实验
- 把 200 改成 60(极低),看均值往哪边动、中位数动没动。
- 给语文加一个 88(和原来重复),再看 mode 返回几个值。
- 想一想:如果一份收入数据里 90% 的人月薪 5000,1% 的人月薪 100 万,均值和中位数差多少?
常见误区
- 只报均值不报中位数:极端值把这一个数带跑了,读者还以为看懂了。
- 以为 mode 一定给一个值:可能给十个,也可能给零个(全是缺失时)。
- 把中位数当均值用:中位数不参与加减,算总额还得用均值乘人数。
- 偶数个数据以为中位数是某个真实值:它是插出来的平均,可能没人考这个分。
自测三问(点开对答案)
1. 为什么中位数抗极端值? —— 它只看排名位置,不看数值大小。把一个数改成 200 或 2000,它还是排最后,中间那个人不变。 2. mode 返回 10 个值说明什么? —— 说明这一列没有重复值,每个值都出现一次,mode 把它们全算成众数了。 3. 报「平均分」时最稳妥的写法是什么? —— 均值和中位数一起给,例如「平均 82.70(中位数 84.0)」,读者能看出有没有被极端值拉偏。均值和中间值都有了,但它们只说「中心在哪」。下一篇说「散得有多开」。
- ☐ (本篇完,下一篇 4.3 方差与标准差:谁的成绩更稳)