数据处理——异常值处理(箱线图,均值填充)

目录

1 异常值定义

2 箱线图

3 案例处理

4 数据处理代码展示:


1 异常值定义

        异常值(Outliers)在统计学、数据分析以及机器学习等领域中是一个重要的概念。它们通常指的是在数据集中与其余数据点的分布模式不一致或显著不同的观测值。这些值可能是由于测量误差、数据输入错误、实验错误或数据集中固有的变异性等原因造成的。

2 箱线图

        箱线图(Box Plot)是一种用于显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也常常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比对。箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数,然后连接两个四分位数画出箱体,再将上边缘和下边缘与箱体相连接,中位数在箱体中间。

         箱线图包含以下主要元素:

         中位数(Median):数据集的中间值,将数据集分为两半,一半数据比中位数大,一半数据比中位数小。

         第一四分位数(Q1/25%分位数):也称为下四分位数,是数据集中有25%的数据小于或等于它的值。

         第三四分位数(Q3/75%分位数):也称为上四分位数,是数据集中有75%的数据小于或等于它的值。

         箱体(Interquartile Range, IQR):是第一四分位数与第三四分位数之间的差值,即IQR = Q3 - Q1。箱体表示了数据集中大部分数据的范围。

         异常值(Outliers):在箱线图中,异常值通常定义为小于Q1 - 1.5 * IQR或大于Q3 + 1.5 * IQR的数据点。这些点通常在箱线图中用单独的点或符号表示,并且可能不包括在箱体或须线的范围内。

         上边缘:通常是第三四分位数(Q3,即75%分位数)加上一个“须长”(Whisker Length)得到的。这个“须长”通常是四分位距(IQR,即Q3与Q1之差)的某个倍数(如1.5倍)。因此,上边缘的计算公式大致为:Q3 + 1.5 * IQR。但请注意,如果计算出的上边缘值大于数据集中的实际最大值,那么上边缘将直接设置为数据集中的最大值。

         下边缘:与上边缘类似,下边缘通常是第一四分位数(Q1,即25%分位数)减去一个“须长”得到的。因此,下边缘的计算公式大致为:Q1 - 1.5 * IQR。同样地,如果计算出的下边缘值小于数据集中的实际最小值,那么下边缘将直接设置为数据集中的最小值。

          中位数:中位数(Median)是一种统计量,用于描述一组数据按照大小顺序排列后位于中间位置的数值。如果数据的数量是奇数,则中位数是中间那个数;如果数据的数量是偶数,则中位数是中间两个数的平均值。

3 案例处理

数据来源:Iris - UCI 机器学习存储库

异常值处理(均值填充)展示:

4 数据处理代码展示:

#python包导入
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import copy
import seaborn as sns
#乱码解决
plt.rcParams["font.sans-serif"] = "SimHei"#汉字乱码的解决方法
plt.rcParams['axes.unicode_minus']=False #用来正确显示负号
#导入数据
train= pd.read_excel(r"C:\Users\86182\Desktop\iris.xlsx", sheet_name='Sheet1')
#导入的数据确保没有字符串在excle中先做处理
train.fillna(train.mode(),inplace=True)#数据缺失值众数填充
train.drop_duplicates()# 默认根据所有的列,进行删除(数据结构中,行相同的数据只保留一行)
#表格第一行名称提取
a=list(train.columns)
train=np.array(train)
newtrain=copy.deepcopy(train)#深度拷贝这样改变一个另外一个不会改变
#对数据异常值查找并对其进行平均值替换
for i in range(len(train[1,:])):
    X = copy.deepcopy(train[:,i])#深度拷贝
    q1 = np.quantile(X,0.25)#分位数的意思np.quantile(a, 0.5)
    q3 = np.quantile(X,0.75)
    qr = q3 - q1
    Lower_tail = q1 - 1.5 * qr
    Upper_tail = q3 + 1.5 * qr
    m = np.mean(X)#平均值填充
    for j in range(len(X)):
        if X[j] > Upper_tail or X[j] < Lower_tail:
            X[j]=m
    newtrain[:,i]=copy.deepcopy(X)
#图像绘制
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(9,4))
# fig.suptitle("Boxplot Examples",fontsize=24)#画版标题
bplot1=axes[0].boxplot(train,vert=True,patch_artist=True,meanline=False)
bplot2=axes[1].boxplot(newtrain,vert=True,notch=True,patch_artist=True,meanline=False)
#颜色填充
colors = ['pink', 'lightblue', 'lightgreen','orange','red']
for bplot in (bplot1, bplot2):
    for patch, color in zip(bplot['boxes'], colors):
        patch.set_facecolor(color)
#图像修饰
biaoti=['处理前','处理后']
for k in range(len(axes)):
    axes[k].set_xlabel('类别')  # 设置x轴名称
    axes[k].set_ylabel('数值')  # 设置y轴名称
    axes[k].set_title("{}".format(biaoti[k]), fontsize=10)#标题填充,fontisize为字体大小
plt.setp(axes, xticks=[1,2,3,4,5],xticklabels=a)#加刻度线名称
plt.show()

  • 34
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值