描述统计进阶:从方差、标准差到偏度、峰度与箱线图
1. 从平均数说起为什么“中”这部分才是重点如果你是从系列第一篇追过来的应该还记得我在“描述统计上”里花了不少篇幅讲集中趋势——均值、中位数、众数以及它们各自适用的场景。当时留了一个尾巴集中趋势只是把数据“压”成一个点但这个点能不能代表整批数据还得看数据本身“散不散”“歪不歪”。这次“描述统计中”要聊的就是数据形态的另一半——离散程度、分布形状以及一套把全貌画出来的工具。这批笔记的来源是某培训项目里“数据挖掘数学基础”的第一章中段原题不长但涉及的概念恰恰是后续所有统计方法的地基。做数据挖掘的人如果只盯着均值业务方问一句“为什么这个月均值涨了但投诉也涨了”你拿均值是回答不了的。真正要看的是方差是否变大、分布是否出现长尾、有没有离群点把平均值拉高。这些问题全部落在“描述统计中”的范围内。适合看这篇内容的是刚入门数据挖掘、机器学习或者做数据分析但只停留在算平均值阶段的人。这篇不会写公式推导重点放在每个指标怎么算、怎么解读、在什么场景下用、以及我踩过的那些坑。2. 离散程度的度量数据的“稳定”到底怎么刻画2.1 极差与四分位距粗糙但有用的两个量先说最简单的极差。一组数据里的最大值减去最小值就是极差。比如某电商平台一周内每日订单量分别是 1024、980、1105、986、1043、1876、1015极差就是 1876 − 980 896。这个指标计算极其简单但最大的毛病是只取决于两个端点——只要有一天出现异常大促极差就会暴涨可实际大部分日子的波动其实没那么吓人。所以我一般在汇报时只用它做“一眼看异常”不会靠它做决策。比极差稳健得多的是四分位距IQR也就是第三四分位数与第一四分位数之差。四分位数的理解方式可以这样类比把数据按从小到大排队切三刀分成四段每段包含约四分之一的数据第一刀是 Q1排在 25% 位置的值第三刀是 Q375% 位置的值中间那段就是 IQR。IQR 的好处是不受极端值影响因为它只看中间 50% 数据的跨度。实操中算四分位数Excel 里用 QUARTILE.INC 或 QUARTILE.EXC注意这两者算法有细微差别Python 里用 pandas 的 df[列名].quantile(0.25) 和 quantile(0.75) 即可SQL 里有些数据库没有直接的 percentile 函数需要自己写窗口函数后面我会给一个可用的写法。极差、IQR 这类度量称为“位置尺度”它们虽然只是离散程度的第一层但已经能帮你判断一个大致的波动区间。2.2 方差与标准差为什么要用平方而不是绝对值这是整个描述统计中最核心的概念。方差定义为每个数据与均值之差的平方的平均值标准差是方差的平方根。为什么是“平方”而不是“绝对值”我当年学的时候也疑惑过。绝对值确实能反映偏离程度但数学处理上有很多麻烦绝对值函数在零点不可导后续做回归、最优化时求导会很难受同时平方放大了大的偏差——偏离均值 2 个单位和偏离 3 个单位的差异在平方后变成 4 和 9这符合我们对波动的直觉异常值造成的信号不应被平均掉。平方还有一个好处就是方差分解时具有优良性质——总方差可以拆成组间方差加组内方差这在分析分组数据时非常关键绝对值做不到这一步。标准差的单位与原始数据一致所以它比方差更直观。比如订单量单位是“单”方差单位是“单²”业务方大概率看不懂标准差单位还是“单”可以直接说“每天订单量上下波动 120 单”。要注意一个重要区别总体方差的分母是 n样本方差的分母是 n−1。做数据挖掘时绝大多数情况下我们手里的数据只是样本动辄上千万条也未必覆盖全部用户本质上还是一个抽样过程。n−1 来源于“自由度”的约束因为样本均值已经是这批数据算出来的最后一个数据其实可以由前 n−1 个数据和均值推出来可自由变动的数据只剩 n−1 个。用 n 作分母会系统性低估总体方差这在做假设检验的时候会直接导致置信区间偏窄、p 值虚小。我见过不止一个新手拿全体用户数据算样本方差结果标准误偏小显著性判断出了问题。2.3 变异系数不同量纲之间怎么比较波动标准差很大一个问题量纲影响。比较两个不同量级的指标谁更“波动”比如一个指标均值 1000、标准差 50另一个指标均值 10、标准差 5光看标准差50 显然比 5 大但第二个指标的相对波动是 50%远远大于第一个的 5%。这就需要变异系数 CV 标准差 / 均值。CV 没有单位可以跨量纲比较。我在实际项目中常用 CV 来做指标稳定性监控比如各渠道转化率的稳定性对比、不同区域销量的离散程度对比。需要注意的是均值接近 0 时 CV 会爆炸毫无意义均值为负时更没法解释。遇到这种情况直接放弃使用 CV改回标准差或 IQR。2.4 实操心得用 Python 和 SQL 算离散指标漂亮的原理还是要落到代码上。Python 里最简单的方式是 pandasimport pandas as pd df pd.read_csv(orders.csv) print(df[order_amount].std(ddof1)) # 样本标准差 print(df[order_amount].var(ddof1)) # 样本方差 print(df[order_amount].quantile([0.25, 0.75])) print(df[order_amount].max() - df[order_amount].min()) # 极差注意 pandas 的 std() 默认 ddof1也就是样本标准差如果数据是全量用户理论上的总体记得手动指定 ddof0。SQL 里有些数据库内置 STDEV 函数SQL Server 和 PostgreSQL 都有如果没有窗口函数也能实现SELECT MAX(order_amount) - MIN(order_amount) AS range_val, PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY order_amount) AS q1, PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY order_amount) AS q3 FROM orders;PERCENTILE_CONT 是针对连续分布插值的方法PostgreSQL、Oracle、SQL Server 近几个版本都支持。算出来 Q1、Q3 后IQR Q3 − Q1这一步在 SQL 里需要嵌套一层子查询。3. 偏度与峰度数据到底“歪”成什么样、有多“陡”3.1 偏度长尾在左还是右集中趋势和离散程度回答了“数据的中心在哪里、散得多开”但依然没描述形状。两组数据可以均值一样、标准差也一样但一组是对称分布另一组右边拖着长长的尾巴——业务含义完全不同。偏度刻画的就是这种非对称性。偏度的定义是三阶中心矩除以标准差的立方公式不再展开理解上记住三种形态偏度 ≈ 0近似对称均值和中位数差不多。偏度 0右偏正偏右侧尾巴长此时均值通常大于中位数。偏度 0左偏负偏左侧尾巴长中位数通常大于均值。这个场景在业务里实在太常见了。比如用户单次消费金额绝大多数人花 50 到 200 元但极少数人一次囤货花一万这就是典型的右偏。你用均值汇报“人均消费 300 元”听着还行但中位数可能只有 120 元——一半用户花得比 120 还少。这种差别的背后就是用均值容易误导决策。Python 里可以直接用 scipy.stats.skew或者 pandas 的 df[列].skew()。注意偏度对异常值非常敏感样本量不大时单个极端值就足以让偏度“造假”所以最好先用箱线图或 z-score 探一眼数据里有没有明显离群点。3.2 峰度不是“高峰”是“厚尾”峰度这个概念比偏度更容易被误解。很多人以为峰度描述的是分布顶部有多“尖”其实不然。峰度的核心是分布尾部的厚度——极端值出现的概率有多高。四阶中心矩除以标准差的四次方再减 3 得到超额峰度。减 3 是把标准正态分布的峰度归零这样正峰度表示尾部比正态更厚极端值更多负峰度表示尾部更薄极端值更少。经验法则|峰度| 10 基本可以认为数据不服从正态在金融风控里峰度常年大于 10意味着极端行情比正态模型预测的频繁得多。这也是为什么用正态模型做风控经常失守——模型低估了尾部风险。如果你是做特征工程的偏度、峰度往往可以作为两个特征直接进模型。某些模型对特征分布敏感比如线性回归假设残差正态此时高偏度高峰度的特征可以考虑做 Box-Cox 变换。但树模型不关心这些不用白费力气变换。3.3 一个具体案例收入数据的偏度峰度计算为了演示全套流程我来用一套虚构的“某公司员工月薪万元”数据过一遍4.5, 5.2, 5.8, 6.1, 6.3, 6.8, 7.2, 8.5, 9.0, 35.0。这条数据一看就有猫腻前九个都集中在 4.5 到 9最后一个 35 明显是离群点。可以算一下均值和标准差会有多少波动均值全部十个算约 9.44 万去掉 35 后九个数均值约 6.6 万。一个点把均值拉高了 2.8 万相当于 43%。中位数全部数据中位数为 (6.36.8)/2 6.55 万去掉 35 后中位数是 (6.16.3)/2 6.2 万变化小得多。偏度明显右偏因为长尾在 35 那一侧。scipy 算出来大约 2.7 左右。峰度算出来也是高位大约 8 以上说明尾部比正态厚极端值不可忽视。这个案例直观说明单看均值会误判薪酬水平单看方差方差也全被那个 35 拉大了这时候用中位数 IQR 箱线图才是更稳妥的描述方案。4. 五数概括与箱线图一张图看完全部形态4.1 五数概括与箱线图的构造五个数就能给出一组数据的完整骨架最小值、Q1、中位数、Q3、最大值。箱线图就是在五数概括基础上画出来的箱体从 Q1 到 Q3箱内横线是中位数向上向下伸出两条“须”。这里有一个至关重要的细节箱线图的须并不是从 Q3 直接画到最大值。标准做法是上须画到 Q1 − 1.5 × IQR 和 Q3 1.5 × IQR 范围内的最大/最小观测值超出这个范围的单独画成离群点。1.5 是一个经验常数来自正态分布下的概率考量——正态时这个范围大约覆盖 99.3% 的数据超出部分可以视作异常。这套规则有个名字叫 Tukeys fences是探索性数据分析的经典内容。用 matplotlib 画箱线图时要注意默认的 showfliers 参数。在我们这套数据里35 会直接显示成一个点这对发现离群点非常有用。我经常把箱线图作为一切分析的第一张图——先看整体分布再决定后续建模或清洗的策略。4.2 箱线图和 3σ 法则的取舍很多教材在讲异常值检测时会提到 3σ 法则数据偏离均值超过 3 个标准差视为异常。这在实际中要小心。3σ 法则理论上依赖正态分布假设如果数据本身严重右偏标准差被长尾拉得很大3σ 的阈值也会被拉远许多真正的异常反而不会被识别如果数据出现厚尾3σ 法则还会漏报很多极端但真实存在的风险点。相对而言基于 IQR 的箱线图规则不依赖分布形态它对偏态数据的适应性更好。我在做真实用户行为日志分析时基本默认用 IQR 规则只有在对正态性有明确要求的统计推断里才会回头用 3σ。两者的选择本质是“模型假设强度”与“现实数据适配度”之间的权衡。4.3 实操用这几行代码快速做探索直接用 pandas matplotlib 快速出图import matplotlib.pyplot as plt import pandas as pd df pd.read_csv(salaries.csv) df.boxplot(columnsalary, vertFalse) plt.title(Salary Distribution) plt.show()如果要对多个维度横向对比箱线图把 column 参数换成多列列表即可。更高级的需求比如分组对比可以用 seabornimport seaborn as sns sns.boxplot(datadf, xdepartment, ysalary)这两个图是我在项目里最常用的第一张和第二张图出图速度快信息量大。后续无论是做特征筛选还是异常检测都离不开这两张图的判断。5. 常见问题与排查技巧实录5.1 到底该用样本标准差还是总体标准差这是最容易被忽略的。某次我复核一份报表发现对方用 Excel 的 STDEV.P总体标准差处理了一份抽样问卷数据结果标准差被低估置信区间窄了约 15%。Excel 里 STDEV.S 是样本标准差STDEV.P 是总体标准差pandas 里 ddof 默认 1样本NumPy 的 np.std 默认 ddof0总体。做分析之前先问自己这份数据是一锤子全查还是只是抽出来的样本绝大多数业务数据都是后者。5.2 量纲差异极大时用标准差比较波动不同量纲的指标一定不能直接比较标准差。我用过两个渠道的转化率数据一个渠道日均访客 10 万转化率均值 3.2%标准差 0.8%另一个渠道日均访客 2000转化率均值 31%标准差 12%。单看标准差第二个“更加波动”但按 CV 算第一个 0.8/3.225%第二个 12/31≈38.7%结论反过来。只有 CV 能给出公平的比较基准。5.3 偏度、峰度算出来异常大数据就一定要清洗吗不一定。我在分析某平台用户访问深度时偏度和峰度常年爆表——这是业务本身决定的少数重度用户的访问深度远超普通用户天然右偏厚尾。如果盲目把“偏度大于 2”的数据当异常清洗会把最有价值的 VIP 用户行为记录删掉。判断标准应该结合业务场景如果这些极端值是业务内生特征不必清洗如果它们是录入错误或数据采集异常才需要处理。先画箱线图看离群点再结合业务判断是清洗之前必须走的流程。5.4 中位数、均值、众数差异巨大时该如何解读很多新人看到三者差距巨大第一反应是“数据有错”。其实这个差异本身就是信息它告诉你数据的分布形态不是对称的。均值大于中位数通常意味着高收入群体拉高了整体营销策略上可能要针对中位数附近的客群多做价格敏感测试。如果均值小于中位数说明低端数据拖了后腿。三者的位置关系是一个快速诊断工具尤其适合刚开始分析一个陌生数据集时用。5.5 离群点检测结果互相矛盾IQR 规则和 3σ 规则检测同一批数据经常得出不一致的结论。这是因为 IQR 基于分位数对偏态数据稳健3σ 基于均值和标准差对异常值本身敏感。遇到矛盾我的处理原则是样本量大大于 1 万、分布近似正态优先信 3σ 结果。偏态明显或样本量小优先信 IQR 结果。矛盾本身并不离谱关键是在报告中说明你用了什么规则、为什么选这个规则这样才能给业务方一个可复现的结论。5.6 表格速查这些指标到底什么时候用场景推荐指标原因快速看波动范围极差简单直观不适合深入分析稳健描述中间 50% 波动IQR不受极端值影响常规量化波动标准差单位一致解释力强跨量纲比较波动变异系数无单位可比性强判断长尾方向偏度正负号直接反映左右尾判断极端值风险峰度厚尾意味着极端事件更频繁一张图看全貌箱线图五个数、离群点一次搞定这张表可以说是“描述统计中”全文最浓缩的产物建议存下来做报告时翻着用。6. 总结里不想说的那些话按惯例这类文章结尾应该来个高瞻远瞩的总结但我不想讲套话。描述统计虽然是最“初级”的内容但我在真实项目里见过太多问题恰恰出在这个最“初级”的部分——报表里只给均值不给标准差、比较两个指标波动不看量纲、算偏度发现异常就直接删数据这类事几乎每个月都能遇到。如果你认真把这篇文章里的指标都过了一遍接下来建议做一件小事把自己手头最常用的那个数据集算一遍均值、中位数、标准差、IQR、偏度、峰度画一张箱线图然后试着用 5 句话向别人解释你这个数据的特征。这一步做完了你比很多只会上传 CSV 跑模型的人强不少。数据挖掘越往后走机器学习模型越花哨但数据描述和探索的能力始终是那个最不性感却最不能跳过的地基。希望这篇“中”的内容能帮你把这块地基夯得再实一点。