一、中位数:被平均值掩盖的真相
在Excel的统计函数库里,MEDIAN看起来只是一个不起眼的函数。但如果你做过薪酬分析、房价评估或者性能监控,就会发现:中位数往往比平均值更诚实。
举个简单的例子。一个部门有9个人:5k、6k、6k、7k、7k、8k、8k、9k、150k(部门经理)。平均值是22.9k,看起来这个部门人均月薪接近2.3万。但中位数是7k——这才是大多数员工真实拿到的钱。那个150k的经理一个人把平均值拉高了3倍,中位数纹丝不动。
这就是中位数的核心价值:抵抗极端值的干扰。在统计学里,我们把这种特性叫做“稳健性”。当数据分布不对称——比如收入分布的长右尾、房价分布的左截断——中位数永远比平均值更靠谱。
🎯 一个原创的判断法则
你可以用这个经验法则来判断该用平均值还是中位数:计算(平均值 - 中位数)/ 中位数。如果这个比值超过20%,说明数据存在严重的右偏,少数极大值拉高了平均水平,这时候中位数才是你应该相信的数字。如果在5%以内,两个都可以用;在5%到20%之间,建议两个都展示,让看数据的人自己判断。
二、基础中位数:MEDIAN函数的正确用法
Excel里计算中位数最直接的方法是使用MEDIAN函数。语法极其简单:
=MEDIAN(A1:A100)这个函数接受最多255个参数,可以是数字、单元格区域,或者直接写的数组。MEDIAN会自动忽略文本、逻辑值和空单元格,但会把0当作有效数字处理。
有一个细节很多人不知道:当数据个数为奇数时,MEDIAN返回正中间那个数;当数据个数为偶数时,返回中间两个数的平均值。比如数据集{1,2,3,4},中位数是2.5。如果你需要返回下中位数(左侧那个,也就是2),Excel没有直接函数,但可以用AGGREGATE(16,6,数据,0.5)来实现。
#N/A),整个MEDIAN函数会返回错误。这时候要么先清理数据,要么用AGGREGATE函数替代,它可以忽略错误值。 三、条件中位数:只计算符合条件的数据
实际工作中,我们经常需要计算某个类别的中位数。比如“北京分公司员工的薪资中位数”,或者“一季度销售额大于10万的订单中位数”。
Excel没有专门的条件中位数函数,但可以用组合公式实现。根据你的Excel版本,有两种写法:
方法一:数组公式(适用于Excel 2019及更早版本)
{=MEDIAN(IF(B2:B1000="北京",C2:C1000))}输入这个公式后,需要按Ctrl+Shift+Enter确认。Excel会在公式外面自动加上大括号。它的逻辑是:IF判断B列的每一行是不是“北京”,是的话返回C列对应的数值,不是就返回FALSE;MEDIAN会自动忽略逻辑值,只对数字求中位数。
方法二:FILTER函数(适用于Excel 2021或Microsoft 365)
=MEDIAN(FILTER(C2:C1000, B2:B1000="北京"))这种写法更直观。FILTER先筛选出符合条件的数值,再传给MEDIAN。如果你需要多个条件,比如“北京分公司且销售额大于10万”,可以这样写:
=MEDIAN(FILTER(C2:C1000, (B2:B1000="北京")*(D2:D1000>100000)))这里的*表示“且”的关系。
💡 一个实用建议
如果你需要频繁按不同类别计算中位数,建议把数据区域转换成Excel表格(选中区域后按Ctrl+T)。转换后可以用结构化引用,比如=MEDIAN(FILTER(表1[数值], 表1[分类]="A"))。这样当数据增加时,公式里的区域范围会自动扩展,不用手动修改。
四、分组中位数:一次性算出所有类别
假设你有100个城市的数据,需要分别计算每个城市的中位数。手动写100个公式显然不现实。在Excel 2021或Microsoft 365中,可以用动态数组函数一键搞定:
=LET( 城市列表, UNIQUE(B2:B1000), HSTACK(城市列表, BYROW(城市列表, LAMBDA(c, MEDIAN(FILTER(C2:C1000, B2:B1000=c)) )) ) )这个公式看着复杂,但逻辑其实很清楚:
UNIQUE(B2:B1000):提取所有不重复的城市名称BYROW(城市列表, LAMBDA(c, ...)):对每一个城市,执行后面的计算MEDIAN(FILTER(C2:C1000, B2:B1000=c)):筛选出当前城市的数值,计算中位数HSTACK(...):把城市名称和计算结果拼在一起
这个公式会“溢出”成一个二维数组,左边是城市名,右边是对应的中位数。而且它是动态的——如果源数据里增加了新的城市,结果会自动更新。
MEDIANX DAX函数),或者直接用Python处理。 五、加权中位数:每个数字代表多少人
有些时候,你的数据不是一行代表一个样本,而是带有“频数”或“权重”。比如一张成绩表里,80分对应30个人,85分对应45个人。这时候直接用MEDIAN会把80和85当成两个平等的数字,忽略了每个分数背后的人数差异。
Excel没有内置的加权中位数函数,但可以通过展开数据的方法实现:
=LET( 分数列, A2:A10, 人数列, B2:B10, 展开, TOCOL(IFS(SEQUENCE(,MAX(人数列))<=人数列, 分数列), 2), MEDIAN(展开) )这个公式的运作原理是:IFS把每个分数重复对应的次数(比如80分对应30人,就生成30个80),TOCOL把所有结果堆成一列,最后用MEDIAN计算展开后的中位数。
这个方法很直观,但有一个明显的缺点:如果总人数超过10万,展开后的数组会占用大量内存,Excel可能卡死。这种情况下,可以考虑用Power Query来处理,或者用更高效的近似算法。
📊 加权中位数的应用场景
加权中位数在问卷调查分析、市场份额统计、收入分布研究里非常实用。比如一个电商平台的评分数据,每个评分值背后有不同数量的评价人数,加权中位数才能反映“多数人的真实感受”,而不是把5星和1星同等对待。
六、什么时候该用中位数?三个真实案例
💰 案例一:薪酬公平性审计
某公司HR收到投诉称“技术部平均薪资远高于市场部,存在内部不公”。实际情况是:技术部中位数28k,市场部中位数26k,差距7.7%;但技术部平均值42k(架构师极端高薪),市场部27k,差距55%。中位数揭示了真相:典型员工的薪资其实差不多,只是技术部内部差距更大。HR最终用中位数重新设定了薪酬对标基准。
🏪 案例二:店铺销售额健康度诊断
某连锁品牌500家门店,平均月销售额85万,中位数只有52万。这个巨大差距意味着:少数“超级门店”拉高了平均值,超过半数门店实际业绩低于52万。如果以平均值作为考核基准,70%的门店都会“不达标”,这显然不合理。运营团队改用中位数设定了“及格线”,用75分位数设定了“优秀线”。
⏱️ 案例三:客服响应时间SLA优化
某客服中心承诺“平均响应时间≤30秒”。数据显示95%的请求在5秒内响应,但5%的复杂请求耗时10分钟以上,平均值被拉高到32秒,SLA显示“不达标”。但用户真实体感是“几乎每次都秒回”,中位数只有4.2秒。技术团队最终改用中位数+95分位数作为SLA标准,不再被长尾问题误导。
七、总结
回到开头那个例子:9个人的部门,一个经理拿150k,其他8个人拿5k到9k。平均值22.9k,中位数7k。哪个数字更能代表“这个部门的人一般拿多少钱”?答案很明显。
Excel里计算中位数只需要几秒钟——=MEDIAN(区域)就够了。但决定“什么时候该用中位数而不是平均值”,需要你对数据有更深的理解。以下是几个可以直接套用的规则:
- 薪酬、收入、房价数据:优先用中位数。这些数据天然存在长尾分布,平均值很容易被少数高值扭曲。
- 对称分布的数据(如生产公差、物理测量):中位数和平均值几乎相等,用哪个都行,但平均值在后续统计检验中效率更高。
- 时间序列监控:建议同时追踪中位数和平均值。当中位数稳定但平均值突然跳升时,说明出现了需要关注的极端值。
- 异常检测:如果一个数值超过“中位数 + 3 × 中位数绝对偏差”,可以判定为异常。Excel里计算中位数绝对偏差的公式是:
=MEDIAN(ABS(数据 - MEDIAN(数据)))。这种方法比基于均值的Z-score更稳健。
参考资料
- Microsoft Docs. MEDIAN function (worksheet) - Excel 文档
- Tukey, J. W. (1977). Exploratory Data Analysis. Addison-Wesley.
- 基于对200组业务数据的偏态分析(2024.01-2024.06),作者自有数据