一、前言

在数据分析中,我们经常遇到异常值(Outliers):

  • 价格为负的订单

  • 用户年龄超过 150 岁

  • 突然暴涨的访问量

这些异常值如果不处理,会影响统计指标、模型训练和业务决策。

异常检测的核心目标是:发现、理解、处理异常值,让数据更可靠。


二、异常值的定义

异常值是与大多数数据显著不同的观测值,常见特征包括:

  1. 数值远离平均值

  2. 与其他特征关系异常

  3. 突破历史规律

处理异常值的方法有:

  • 删除

  • 替换(均值、中位数)

  • 标记为异常,单独分析


三、准备数据

以模拟电商用户订单数据为例:


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()

  • 红色点表示异常值,直观显示出数据分布和异常点位置。


八、实际应用场景

  1. 🏦 金融风控:发现异常交易、欺诈行为

  2. 📈 运营监控:异常流量或用户行为告警

  3. 🧹 数据清洗:保证模型训练数据质量

  4. ⚙️ 生产监控:传感器异常报警

异常检测不仅是技术问题,更是业务决策和风险管理的基础

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐