异常值识别:三种方法的对比与取舍
做数据清理的人迟早会碰到一个尴尬时刻:明明盯着一组走势正常的序列,突然冒出一个偏离均值好几倍的数。删掉它,怕误伤真实信号;留着它,后续的统计和预测全被带偏。异常值识别之所以让人纠结,是因为它本质上不是纯技术问题,而是一个关于“什么算正常”的判断。
最常见的做法是Z分数。它假设数据近似正态分布,计算每个点与均值的距离,再除以标准差。经验上,绝对值超过3就标记为异常。举个例子,某电商平台日订单量均值1200单,标准差150单,某天突然录得2100单,Z分数为6,明显越界。这个方法简单、可解释,但有个硬伤:均值和标准差本身就会被异常值拉偏。如果那2100单不是孤例,而是连续三天出现,标准差会被撑大,反而让真正的异常变得“正常”。
于是有人转向IQR方法,也就是四分位距。它不依赖正态假设,先把数据排序,取第25百分位和第75百分位,两者之差为IQR,通常把低于Q1减1.5倍IQR或高于Q3加1.5倍IQR的点视为异常。还是那组订单数据,假设Q1为1050,Q3为1350,IQR为300,那么上界是1350加450等于1800。2100单依然会被标记,但这次判断依据来自中位数附近的分布,而不是被极端值污染的均值。IQR对偏态数据更稳健,代价是它只看单变量,遇到多维特征就力不从心。
如果数据维度高、关系复杂,前两种方法就开始捉襟见肘。比如用户行为数据里,单看登录次数正常、单看停留时长也正常,但两者组合起来明显背离常规,这时候孤立森林之类的算法更合适。它的思路很直白:随机切分数据,异常点因为“少而不同”,往往在少数几次切分后就被单独隔离出来。实际项目中,用孤立森林对十万条用户记录打分,通常能在一两分钟内跑完,但输出的是异常分数,阈值需要结合业务手动调。
三种方法对比下来,没有哪个绝对占优。Z分数适合分布接近正态、异常点占比极低的场景,比如传感器瞬时故障。IQR适合偏态明显、又只想看单变量的情况,比如收入分布、访问量分布。孤立森林适合多特征、样本量大的探索性分析,但可解释性偏弱,业务方常会追问“为什么这个点被判异常”。
一个务实的做法是并行跑两到三种方法,再观察它们的交集和差集。交集部分大概率是真异常,差集部分则需要人工抽查。某次对一批门店销售数据做清洗,Z分数标出12个异常点,IQR标出9个,两者重合7个。剩下5个分歧点里,有3个是促销活动导致的真实峰值,另外2个是录入错误。如果只信一种方法,要么误删真实峰值,要么漏掉录入错误。
还有一点常被忽略:异常值不等于错误值。它可能是噪声,也可能是新趋势的早期信号。疫情初期,某些线下门店客流数据出现极端低值,按常规方法全该标记异常,但那是真实的结构性变化,删掉就丢失了关键信息。识别异常只是第一步,判断它该删、该修还是该保留,取决于你对数据生成过程的理解。
所以,与其追求一个万能阈值,不如把异常值识别当成一次持续的观察:先看分布,再选方法,最后结合业务背景做取舍。数据清洗没有一劳永逸的公式,只有不断校准的判断。