← 返回首页

项目09: 异常值检测

统计描述与分位数,基于IQR或3σ原则识别异常

📊 数据集预览

使用 retail_orders 数据集,包含价格、数量等数值列。

retail_orders.csv(前5行)

🎯 学习目标

  • 查看数据的统计描述
  • 计算分位数与IQR
  • 使用IQR方法检测异常值
  • 使用3σ原则检测异常值
  • 处理异常值(删除或替换)

💻 实战练习

1. 加载数据并查看统计描述

使用 describe() 方法可以快速查看数据的统计摘要,包括计数、均值、标准差、最小值、25%分位数、中位数、75%分位数和最大值。

import pandas as pd

df = pd.read_csv('retail_orders.csv')
print(df['price'].describe())
💡 小贴士:describe() 默认只分析数值列,对于包含非数值列的数据,需要指定参数才能看到所有列的统计信息。
代码编辑器
点击"运行代码"查看输出...

2. 计算IQR(四分位距)

IQR(Interquartile Range)是统计学中衡量数据离散程度的指标,计算公式为:IQR = Q3 - Q1。其中 Q1 是第25百分位数(下四分位数),Q3 是第75百分位数(上四分位数)。

Q1 = df['price'].quantile(0.25)
Q3 = df['price'].quantile(0.75)
IQR = Q3 - Q1
print(f"Q1: {Q1}, Q3: {Q3}, IQR: {IQR}")
⚠️ 注意事项:使用 quantile() 时,参数范围是 0 到 1 之间的小数,0.5 表示中位数。
代码编辑器
点击"运行代码"查看输出...

3. 使用IQR方法检测异常值

IQR方法是经典的异常值检测方法。根据统计学原理,正常数据通常分布在 [Q1 - 1.5×IQR, Q3 + 1.5×IQR] 范围内,超出这个范围的数据被识别为异常值。

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['price'] < lower) | (df['price'] > upper)]
print(f"异常值数量: {len(outliers)}")
print(outliers[['product', 'price']])
💡 小贴士:IQR 方法基于数据分布的顺序,不受极端值影响,对偏态分布也能较好地识别异常。
代码编辑器
点击"运行代码"查看输出...

4. 使用3σ原则检测异常值

3σ原则(也称为拉依达准则)基于正态分布假设。在正态分布中,约99.7%的数据落在均值±3个标准差范围内。超出这个范围的数据被认为是异常值。

mean = df['price'].mean()
std = df['price'].std()
lower = mean - 3 * std
upper = mean + 3 * std
outliers = df[(df['price'] < lower) | (df['price'] > upper)]
print(f"异常值数量: {len(outliers)}")
print(outliers[['product', 'price']])
⚠️ 注意事项:3σ原则假设数据近似正态分布。如果数据存在严重偏态或尖峰肥尾,检测效果可能不佳,应优先考虑IQR方法。
代码编辑器
点击"运行代码"查看输出...

5. 处理异常值

检测到异常值后,需要根据业务场景选择合适的处理方式。常见的处理方法包括:删除异常值用统计量替换。通常推荐使用中位数替换,因为中位数不受极端值影响。

median = df['price'].median()
df['price_clean'] = df['price'].copy()
df.loc[(df['price'] < lower) | (df['price'] > upper), 'price_clean'] = median
print(f"处理后的数据:")
print(df[['product', 'price', 'price_clean']])
💡 小贴士:使用 df.loc[条件, '列'] = 值 可以根据条件对特定列进行批量赋值,这是数据清洗中最常用的技巧之一。
代码编辑器
点击"运行代码"查看输出...
📋 总代码运行框
点击"运行代码"查看输出...