用 Python 做异常检测:识别与可视化异常值
一、前言
在数据分析中,我们经常遇到异常值(Outliers):
-
价格为负的订单
-
用户年龄超过 150 岁
-
突然暴涨的访问量
这些异常值如果不处理,会影响统计指标、模型训练和业务决策。
异常检测的核心目标是:发现、理解、处理异常值,让数据更可靠。
二、异常值的定义
异常值是与大多数数据显著不同的观测值,常见特征包括:
-
数值远离平均值
-
与其他特征关系异常
-
突破历史规律
处理异常值的方法有:
-
删除
-
替换(均值、中位数)
-
标记为异常,单独分析
三、准备数据
以模拟电商用户订单数据为例:
import pandas as pd import numpy as np np.random.seed(42) data = pd.DataFrame({ 'user_id': range(1,101), 'order_amount': np.append(np.random.normal(200,50,95), [1000,1200,1500,2000,5000]) }) data.head()
我们在数据中人为加入了几个异常订单金额。
四、箱线图检测异常值
import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(6,4)) sns.boxplot(x=data['order_amount']) plt.title('订单金额箱线图') plt.show()
-
箱线图可以直观显示异常值(通常为箱体外的“点”)。
五、使用 IQR 方法检测
Q1 = data['order_amount'].quantile(0.25) Q3 = data['order_amount'].quantile(0.75) IQR = Q3 - Q1 # 异常值范围 lower = Q1 - 1.5*IQR upper = Q3 + 1.5*IQR outliers = data[(data['order_amount'] < lower) | (data['order_amount'] > upper)] print("异常值数据:\n", outliers)
IQR 方法简单高效,常用于统计分析中。
六、使用 Z-Score 方法检测
from scipy import stats data['z_score'] = stats.zscore(data['order_amount']) z_outliers = data[np.abs(data['z_score']) > 3] print("Z-Score 检测的异常值:\n", z_outliers)
-
Z-Score 方法适用于近似正态分布的数据,阈值通常为 3。
七、可视化异常值
plt.figure(figsize=(8,4)) plt.scatter(data['user_id'], data['order_amount'], c=(np.abs(data['z_score'])>3), cmap='coolwarm') plt.xlabel('用户ID') plt.ylabel('订单金额') plt.title('订单金额异常值可视化') plt.show()
-
红色点表示异常值,直观显示出数据分布和异常点位置。
八、实际应用场景
-
🏦 金融风控:发现异常交易、欺诈行为
-
📈 运营监控:异常流量或用户行为告警
-
🧹 数据清洗:保证模型训练数据质量
-
⚙️ 生产监控:传感器异常报警
异常检测不仅是技术问题,更是业务决策和风险管理的基础
更多推荐



所有评论(0)