R語言數據分析與挖掘(第一章):數據預處理(2)——缺失值常用的處理方法
- 2019 年 10 月 7 日
- 筆記
上一篇文章(缺失值處理)介紹了缺失值處理的判斷方法,這一講接著介紹缺失值常用的幾種處理方法:刪除法,替換法和插補法。不同的方法對應不同類型的缺失值。
1.刪除法
如果缺失值的比例很小,且不影響整體的數據結構,即缺失值類型是完全隨機缺失時,可以考慮將缺失值刪除,該方法操作非常簡單,使用函數na.omit()就可以將含有缺失值的行刪除。其函數的基本書寫格式為:
na .omit (object,....)
其中object即為需要處理的數據對象。下面我們對algae數據集進行處理:
> algae=na.omit(algae) > sum(is.na(algae)) [1] 0
上一篇文章中,我們介紹到該數據集有33個缺失值,刪除後,現在為0了。
除了na.omit()函數外,還可以利用complete.cases函數來刪除含有缺失值的行。
> # 因為上一句程式碼已經刪除過,這裡重新載入原始數據 > data(algae) > algae<-algae[complete.cases(algae),] > sum(!complete.cases(algae)) [1] 0
2.替換法
直接刪除含有缺失值的行記錄的代價和風險較大,故我們可以考慮將缺失值部分替換掉,如用均值去替換,即均值替換法,該方法根據變數的不同類型選擇不同的替換,對數值型變數採用均值替換,對非數值型變數採用眾數替換。
下面我們將對algae數據集採用均值替換處理缺失值:
> data(algae) > mean(complete.cases(algae)) [1] 0.92 > algae[is.na(algae)]<-mean(complete.cases(algae)) > sum(!complete.cases(algae)) [1] 0
但是均值替換法還是存在一些問題,因為該方法適用於處理完全隨機缺失數據,且會改變整體數據的統計性質,比如方差變小,存在偏差等,因此在在實踐中並不常用。
3.插補法
實戰中常用的方法是插補法,隨機插補的思想類似,利用非缺失數據的均值或者隨機數來填補缺失值,下面我們詳細介紹多重插補。
多重插補的主要思想是:利用蒙特卡洛模擬法(MCMC)將原始數據集插補成幾個完整數據集,在每個新數據集中利用線性回歸(lm)或廣義線性回歸(glm)等方法進行插補建模,再將這些完整的模型整合到一起,評價插補模型的優劣並返回完數據集。
該方法主要利用mice包中的函數mice進行,其函數的基本書寫格式為,
mice(data,m=5,method=vector("character",length =ncol (data)),seed = NA, defaultMethod = c("pmm","logreg","polyreg","polr"),....)
參數介紹:
data一個包含完整數據和缺失數據的矩陣或數據框,其中各缺失數據用符號NA表示;
m:指定的多正插補數,默認值為5;
method:一個字元串,或者長度與數據集列數相同的字元串向量,用於指定數據集中的每一列採用的插補方法,單一字元串指定所有列用相同方法插補,字元串向量指定不同列採用不同方法插補,默認插補法取決需要插補的目標列,並由defaulmethod指定參數;
seed:一個整數,用於函數set.seed()的參數,指定產生固定的隨機數的個數,默認值為NA;
defaultMethod:一個向量,用於指定每個數據集採用的插補建模方法,可供選者的方法有多種,「pmm」表示用預測的均值匹配,「logreg」表示用邏批回歸擬合,「polyreg」表示多項式擬合,「polr」表示採用比例優勢模型擬合等。
需要注意的是:選擇不同的插補建模方法對數據有不同的要求,回歸法適用於數值型數據集,「pmm」對數據格式沒有特殊要求。在實戰過程中我們還會用到函數pool()、函數compute()等。下面我們將用到一些回歸知識, 有疑感的話先放著,後面分析數據時我們會深入了解。
> imp<-mice(algae[,4:11],seed=1234) iter imp variable 1 1 1 2 1 3 1 4 1 5 2 1 2 2 2 3 2 4 2 5 3 1 3 2 3 3 3 4 3 5 4 1 4 2 4 3 4 4 4 5 5 1 5 2 5 3 5 4 5 5 > fit <- with(imp,lm(mxPH~.,data = algae[,4:11])) > pool=pool(fit) > options(digits=3) # 設定輸出結果保留3位小數。 > summary(pool) estimate std.error statistic df p.value (Intercept) 7.90e+00 2.49e-01 31.735 190 0.00e+00 mnO2 -1.43e-02 2.39e-02 -0.598 190 5.51e-01 Cl 2.20e-03 1.32e-03 1.669 190 9.68e-02 NO3 -2.15e-02 2.18e-02 -0.986 190 3.25e-01 NH4 -1.75e-05 4.08e-05 -0.429 190 6.69e-01 oPO4 1.36e-03 1.50e-03 0.908 190 3.65e-01 PO4 -5.96e-04 1.14e-03 -0.522 190 6.02e-01 Chla 1.31e-02 2.82e-03 4.654 190 6.10e-06
上述程式碼表示:
首先創建一個imp對象,該對象是包含4個插補對象的列表,使用的數據為algae數據集中含有缺失值的第4到11列數據,默認插補查補數據集為5個;然後創建fit對象,用於設定統計分析方法,這裡指定線性回歸,則fit是一個包含4個統計分析結果的列表對象;再創建pool 對象,該對象將前面的四個統計分析結果匯總;最後用summary函數顯示pool的統計資訊,指定輸出結果保留3位小數。
插補完後,對插補數據和原始數據進行對比,利用mice包中的函數stripplot()對變數分布圖進行可視化。
algae_complete=complete(imp,action=1) sum(is.na(algae_complete)) par(mfrow=c(3,3)) stripplot(imp,pch=c(1,8),col=c("grey","1")) par(mfrow=c(1,1)

缺失值處理是一個不容易的工程,我們在數據挖掘中可選擇對缺失數據不敏感的方法,比如決策樹,這樣就省略了缺失值處理的步驟。如果對於數據敏感的方法,還是要處理的哦!!