异常值怎么找:一份实用清单
做数据清洗的人都有过这种经历:一批看起来正常的数字里,突然冒出一个离谱的值。它可能是录入错误,也可能是真实信号。直接删掉,怕丢掉重要信息;直接保留,又怕后续的走势判断被带偏。异常值识别的难点不在计算,而在判断。下面这份清单,按从简到繁的顺序,整理了几种常用方法,每种都附带一个具体的数字例子。
最直观的方法是箱线图。它的逻辑很简单:先算出一组数据的中位数和四分位数,把上下四分位之外超过1.5倍四分位距的点标记为异常。比如某电商后台一周的日订单量分别是1200、1350、1280、1300、1320、1250,突然有一天是9800。中位数大约在1290,四分位距很小,9800会远远落在上界之外。箱线图的好处是不假设数据服从正态分布,对偏态数据也比较稳健。但它对样本量有要求,少于10个点时,四分位数的计算本身就不太稳定。
如果数据接近正态分布,Z-score是更常用的选择。它衡量的是某个值距离均值有多少个标准差。经验上,绝对值超过3的Z-score就值得注意。举个例子,某城市过去30天的日均气温均值是22摄氏度,标准差是3度。某天录得35度,Z-score约为4.3,这在统计上属于小概率事件。但Z-score有个明显弱点:均值和标准差本身会被异常值拉偏。一个极端大值进来,标准差变大,反而可能让其他异常值显得正常。所以遇到明显偏态的数据,可以考虑用中位数绝对偏差(MAD)替代标准差,它对极端值更不敏感。
时间序列的数据需要另一套思路。很多异常不是孤立的大或小,而是走势上的突变。比如某App的日活连续两周稳定在50万上下,某天突然跌到32万,第二天又回到51万,这种单点凹陷用箱线图未必能标出来,因为它在全局分布里可能并不极端。这时候可以看环比变化率,或者用移动平均做基线,把偏离基线超过一定比例的点挑出来。更严格一点,可以用STL分解,把趋势、季节性和残差拆开,在残差项上做判断。残差突然变大的时间点,往往对应真实的异常事件。
上面这些方法都有一个共同前提:你得先想清楚异常值的用途。如果是做数据清洗,目标是找出录入错误,那越灵敏越好,宁可多标一些让人工复核。如果是做走势预测,目标就反过来了——某些异常值恰恰是趋势转折的信号,删掉它们等于把最重要的信息扔了。2020年某类消费数据的断崖式下跌,在统计上当然是异常值,但没人会把它当作噪声处理。所以识别方法只是工具,判断标准取决于业务场景。
实际操作中,比较稳妥的做法是组合使用。先用箱线图或MAD做一轮快速筛查,把明显离谱的点标出来;再对时间序列做变化率检测,捕捉走势上的突变;最后把两边的结果放在一起,人工过一遍。每一步都保留原始记录,不要直接覆盖或删除。一个可复用的习惯是:给每个被标记的点打上标签,注明是录入错误、业务事件还是待确认。下次再观察同一指标时,这些标签本身就是有价值的参照。
还有一点容易被忽略:异常值检测的阈值不是固定的。1.5倍四分位距、3倍标准差、5%的变化率,这些都是经验起点,不是铁律。数据频率越高、波动越大,阈值就应该越宽松。日频数据里3倍标准差可能天天触发,月频数据里可能几年才遇到一次。比较务实的做法是,先在一个已知正常的时间窗口上跑一遍,看看误报率有多高,再决定要不要收紧或放宽。
回到最初的问题:异常值该删还是该留?多数情况下,答案不是二选一。更合理的做法是标记、隔离、单独观察,让它在后续分析中既不影响整体走势,又不至于被彻底遗忘。数据工作里,很多错误不是因为没发现异常,而是因为发现之后处理得太急。慢一步判断,往往比快一步删除更有价值。