异常检测:四分位距法(IQR)
一、IQR介绍
IQR(Interquartile Range)算法是一种用于检测异常值的统计方法,主要基于数据的四分位数。IQR 代表数据集中第 1 四分位数(Q1)和第 3 四分位数(Q3)之间的范围。
1.1 IQR 算法步骤
1)计算四分位数:
Q1(下四分位数):数据中 25% 的值。
Q3(上四分位数):数据中 75% 的值。
2)计算 IQR:
𝐼𝑄𝑅=𝑄3−𝑄1
3)定义异常值的边界:
下限=𝑄1−1.5×𝐼𝑄𝑅
上限=𝑄3+1.5×𝐼𝑄𝑅
4)检测异常值:
任何小于下限或大于上限的数据点都被视为异常值。
1.2 IQR实例
假设有以下数据集: 8,10,12,14,15,16,18,20,22,25,30,50,100
计算步骤如下:
1)排序数据
8,10,12,14,15,16,18,20,22,25,30,50,100
2)计算 Q1 和 Q3
Q1(下四分位数):14(取第4个数,它前面有3个数,后面有9个数)
Q3(上四分位数):25(取第10个数,它前面有9个数,后面有3个数)
3)计算 IQR
𝐼𝑄𝑅=𝑄3−𝑄1=25−14=11
4)定义异常值边界
下限: 𝐿𝑜𝑤𝑒𝑟𝐵𝑜𝑢𝑛𝑑=𝑄1−1.5×𝐼𝑄𝑅=14−1.5×11=−2.5
上限: 𝑈𝑝𝑝𝑒𝑟𝐵𝑜𝑢𝑛𝑑=𝑄3+1.5×𝐼𝑄𝑅=25+1.5×11=41.5
5)检测异常值
数据集中小于 -2.5 或大于 41.5 的值,在这个数据集中,异常值是 50 和 100。
二、python实例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 创建包含异常值的数据
data = [8, 10, 12, 14, 15, 16, 18, 20, 22, 25, 30, 50, 100]
# 将数据转换为 Pandas DataFrame
df = pd.DataFrame(data, columns=['Scores'])
# 计算 Q1 和 Q3
Q1 = df['Scores'].quantile(0.25)
Q2 = df['Scores'].quantile(0.5)
Q3 = df['Scores'].quantile(0.75)
IQR = Q3 - Q1
# 计算上下限
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 检测异常值
outliers = df[(df['Scores'] < lower_bound) | (df['Scores'] > upper_bound)]
# 打印结果
print(f"Q1: {Q1}, Q2: {Q2}, Q3: {Q3}, IQR: {IQR}")
print(f"Lower Bound: {lower_bound}, Upper Bound: {upper_bound}")
print(f"Outliers: {outliers['Scores'].values}")
# 绘制箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=df['Scores'])
plt.title('Boxplot of Scores with Outliers')
plt.ylabel('Scores')
# 添加 lower_bound 和 upper_bound 的水平线
plt.axhline(y=lower_bound, color='red', linestyle='--', label='Lower Bound (Q1 - 1.5 * IQR)')
plt.axhline(y=upper_bound, color='blue', linestyle='--', label='Upper Bound (Q3 + 1.5 * IQR)')
# 添加图例
plt.legend()
# 显示图形
plt.show()

执行结果:
Q1: 14.0, Q2: 18.0, Q3: 25.0, IQR: 11.0
Lower Bound: -2.5, Upper Bound: 41.5
Outliers: [ 50 100]
参考书籍:


本文来自博客园,作者:limingqi,转载请注明原文链接:https://www.cnblogs.com/limingqi/p/18984629
浙公网安备 33010602011771号