本文链接: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 用缺失值代替
凡是在异常值阈值外的,都用缺失值代替,然后用缺失值的填补方法对这些缺失值进行填补。文章来源:https://www.toymoban.com/news/detail-480714.html
总结
识别方法和处理方法可以自由组合,比如用箱线图对异常值进行检测,并用缺失值代替,对超出阈值的值进行代替,然后对缺失值填补。这篇文章对你们有用的话,可以点赞收藏加评论哦。欢迎评论区交流。文章来源地址https://www.toymoban.com/news/detail-480714.html
到了这里,关于【python】数据挖掘分析清洗——离群点(异常值)处理方法汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!