异常值是与其他数据有明显不同的值,它们可能是由于数据收集错误、测量误差、或其他异常情况引起的。处理异常值的目标是使数据更加准确、可靠,并且适合用于后续的数据分析和建模。
处理异常值的方法:
- 3σ法则:计算数据的均值和标准差,然后根据3σ法则,将位于均值±3倍标准差之外的数据视为异常值。适合正太分布
- 箱线图(IQR方法):绘制箱线图,根据数据的四分位数(Q1,Q3)和四分位距(IQR=Q3-Q1),将位于Q1-1.5IQR和Q3+1.5IQR之外的数据视为异常值。
- 领域知识:根据数据的领域知识和业务规则来确定异常值。
1、3σ法则
import pandas as pd
import numpy as np
data=pd.Series(np.random.randint(0,100,size=300))
for i in range(2):
data.iloc[np.random.randint(0,300)]=np.random.randint(1000,2000)
data.iloc[np.random.randint(0,300)]=np.random.randint(-1000,-100)
#计算均值和标准差
mean=data.mean()
std=data.std()
#设置上下限
upper_limit=std+3*mean
lower_limit=std-3*mean
cond=(data>upper_limit)|(data<lower_limit)
print(data[cond])
2、箱线图
箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。
以下是使用箱线图处理异常值的步骤:
1.绘制箱线图:使用boxplot()方法绘制数据的箱线图。
2.确定异常值:观察箱线图,查找位于箱线之外的数据点,这些数据点被认为是异常值。
3.处理异常值:根据实际情况,您可以选择删除异常值、替换为特定值或进行其他处理。
- 绘制箱线图
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data=pd.DataFrame(np.random.randint(0,100,size=(100,1)),columns=['values'])
for i in range(2):#设置异常值
data.loc[(np.random.randint(0,100)),('values')]=np.random.randint(200,300)
data.loc[(np.random.randint(0,100)),('values')]=np.random.randint(-100,0)
data.boxplot(column='values')#绘制箱线图
plt.show()
- 确定异常点
q1=data['values'].quantile(0.25)
q3=data['values'].quantile(0.75)
#根据数据的四分位数(Q1,Q3)和四分位距(IQR=Q3-Q1),
#将位于Q1-1.5IQR和Q3+1.5IQR之外的数据视为异常值。
iqr=q3-q1
lower_limit=q1-1.5*iqr
upper_limit=q3+1.5*iqr
cond=(data['values']>upper_limit)|(data['values']<lower_limit)
print(data[cond])
- 处理异常点
我们根据需求对这些异常点进行处理。
通过插值法处理数据异常
适用于线性数值,其根据相邻数据点的值来推测异常值,pandas提供了interpolate()方法来进行插值处理。
pandas提供了interpolate方法来推测异常值。
语法:DataFrame['columns_name'].interpolate(参数)
参数:
- method:插值方法,默认是linear线性插值,可以选择其他方法如polynomial、spline等。(有很多)
- axis:沿哪个轴插值,默认是0(行)。
- limit:最多插值的缺失值数量。
- inplace:是否在原地修改数据,默认是False。
- limit_direction:插值方向,可以是forward、backward或者both。
- order:如果method是polynomial,需要指定多项式的阶数。
代码示例:
import pandas as pd
import numpy as np
data= pd.DataFrame({'values':[10,12,13,14,15,16,20,22,24,25,100,32,36,38]})
#通过箱线表寻找异常点
q1=data['values'].quantile(0.25)
q2=data['values'].quantile(0.75)
iqr=q2-q1
lower_limit=q1-1.5*iqr
upper_limit=q2+1.5*iqr
cond=(data['values']>upper_limit)|(data['values']<lower_limit)#找到异常点
#将异常数据换成NaN
data.loc[cond,'values']=np.nan
df=data['values'].interpolate().to_frame()#这里返回的是series,通过to_frame()转变成dataframe
#通过interpolate()进行推测数据值
print(df)