基本统计特征:均值、方差、峰度、偏度

做特征工程,本质上是在跟数字的「脾气」打交道。均值、方差这些统计量,说白了就是一套量化的尺子——帮你摸清每个字段的分布性格。

我个人习惯,拿到一张大宽表后,会先算一遍这四类统计特征。不是炫技,而是真的能快速发现脏数据、识别值域异常、甚至提前感知建模风险。你想想看,如果某个字段的偏度高达 30,那基本可以断定是非对称分布了,再做后续衍生就得格外小心。

这一章我们就把这四个量拆开揉碎,讲清楚它们到底在度量什么,在特征衍生和分箱场景下怎么用。

统计特征与分布形状的关系 基本统计量 均值 μ 方差 σ² 偏度 γ₁ 峰度 γ₂ 偏度 < 0 → 左偏(左尾长) 偏度 > 0 → 右偏(右尾长) 偏度 = 0 → 对称(理想正态) 峰度 > 3 → 尖峰厚尾 峰度 < 3 → 平峰薄尾 峰度 = 3 → 正态分布基准 注:分布形状极端时,峰度或偏度可作为分箱依据

均值(Mean)——最朴素的中心趋势

均值就是所有值的算术平均值。简单,但有用。在特征衍生里,我们经常用它做跨群对比——比如按用户分组,算出每个用户的日均交易金额,这就是一个很好的衍生特征。

不过要小心,均值对异常值极其敏感。我在项目中遇到过这样的情况:某个字段本来均值在 50 左右,因为几条录入错误(数值变成 500000),均值直接被拉到了 3000 多。你如果不做预处理,后续分箱的边界会完全跑偏。

使用建议: 在分箱前,建议先用 IQR 或 Z-Score 剔除异常极值,再算均值做参考。尤其是做等频分箱时,均值偏移会导致某些箱体样本数严重不足。

方差与标准差(Variance & Standard Deviation)——离散程度的度量

方差衡量的是数据围绕均值的波动幅度。标准差就是方差的平方根,量纲与原始数据一致,更方便解释。

举个例子:两个用户的月消费均值都是 5000 元。但一个人每月消费在 4500~5500 之间波动,另一个在 1000~9000 之间。同样均值,方差天差地别。这种差异在风控模型里可能就是「稳定用户」和「风险用户」的分水岭。

在自动分箱中,方差常用来判断是否需要单独划出一个「高波动」区间。我之前做信贷评分卡时,发现连续 3 个月收入方差大于某个阈值的群体,违约率显著上升。后来直接把方差作为一个离散化维度放进模型,效果提升了一个百分点。

偏度(Skewness)——分布的对称性

偏度告诉我们数据是往左偏还是往右偏。

  • 偏度 = 0:对称分布(比如理想正态)。
  • 偏度 > 0:右偏,右边有长尾(大部分数据集中在左侧,少量极大值)。
  • 偏度 < 0:左偏,左边有长尾。

为什么会关心偏度?因为很多统计模型(如线性回归)天然假设误差正态,如果偏度太大就需要做变换。在特征工程里,我习惯先用偏度做一次「过滤」:如果偏度的绝对值大于 1.5,我会优先考虑做 Log 变换或 Box-Cox 变换,再去做分箱。

警告: 偏度对样本量敏感。小样本下(比如 < 30 条记录)的偏度估计波动很大,不要轻易用它下结论。我曾经被 20 条样本的偏度值 -2.8 吓到过,结果数据量加到 500 后偏度变成了 -0.3,虚惊一场。

峰度(Kurtosis)——尖峰还是平峰

峰度描述的是分布尾部的「厚薄」和峰部的「尖峭程度」。通常我们会与正态分布做对比(正态分布峰度为 3)。

峰度值 形态说明 常见场景举例
> 3 尖峰厚尾,极端值较多 金融收益率、网页访问量(有突发峰值)
= 3 标准正态 实验室测量误差(理想情况)
< 3 平峰薄尾,数据相对均匀 人体身高、考试分数(受物理限制)

峰度高意味着极值频发——这在风控模型里往往是「黑天鹅」信号。自动分箱时,我一般会检查峰度 > 5 的字段,考虑单独划出一个「异常极端值」箱,而不是强行让极端值混入其他箱体。你想想看,如果几个极端值被分到同一个箱里,这个箱的 WOE 会很不稳定,模型上线后容易失效。

SQL 实现:快速计算四个统计量

下面是在 Apache Hive / Spark SQL 中一次性算均方偏峰的写法,注意偏度和峰度用的是内置聚合函数。

SELECT
    用户ID,
    AVG(消费金额)                          AS 均值,
    STDDEV_SAMP(消费金额)                  AS 标准差,
    VAR_SAMP(消费金额)                     AS 方差,
    SKEWNESS(消费金额)                     AS 偏度,
    KURTOSIS(消费金额)                     AS 峰度
FROM 交易表
GROUP BY 用户ID;
小提示: 不同数据库的偏度/峰度函数名略有差异。MySQL 8.0+ 可以用 STDDEV_POP、VAR_POP,但偏度没有内置函数,需要自己用 POW 和聚合算三阶矩。Presto/Trino 中偏度函数叫 SKEWNESS,峰度叫 KURTOSIS。生产环境注意版本兼容。

特征衍生中的实战经验

我个人很少只用单字段的均值或方差做特征,而是把它们组合起来看。举个例子:

  • 「均值 + 标准差」一起作为特征,相当于同时表达了中心位置和离散程度。
  • 「偏度 + 峰度」组合,可以刻画一个字段的异常敏感度。我曾经在用户生命周期建模中,把活跃天数的偏度 > 2 且峰度 > 5 的用户单独标记为一个群体,结果这个群体的留存率比普通用户低了 40%。
  • 在分箱阶段,如果某个字段的偏度接近 0 且峰度接近 3,你大可以用等距分箱;否则建议优先用等频或基于统计分布的定制分箱。
避坑指南: 我曾经在某个工业传感器数据集上,直接对所有字段做均值填充——结果忽略了其中一个字段的峰度高达 12。填充完后模型性能反而下降,后来发现用中位数填充效果更好。所以,先看偏度和峰度再决定填充策略,这步不能省。

基本统计量看起来简单,但用好了就是特征工程的「听诊器」。在后续几章里,我们会把这些量作为基石,做更复杂的图谱变量衍生和自动分箱策略。嗯,今天就先到这里。