在數據挖掘的過程當中,數據預處理佔到了整個過程的60%html
髒數據:指通常不符合要求,以及不能直接進行相應分析的數據git
髒數據包括:缺失值、異常值、不一致的值、重複數據及含有特殊符號(如#、¥、*)的數據app
數據清洗:刪除原始數據集中的無關數據、重複數據、平滑噪聲數據、處理缺失值、異常值等函數
缺失值處理:刪除記錄、數據插補和不處理spa
主要用到VIM和mice包 .net
install.packages(c("VIM","mice"))code
1.處理缺失值的步驟htm
步驟:對象
(1)識別缺失數據;blog
(2)檢查致使數據缺失的緣由;
(3)刪除包含缺失值的實例或用合理的數值代替(插補)缺失值
缺失值數據的分類:
(1)徹底隨機缺失:若某變量的缺失數據與其餘任何觀測或未觀測變量都不相關,則數據爲徹底隨機缺失(MCAR)。
(2)隨機缺失:若某變量上的缺失數據與其餘觀測變量相關,與它本身的未觀測值不相關,則數據爲隨機缺失(MAR)。
(3)非隨機缺失:若缺失數據不屬於MCAR或MAR,則數據爲非隨機缺失(NIMAR)。
2.識別缺失值
NA:表明缺失值;
NaN:表明不可能的值;
Inf:表明正無窮;
-Inf:表明負無窮。
is.na():識別缺失值;
is.nan():識別不可能值;
is.infinite():無窮值。
is.na()、is.nan()和is.infinte()函數的返回值示例
x |
is.na(x) |
is.nan(x) |
is.infinite(x) |
x<-NA |
TRUE |
FALSE |
FALSE |
x<-0/0 |
TRUE |
TRUE |
FALSE |
x<-1/0 |
FALSE |
FALSE |
TRUE |
|
|
|
|
complete.cases()可用來識別矩陣或數據框中沒有缺失值的行,若每行都包含完整的實例,則返回TRUE的邏輯向量,若每行有一個或多個缺失值,則返回FALSE;
3.探索缺失值模式
(1)列表顯示缺失值
mice包中的md.pattern()函數能夠生成一個以矩陣或數據框形式展現缺失值模式的表格
library(mice)
data(sleep,package="VIM")
md.pattern(sleep)
(2)圖形探究缺失數據
VIM包中提供大量能可視化數據集中缺失值模式的函數:aggr()、matrixplot()、scattMiss()
library("VIM")
aggr(sleep,prop=TRUE,numbers=TRUE)#用比例代替了計數
matrixplot()函數可生成展現每一個實例數據的圖形
matrixplot(sleep)
淺色表示值小,深色表示值大;默認缺失值爲紅色。
marginplot()函數可生成一幅散點圖,在圖形邊界展現兩個變量的缺失值信息。
library("VIM")
marginplot(sleep[c("Gest","Dream")],pch=c(20),col=c("darkgray","red","blue"))
(3)用相關性探索缺失值
影子矩陣:用指示變量替代數據集中的數據(1表示缺失,0表示存在),這樣生成的矩陣有時稱做影子矩陣。
求這些指示變量間和它們與初始(可觀測)變量間的相關性,有且於觀察哪些變量常一塊兒缺失,以及分析變量「缺失」與其餘變量間的關係。
head(sleep)
str(sleep)
x<-as.data.frame(abs(is.na(sleep)))
head(sleep,n=5)
head(x,n=5)
y<-x[which(sd(x)>0)]
cor(y)
cor(sleep,y,use="pairwise.complete.obs")
4.理解缺失值數據的來由和影響
識別缺失數據的數目、分佈和模式有兩個目的:
(1)分析生成缺失數據的潛在機制;
(2)評價缺失數據對回答實質性問題的影響。
即:
(1)缺失數據的比例有多大?
(2)缺失數據是否集中在少數幾個變量上,抑或普遍存在?
(3)缺失是隨機產生的嗎?
(4)缺失數據間的相關性或與可觀測數據間的相關性,是否能夠代表產生缺失值的機制呢?
若缺失數據集中在幾個相對不過重要的變量上,則能夠刪除這些變量,而後再進行正常的數據分析;
如有一小部分數據隨機分佈在整個數據集中(MCAR),則能夠分析數據完整的實例,這樣仍可獲得可靠有效的結果;
若以假定數據是MCAR或MAR,則能夠應用多重插補法來得到有鏟的結論。
若數據是NMAR,則須要藉助專門的方法,收集新數據,或加入一個相對更容易、更有收益的行業。
5.理性處理不完整數據
6.完整實例分析(行刪除)
函數complete.cases()、na.omit()可用來存儲沒有缺失值的數據框或矩陣形式的實例(行):
newdata<-mydata[complete.cases(mydata),]
newdata<-na.omit(mydata)
options(digits=1)
cor(na.omit(sleep))
cor(sleep,use="complete.obs")
fit<-lm(Dream~Span+Gest,data=na.omit(sleep))
summary(fit)
7.多重插補
多重插補(MI)是一種基於重複模擬的處理缺失值的方法。
MI從一個包含缺失值的數據集中生成一組完整的數據集。每一個模擬數據集中,缺失數據將使用蒙特卡洛方法來填補。
此時,標準的統計方法即可應用到每一個模擬的數據集上,經過組合輸出結果給出估計的結果,以及引入缺失值時的置信敬意。
可用到的包Amelia、mice和mi包
mice()函數首先從一個包含缺失數據的數據框開始,而後返回一個包含多個完整數據集的對象。每一個完整數據集都是經過對原始數據框中的缺失數據進行插而生成的。
with()函數可依次對每一個完整數據集應用統計模型
pool()函數將這些單獨的分析結果整合爲一組結果。
最終模型的標準誤和p值都將準確地反映出因爲缺失值和多重插補而產生的不肯定性。
基於mice包的分析一般符合如下分析過程:
library(mice)
imp<-mice(mydata,m)
fit<-with(imp,analysis)
pooled<-pool(fit)
summary(pooled)
mydata是一個飲食缺失值的矩陣或數據框;imp是一個包含m個插補數據集的列表對象,同時還含有完成插補過程的信息,默認的m=5analysis是一個表達式對象,用來設定應用於m個插補的統計分析方法。方法包括作線迴歸模型的lm()函數、作廣義線性模型的glm()函數、作廣義可加模型的gam()、及作負二項模型的nbrm()函數。fit是一個包含m個單獨統計分析結果的列表對象;pooled是一個包含這m個統計分析平均結果的列表對象。</pre><pre name="code" class="plain">library(mice)
data(sleep,package="VIM")
imp<-mice(sleep,seed=1234)
fit<-with(imp,lm(Dream~Span+Gest))
pooled<-pool(fit)
summary(pooled)
impimp$imp$Dream
利用complete()函數可觀察m個插補數據集中的任意一個,格式爲:complete(imp,action=#)
eg:
dataset3<-complete(imp,action=3)
dataset3
8.處理缺失值的其餘方法
軟件包 |
描述 |
Hmisc |
包含多種函數,支持簡單插補、多重插補和典型變量插補 |
mvnmle |
對多元正態頒數據中缺失值的最大似然估計 |
cat |
對數線性模型中多元類別型變量的多重插補 |
arrayImpute\arraryMissPattern、SeqKnn |
處理微陣列缺失值數據的實用函數 |
longitudinalData |
相關的函數列表,好比對時間序列缺失值進行插補的一系列函數 |
kmi |
處理生存分析缺失值的Kaplan-Meier多重插補 |
mix |
通常位置模型中混合類別型和連續型數據的多重插補 |
pan |
多元面板數據或聚類的多重插補 |
(1)成對刪除
處理含缺失值的數據集時,成對刪除常做爲行刪除的備選方法使用。對於成對刪除,觀測只是當它含缺失數據的變量涉及某個特定分析時纔會被刪除。
cor(sleep,use="pairwise.complete.obs")
雖然成對刪除彷佛利用了全部可用數據,但實際上每次計算只用了不一樣的數據集,這將會致使一些扭曲,故建議不要使用該方法。
(2)簡單(非隨機)插補
簡單插補,即用某個值(如均值、中位數或衆數)來替換變量中的缺失值。注意,替換是非隨機的,這意味着不會引入隨機偏差(與多重陪襯不一樣)。
簡單插補的一個優勢是,解決「缺失值問題」時不會減小分析過程當中可用的樣本量。雖然 簡單插補用法簡單,但對於非MCAR的數據會產生有偏的結果。若缺失數據的數目很是大,那麼簡單插補極可能會低估標準差、曲解變量間的相關性,並會生成不正確的統計檢驗的p值。應儘可能避免使用該方法。
----------------------------------------------------------------
異常值分析是檢驗數據是否有錄入錯誤以及含有不合常理的數據;
異常值是指樣本中的個別值,其數據明顯偏離其他的觀測值。異常值也稱爲離羣點,異常值的分析也稱爲離羣點分析。
異常值處理通常分爲如下幾個步驟:異常值檢測、異常值篩選、異常值處理。
其中異常值檢測的方法主要有:箱型圖、簡單統計量(好比觀察極(大/小)值),3σ原則
異常值處理方法主要有:刪除法、插補法、替換法。
數據不一致:指數據的矛盾性、不相容性;在數據挖掘過程當中,不一致數據的產生主要發生在數據集成的過程當中,多是因爲被挖掘數據是來自於從不一樣的數據源、重複存放的數據未能進行一致性地更新形成的。
下面主要是進行異常值檢驗、離羣點分析、異常值處理:
提到異常值不得不說一個詞:魯棒性。就是不受異常值影響,通常是魯棒性高的數據,比較優質。
1、異常值檢驗
異常值大概包括缺失值、離羣值、重複值,數據不一致。
summary能夠顯示每一個變量的缺失值數量.
關於缺失值的檢測應該包括:缺失值數量、缺失值比例、缺失值與完整值數據篩選。
#缺失值解決方案
sum(complete.cases(saledata)) #is.na(saledata)
sum(!complete.cases(saledata))
mean(!complete.cases(saledata)) #1/201數字,缺失值比例
saledata[!complete.cases(saledata),] #篩選出缺失值的數值
箱型圖的檢測包括:四分位數檢測(箱型圖自帶)+1δ標準差上下+異常值數據點。
箱型圖有一個很是好的地方是,boxplot以後,結果中會自帶異常值,就是下面代碼中的sp$out,這個是作箱型圖,按照上下邊界以外爲異常值進行斷定的。
上下邊界,分別是Q3+(Q3-Q1)、Q1-(Q3-Q1)。
sp=boxplot(saledata$"銷量",boxwex=0.7)
title("銷量異常值檢測箱線圖")
xi=1.1
sd.s=sd(saledata[complete.cases(saledata),]$"銷量")
mn.s=mean(saledata[complete.cases(saledata),]$"銷量")
points(xi,mn.s,col="red",pch=18)
arrows(xi, mn.s - sd.s, xi, mn.s + sd.s, code = 3, col = "pink", angle = 75, length = .1)
text(rep(c(1.05,1.05,0.95,0.95),length=length(sp$out)),labels=sp$out[order(sp$out)],
sp$out[order(sp$out)]+rep(c(150,-150,150,-150),length=length(sp$out)),col="red")
代碼中text函數的格式爲text(x,label,y,col);points加入均值點;arrows加入均值上下1δ標準差範圍箭頭。
箱型圖還有等寬與等深分箱法
數據去重與數據分組合並存在必定區別,去重是純粹的全部變量都是重複的,而數據分組合並多是由於一些主鍵的重複。
數據去重包括重複檢測(table、unique函數)以及重複數據處理(unique/duplicated)。
常見的有unique、數據框中duplicated函數,duplicated返回的是邏輯值。
常見的異常值處理辦法是刪除法、替代法(連續變量均值替代、離散變量用衆數以及中位數替代)、插補法(迴歸插補、多重插補)
除了直接刪除,能夠先把異常值變成缺失值、而後進行後續缺失值補齊。
實踐中,異常值處理,通常劃分爲NA缺失值或者返回公司進行數據修整(數據返修爲主要方法)
利用圖形——箱型圖進行異常值檢測。
#異常值識別
par(mfrow=c(1,2))#將繪圖窗口劃爲1行兩列,同時顯示兩圖
dotchart(inputfile$sales)#繪製單變量散點圖,多蘭圖
pc=boxplot(inputfile$sales,horizontal=T)#繪製水平箱形圖
代碼來自《R語言數據分析與挖掘實戰》第四節。
整行替換數據框裏99%以上和1%如下的點,將99%以上的點值=99%的點值;小於1%的點值=1%的點值。
(本圖來自CDA DSC,L2-R語言課程,常老師所述)
#異常數據處理
q1<-quantile(result$tot_derog, 0.001) #取得時1%時的變量值
q99<-quantile(result$tot_derog, 0.999) #replacement has 1 row, data has 0 說明一個沒換
result[result$tot_derog<q1,]$tot_derog<-q1
result[result$tot_derog>q99,]$tot_derog<-q99
summary(result$tot_derog) #蓋帽法以後,查看數據狀況
fix(inputfile)#表格形式呈現數據
which(inputfile$sales==6607.4)#能夠找到極值點序號(位置)是啥
把缺失值數據集、非缺失值數據集分開。
#缺失值的處理
inputfile$date=as.numeric(inputfile$date)#將日期轉換成數值型變量
sub=which(is.na(inputfile$sales))#識別缺失值所在行數
inputfile1=inputfile[-sub,]#將數據集分紅完整數據和缺失數據兩部分
inputfile2=inputfile[sub,]
將連續變量等級化以後,不一樣的分位數的數據就會變成不一樣的等級數據,連續變量離散化了,消除了極值的影響。
數據集分爲缺失值、非缺失值兩塊內容。缺失值處理若是是連續變量,能夠選擇均值;離散變量,能夠選擇衆數或者中位數。
計算非缺失值數據的均值,
而後賦值給缺失值數據。
#均值替換法處理缺失,結果轉存
#思路:拆成兩份,把缺失值一份用均值賦值,而後從新合起來
avg_sales=mean(inputfile1$sales)#求變量未缺失部分的均值
inputfile2$sales=rep(avg_sales,n)#用均值替換缺失
result2=rbind(inputfile1,inputfile2)#併入完成插補的數據
#迴歸插補法處理缺失,結果轉存
model=lm(sales~date,data=inputfile1)#迴歸模型擬合
inputfile2$sales=predict(model,inputfile2)#模型預測
result3=rbind(inputfile1,inputfile2)
注意:多重插補的處理有兩個要點:先刪除Y變量的缺失值而後插補
一、被解釋變量有缺失值的觀測不能填補,只能刪除,不能本身亂補;
二、只對放入模型的解釋變量進行插補。
比較詳細的來介紹一下這個多重插補法。筆者整理了大體的步驟簡介以下:
缺失數據集——MCMC估計插補成幾個數據集——每一個數據集進行插補建模(glm、lm模型)——將這些模型整合到一塊兒(pool)——評價插補模型優劣(模型係數的t統計量)——輸出完整數據集(compute)
步驟詳細介紹:
函數mice()首先從一個包含缺失數據的數據框開始,而後返回一個包含多個(默認爲5個)完整數據集的對象。
每一個完整數據集都是經過對原始數據框中的缺失數據進行插補而生成的。 因爲插補有隨機的成分,所以每一個完整數據集都略有不一樣。
其中,mice中使用決策樹cart有如下幾個要注意的地方:該方法只對數值變量進行插補,分類變量的缺失值保留,cart插補法通常不超過5k數據集。
而後, with()函數可依次對每一個完整數據集應用統計模型(如線性模型或廣義線性模型) ,
最後, pool()函數將這些單獨的分析結果整合爲一組結果。最終模型的標準誤和p值都將準確地反映出因爲缺失值和多重插補而產生的不肯定性。
#多重插補法處理缺失,結果轉存
library(lattice) #調入函數包
library(MASS)
library(nnet)
library(mice) #前三個包是mice的基礎
imp=mice(inputfile,m=4) #4重插補,即生成4個完好失數據集
fit=with(imp,lm(sales~date,data=inputfile))#選擇插補模型
pooled=pool(fit)
summary(pooled)
result4=complete(imp,action=3)#選擇第三個插補數據集做爲結果
結果解讀:
(1)imp對象中,包含了:每一個變量缺失值個數信息、每一個變量插補方式(PMM,預測均值法常見)、插補的變量有哪些、預測變量矩陣(在矩陣中,行表明插補變量,列表明爲插補提供信息的變量, 1和0分別表示使用和未使用);
同時 利用這個代碼imp$imp$sales 能夠找到,每一個插補數據集缺失值位置的數據補齊具體數值是啥。
(2)with對象。插補模型能夠多樣化,好比lm,glm都是能夠直接應用進去,詳情可見《R語言實戰》第十五章;
(3)pool對象。summary以後,會出現lm模型係數,能夠若是出現係數不顯著,那麼則須要考慮換插補模型;
(4)complete對象。m個完整插補數據集,同時能夠利用此函數輸出。
其餘:
mice
包提供了一個很好的函數md.pattern()
,用它能夠對缺失數據的模式有個更好的理解。還有一些可視化的界面,經過VIM、箱型圖、lattice來展現缺失值狀況。可見博客:在R中填充缺失數據—mice包
離羣點檢測與異常值主要的區別在於:
異常值針對單一變量,而離羣值指的是不少變量綜合考慮以後的異常值。
下面介紹一種基於聚類+歐氏距離的離羣點檢測方法。
基於聚類的離羣點檢測的步驟以下:數據標準化——聚類——求每一類每一指標的均值點——每一類每一指標生成一個矩陣——計算歐式距離——畫圖判斷。
Data=read.csv(".data.csv",header=T)[,2:4]
Data=scale(Data)
set.seed(12)
km=kmeans(Data,center=3)
print(km)
km$centers #每一類的均值點
#各樣本歐氏距離,每一行
x1=matrix(km$centers[1,], nrow = 940, ncol =3 , byrow = T)
juli1=sqrt(rowSums((Data-x1)^2))
x2=matrix(km$centers[2,], nrow = 940, ncol =3 , byrow = T)
juli2=sqrt(rowSums((Data-x2)^2))
x3=matrix(km$centers[3,], nrow = 940, ncol =3 , byrow = T)
juli3=sqrt(rowSums((Data-x3)^2))
dist=data.frame(juli1,juli2,juli3)
##歐氏距離最小值
y=apply(dist, 1, min)
plot(1:940,y,xlim=c(0,940),xlab="樣本點",ylab="歐氏距離")
points(which(y>2.5),y[which(y>2.5)],pch=19,col="red")
參考來源於:
https://kknews.cc/zh-cn/tech/e2v4z.html
http://blog.csdn.net/sinat_26917383/article/details/51210793