本版塊打算分享一些數(shù)據(jù)分析過程中用到的數(shù)據(jù)清洗显押,統(tǒng)計分析扳肛,建立簡單模型等。
????拿到數(shù)據(jù)后乘碑,在清楚了分析需求后挖息,別急著各種統(tǒng)計、模型一塊上兽肤,先給數(shù)據(jù)做個“清潔”再說套腹。數(shù)據(jù)中往往會有各種缺失值绪抛,異常值,錯誤值等电禀,今天先介紹一下如何處理缺失值幢码,才能更好的數(shù)據(jù)分析,更準確高效的建模尖飞。
一 查看數(shù)據(jù)集的缺失情況
????R中使用NA代表缺失值症副,用is.na識別缺失值,返回值為TRUE或FALSE政基。由于邏輯值TRUE和FALSE分別等價于數(shù)值1和0贞铣,可用sum()和mean()來獲取數(shù)據(jù)集的缺失情況。
載入R包及內(nèi)置數(shù)據(jù)集
library(VIM)#VIM包的sleep數(shù)據(jù)集示例data(sleep,package="VIM")
1)查看數(shù)據(jù)集整體有多少缺失值及百分比
sum(is.na(sleep))mean(is.na(sleep))
2)查看數(shù)據(jù)集特定變量(列)有多少缺失值及百分比
sum(is.na(sleep$Sleep))mean(is.na(sleep$Sleep))
3)數(shù)據(jù)集中多個行包含缺失值
mean(!complete.cases(sleep))
4)列出沒有缺失值的行
sleep[complete.cases(sleep),]#利用函數(shù)list <-which(rowSums(is.na(sleep)) >0) ;sleep[-list,]# 效果同上
5)列出有一個或多個缺失值的行
sleep[!complete.cases(sleep),]list <-which(rowSums(is.na(sleep)) >0) ;sleep[list,]
二? 探索缺失值
2.1 mice包展示數(shù)據(jù)整體的缺失情況
library(mice)md.pattern(sleep)BodyWgtBrainWgt Pred Exp Danger Sleep Span Gest Dream NonD? 421? ? ? ? 1? ? 1? 1? ? ? 1? ? 1? ? 1? ? 1? ? 1? ? 1? 091? ? ? ? 1? ? 1? 1? ? ? 1? ? 1? ? 1? ? 1? ? 0? ? 0? 231? ? ? ? 1? ? 1? 1? ? ? 1? ? 1? ? 1? ? 0? ? 1? ? 1? 121? ? ? ? 1? ? 1? 1? ? ? 1? ? 1? ? 0? ? 1? ? 1? ? 1? 111? ? ? ? 1? ? 1? 1? ? ? 1? ? 1? ? 0? ? 1? ? 0? ? 0? 311? ? ? ? 1? ? 1? 1? ? ? 1? ? 1? ? 0? ? 0? ? 1? ? 1? 221? ? ? ? 1? ? 1? 1? ? ? 1? ? 0? ? 1? ? 1? ? 1? ? 0? 221? ? ? ? 1? ? 1? 1? ? ? 1? ? 0? ? 1? ? 1? ? 0? ? 0? 300? ? 0? 0? ? ? 0? ? 4? ? 4? ? 4? ? 12? 14 38
其中 ’1’代表完好數(shù)據(jù)沮明,’0’代表缺失值辕坝。左側(cè)第一列,’42’代表有42條數(shù)據(jù)無缺失值荐健,第一個’9’代表9條數(shù)據(jù)Dream和NonD同時缺失酱畅。最后一行返回的就是每一個變量(列)對應(yīng)的缺失數(shù)目,38為一共有多少缺失值江场。下圖同樣的意思圣贸。
2.2 VIM包展示數(shù)據(jù)缺失情況
1)展示sleep數(shù)據(jù)集的整體缺失情況
library("VIM")aggr(sleep,prop=FALSE,numbers=TRUE)
2)展示sleep數(shù)據(jù)集感興趣的變量的缺失情況
marginplot(sleep[c("Sleep","Dream")],pch=c(20),col=c("darkgray","red","blue"))
三? 處理缺失值
????當充分了解了缺失值的情況后,可以根據(jù)數(shù)據(jù)量的大小扛稽,以及某一列是否為重要的預(yù)測作用變量,對數(shù)據(jù)集中的NA行和某些NA列進行處理滑负。
3.1 刪除缺失值
1)刪除數(shù)據(jù)集中所有含有NA的行和列
sleep_noNA <- na.omit(sleep)sleep_noNA <-x[complete.cases(sleep),]#兩種一樣的效果
2)刪除所有含有NA的列
na_flag<-apply(is.na(sleep), 2,sum)sleep[,which(na_flag == 0)]
3)刪除所有含有NA的行
na_flag<-apply(is.na(sleep), 1,sum)sleep[which(na_flag == 0),]
4)根據(jù)某些列的NA在张,移除相應(yīng)的行
sleep[complete.cases(sleep[,c(1,3)]),]
4)表示將向量x中所以NA元素用某個值來代替
sleep[is.na(sleep)] <-999
3.2 填充缺失值
當數(shù)據(jù)量不是很大或者變量比較重要時候,可以考慮對缺失值進行填充矮慕。
1)常見數(shù)值填補
library(Hmisc)data(sleep)#均值填充帮匾,適用于接近正態(tài)分布impute(sleep$NonD , mean)#中位數(shù)填充,偏態(tài)數(shù)據(jù)但是不是很嚴重impute(sleep$Dream , median)# 填充特定值impute(sleep$Span,0)
2)DMwR包進行kNN最近鄰插補
library(DMwR)data(sleep)data<- sleep? ? ? ? ? ? ? ? ? # 備份數(shù)據(jù)痴鳄,對比填充結(jié)果set.seed(1120)sleep$BrainWgt[sample(nrow(sleep),20)] <- NAhead(sleep)BodyWgtBrainWgt NonD Dream Sleep Span Gest Pred Exp Danger16654.000? 5712.0? NA? ? NA? 3.3 38.6? 645? ? 3? 5? ? ? 321.000? ? ? 6.6? 6.3? 2.0? 8.3? 4.5? 42? ? 3? 1? ? ? 333.385? ? ? NA? NA? ? NA? 12.5 14.0? 60? ? 1? 1? ? ? 140.920? ? ? 5.7? NA? ? NA? 16.5? NA? 25? ? 5? 2? ? ? 352547.000? 4603.0? 2.1? 1.8? 3.9 69.0? 624? ? 3? 5? ? ? 4610.550? ? ? NA? 9.1? 0.7? 9.8 27.0? 180? ? 4? 4? ? ? 4
# 最近鄰填補缺失值
knnOutput<-knnImputation(sleep[c(1:6)])anyNA(knnOutput)head(knnOutput)BodyWgtBrainWgtNonDDreamSleepSpan1 6654.0005712.000002.5344671.6758303.338.6000002? ? 1.0006.600006.3000002.0000008.34.5000003? ? 3.38519.6703410.1097102.24860412.514.0000004? ? 0.9205.7000012.8033453.35310416.58.1735685 2547.0004603.000002.1000001.8000003.969.0000006? 10.55095.834599.1000000.7000009.827.000000
# 將插補值與實際值進行對照
actuals <-data$BrainWgt[is.na(sleep$BrainWgt)]predicteds <- knnOutput[is.na(sleep$BrainWgt),"BrainWgt"]
# 兩樣本均值檢驗并計算其相似度
t.test(actuals, predicteds)# 接受差值為0的假設(shè)cor(actuals, predicteds)# 相關(guān)系數(shù)
????當然根據(jù)數(shù)據(jù)和目的的不同瘟斜,采用的缺失值處理方式肯定不一樣,需要我們對數(shù)據(jù)和需求有足夠的認識痪寻,做出比較好的判斷和處理螺句。