Python异常值剔除函数reject_outliers的参数含义及运行原理咨询
基于中位数绝对偏差(MAD)的异常值检测方法说明
你给出的代码用的是MAD稳健异常值检测法,比常用的z-score(基于均值和标准差)更适合3~15个的小样本场景,不会被少量异常值带偏判定结果。
参数m的统计学含义及与标准差的对应关系
你可以把m类比成z-score方法里的z阈值,区别是z值用标准差做离散程度衡量,m用MAD做离散程度衡量:
- 如果假设数据服从正态分布,MAD和标准差有固定转换关系:
1倍标准差 ≈ 1.4826倍MAD,反过来1倍MAD ≈ 0.6745倍标准差 - 如果你想要和z=3(3倍标准差)等价的判定严格程度,m取
3*1.4826≈4.5即可 - 你当前代码默认m=6,大概对应4倍标准差的严格程度,判定比z=3更宽松,所以你给出的示例里0.98这个异常值没有被剔除,把m调到3左右就能把这个点筛掉。
具体问题解答
- 问题1:为什么要计算两次中位数?
两次计算都是为了保证指标的稳健性,避免被异常值干扰:- 第一次对data算中位数:中位数是衡量数据中心趋势的稳健指标,哪怕数据里有极端异常值,中位数也不会出现大幅偏移,如果你用均值做中心,示例里的0.98会直接把整体均值拉高,中心判定就不准了
- 第二次对d(每个点到中位数的绝对距离)算中位数:得到的就是MAD,是衡量数据离散程度的稳健指标,替代了z-score里的标准差,同样不会被极端值带偏,避免出现异常值把标准差拉高、反而无法被识别的问题。
- 问题2:代码中
mdev if mdev else 1.的作用是什么?
这是边界异常处理逻辑:如果所有输入数据完全相同,那么每个点到中位数的绝对距离都是0,得到的mdev就是0,直接做除法会触发除零错误,所以当mdev为0时用1替代,保证代码不会崩溃。 - 问题3:s变量代表什么,为什么筛选条件是s < m?
s是用MAD归一化后的绝对偏差,等价于z-score方法里的z值:s越大说明该数据点离整体中心越远,是异常值的概率越高。所以设置阈值m,保留s小于m的正常点,剔除s大于等于m的异常点。代码末尾的空值判断是额外的边界处理,避免所有数据都被判定为异常值时返回空列表。
内容的提问来源于stack exchange,提问作者srv_77
相关产品推荐
相关产品推荐

