为什么需要稳健统计?
标准差是一个强大的离散度指标,但它有一个致命弱点:对异常值极其敏感。一个极端值就能大幅推高标准差,给出对典型变异的误导性描述。
稳健统计提供的离散度指标能够抵御异常值的影响,在现实数据中尤为重要——因为测量误差、数据录入错误或真正的极端情况都很常见。
示例:异常值的影响
数据:10, 12, 11, 13, 12, 11, 100(一个异常值)
标准差:32.4(被异常值主导)
MAD:1.0(忽略了异常值)
IQR:1.5(忽略了异常值)
崩溃点
统计量的“崩溃点”是指数据中极端值达到多少比例时,该统计量才会变得毫无意义。标准差的崩溃点为 0%(一个异常值就能破坏它)。MAD 和 IQR 的崩溃点为 50%——即使一半数据是异常值,它们仍然有效。
中位数绝对偏差 (MAD)
MAD 是最稳健的离散度指标。它计算的是各数据点与中位数的绝对偏差的中位数:
MAD 公式
MAD = median(|xᵢ - median(x)|)
1
求中位数
计算数据集的中位数。
2
计算偏差
用每个数值减去中位数,取绝对值。
3
求 MAD
计算这些绝对偏差的中位数。
用 MAD 估计 σ:对于正态分布数据,MAD ≈ 0.6745 × σ。要从 MAD 估算标准差,乘以 1.4826:
由 MAD 估计标准差
σ̂ = 1.4826 × MAD
为什么是 1.4826?
这个缩放系数来源于正态分布下 MAD 与标准差之间的关系。它确保缩放后的 MAD 在数据服从正态分布时是真实标准差的无偏估计量。
四分位距 (IQR)
IQR 衡量的是数据中间 50% 的离散程度——即第 25 百分位数与第 75 百分位数之间的范围:
IQR 公式
IQR = Q3 - Q1 = 第 75 百分位数 - 第 25 百分位数
IQR 被广泛使用,因为它易于理解、在箱线图中直观呈现,并且是常见的“1.5×IQR 法则”异常值检测的基础。
用 IQR 估计 σ:对于正态数据,IQR ≈ 1.35 × σ。要从 IQR 估算标准差:
由 IQR 估计标准差
σ̂ = IQR / 1.35 ≈ 0.7413 × IQR
稳健指标对比
标准差
使用所有数据点 · 对正态数据效率最高 · 对异常值极其敏感 · 崩溃点:0%
MAD
最稳健的指标 · 使用中位数(而非均值) · 不受任何异常值影响 · 崩溃点:50%
IQR
易于理解 · 用于箱线图 · 忽略极端 50% 的数据 · 崩溃点:25%
何时使用稳健统计
- 探索性分析:当你不确定是否存在异常值时,先使用稳健指标
- 数据质量问题:当数据可能包含错误或测量问题时
- 厚尾分布:当极端值在预期之中时(金融收益、保险理赔)
- 小样本:当异常值因观测值少而影响过大时
- 异常值检测:用标准差来检测异常值是循环论证;应该用 IQR 或 MAD
代码实现
Python
import numpy as np
from scipy import stats
def mad(data):
"""Median Absolute Deviation"""
median = np.median(data)
return np.median(np.abs(data - median))
def scaled_mad(data):
"""MAD scaled to estimate SD (for normal data)"""
return 1.4826 * mad(data)
def iqr(data):
"""Interquartile Range"""
return np.percentile(data, 75) - np.percentile(data, 25)
# Compare on data with outlier
data = [10, 12, 11, 13, 12, 11, 100]
print(f"SD: {np.std(data, ddof=1):.2f}")
print(f"MAD: {mad(data):.2f}")
print(f"Scaled MAD: {scaled_mad(data):.2f}")
print(f"IQR: {iqr(data):.2f}")