跳转至

2.7   极差与四分位距

小率已经知道标准差能描述“散不散”。但他又遇到一个新问题。

咖啡店老板拿来一串外卖送达时间:

\[ 18,\ 20,\ 21,\ 22,\ 24,\ 25,\ 25,\ 26,\ 27,\ 28,\ 29,\ 30,\ 31,\ 32,\ 33,\ 34,\ 36,\ 37,\ 41,\ 78 \]

大多数订单都在 20 到 40 分钟之间送达,最后却有一个 78 分钟。小率皱起眉头。

如果只看最大值和最小值,78 分钟会不会把整个故事带偏?

均哥点点头。

所以我们需要一种既能看范围,又不被极端值牵着走的方法。

均哥和小率用箱线图检查外卖送达时间

本节要讲三个工具:极差(Range)、四分位距(Interquartile Range, IQR)和箱线图(Box Plot)。

它们和标准差一样,都在描述“散不散”,但视角不同。标准差会让每个点都参与计算;极差只看最远的两端;IQR 只看中间一半。理解这些差异,比记住公式更重要。


2.7.1   极差:最快扫一眼范围

极差(Range) 是最大值和最小值的差:

\[ R=x_{\max}-x_{\min} \]

在外卖例子里:

\[ R=78-18=60 \]

这说明最慢和最快之间差了 60 分钟。

极差的优点是直观:一眼知道跨度有多大。

但它也很脆弱:它只看两个点。

如果 78 分钟是因为暴雨、骑手摔车、商家漏单或顾客地址填错,它可能是值得单独调查的特殊情况。此时极差会把整组数据描述得“非常夸张”。

极差像把最左边和最右边拉开看,但中间发生了什么,它完全不知道。
对。极差适合快速扫一眼,不适合单独支撑结论。

极差常适合做第一眼检查。例如一份年龄数据极差是 98 岁,说明样本横跨婴儿到老人;一份考试成绩极差是 5 分,说明大家分数非常接近;一批产品重量极差突然变大,可能提示生产过程有异常。

但极差的问题也正来自它太快:它完全不关心中间 98% 的数据。如果只有一个录入错误,极差就会被拉得很夸张。


2.7.2   四分位数:把排好队的数据切成四段

要看“中间大多数”的范围,我们先把数据从小到大排好。

四分位数会把这支队伍切成四段:

  • \(Q_1\):第 25% 位置,四分之一数据在它以下。
  • \(Q_2\):第 50% 位置,也就是中位数。
  • \(Q_3\):第 75% 位置,四分之三数据在它以下。

在很多统计软件里,四分位数的具体计算方式可能略有差别,但核心直觉不变:

\(Q_1\)\(Q_3\) 之间,是中间一半数据的活动范围。

四分位距(Interquartile Range, IQR) 定义为:

\[ \mathrm{IQR}=Q_3-Q_1 \]

它只看中间 50% 的数据,因此比极差更不怕极端值。

你可以把 IQR 想成“普通订单的主要活动区间”。在外卖例子里,如果 \(Q_1=24\) 分钟、\(Q_3=34\) 分钟,那么中间一半订单大约集中在 24 到 34 分钟之间。这个信息比“最慢 78 分钟”更能描述大多数顾客的体验。

所以 IQR 不是看全部范围,而是看中间那块最稳定的范围。
对。它牺牲两端细节,换来对极端值的耐受。

2.7.3   箱线图:把五个关键信息放在一张图里

箱线图(Box Plot)是描述分布的压缩图。它把中位数、四分位数、IQR 和可能的异常点放在一起。

图 2.7.1 箱线图结构

图 2.7.1   箱线图把中位数、四分位数、IQR 和可能的异常值放在一张图里。

读箱线图时,先看这几件事:

元素 含义 读图时问什么
箱体中线 中位数 \(Q_2\) 典型水平在哪里
箱体两边 \(Q_1\)\(Q_3\) 中间一半数据在哪
箱体长度 IQR 中间一半散得多开
非异常范围内的较小/较大值 普通范围大概到哪里
单独的点 可能异常值 值得检查来源吗

箱线图不是为了让图看起来高级,而是为了快速回答:中心在哪里?中间一半有多宽?有没有可疑的远点?

读箱线图时可以按“中间、箱子、尾巴、远点”四步走:

  1. 看中位数线:典型水平在哪里。
  2. 看箱体长度:中间一半数据是否集中。
  3. 看上下两根须:普通范围是否对称。
  4. 看单独点:有没有需要追问的异常值。

这样读,箱线图就不再是一堆线条,而是一份压缩后的分布报告。


2.7.4   异常值规则不是定罪书

箱线图常用一个经验规则标记异常值:

\[ \text{低于 }Q_1-1.5\mathrm{IQR}\quad \text{或高于 }Q_3+1.5\mathrm{IQR} \]

的点,会被标出来。

但注意:被标出来不等于一定错误。

它只是提醒你:“这个点离其他数据比较远,最好检查一下。”

可能原因包括:

  • 记录错误:时间录成了 78,其实是 28。
  • 特殊事件:暴雨、交通事故、设备故障。
  • 真实但罕见:确实有一个订单等了很久。
  • 群体混合:某些远距离订单和普通订单混在一起。

异常值不是坏人

异常值可能是错误,也可能是最有价值的信息。不要机械删除。先查来源,再决定保留、修正、分组还是单独说明。

一个好的异常值处理流程通常是:

  1. 先确认记录:是不是单位错了、录入错了、小数点错了。
  2. 再查背景:是不是暴雨、活动、促销、故障等特殊事件。
  3. 再决定分析方式:保留、修正、删除、分组,或在报告中单独说明。

最危险的做法是为了让图“更好看”就偷偷删掉异常点。统计报告里,异常值处理必须可解释、可复查。


2.7.5   比较多组数据时,IQR 很有用

如果两家门店的中位送达时间都差不多,我们还想知道哪家更稳定。

这时箱线图很方便。

图 2.7.2 两组数据的箱线图比较

图 2.7.2   中位数接近时,IQR 更小的一组通常更稳定;异常点提示需要进一步检查来源。
箱子越短,中间一半数据越集中?
对。箱体就是中间一半数据的活动范围。

极差、标准差和 IQR 都能描述离散程度,但它们关注点不同:

图 2.7.3 离散指标对比

图 2.7.3   极差、标准差和 IQR 都描述离散程度,但对极端值的敏感程度不同。
指标 看什么 对极端值敏感吗
极差 最大值和最小值 非常敏感
标准差 每个值离均值多远 敏感
IQR 中间 50% 的范围 不太敏感

在比较多组数据时,IQR 常常比极差更公平。比如两家门店各有一单特别迟到,极差都会很大;但如果其中一家大多数订单都很稳定,另一家中间一半订单也很分散,箱线图会把这个差异显示出来。

那报告离散程度时,我应该写标准差还是 IQR?
先看分布。对称、无明显异常值,用标准差很好;偏态、有异常值,用 IQR 更稳。

2.7.6   用 Python 计算 IQR

import numpy as np

data = np.array([18, 20, 21, 22, 24, 25, 25, 26, 27, 28,
                 29, 30, 31, 32, 33, 34, 36, 37, 41, 78])

q1, q2, q3 = np.percentile(data, [25, 50, 75])
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr

print(f"Q1 = {q1:.1f}")
print(f"中位数 Q2 = {q2:.1f}")
print(f"Q3 = {q3:.1f}")
print(f"IQR = {iqr:.1f}")
print(f"异常值检查范围:{lower:.1f}{upper:.1f}")
print(data[(data < lower) | (data > upper)])

完整配套脚本

本节配套脚本在 docs/assets/scripts/ch02_descriptive/07_range_and_iqr.py,可以复现四分位数、IQR 和箱线图。

小率的笔记本

  • 极差等于最大值减最小值,直观但非常怕极端值。
  • 四分位数把排序后的数据切成四段,IQR 是 \(Q_3-Q_1\)
  • IQR 描述中间 50% 数据的范围,比极差更稳健。
  • 箱线图适合快速比较多组数据的中心、离散和异常点。
  • 异常值规则是提醒,不是定罪;先查来源,再做处理。
  • 对称数据常配均值和标准差;偏态或有异常值时,常配中位数和 IQR。