各位读者大家好!在我们的数据处理和分析系列中,今天我们将了解Python 中异常值的检测和删除。
那么,让我们开始吧!
Python 中的异常值是什么?
在深入探讨异常值的概念之前,让我们先了解原始数据的起源。
馈送到系统的原始数据通常是通过调查和从网络上的实时操作中提取数据而生成的。这可能会引起数据的变化,并且在记录数据时存在测量误差的可能性。
这就是异常值出现的时候。
异常值是远离数据集其余数据值的一个点或一组数据点。也就是说,它是远离数据集中数据值的总体分布的数据点。
仅在连续值中才可能出现异常值。因此,异常值的检测和去除仅适用于回归值。
基本上,异常值似乎偏离了数据元素的整体正确且结构良好的分布。它可以被认为是远离类或总体的异常分布。
了解了离群值的概念后,现在让我们在下一节中重点关注删除离群值的必要性。
为什么需要从数据中删除异常值?
如上所述,异常值是远离数据通常分布的数据点,会对整体数据分布产生以下影响:
- 影响数据的总体标准差。
- 操纵数据的总体平均值。
- 将数据转换为倾斜形式。
- 它会导致机器学习模型的准确性估计出现偏差。
- 影响数据集的分布和统计。
由于上述原因,在对数据集建模之前有必要检测并消除异常值。
异常值检测 – IQR 方法
数据集中的异常值可以通过以下方法检测:
- Z 分数
- 散点图
- 四分位距(IQR)
在本文中,我们将实现 IQR 方法来检测和处理异常值。
IQR 是四分位数范围的缩写。它衡量数据值的统计离散程度,作为整体分布的衡量标准。
IQR 分别相当于第一个四分位数 (Q1) 和第三个四分位数 (Q3) 之间的差。
这里,Q1 指的是第一个四分位数,即 25%,Q3 指的是第三个四分位数,即 75%。
我们将使用箱线图来检测和可视化数据集中存在的异常值。
箱线图以四分位数描述数据的分布,由以下部分组成:
- 第一季度-25%
- 第二季度-50%
- 第三季度-75%
- 下限/晶须
- 上须/束缚
任何低于下限且高于上限的数据点都被视为离群值。
现在让我们实现 Boxplot 来检测以下示例中的异常值。
示例:
最初,我们已将数据集导入到环境中。您可以在此处找到数据集。
import pandas import numpy BIKE = pandas.read_csv( "Bike.csv" ) |
此外,我们将变量分为数值和分类值。
numeric_col = [ 'temp' , 'hum' , 'windspeed' ] categorical_col = [ 'season' , 'yr' , 'mnth' , 'holiday' , 'weekday' , 'workingday' , 'weathersit' ] |
我们对数值变量应用箱线图boxplot() function
,如下所示:
BIKE.boxplot(numeric_col) |
如上所示,变量“windspeed”包含高于下限的异常值。
去除异常值
现在是时候处理我们在上一节中使用箱线图检测到的异常值了。
使用 IQR,我们可以按照以下方法将异常值替换为 NULL 值:
- 计算第一和第三四分位数(Q1 和 Q3)。
- 此外,评估四分位数范围IQR = Q3-Q1。
- 估计下界,下界=Q1*1.5
- 估计上限,上限=Q3*1.5
- 将位于下限和上限之外的数据点替换为NULL 值。
for x in [ 'windspeed' ]: q75,q25 = np.percentile(BIKE.loc[:,x],[ 75 , 25 ]) intr_qr = q75 - q25 max = q75 + ( 1.5 * intr_qr) min = q25 - ( 1.5 * intr_qr) BIKE.loc[BIKE[x] < min ,x] = np.nan BIKE.loc[BIKE[x] > max ,x] = np.nan |
因此,我们用来numpy.percentile() method
计算 Q1 和 Q3 的值。此外,我们已将异常值替换numpy.nan
为 NULL 值。
用 nan 替换异常值后,现在让我们使用以下代码检查空值或缺失值的总和:
BIKE.isnull(). sum () |
数据集每列中 NULL 值/异常值的计数总和:
season 0 yr 0 mnth 0 holiday 0 weathersit 0 temp 0 hum 0 windspeed 5 cnt 0 dtype: int64 |
现在,我们可以使用以下任何技术来处理 NULL 值:
- 使用平均值、中位数或 Knn 估算值估算缺失值。
- 删除空值(如果比例相对较小)
pandas.dataframe.dropna()
在这里,我们将使用函数删除空值
BIKE = BIKE.dropna(axis = 0 ) |
处理完异常值后,现在让我们检查数据集中是否存在缺失值或空值:
BIKE.isnull(). sum () |
输出-
season 0 yr 0 mnth 0 holiday 0 weathersit 0 temp 0 hum 0 windspeed 0 cnt 0 dtype: int64 |
因此,数据集中存在的所有异常值都已被检测并处理(删除)。
结论
至此,我们这个话题就结束了。如果您遇到任何问题,请随时在下面发表评论。
了解更多与 Python 相关的此类帖子。请继续关注,直到那时,快乐学习!🙂