python数据分析之异常值处理


前言

异常值是一种沉默的“杀手”,在你去除缺失值准备开始建模的时候,可能会导致你的模型效果不理想或者是十分糟糕,而又不清楚问题出现在哪,所以对于异常值的处理也是非常重要的,本文将讲解什么是异常值以及异常值的处理。


一、什么是异常值?

异常值有很多,这里所介绍的是关于数值型的异常值,也可以称为“离散值”。异常值是指在数据集中与其他观测值明显不同的数据点或样本。它们可能是由于测量错误、数据损坏、数据录入错误、系统故障或真实的极端情况等原因而产生。例如在测量学生身高体重数据方面,出现身高为10cm的情况,或者是体重为1吨等等不符合实际的情况。当然也有异常值是属于正常的情况,比如在医疗邻域,病人血压“飙升“等。

二、异常值检测

1.统计学方法

1)箱线图

箱线图(IQR)是一种十分常用的方法,是一种用于显示数据分布情况的统计图表,主要由五个统计量组成:最小值、下四分位数(Q1)、中位数(Q2)、上四分位数(Q3)和最大值。箱线图能够直观地展示出数据的中心位置、离散程度以及异常值情况,对比不同数据集之间的差异也非常有帮助。对于检测到的异常值(小于Q1-1.5IQR或者大于Q3+1.5IQR的数据被认为是异常值,其中IQR(四分位距):75%分位数(Q3)-25%分位数(Q1)),会用小圆圈标识。
在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

# 生成一组随机数据作为示例
np.random.seed(10)
data = np.random.normal(0, 2, 100)

# 绘制箱线图
plt.figure()
plt.boxplot(data)
plt.title('Box Plot Example')
plt.show()

在这里插入图片描述
如上图所示,有一个小圆点代表的就是异常值。

2)3σ原则

3σ原则(3 sigma rule)也称为3倍标准差法,是标准差方法的一种特定应用。在统计学中,3σ原则是指,对于服从正态分布的数据,大约 68% 的数据值落在均值加减一个标准差范围内,约 95% 的数据值落在均值加减两个标准差范围内,约 99.7% 的数据值落在均值加减三个标准差范围内。如果数据集中的某个数据点与均值之间的差异超过了三倍标准差(3σ),那么这个数据点可以被认为是异常值(离群点)。注意数据分布需要满足正态分布或近似正态分布

import numpy as np

def detect_outliers(data, threshold=3):
    mean = np.mean(data)
    std = np.std(data)
    outliers = []
    for value in data:
        z_score = (value - mean) / std
        if abs(z_score) > threshold:
            outliers.append(value)
    return outliers

# 生成一组含有异常值的随机数据
np.random.seed(10)
data = np.concatenate([np.random.normal(0, 1, 100), [10, 12, -8]]) #均值为0、标准差为1的正态分布的随机数,而后面三个元素是异常值。

# 使用3σ原则检测异常值
outliers = detect_outliers(data, threshold=3)

print("数据集:", data)
print("异常值:", outliers)

在这里插入图片描述
对于如何检测是否服从正态分布,可以利用Shapiro-Wilk 正态性检验,该检验基于样本数据的观察值与期望的正态分布进行比较,返回一个 p-value。如果 p-value 较大(通常大于 0.05),则可以接受原假设,即数据服从正态分布。S-W检验一般适用小样本数据(8<样本<50),而Kolmogorov-Smirnov(K-S)检验则可以适用于大样本。
在这里插入图片描述

3)Z-score

Z-score 方法是一种常用的统计方法,用于衡量一个数据点与其所在数据集均值的偏离程度,即标准化处理。通过计算 Z-score,我们可以判断一个数据点在数据集中的位置,以及与其他数据点的相对位置关系。通常情况下,绝对值大于 3 的 Z-score 被认为是异常值(outlier)。Z-score为3时,相当于3sigma判断标准。
在这里插入图片描述

2.距离方法

1)K近邻

K近邻(K-Nearest Neighbors,KNN)算法也可以用于检测异常值。在使用 KNN 算法检测异常值时,我们可以通过计算每个数据点与其最近的 K 个邻居之间的距离来确定异常值。如果某个数据点的距离远离其 K 个最近邻居,那么可以将其标记为异常值。

在这里插入图片描述

2)孤立森林

孤立森林(Isolation Forest)是一种用于异常检测的无监督学习算法,它利用了数据点的分离性质来检测异常值。该算法基于以下直觉:异常值通常比正常值更容易被分离。Isolation Forest 是一种高效的异常检测算法,它不需要对数据进行归一化或者假设数据服从特定的分布。这使得它适用于处理各种类型的数据,尤其是大规模数据集。

在这里插入图片描述

3.基于密度的方法

1)局部离群因子

局部离群因子(Local Outlier Factor,LOF) 的核心思想是基于数据点相对于其邻居的密度来评估其是否为异常值。具体而言,它计算每个数据点的局部离群因子(local outlier factor),该因子表示数据点相对于其邻居的密度与其自身密度之比的平均值。如果一个数据点的局部离群因子远高于其邻居的局部离群因子,则可能是一个异常值。该方法与KNN类似,但LOF 主要依赖于数据点相对于其邻居的密度来确定异常值,而 KNN 则依赖于数据点与其最近邻居之间的距离。LOF 是一种强大的异常检测算法,适用于各种类型的数据。然而,在使用 LOF 进行异常检测时,需要谨慎选择参数,并根据数据集的特性进行调整,以获得最佳的异常检测结果。
在这里插入图片描述

2)密度聚类

基于密度聚类的算法有很多,这里介绍的密度聚类算法主要是使用DBSCAN模型,该算法通过将数据点分成高密度区域和低密度区域来发现聚类结构,并且可以识别出低密度区域中的离群点。密度聚类算法是一种有效的检测异常值的方法,尤其适用于发现密度变化较大的数据集中的异常值。但是其对参数较为敏感,需谨慎选择参数,并且密度聚类算法的计算复杂度较高。

4.基于机器学习的方法

1)支持向量机

支持向量机(SVM)通常是通过检测落在决策边界(支持向量)之外的数据点来识别异常值。这种方法通常称为单类别支持向量机(One-Class SVM)
在这里插入图片描述

2)集成方法

如基于随机森林或梯度提升树等集成学习方法,可以结合多个模型的预测结果来识别异常值。这里一随机森林为例,随机森林通过对数据点的多个决策树进行集成,然后根据其平均或投票结果来评估每个数据点的异常程度。其优点能够处理高维数据和大规模数据集,对参数不敏感,具有较高的鲁棒性;但是需要较多的计算资源和较长的训练时间,并且可能在数据不平衡或异常值比例较高时产生较高的误报率。
在这里插入图片描述


总结

选择合适的异常值检测方法取决于数据特征、异常值类型以及具体业务场景。综合考虑不同方法的优缺点,并结合领域知识进行综合判断,可以更有效地检测和处理数据集中的异常值。在通常情况下,一般使用统计学的方法居多,其一是方便简单,同时可解释度高,其次是高效、可靠性好,能够很好的识别出异常值,并且能在不同的邻域中应用。

  • 24
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值