缺失值处理方法

缺失值是数据分析中一个常见的问题,因为在许多情况下,我们的数据集中会存在缺失数据。这些缺失值可能会导致分析结果偏差或错误,因此需要进行缺失值处理。下面介绍四种常见的缺失值处理方法:前向填充、移动平均、指数平滑、线性插值

1、前向填充(Forward Filling):使用前面最近的一个已知值来填充缺失值。当有多个连续的缺失值时,该方法将使用上一个已知值来填充所有缺失值,直到遇到下一个已知值。



# 构建一列随机缺失值列
unemploy['missing'] = unemploy['rate']
# unemploy.head()
# 随机选择10%行手动填充缺失值
mis_index = unemploy.sample(frac=0.1,random_state=999).index   # 获取缺失值所在的行标签
# mis_index   将存在缺失值的单元格转换为None
unemploy.loc[mis_index,'missing']=None


unemploy['f_fill'] = unemploy['missing']
unemploy['f_fill'].ffill(inplace=True)   # 默认实现前向填充


# 然后绘制散点--折线图实现观察
# 首先绘制关于date——rate散点图
plt.scatter(unemploy.year,unemploy.rate,s=10)
plt.plot(unemploy.year,unemploy.rate,label='real')


# 将非缺失点用“红点”绘制出来;缺失点用“倒三角”绘制出来
plt.scatter(unemploy[~unemploy.index.isin(mis_index)].year,unemploy[~unemploy.index.isin(mis_index)].f_fill,s=10,c='r')
# 绘制散点图:行是df中不属于mis_index的索引值;列是索引对应的f_fill列的值。

plt.scatter(unemploy.loc[mis_index].year,unemploy.loc[mis_index].f_fill,s=50,c='r',marker='v')
plt.plot(unemploy.year,unemploy.f_fill,label='forward fill')

plt.legend()

缺失值处理方法_第1张图片

 

2、移动平均(Moving Average):根据实际情况选择适合的移动窗口大小,一般来说。窗口大小越大,估计的结果越平滑,但是也会更滞后。例如,如果缺失的值位于时间序列中的某个位置,则可以使用该位置前后的一些数据的平均值来填充该缺失值。

# 首先使用np.where()判断是否为缺失值,是的话返回第二个参数,否则返回第三个参数;
# shift(1)表示当前单元格向上移动一个;窗口大小为3;min_periods=1表示最初位置可以使用第一个非缺失值
unemploy['moveavg']=np.where(unemploy['missing'].isnull(),
                             unemploy['missing'].shift(1).rolling(3,min_periods=1).mean(),
                             unemploy['missing'])

# 观察填充效果
plt.scatter(unemploy.year,unemploy.rate,s=10)
plt.plot(unemploy.year,unemploy.rate,label='real')

plt.scatter(unemploy[~unemploy.index.isin(mis_index)].year,unemploy[~unemploy.index.isin(mis_index)].f_fill,s=10,c='r')
plt.scatter(unemploy.loc[mis_index].year,unemploy.loc[mis_index].f_fill,s=50,c='r',marker='v')
plt.plot(unemploy.year,unemploy.f_fill,label='forward fill',c='r',linestyle = '--')

plt.scatter(unemploy[~unemploy.index.isin(mis_index)].year,unemploy[~unemploy.index.isin(mis_index)].moveavg,s=10,c='r')
plt.scatter(unemploy.loc[mis_index].year,unemploy.loc[mis_index].moveavg,s=50,c='g',marker='^')
plt.plot(unemploy.year,unemploy.moveavg,label='moving average',c='g',linestyle = '--')

plt.legend()




缺失值处理方法_第2张图片

3、指数平滑(Exponential Smoothing):使用加权平均值来填充缺失值,其中最近的数据点被赋予更高的权重。指数平滑可以更好地反映数据的趋势和季节性,并且在填充连续的缺失值时也非常有效。

# 设置两种平滑系数
air['smooth_0.5']= air.Passengers.ewm(alpha =0.5).mean()
air['smooth_0.9']= air.Passengers.ewm(alpha =0.9).mean()
air

# 先后绘制date与air、air['smooth_0.5']、air['smooth_0.9']的散点图
plt.plot(air.Date,air.Passengers,label='actual')
plt.plot(air.Date,air['smooth_0.5'],label='alpha=0.5')
plt.plot(air.Date,air['smooth_0.9'],label='alpha=0.9')
plt.xticks(rotation=45)  # 设置倾斜角度
plt.legend()

缺失值处理方法_第3张图片

 

4、线性插值(Linear Interpolation):使用数据中已知的两个邻近数据点之间的线性关系来填充缺失值。这种方法通常用于连续的时间序列数据,可以更好地估计缺失值的可能范围。

unemploy['inter_lin']=unemploy['missing'].interpolate(method='linear')
unemploy['inter_poly']=unemploy['missing'].interpolate(method='polynomial', order=3)

# 观察填充效果
plt.plot(unemploy.year,unemploy.rate,label='real')
plt.plot(unemploy.year,unemploy.inter_lin,label='linear interpolation',c='r',linestyle = '--')
plt.plot(unemploy.year,unemploy.inter_poly,label='polynomial interpolation',c='g',linestyle = '--')
plt.legend()

你可能感兴趣的:(数据挖掘,数据分析,人工智能)