R語(yǔ)言之缺失值和異常值處理

  • 加載并查看數(shù)據(jù)基本情況
library(VIM)
data(sleep)
str(sleep)
summary(sleep)
head(sleep)

一陨囊、處理缺失值

  • 查看NA的分布情況,有一個(gè)直觀了解
library('mice')
md.pattern(sleep)
matrixplot(sleep)
NA分布情況
  • 根據(jù)NA的分布情況,獲取數(shù)據(jù)子集
#統(tǒng)計(jì)每一列NA的數(shù)量
na_flag <- apply(is.na(sleep), 2, sum)
# na_flag <- md.pattern(sleep,plot = F) %>% .[nrow(.),-ncol(.)]#同上
library('dplyr')
#獲取含有NA的列和不含NA的列
na_col = na_flag[na_flag > 0] %>% names()
full_col = setdiff(names(sleep),na_col)
# fill_col = names(sleep)[!(names(sleep) %in% na_col)]同上
# 獲取所有含有NA的行
na_df = sleep[!complete.cases(sleep),]
#獲取所有不含NA的行
full_df = na.omit(sleep)
#fill_df = sleep[complete.cases(sleep),]同上
#對(duì)變量進(jìn)行重新排序
sleep = sleep[,c(na_col,full_col)]

1. 刪除法

當(dāng)缺失值占比不大時(shí)严就,直接刪除缺失部分是最簡(jiǎn)單的辦法

1.1 針對(duì)特定變量刪除NA

sleep_del_Gest = sleep[!is.na(sleep$Gest),]
md.pattern(sleep_del_Gest)
對(duì)特定變量刪除NA后

1.2 刪除所有含NA的行

sleep_del_all = na.omit(sleep)
# sleep_del_all = sleep[complete.cases(sleep),]#同上
md.pattern(sleep_del_all)
刪除所有NA

1.3 觀察變化前后變量之間的相關(guān)性

library(PerformanceAnalytics)
chart.Correlation(sleep,histogram = T)
chart.Correlation(sleep_del_all,histogram = T)
刪除前變量相關(guān)性

刪除后變量相關(guān)性

2. 插補(bǔ)法

  • 若缺失值占比過(guò)大荒辕,直接刪除會(huì)損失大量的信息汗销。這種情況應(yīng)該對(duì)缺失值進(jìn)行填補(bǔ)。
  • 若屬性是連續(xù)的抵窒,則使用該屬性存在值的均值去插補(bǔ)缺失值弛针;
  • 若屬性是離散的,則可取該屬性的眾數(shù)來(lái)插補(bǔ)缺失值李皇。

2.1. 使用均值,中值等針對(duì)某一個(gè)變量填值

#觀察數(shù)據(jù)分布情況
NonD_var = c(var = 'NonD',
             mean = mean(sleep$NonD,na.rm = T),
             median = median(sleep$NonD,na.rm = T),
             quantile(sleep$NonD,c(0,0.01,0.1,0.25,0.5,0.75,0.9,1),na.rm = T),
             max = max(sleep$NonD,na.rm = T),
             missing = sum(is.na(sleep$NonD)))
View(t(NonD_var))
變量NonD數(shù)據(jù)分布情況
#簡(jiǎn)單可視化
op <- par(mfrow = c(1,2))
hist(sleep$NonD,freq = F,col = 'lightblue',main = 'Befor')
#使用該變量現(xiàn)有數(shù)據(jù)的均值替換缺失值
library('Hmisc')
sleep$NonD = impute(sleep$NonD, fun = mean)#impute(x,2.5), impute(x,mean), impute(x,"random")
hist(NonD,freq = F,col = 'pink',main = 'After')

填值前后變量NonD數(shù)據(jù)分布變化

2.2. 基于kmeans均值算法填值

  • 只適用于數(shù)值型缺失
####重新加載原始數(shù)據(jù)并對(duì)變量進(jìn)行排序
data("sleep",package = 'VIM')
sleep = sleep[,c(na_col,full_col)]

library('DMwR')
#以距離最近的3個(gè)值根據(jù)距離進(jìn)行加權(quán)平均來(lái)填值
sleep_fill_knn = knnImputation(sleep, k = 10, meth = 'weighAvg') 
md.pattern(sleep_fill_knn)

sleep_fill_knn = sleep_fill_knn[,names(sleep)]

#觀察變換前后數(shù)據(jù)的分布情況
op <- par(mfrow = c(5,2))
for(fct in na_col){
  hist(sleep[,fct],col = 'lightblue',freq = F,xlab = fct,main = 'Befor')
  hist(sleep_fill_knn[,fct],col = 'pink',freq = F,xlab = fct,main = 'After') 
}
par(op)

均值填值前后各變量數(shù)據(jù)分布情況

#觀察變換前后變量間的相關(guān)性
library(PerformanceAnalytics)
chart.Correlation(sleep,histogram = T)
chart.Correlation(sleep_fill_knn,histogram = T)

before_knnImputation

after_knnImputation

2.3. 基于回歸算法填值

f = as.formula(paste(paste(na_col,collapse = ' + '),'~',paste(fill_col,collapse = ' + ')))
sleep_fill_reg = regressionImp(f,data = sleep)
#這里的formular = y ~ .,y是response variable削茁,即要插補(bǔ)的變量。
#我這里使用了所有包含NA的變量來(lái)對(duì)所有不含NA的變量進(jìn)行回歸掉房,有些極端茧跋,僅供參考。

sleep_fill_reg = sleep_fill_reg[,names(sleep)]
md.pattern(sleep_fill_reg)

#觀察變換前后數(shù)據(jù)的分布情況卓囚,變量間的相關(guān)性
library(PerformanceAnalytics)
chart.Correlation(sleep,histogram = T)
chart.Correlation(sleep_fill_reg,histogram = T)

befor_regressionImp

after_regressionImp

2.4. 基于隨機(jī)森林替換

if(!require('randomForest'))(
  install.packages('randomForest')
)
sleep_fill_rf = rfImpute(Danger ~ .,sleep) 
sleep_fill_rf = sleep_fill_rf[,names(sleep)]
#觀察變換前后數(shù)據(jù)的分布情況厌衔,變量間的相關(guān)性
library(PerformanceAnalytics)
chart.Correlation(sleep,histogram = T)
chart.Correlation(sleep_fill_rf,histogram = T)

befor_rf

after_rf


二、處理異常值

1.1 單變量異常值檢測(cè)

lb = c('ggplot2','reshape2','dplyr')
lapply(lb,require,character.only = T)

boxplot(sleep_fill_rf,frame = T)

sleep_fill_rf %>% melt() %>%
  ggplot(aes(NULL,value)) +
  geom_boxplot(aes(fill = variable)) +
  facet_wrap(variable ~. , scales = 'free_y')

sigular_boxplot

sigular_ggboxplot

1.2 蓋帽法處理異常值

#采用蓋帽法捍岳,用10%處的數(shù)據(jù)覆蓋分布在10%以下的數(shù)據(jù)富寿,用90%處的數(shù)據(jù)覆蓋分布在99%以上的數(shù)據(jù)。
#這里的10%和90%取值有些極端锣夹,及供參考页徐。
block<-function(x,lower=T,upper=T){
  if(lower){
    q1<-quantile(x,0.1)
    x[x<=q1]<-q1
  }
  if(upper){
    q99<-quantile(x,0.90)
    x[x>q99]<-q99
  }
  return(x)
}

sleep_fill_rf_blk = sapply(sleep_fill_rf,block)
boxplot(sleep_fill_rf_blk,frame = T)

after_block

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市银萍,隨后出現(xiàn)的幾起案子变勇,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搀绣,死亡現(xiàn)場(chǎng)離奇詭異飞袋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)链患,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)巧鸭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人麻捻,你說(shuō)我怎么就攤上這事纲仍。” “怎么了贸毕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵郑叠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我明棍,道長(zhǎng)乡革,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任摊腋,我火速辦了婚禮署拟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歌豺。我一直安慰自己,他們只是感情好心包,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布类咧。 她就那樣靜靜地躺著,像睡著了一般蟹腾。 火紅的嫁衣襯著肌膚如雪痕惋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天娃殖,我揣著相機(jī)與錄音值戳,去河邊找鬼。 笑死炉爆,一個(gè)胖子當(dāng)著我的面吹牛堕虹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芬首,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赴捞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了郁稍?” 一聲冷哼從身側(cè)響起赦政,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耀怜,沒(méi)想到半個(gè)月后恢着,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體桐愉,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年掰派,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了从诲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碗淌,死狀恐怖盏求,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亿眠,我是刑警寧澤碎罚,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站纳像,受9級(jí)特大地震影響荆烈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竟趾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一憔购、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岔帽,春花似錦玫鸟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贾费,卻和暖如春钦购,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褂萧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工押桃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人导犹。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓唱凯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谎痢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子波丰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 一、認(rèn)識(shí)缺失值 在我們的數(shù)據(jù)分析過(guò)程中舶得,經(jīng)常會(huì)碰到缺失值的情況掰烟。缺失值產(chǎn)生的原因很多,比如人工輸入失誤,系統(tǒng)出錯(cuò)纫骑,...
    鳴人吃土豆閱讀 6,058評(píng)論 0 11
  • {因?yàn)槲恼潞眯牵赞D(zhuǎn)載!先馆!}R語(yǔ)言缺失值處理 2016-08-23 05:17砍柴問(wèn)樵夫 數(shù)據(jù)缺失有多種原因发框,而大...
    夢(mèng)醒啟程閱讀 19,516評(píng)論 2 11
  • 數(shù)據(jù)預(yù)處理步驟有數(shù)據(jù)清洗、數(shù)據(jù)集成煤墙、數(shù)據(jù)變換梅惯、數(shù)據(jù)規(guī)約。實(shí)際工作中不是每一步都必須仿野。 版本一: 缺失值處理對(duì)于缺失...
    apricoter閱讀 3,382評(píng)論 0 8
  • 缺失值簡(jiǎn)介 造成數(shù)據(jù)缺失的原因 有些信息暫時(shí)無(wú)法獲取铣减。例如小越現(xiàn)在在看哪個(gè)小姐姐 有些信息是被遺漏的〗抛鳎可能是因?yàn)檩?..
    1想得美閱讀 18,416評(píng)論 1 12
  • 一葫哗、我的目標(biāo): 2017年12月15日到2018年3月底家庭凈利潤(rùn)10萬(wàn)和身體健康 二.很開(kāi)心我在使用一套全新的方...
    427567be5e1b閱讀 208評(píng)論 0 0