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 用缺失值代替

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

    总结

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python数据挖掘分析清洗:离群点(异常值)处理方法汇总

    发表评论