天天看點

R 資料品質分析①

資料品質分析

資料品質分析是資料挖掘中資料準備的最重要一環,是資料處理的前體。資料品質分分析主要任務是識别髒資料。常見的髒資料包括:

  • 缺失值
  • 異常值
  • 不一緻的值
  • 重複資料或者包括特殊符号的資料

缺失值處理

處理資料缺失的一般步驟:

  • 識别缺失資料
  • 檢測導緻資料缺失的原因
  • 删除包含缺失值的執行個體或用合理的數值代替(插補)缺失值。

1、識别缺失資料:

R語言中,NA代表缺失值,NaN代表不可能值,Inf和-Inf代表正無窮和負無窮。推薦使用is.na,is.nan,is.finite,is.infinite4個函數去處理。

setwd("E:\\Rwork\\data")
library(mice)
library(VIM)
a <- read.csv('catering_sale.csv',header = T)
dim(a)
sum(complete.cases(a))
sum(!complete.cases(a))
mean(!complete.cases(a))
a[!complete.cases(a), ]


# 異常值檢測箱線圖
sp <- boxplot(a$"銷量", boxwex = 0.7)
title("銷量異常值檢測箱線圖")
xi <- 1.1
sd.s <- sd(a[complete.cases(a), ]$"銷量")
mn.s <- mean(a[complete.cases(a), ]$"銷量")
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")
           
R 資料品質分析①
complete.case()可用來識别矩陣或資料框中沒有缺失值的行
> complete.cases(a)
  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
 [16]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [31]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [46]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [61]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [76]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [91]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[106]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[121]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[136]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[151]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
[166]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[181]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[196]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
> is.na(a)
        日期  銷量
  [1,] FALSE FALSE
  [2,] FALSE FALSE
  [3,] FALSE FALSE
  [4,] FALSE FALSE
  [5,] FALSE FALSE
  [6,] FALSE FALSE
  [7,] FALSE FALSE
  [8,] FALSE FALSE
  [9,] FALSE FALSE
 [10,] FALSE FALSE
 [11,] FALSE FALSE
 [12,] FALSE FALSE
 [13,] FALSE FALSE
 [14,] FALSE FALSE
 [15,] FALSE  TRUE
 [16,] FALSE FALSE
 [17,] FALSE FALSE
 [18,] FALSE FALSE
 [19,] FALSE FALSE
 [20,] FALSE FALSE
 [21,] FALSE FALSE
 [22,] FALSE FALSE
 [23,] FALSE FALSE
 [24,] FALSE FALSE
 [25,] FALSE FALSE
 [26,] FALSE FALSE
 [27,] FALSE FALSE
 [28,] FALSE FALSE
 [29,] FALSE FALSE
 [30,] FALSE FALSE
 [31,] FALSE FALSE
 [32,] FALSE FALSE
 [33,] FALSE FALSE
 [34,] FALSE FALSE
 [35,] FALSE FALSE
 [36,] FALSE FALSE
 [37,] FALSE FALSE
 [38,] FALSE FALSE
 [39,] FALSE FALSE
 [40,] FALSE FALSE
 [41,] FALSE FALSE
 [42,] FALSE FALSE
 [43,] FALSE FALSE
 [44,] FALSE FALSE
 [45,] FALSE FALSE
 [46,] FALSE FALSE
 [47,] FALSE FALSE
 [48,] FALSE FALSE
 [49,] FALSE FALSE
 [50,] FALSE FALSE
 [51,] FALSE FALSE
 [52,] FALSE FALSE
 [53,] FALSE FALSE
 [54,] FALSE FALSE
 [55,] FALSE FALSE
 [56,] FALSE FALSE
 [57,] FALSE FALSE
 [58,] FALSE FALSE
 [59,] FALSE FALSE
 [60,] FALSE FALSE

> md.pattern(a)
    日期 銷量  
195    1    1 0
  6    1    0 1
       0    6 6
           

備注:0表示變量的列中沒有缺失,1則表示有缺失值。

第一行給出了沒有缺失值的數目(共多少行)。

第一清單示各缺失值的模式。

最後一行給出了每個變量的缺失值數目。

最後一列給出了變量的數目(這些變量存在缺失值)。

aggr(a,prop=F,numbers=T)
           
R 資料品質分析①
matrixplot(a)
           
R 資料品質分析①

2. 缺失值處理

  • 行删除法:資料集中含有缺失值的行都會被删除,一般假定缺失資料是完全随機産生的,并且缺失值隻是很少一部分,對結果不會造成大的影響。即:要有足夠的樣本量,并且删除缺失值後不會有大的偏差!
行删除的函數有na.omit()和complete.case()
  • 删除含有缺失值的行
newdata<-na.omit(a)
newdata<-a[complete.cases(a),]
           
  • 删除含有缺失值的列
t(na.omit(t(a)))

na_flag <- apply(is.na(a), 2, sum)
a <- a[, which(na_flag == 0)]

lapply(Y, na.omit)
           
  • 預測插補法
> a <- read.csv("titanic.train.csv",header = T, row.names = 1) 
> sapply(a,function(x) sum(is.na(x)))
Survived   Pclass     Name      Sex      Age    SibSp    Parch 
       0        0        0        0      177        0        0 
  Ticket     Fare    Cabin Embarked 
       0        0        0        0 
> age.model <- rpart(Age ~ Pclass + Sex + SibSp + 
+                      Parch + Fare + Embarked  ,
+                    data=a[!is.na(a$Age), ],
+                    method='anova')
> 
> a$Age[is.na(a$Age)] <- predict(age.model, a[is.na(a$Age), ])
> sapply(a,function(x) sum(is.na(x)))
Survived   Pclass     Name      Sex      Age    SibSp    Parch 
       0        0        0        0        0        0        0 
  Ticket     Fare    Cabin Embarked 
       0        0        0        0 
>