資料品質分析
資料品質分析是資料挖掘中資料準備的最重要一環,是資料處理的前體。資料品質分分析主要任務是識别髒資料。常見的髒資料包括:
- 缺失值
- 異常值
- 不一緻的值
- 重複資料或者包括特殊符号的資料
缺失值處理
處理資料缺失的一般步驟:
- 識别缺失資料
- 檢測導緻資料缺失的原因
- 删除包含缺失值的執行個體或用合理的數值代替(插補)缺失值。
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")
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)
matrixplot(a)
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
>