【python】数据挖掘分析清洗——离群点(异常值)处理方法汇总

目录

  • 前言
  • 一、识别异常值
    • 1.1 箱线图处理异常值
    • 1.2 3α原则
    • 1.3 boxcox
  • 二、异常值处理
    • 2.1 截尾法
    • 2.2 单一变量代替
    • 2.3 用缺失值代替
  • 总结

本文链接:https://blog.csdn.net/weixin_47058355/article/details/129949060?spm=1001.2014.3001.5501

前言

异常值处理的意义在于提高数据分析的准确性和可靠性。异常值往往会影响数据的统计特征,如平均值、方差等,从而导致错误的结论或预测结果。此外,异常值还可能干扰模型的拟合效果,使得模型对数据的解释能力变弱。
因此,对于数据分析任务,我们通常需要进行异常值处理,以尽可能保证数据的质量和准确性。常用的异常值处理方法包括删除异常值、替换异常值、将异常值视为缺失值等。具体方法需要根据数据类型和任务要求来选择和实施。
本文用的是泰塔尼克号的数据集 可以从kaggle上找 链接:传送门

一、识别异常值

1.1 箱线图处理异常值

箱线图(Box plot)是一种用于展示数据分布情况的图形,它能够有效地检测数据中的异常值。箱线图由五个数值点组成,分别是最小值、下四分位数(Q1)、中位数(Q2)、上四分位数(Q3)和最大值。
在箱线图中,箱子的上边缘和下边缘分别代表数据的上四分位数(Q3)和下四分位数(Q1),箱子内部的线段表示数据的中位数(Q2)。箱子的顶端和底端则连接着两条线段,称为“须”,它们通常延伸到数据集中非异常值的最大值和最小值。
如果数据中存在异常值,那么这些异常值将会被绘制成独立的点,并且远离其他数据点。通过观察箱线图,我们可以很容易地识别出这些异常值,因为它们不符合正常数据点的分布规律,即在“须”之外。这是箱线图检测异常值的原理。
IQR(Interquartile Range)是指四分位数间距,也就是数据的上四分位数(Q3)与下四分位数(Q1)之间的距离。在使用箱线图进行异常值检测时,通常会根据IQR来确定异常值的阈值范围。

具体来说,可以使用以下公式来计算异常值的阈值:

上限:Q3 + 1.5 * IQR 下限:Q1 – 1.5 * IQR 如果某个数据点小于下限或大于上限,则该数据点被认为是异常值。

例如,假设有一组数据如下:[2, 4, 6, 8, 10, 12, 14, 16, 18, 20,
22]。通过计算可得到Q1=5、Q2=11、Q3=17,因此IQR=12(即17-5)。根据上述公式,可得到下限为-11和上限为33。因此,该数据集中小于-11或大于33的数值均被视为异常值。

通过使用IQR来检测异常值,我们能够更加准确地识别出数据中的离群值,避免了过度依赖具体分布形态的风险。

#封装好的函数 可以随意调用
def outliers_proc(data, col_name, scale=1.5):
    """
            data:接收pandas数据格式
            col_name: pandas列名
            scale: 尺度
    """
    data_col = data[col_name]
    Q1 = data_col.quantile(0.25) # 0.25分位数
    Q3 = data_col.quantile(0.75)  # 0,75分位数
    IQR = Q3 - Q1
    data_col[data_col < Q1 - (scale * IQR)] = Q1 - (scale * IQR)
    data_col[data_col > Q3 + (scale * IQR)] = Q3 + (scale * IQR)
    return data[col_name]
data['Fare'] = outliers_proc(data, 'Fare')
print(data['Fare'].max())
data['Fare']


除此之外还可以对数据进行箱线图可视化

import matplotlib.pyplot as plt
import numpy as np

# 绘制箱线图
fig, ax = plt.subplots()
ax.boxplot(data['Fare'])

# 添加标题和标签
ax.set_title('Box Plot')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')

# 显示图形
plt.show()

1.2 3α原则

正态分布的3α原则是指,对于一个正态分布的随机变量,其大约有68%的观测值落在平均值加减标准差之间,约95%的观测值落在平均值加减两倍标准差之间,约99.7%的观测值落在平均值加减三倍标准差之间。这个规律可以用来判断某个数据点是否异常或者离群。如果一个数据点的值超过了平均值加减三倍标准差的范围,那么它就被认为是异常点或者离群点。

def find_anomalies(random_data):
    random_data_std = random_data.std()
    random_data_mean = random_data.mean()
    anomaly_cut_off = random_data_std * 3

    lower_limit  = random_data_mean - anomaly_cut_off 
    upper_limit = random_data_mean + anomaly_cut_off

    random_data[random_data <lower_limit] = lower_limit
    random_data[random_data >upper_limit] = upper_limit

    return random_data
find_anomalies(data['Fare'])
print(data['Fare'].max())
data['Fare']

1.3 boxcox

box和cox在1964年提出的变换可以使线性回归模型满足线性性、独立性、齐方差性以及正态性,同时又不丢失信息。真实数据往往不完美符合这四个特性,而大多数数据统计都要求数据为正态分布(比如pearson相关系数)。因此可以通过boxcox改变一下数据形式。
切记要求该列数据全部大于0 不可以小于或者等于0 否则会报错 Data must be positive.

from scipy.stats import boxcox
data['Fare']=data['Fare']+1
boxcox_transformed_data = boxcox(data['Fare'])
boxcox_transformed_data

二、异常值处理

2.1 截尾法

截尾法 就是大于异常值阈值的数 都变为最大阈值 小于异常值阈值的数 都变为最小阈值。比如前面所写的箱线图 就是截尾法

2.2 单一变量代替

凡是在异常值阈值外的,都用单一变量代替,比如最大值,最小值,平均值,众数等等。

2.3 用缺失值代替

凡是在异常值阈值外的,都用缺失值代替,然后用缺失值的填补方法对这些缺失值进行填补。

总结

识别方法和处理方法可以自由组合,比如用箱线图对异常值进行检测,并用缺失值代替,对超出阈值的值进行代替,然后对缺失值填补。这篇文章对你们有用的话,可以点赞收藏加评论哦。欢迎评论区交流。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年6月21日
下一篇 2023年6月21日

相关推荐