eviews如何处理缺失数据填补_python数据预处理之异常值、缺失值处理方法
一、異常值
? ? ? ?異常值是指樣本中的個別值,其數值明顯偏離其余的觀測值。異常值也稱離群點,異常值的分析也稱為離群點的分析。
? ? ? ?常用的異常值分析方法為3σ原則、箱型圖分析、機器學習算法檢測,一般情況下對異常值的處理都是刪除和修正填補,即默認為異常值對整個項目的作用不大,只有當我們的目的是要求準確找出離群點,并對離群點進行分析時有必要用到機器學習算法,其他情況下不用費精力去分析他們,今天不討論基于機器學習算法的離群點檢測和分析,改天單獨出一個。
1、3σ原則
? ? ? ?如果數據服從正態分布,異常值被定義為一組測定值中與平均值的偏差超過3倍的值 → p(|x - μ| > 3σ) ≤ 0.003
首先創建數據
對數據進行正態性檢驗,p值為0.63,遠遠大于 0.05,認為服從正態分布。
接下來繪圖查看數據和異常值
#繪制數據密度曲線fig= plt.figure(figsize=(10,6))ax1=fig.add_subplot(2,1,1)data.plot(kind='kde',style='--k',grid=True,title='密度曲線')plt.axvline(3*std,hold=None,linestyle='--',color='r')plt.axvline(-3*std,hold=None,linestyle='--',color='r') #篩選出異常值和正常值error = data[np.abs(data - u) > 3*std]data_c = data[np.abs(data - u) <= 3*std]ax2=fig.add_subplot(2,1,2)plt.scatter(data_c.index,data_c,alpha=0.3)plt.scatter(error.index,error,color='r',marker='o',alpha=0.8)圖中可以看出數據服從標準正態分布,且存在兩個異常值
2、箱型圖分析
? ?箱型圖是非常適合做異常值觀察的圖形,箱型圖的五根線分別表示最大值。最小值、上四分位、下四分位和中位數,箱型圖的兩個重要的概念是內限和外限,盒須的內限,最大值區間:上四分位+1.5IQR,最小值區間:下四分位-1.5IQR (IQR=上四分位-下四分位),在內限之外是中度異常,在外限之外是極度異常。下面以內限為界,查看異常數據
#箱型圖fig = plt.figure(figsize = (10,6))ax1 = fig.add_subplot(2,1,1)color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')data.plot.box(vert=False, grid = True,color = color,ax = ax1,label = '樣本數據') s = data.describe()print(s)print('------')# 基本統計量 q1 = s['25%']q3 = s['75%']iqr = q3 - q1mi = q1 - 1.5*iqrma = q3 + 1.5*iqrprint('分位差為:%.3f,下限為:%.3f,上限為:%.3f' % (iqr,mi,ma))print('------')#?計算分位差ax2 = fig.add_subplot(2,1,2)error = data[(data < mi) | (data > ma)]data_c = data[(data >= mi) & (data <= ma)]print('異常值共%i條' % len(error))# 篩選出異常值error、剔除異常值之后的數據data_c plt.scatter(data_c.index,data_c,marker='.',alpha = 0.3)plt.scatter(error.index,error,color = 'r',marker='.',alpha = 0.5)plt.grid()從上圖可以看出,該數據上限為2.799,下限為-2.741,異常值共6條,找出異常值之后一般情況下如果異常值不多,可以直接刪除,或者當做缺失值處理。二、缺失值
? ? ?對于缺失值最簡單的處理方法便是刪除,但有時不同字段存在大量不同的缺失值,處理起來比較麻煩,如果直接刪除將會影響分析結果或者建模的準確率。對于特定的數據一般不直接刪除,我把常用的缺失值插補方法分為兩類,取名為單一插補法(均值填充、中位數填充、眾數填充、特定值填充、臨近值填充等)、插值法(拉格朗日插值法、多重插補法等)
1、均值/中位數/眾數/特定值/臨近值插補
# 創建數據s = pd.Series([1,2,3,np.nan,3,4,5,5,5,5,np.nan,np.nan,6,6,7,12,2,np.nan,3,4]) u = s.mean() # 均值me = s.median() # 中位數mod = s.mode() # 眾數print('均值為:%.2f, 中位數為:%.2f' % (u,me))print('眾數為:', mod.tolist())print('------')# 分別求出均值/中位數/眾數 s.fillna(u,inplace = True)# 用均值填補,可換為中位數、眾數或特定的數值等 s1 = pd.Series([1,2,3,np.nan,3,4,5,5,5,5,np.nan,np.nan,6,6,7,12,2,np.nan,3,4]) s1.fillna(method = 'ffill',inplace = True)#?用前值插補?,后值為bfill2、拉格朗日插值法
? ? ? ?拉格朗日插值法的數學原理是,平面上任意點可以擬合成下列多項式
? ? ?
? ? ? 當平面上只有兩點時則是最簡單的線性關系 ,三點時是二次方,為了根據新的x求出y,需要知道上述公式所有系數,因為n個點在以上多項式上,把n個點的坐標帶入,可求出系數,最終求得插值。
from scipy.interpolate import lagrangex = [3, 6, 9]y = [10, 8, 4]print(lagrange(x,y))print(type(lagrange(x,y)))# 輸出值為的是多項式的n個系數# 這里輸出3個值,分別為a0,a1,a2# y = a0 * x**2 + a1 * x + a2 → y = -0.11111111 * x**2 + 0.33333333 * x + 10 print('插值10為:%.2f' % lagrange(x,y)(10)) # -0.11111111*100 + 0.33333333*10 + 10 = -11.11111111 + 3.33333333 +10 = 2.22222222#?插值10為:2.22下面給出拉格朗日插值法和其他插補方法對比圖
data = pd.Series(np.random.rand(100)*100)data[3,6,33,56,45,66,67,80,90] = np.nan data_c = data.fillna(data.median()) # 中位數填充缺失值fig,axes = plt.subplots(1,4,figsize = (20,5))data.plot.box(ax = axes[0],grid = True,title = '數據分布')data.plot(kind = 'kde',style = '--r',ax = axes[1],grid = True,title = '刪除缺失值',xlim = [-50,150])data_c.plot(kind = 'kde',style = '--b',ax = axes[2],grid = True,title = '缺失值填充中位數',xlim = [-50,150])# 密度圖查看缺失值情況def na_c(s,n,k=5): y = s[list(range(n-k,n+1+k))] # 取數 y = y[y.notnull()] # 剔除空值 return(lagrange(y.index,list(y))(n))# 創建函數,做插值,由于數據量原因,以空值前后5個數據(共10個數據)為例做插值 na_re = []for i in range(len(data)): if data.isnull()[i]: data[i] = na_c(data,i) print(na_c(data,i)) na_re.append(data[i])data.dropna(inplace=True) # 清除插值后仍存在的缺失值data.plot(kind = 'kde',style = '--k',grid = True,title = '拉格朗日插值后',xlim = [-50,150])print('finished!')因為該數據缺失值不多,所以直接刪除和用拉格朗日插值法插補進去效果差不多,但可以明顯看出,用拉格朗日插值法比直接中位數填充擬合的要好。? ? 整體來說,缺失值和異常值的處理雖然技術不難,但要具體情況具體分析,如何進行處理就要靠日常積累的數據分析經驗,以上,僅供參考。
總結
以上是生活随笔為你收集整理的eviews如何处理缺失数据填补_python数据预处理之异常值、缺失值处理方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在java中重写方法应遵循规则的包括_J
- 下一篇: tv英语域名注册_企业邮箱十万个为什么—