很多人学统计学到描述性统计这一章,会觉得均值、中位数、众数算完就差不多了,四分位数看一眼定义,知道它是"把数据四等分的三个点",然后就翻篇了。我当初也是这么想的,直到有一次帮人看一批收入数据,均值算出来挺体面,中位数也不算难看,但真正把四分位数拉出来一看,才发现底下藏着一大截被平均值彻底掩盖的极端情况。从那之后我才意识到,集中趋势分析里,均值和中位数只是"一个点",而四分位数给的是一组"位置坐标",它们回答的根本不是同一个问题。
这篇日记式的总结,就是围绕四分位数和各类均值的比较展开的。核心想讲清楚三件事:四分位数到底在描述什么、它和均值中位数各自适合什么场景、以及在实际动手算的时候有哪些容易翻车的地方。适合刚学完描述性统计、正在被"到底该用哪个指标"困扰的朋友,也适合已经工作、需要拿数据说话但不想被平均值忽悠的人。我会尽量用生活化的例子把原理讲透,再补上可以直接抄的操作步骤和踩坑经验,读完你至少能做到:拿到一组数据,知道先看什么、后看什么,以及为什么。
1. 为什么单看均值会让人误判:从一个收入样本说起
1.1 均值"体面"背后的失真
先摆一组我自己编的、但很贴近现实的数据。假设某个小团队有 10 个人,月收入(单位:千元)分别是:
3, 4, 4, 5, 5, 6, 7, 8, 10, 48算一下均值:(3+4+4+5+5+6+7+8+10+48) / 10 = 100 / 10 = 10。均值是 10 千元,也就是一万块。听起来还行对吧?但你把这组数据从头看到尾,会发现除了最后那个 48,其余 9 个人全在 3 到 10 之间,绝大多数人根本够不到 10 这个数。均值被那个 48 硬生生往上拽了一大截。
这就是均值对极端值极度敏感的典型表现。它的数学本质是"所有数值的总和平均分摊到每个观测上",所以任何一个离群点都会按 1/n 的权重直接拉动结果。数据量越小,单个极端值的影响越夸张。上面这组里,48 一个人就贡献了 4.8 的均值增量,占了均值的一半。
那中位数呢?把数据排序后取中间两个数的平均:(5+6)/2 = 5.5。中位数 5.5 千元,明显更贴近大多数人的真实处境。中位数只关心"排在最中间的那个位置是谁",极端值再大,只要不改变排序位置,它就纹丝不动。这就是中位数的稳健性。
但问题来了:中位数告诉你"中间是 5.5",可它没告诉你"中间之外的人分布成什么样"。是大家都挤在 5 附近,还是从 3 一路铺到 48?这两种情况中位数可能一样,但数据的"性格"完全不同。这时候就轮到四分位数登场了。
1.2 四分位数补上的那块拼图
四分位数是把排序后的数据切成四段的那三个切点,通常记作 Q1、Q2、Q3:
- Q1(第一四分位数):25% 的数据小于等于它,也叫下四分位数;
- Q2(第二四分位数):50% 的数据小于等于它,其实就是中位数;
- Q3(第三四分位数):75% 的数据小于等于它,也叫上四分位数。
还是上面那组数据,排序后是3, 4, 4, 5, 5, 6, 7, 8, 10, 48,n=10。按常见的分位算法,Q1 大约在 4.25,Q2 = 5.5,Q3 大约在 7.75(具体算法后面细讲,不同方法结果会有细微差异)。你把这几个数摆在一起看:
| 指标 | 数值(千元) | 它告诉你什么 |
|---|---|---|
| 均值 | 10 | 被极端值拉高,代表性差 |
| 中位数 Q2 | 5.5 | 中间位置的真实水平 |
| Q1 | 约 4.25 | 有四分之一的人低于这个数 |
| Q3 | 约 7.75 | 有四分之三的人低于这个数 |
| Q3 - Q1(四分位距) | 约 3.5 | 中间一半人的跨度,衡量集中程度 |
看到没?四分位数一摆出来,数据的"骨架"就清楚了:中间 50% 的人集中在 4.25 到 7.75 这个区间,跨度只有 3.5;而均值 10 远远飘在这个区间之外,说明它已经被顶部那个 48 带偏了。四分位数不给你一个"代表值",它给你的是数据的"分布轮廓",这是均值和单独一个中位数都做不到的。
1.3 三个指标回答的是三个不同的问题
我后来总结出一个特别好记的框架,把这三个东西的分工说清楚:
- 均值回答:"如果所有值平均分配,每个人能拿多少?"——它是个"公平分配"视角,适合总量、平均水平的场景,但怕极端值。
- 中位数回答:"排在正中间的那个人是什么水平?"——它是个"典型个体"视角,抗极端值,但丢掉了分布信息。
- 四分位数回答:"数据被切成四段后,每段的边界在哪?"——它是个"分布结构"视角,既抗极端值,又能看出集中还是分散。
所以它们不是互相替代的关系,而是层层递进的观察角度。实际分析里,我的习惯是先看均值和中位数的差距,差距大就说明有偏态或极端值;然后再拉四分位数,看中间 50% 的跨度,判断数据到底是"整体均匀"还是"少数人撑场面"。这个顺序比一上来就盯着均值看要靠谱得多。
2. 四分位数的计算:不同算法为什么结果不一样
2.1 位置法的核心思路
四分位数计算最容易让人困惑的地方,是同一组数据用不同工具算出来的 Q1、Q3 居然对不上。这不是谁算错了,而是分位数的定义本身就有多种流派。理解这一点,比死记某个公式重要得多。
所有算法的底层思路是一样的:先把数据升序排列,然后找到"第 25%、50%、75% 位置"落在哪。问题在于,当位置算出来是个小数(比如 2.75),这个"2.75 位置"到底取哪个值?不同流派给了不同答案:
- 方法一(较常见,很多教材用):位置 = (n+1) × p,p 是分位比例。算出来是整数就直接取,是小数就在相邻两个数之间做线性插值。
- 方法二(部分软件默认):位置 = 1 + (n-1) × p,同样做插值。
- 方法三(简单粗暴型):直接取第 ⌈n×p⌉ 个值,不做插值。
拿 n=10、求 Q1(p=0.25)举例:
- 方法一:位置 = (10+1)×0.25 = 2.75,落在第 2 个值(4)和第 3 个值(4)之间,插值结果还是 4。
- 方法二:位置 = 1 + 9×0.25 = 3.25,落在第 3 个值(4)和第 4 个值(5)之间,插值得 4.25。
- 方法三:⌈10×0.25⌉ = ⌈2.5⌉ = 3,直接取第 3 个值,得 4。
三个方法给出 4、4.25、4 三个结果。你看,差异就出在这里。没有哪个绝对正确,关键是同一份报告里前后保持一致,并且注明用的是哪种算法。我见过有人前半段用 Excel 算、后半段用 Python 算,结果对不上还以为是数据错了,白白排查半天。
2.2 手算一遍,把过程走通
光看公式容易飘,我习惯手算一遍把流程刻进脑子里。还是那组数据3, 4, 4, 5, 5, 6, 7, 8, 10, 48,用方法一((n+1)×p 插值法):
第一步,排序。已经是升序了,确认无误。
第二步,算 Q2(中位数)。位置 = (10+1)×0.5 = 5.5,落在第 5 个值(5)和第 6 个值(6)之间,插值:(5+6)/2 = 5.5。
第三步,算 Q1。位置 = (10+1)×0.25 = 2.75,落在第 2 个值(4)和第 3 个值(4)之间。插值公式是:下值 + 小数部分 × (上值 - 下值) = 4 + 0.75×(4-4) = 4。
第四步,算 Q3。位置 = (10+1)×0.75 = 8.25,落在第 8 个值(8)和第 9 个值(10)之间。插值:8 + 0.25×(10-8) = 8.5。
所以 Q1=4,Q2=5.5,Q3=8.5,四分位距 IQR = 8.5 - 4 = 4.5。
提示:插值时那个"小数部分"是位置的小数部分,不是数值的小数部分,别搞混。位置 2.75 的小数部分是 0.75,用它去乘相邻两值的差。
手算的价值在于,你会真切感受到"位置"和"数值"是两回事。很多人第一次学的时候,把位置 2.75 直接当成"取第 2.75 个数",然后卡住——数据里根本没有第 2.75 个数,插值就是为了解决这个"落在缝里"的问题。
2.3 用代码验证,顺便对比不同库的默认行为
手算完之后,我一般会用代码交叉验证,同时看看不同库的默认算法差异。Python 的 numpy 和 pandas 都提供分位数计算,但默认方法不完全一样:
import numpy as np import pandas as pd data = [3, 4, 4, 5, 5, 6, 7, 8, 10, 48] # numpy 默认 linear 插值(对应方法二那类) q1_np = np.percentile(data, 25) q2_np = np.percentile(data, 50) q3_np = np.percentile(data, 75) print("numpy:", q1_np, q2_np, q3_np) # pandas 默认也是 linear,但可以指定 interpolation 参数 s = pd.Series(data) print("pandas:", s.quantile(0.25), s.quantile(0.5), s.quantile(0.75)) # 指定用中点法(对应方法一那类思路) print("midpoint:", np.percentile(data, 25, method="midpoint"))跑出来你会发现 numpy 默认给的是 4.25、5.5、7.75 这一组(linear 插值),和我手算的 4、5.5、8.5 有出入——因为手算用的是 (n+1)×p,而 numpy 默认的 linear 用的是 1+(n-1)×p 那套。这不是谁错了,是算法不同。所以我现在的习惯是:报告里写清楚"采用 linear 插值法",需要和教材对齐时就手动指定 method 参数。
注意:numpy 新版本里
interpolation参数已经改名为method,老代码直接跑可能报错,遇到TypeError先查一下版本和参数名。
3. 各类均值的横向比较:算术、几何、调和到底怎么选
3.1 算术均值:最常用,也最容易被滥用
算术均值就是我们平时说的"平均数",公式简单:所有值加起来除以个数。它的优点是充分利用了每一个数据点,信息不浪费;缺点是对极端值零抵抗,前面收入例子已经演示过了。
算术均值真正适用的场景,是数据本身比较对称、没有明显离群点,而且你关心的是"总量摊平"的概念。比如一个班 40 个人的平均身高、一批产品的平均重量,这类数据天然不会有离谱的极端值,算术均值就很合适。
但一旦数据是右偏分布(少数大值拖尾),算术均值就会系统性偏高。收入、房价、浏览量、订单金额,这些几乎都是右偏的,所以看这类数据时,我基本都会同时报中位数,甚至优先报中位数。
3.2 几何均值:处理比率和增长的正确姿势
几何均值是 n 个数连乘后开 n 次方。它专门用来处理比率、增长率、倍数这类"相乘关系"的数据。为什么?因为比率的"平均"本质上是复合增长,不是简单相加。
举个经典例子。某指标第一年涨了 100%(变成 2 倍),第二年跌了 50%(变成 0.5 倍)。如果用算术均值算平均增长率:(100% + (-50%))/2 = 25%,看起来两年平均涨 25%。但实际上,2 × 0.5 = 1,两年下来原地踏步,真实平均增长率是 0。用几何均值算倍数:√(2 × 0.5) = √1 = 1,对应增长率 0,这才是对的。
所以只要数据是"倍数"或"比率"形式,就该用几何均值。常见的坑是拿算术均值去平均一堆增长率,结果算出来的"平均增长"根本对不上实际的复合结果。我见过有人算三年营收平均增速,直接用算术平均,算出来比实际复合增速高出一截,汇报时被追问才发现问题。
几何均值的计算要点:先把每个比率转成倍数(涨 20% 就是 1.2,跌 20% 就是 0.8),连乘后开 n 次方,再减 1 转回增长率。注意数据里不能有 0 或负数,否则几何均值无定义——这也是它的一个硬约束。
3.3 调和均值:被低估的"平均速度"工具
调和均值是 n 除以"每个数倒数的和",公式是 n / (1/x₁ + 1/x₂ + ... + 1/xₙ)。它最典型的应用场景是平均速率,尤其是"相同距离、不同速度"的情况。
经典例子:一段路,去程速度 60,回程速度 40,问平均速度。很多人脱口而出 (60+40)/2 = 50,错了。因为去程和回程走的是同一段距离,速度快的那段用时短,慢的那段用时长,时间权重不一样。正确算法是调和均值:2 / (1/60 + 1/40) = 2 / (0.01667 + 0.025) = 2 / 0.04167 = 48。平均速度是 48,不是 50。
调和均值的适用条件是:分子(比如总距离、总工作量)固定,分母(速度、效率)变化。只要符合这个结构,就该用调和均值。它还有个特点:调和均值 ≤ 几何均值 ≤ 算术均值,三者相等当且仅当所有数据相同。这个不等式关系可以拿来快速校验——如果你算出来调和均值比算术均值还大,那一定是哪里搞反了。
3.4 三者的选择决策表
我把选择逻辑整理成一张表,实际用的时候对着看就行:
| 均值类型 | 适用数据结构 | 典型场景 | 忌讳 |
|---|---|---|---|
| 算术均值 | 加法关系、对称分布 | 平均身高、平均重量、平均分 | 右偏数据、含极端值 |
| 几何均值 | 乘法关系、比率/倍数 | 平均增长率、复合收益率、平均倍数 | 含 0 或负数 |
| 调和均值 | 分子固定、分母变化 | 平均速度、平均效率、平均单价(定量购买) | 含 0 |
这张表背后其实是一条统一的原则:看数据之间是"相加"还是"相乘"关系。相加关系用算术,相乘关系用几何,而"总量固定、按比率分配"的结构用调和。理解了这条,就不用死记场景了。
4. 四分位数与均值的实战配合:从描述到异常识别
4.1 用 IQR 做异常值筛查
四分位数最实用的衍生用法,是基于 IQR 的异常值判定。规则很简单:
- 下界 = Q1 - 1.5 × IQR
- 上界 = Q3 + 1.5 × IQR
- 落在上下界之外的,视为疑似异常值。
还是那组数据,Q1=4,Q3=8.5,IQR=4.5。下界 = 4 - 1.5×4.5 = 4 - 6.75 = -2.75,上界 = 8.5 + 1.5×4.5 = 8.5 + 6.75 = 15.25。那个 48 远超上界 15.25,妥妥的异常值。
这个 1.5 倍系数不是随便定的,它来自正态分布的经验:正态分布下,落在 Q1-1.5IQR 到 Q3+1.5IQR 之外的数据大约只占 0.7%,属于小概率事件。所以这套规则本质上是"用四分位数画一个稳健的正常范围"。相比用"均值 ± 3 倍标准差"判异常,IQR 法不受极端值本身影响——因为 Q1、Q3 都是位置统计量,那个 48 再大,也不会改变它排在第 10 位这个事实。
提示:IQR 法判出来的"异常"只是统计意义上的离群,不代表数据错误。收入数据里高收入者本来就该存在,不能一删了之。异常值要先判断是"错误值"还是"真实极端值",前者修正或剔除,后者保留并单独说明。
4.2 箱线图:四分位数的可视化落地
四分位数最直观的呈现方式就是箱线图。箱体的下边是 Q1,中间线是 Q2,上边是 Q3,箱体高度就是 IQR;两端的"须"一般延伸到 1.5 倍 IQR 范围内的最远数据点,超出的点单独画成离群点。
用 Python 画一个:
import matplotlib.pyplot as plt data = [3, 4, 4, 5, 5, 6, 7, 8, 10, 48] plt.boxplot(data, vert=False) plt.xlabel("月收入(千元)") plt.title("收入分布箱线图") plt.show()图一出来,那个 48 会孤零零地飘在右边,箱体则挤在左侧——一眼就能看出"绝大多数人集中,个别极端值拉尾"。这种视觉冲击是均值给不了的。我现在的习惯是,任何一组数据在报均值之前,先画个箱线图看看形状,很多"均值看起来正常"的假象当场就破了。
4.3 均值和中位数的差距,本身就是信息
有个技巧我特别爱用:把均值减中位数当成一个"偏态指示器"。差值接近 0,说明分布大致对称;均值明显大于中位数,说明右偏(少数大值拖尾);均值明显小于中位数,说明左偏。
前面收入例子,均值 10、中位数 5.5,差 4.5,明显右偏,和箱线图看到的完全一致。这个判断不需要算偏度系数,心算就能得出方向,特别适合快速摸底。当然它只是定性判断,要精确的偏态程度还是得用偏度统计量,但作为第一眼的直觉校验,够用了。
再配合四分位数看"中间 50% 的跨度"(IQR),就能把一组数据的性格描述得比较完整:中心在哪(中位数)、偏不偏(均值-中位数)、中间挤不挤(IQR)、有没有尾巴(箱线图离群点)。这四个问题答完,基本就不会被数据骗了。
5. 实操中踩过的坑和几条硬经验
5.1 分位数算法不一致导致的对不上
这个坑我踩过不止一次。同一份数据,Excel 的 QUARTILE 函数、Python 的 numpy、还有某些 BI 工具,算出来的 Q1 可能差零点几。原因就是前面说的算法流派不同。解决办法只有一个:在报告里注明算法,团队内部统一工具和参数。如果是给外部看的报告,最好附一句"分位数采用线性插值法计算",省得别人拿别的工具复现时对不上来质疑你。
5.2 小样本下四分位数很不稳定
n 很小的时候(比如 n<10),四分位数的位置会落在很尴尬的地方,插值出来的结果对个别数据点极其敏感。我试过 n=6 的数据,加一个数减一个数,Q1 能跳一大截。所以样本量太小时,四分位数只能当参考,别当铁律。这时候更该看原始数据本身,而不是迷信某个分位点。
5.3 别把"平均增长率"算成算术平均
这是几何均值那节讲过的坑,但值得再强调一次,因为它太常见了。只要涉及"连续几年的增长率""连续几期的倍数变化",一律用几何均值。判断方法很简单:问自己"这些比率是相乘关系还是相加关系",相乘就用几何。我见过太多汇报里用算术平均算复合增速,数字漂亮但经不起推敲。
5.4 均值缺失时别急着填均值
做数据清洗时,遇到缺失值,很多人的第一反应是"用均值填充"。但如果数据是右偏的(收入、金额这类),用均值填充会把整体水平往上抬,因为均值本身就被极端值拉高了。这种场景下用中位数填充更稳妥,它不会被极端值带偏。这个细节看起来小,但对后续分析的影响不小,尤其是缺失比例较高的时候。
5.5 报数时把"一组数"一起报,别只报一个
最后一条是我觉得最重要的经验:集中趋势从来不是一个数能说清的。我现在报数据,习惯至少给"均值 + 中位数 + Q1 + Q3"这一组,必要时加个 IQR 和箱线图。单个均值太容易被误读,而一组位置统计量摆在一起,读者自己就能判断数据的形状和可靠性。这不是啰嗦,是对数据负责。
回过头看,四分位数和各类均值的比较,表面上是几个公式的对比,实质上是训练一种"多角度看数据"的思维习惯。均值给你一个点,中位数给你一个更稳的点,四分位数给你一副骨架,几何调和均值则提醒你"数据的结构决定了该用哪种平均"。这套东西学扎实了,后面学方差、偏度、假设检验都会顺很多,因为你会发现它们本质上都在回答同一个问题:这组数据到底长什么样。