数据预处理|数据清洗|使用Pandas进行异常值清洗
数据预处理|数据清洗|使用Pandas进行异常值清洗
- 通过Pandas库实现数据清洗中的异常值处理
- 异常数据识别阶段
-
基础统计指标分析作为初步筛选依据
- 观察样本分布特征的方法包括绘制散点图观察数据分布情况
- 应用标准差计算得出三倍标准差范围以识别潜在极端值
- 借助箱线图展示数据分布形态并定位可能存在的极端数值集合区域
-
2. 异常值处理
-
- 2.1 直接删除
- 2.2 视为缺失值
- 2.3 平均值修正
- 2.4 盖帽法
- 2.5 分箱平滑法
- 2.6 回归插补
- 2.7 多重插补
- 2.8 不处理
-
- 异常数据识别阶段
使用Pandas进行异常值清洗
outliers被定义为数据集中出现的一类不符合常规的数据点,在本研究中所指的不符合常规的数据点并非错误数据点。这些outliers的存在会导致数据分析结果产生显著偏差
1. 异常值检测
1.1 简单统计分析
在数据分析中,最大值与最小值是最为常见的统计指标之一,用于检测变量取值是否偏离正常区间.具体而言,当某字段的数据如电商信息表中的客户年龄age=199岁时,即可识别出该数值属于异常情况.
- 例1. 计算成年人的身高、体重公式为:Y=(X-100)×1.2,其中X为身高(cm),Y为标准体重(kg)。
import matplotlib.pyplot as plt
import numpy as np
#假设成年人(18岁以上)正常高度在1.4米至2.0米
x=np.arange(140,200,5)
y=(x-100)*1.2
plt.rcParams['font.family']='STSong' #图形中显示汉字
plt.rcParams['font.size']=10
plt.title('身高和体重')
plt.plot(x,y,'.')
plt.plot(150,187,'r.') #异常值
plt.plot(166,212,'r.') #异常值
plt.plot(187,208,'r.')
plt.show()

1.2 散点图方法
通过数据分布的散点图可以检测异常数据。
- 例2. 分析房屋面积和房屋价格的关系示例。
import matplotlib.pyplot as plt
import numpy as np
x = [225.98,247.07,253.14,254.85,241.58,
301.01,20.67,288.64, 163.56,120.06,
207.83,342.75,147.9,53.06,224.72,
29.51,21.61,483.21, 245.25,
299.25,343.35] #房屋面积数据
y = [196.63,203.88,210.75,372.74,202.41,
347.61,24.9,239.34, 140.32,304.15,
176.84,488.23,128.79,49.64,191.74,
33.1,30.74,400.02,205.35,330.64,
283.45] #房屋价格数据
plt.figure(figsize=(6, 5), dpi=100) #创建画布
plt.scatter(x, y,s=40) # 绘制散点图
plt.show() # 显示图像

1.3 3σ原则
在正态分布中表示标准差的是σ,在正态分布中表示均值的是μ,并且当x等于μ时,则是图像的对称轴。根据3σ原则,在正态分布中可以观察到以下现象:约68.27%的数据落在距离均值一个标准差(σ)的区间内;约95.44%的数据则落在两个标准差范围内;而约99.74%的数据则位于三个标准差范围内。换言之,在遵循3σ原则的正态分布情况下Y 的取值几乎全部集中在(μ−3σ, μ+3σ)区间内;超出这个范围的可能性极低,在不到0.3%的情况下发生因此在实际应用中将超出这个范围的数据视为异常值并进行特殊处理如标记或剔除如图所示

3σ原则要求数据服从正态或近似正态分布,且样本数量大于10。
- 例3. 3σ原则检测异常值示例。
import pandas as pd
data=[199,78,72,70,68,72,77,78,42,78,74,
54,80,82,65,62,60] #学生某门课程成绩
s=pd.Series(data)
dmean=s.mean()
dstd=s.std()
print('\n检测出异常值:')
yz1=dmean-3*dstd
yz2=dmean+3*dstd
for i in range(0,len(data)):
if (data[i]<yz1)or(data[i]>yz2):
print(data[i],end=',')
检测出异常值:
199,
1.4 箱线图
箱线图是基于数据集的四分位数构建的图形化的呈现方式,并且是一种简便且高效的可视化异常值检测工具。
- 例4. 箱线图检测异常值示例。
import pandas as pd
import matplotlib.pyplot as plt
data=[78,72,32,70,68,72,77,78,
56,78,74,54,80,82,65,62]
s=pd.Series(data)
plt.boxplot(x=s.values,whis=1.5)
plt.show()
#从图中可以看出,检测出的异常值为32。

2. 异常值处理
在数据预处理过程中实施的对异常值的处理被视为一项关键环节,在实际操作中也面临着诸多挑战和复杂性;同时这也是确保原始数据可靠性和计算出的平均值与标准差具有准确性基础的重要工作
2.1 直接删除
通常会采取的方法是将包含异常值的数据记录进行剔除处理。然而这种方法虽然操作简便易于实施但也存在明显的局限性值得注意的是其缺点不容忽视首先当数据样本较少时单纯地剔除这些数据可能会影响后续分析的有效性其次更为严重的是单纯地剔除这些数据可能会影响变量的原有分布情况从而导致所建立的统计模型出现偏差
2.2 视为缺失值
采用处理缺失数据的方法进行操作。这种方法的优势在于能够基于现有变量信息进行填补。需要注意的是,在将该异常值视为缺失值进行处理时需依据其特点选择合适的补救措施。具体而言,在以下三种情况中采取不同的应对策略:当异常值(即缺失数据)属于完全随机缺失时, 采用特定方法;当属于随机missing时, 采用另一种方法;而当属于non-random missing时, 则需要第三种策略
2.3 平均值修正
如果数据规模较小的情况下,则可以通过计算前后两个观测点的平均数来进行该异常观测点的校正处理。这是一种折中手段,在大多数参数型方法都基于均值构建模型的前提下,采用均值进行校正具有一定的合理性:其优点是可以弥补样本缺失所带来的不足;然而其缺点在于会牺牲掉样本所具有的独特性。
2.4 盖帽法
对于某个连续变量,在其均值上下三倍标准差范围之外的数据点将被替换为其均值加上减去三倍标准差所得到的具体数值,并被称为数据截断处理(如图所示)。

2.5 分箱平滑法
分箱平滑法是一种利用邻近数据点来减少存储误差的方法。其核心目标在于剔除异常数据点,并将连续数值转化为离散形式以提高数据粒度。
在执行分箱操作之前必须对数据进行排序处理将数据按照一定的规则分配到宽度(深度)相等的箱子中其中"宽度"指的是每个箱子覆盖相同的数值范围而"深度"则表示每个箱子包含相同数量的记录。例如客户收入属性income按照金额排序后得到的数据点(单位:元):23.1 万、2.5 万、2.8 万、3.**万、3.5 万、4.**万、4.5 万、4.8 万、5.**万、5.**3 **万、5. **5 **万、6 **万、6. **2 **万、6. **7 **万以及7 **万元人民币的具体数值如上所示。根据记录数量进行划分具体操作如下:对于深度设定为4的情况按照从小到大的顺序将前四个数值划分为第一组接下来四个数值形成第二组以此类推直到所有数据都被均匀地分配到四个组别中去。而对于宽度设定为12百元人民币的情况下则会根据相邻两个数值之间的差值来确定具体的划分区间并确保每一个箱子所覆盖的数据量大致相当从而实现更加均匀的数据分布效果。
- 数据修匀
将数据按区间划分为若干个箱子后, 可采用以下三种方法对各箱子的数据进行修匀处理。
算术平均修匀: 每一箱内的所有数据均以该区间内所有数值的算术平均数代替。
中间数修匀: 每一箱内的所有数据均以该区间内所有数值的中间数替代。
邻近边界修匀: 将每一箱内的任一数据替换成与其最邻近的最大或最小边界的数值。
2.6 回归插补
对于两个相关变量之间的变化趋势, 利用回归方法拟合一个函数以达到平滑数据的目的。当变量间存在依赖关系时(即 y=f(x)), 我们可以通过建立模型求解 f 并利用 x 预测 y 值, 这也是回归问题的核心思想之一。实际应用中常假设 p(y)=N(f(x)) 成立, 其中 N 表示正态分布情况下的概率密度分布函数。如果 y 是观测到的数据并且包含异常点, 我们可以通过 x 的信息重新计算得到新的 y 估计值, 这种过程能够有效地去除异常点的影响, 同时这也是一种常用的数据清洗方法——通过回归分析消除异常值
2.7 多重插补
多重插补的处理包含两个主要步骤:首先删除y变量中的缺失值之后进行插补。需要注意以下两个关键方面:其一,在被解释变量存在缺失值时必须删除而不能进行填充;其二,在模型中使用的解释变量仅需进行插补即可。
2.8 不处理
根据该异常值的特征属性,在分析其本质规律的基础上采用更为精准的建模方式用于修正,并对这一数据集展开数据分析
