數(shù)據(jù)分析|R-缺失值處理

本版塊打算分享一些數(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ù)和需求有足夠的認識痪寻,做出比較好的判斷和處理螺句。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市橡类,隨后出現(xiàn)的幾起案子蛇尚,更是在濱河造成了極大的恐慌,老刑警劉巖顾画,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件取劫,死亡現(xiàn)場離奇詭異匆笤,居然都是意外死亡,警方通過查閱死者的電腦和手機谱邪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門炮捧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惦银,你說我怎么就攤上這事咆课。” “怎么了璧函?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵傀蚌,是天一觀的道長。 經(jīng)常有香客問我蘸吓,道長善炫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任库继,我火速辦了婚禮箩艺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宪萄。我一直安慰自己艺谆,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布拜英。 她就那樣靜靜地躺著静汤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪居凶。 梳的紋絲不亂的頭發(fā)上虫给,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音侠碧,去河邊找鬼抹估。 笑死,一個胖子當著我的面吹牛弄兜,可吹牛的內(nèi)容都是我干的药蜻。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼替饿,長吁一口氣:“原來是場噩夢啊……” “哼语泽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起视卢,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤湿弦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腾夯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颊埃,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蔬充,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了班利。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饥漫。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罗标,靈堂內(nèi)的尸體忽然破棺而出庸队,到底是詐尸還是另有隱情,我是刑警寧澤闯割,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布彻消,位于F島的核電站,受9級特大地震影響宙拉,放射性物質(zhì)發(fā)生泄漏宾尚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一谢澈、第九天 我趴在偏房一處隱蔽的房頂上張望煌贴。 院中可真熱鬧,春花似錦锥忿、人聲如沸牛郑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淹朋。三九已至,卻和暖如春钉答,著一層夾襖步出監(jiān)牢的瞬間瑞你,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工希痴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人春感。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓砌创,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鲫懒。 傳聞我的和親對象是個殘疾皇子嫩实,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361