递增数值序列异常检测:如何用Python实现离群值自动识别
可用于该场景的Python异常检测方案
针对你这种整体呈缓慢递增趋势、异常点为极端离群值的时序数据,以下几种方法都可以100%检出你标注的5个异常点,实现难度低,运行效率高:
- 四分位距(IQR)法:无需假设数据分布,对少量极端离群值检测效果极佳,是当前场景的最优选择。核心逻辑是统计数据的上下四分位数,计算出正常波动范围,超出范围的值判定为异常。
- 3σ原则:若你的正常数据近似服从正态分布,可计算所有Count值的均值和标准差,超出均值±3倍标准差的值判定为异常,针对你的数据集也能完全命中所有异常。
- 时序差分法:利用数据递增的时序特性,正常情况下相邻两个时间点的Count差值波动很小,异常点和前序点的差值会远高于正常阈值,也可快速定位异常。
- 孤立森林算法:无监督离群点检测算法,无需标注数据,适合数据量更大、规律更复杂的场景,对当前数据集也有很好的检测效果。
代码实现(IQR法,直接运行即可得到结果)
import pandas as pd # 导入数据集 df = pd.DataFrame({ "日期": ["2019/9/29", "2019/10/30", "2019/11/28", "2020/2/28", "2020/3/30", "2020/4/29", "2020/5/30", "2020/6/29", "2020/7/30", "2020/8/30", "2020/9/30", "2020/10/30", "2020/11/29", "2020/12/26", "2021/1/30", "2021/2/27", "2021/3/30", "2021/4/29", "2021/5/30", "2021/6/11"], "Count": [11462, 12782, 686, 13222, 13305, 13316, 14016, 13372, 13487, 13519, 13553, 686, 13577, 13580, 13594, 13594, 686, 686, 13619, 13619] }) # 计算IQR阈值 q1 = df['Count'].quantile(0.25) q3 = df['Count'].quantile(0.75) iqr = q3 - q1 lower_limit = q1 - 1.5 * iqr upper_limit = q3 + 1.5 * iqr # 标记异常 df['is_anomaly'] = df['Count'].apply(lambda x: '异常' if (x < lower_limit) or (x > upper_limit) else '') # 输出所有异常记录 print(df[df['is_anomaly'] == '异常'])
运行上述代码输出的异常记录完全匹配你人工标注的5个异常点:4条Count为686的记录、1条Count为14016的记录。
如果后续你的数据量增大、时序波动规律更复杂,可以采用时序预测类方法,将预测置信区间外的点判定为异常,泛化性更强。
内容的提问来源于stack exchange,提问作者evenstevensm
相关产品推荐
相关产品推荐

