数据质量分析
数据质量分析是数据挖掘中数据准备的最重要一环,是数据处理的前体。数据质量分分析主要任务是识别脏数据。常见的脏数据包括:
- 缺失值
- 异常值
- 不一致的值
- 重复数据或者包括特殊符号的数据
缺失值处理
处理数据缺失的一般步骤:
- 识别缺失数据
- 检测导致数据缺失的原因
- 删除包含缺失值的实例或用合理的数值代替(插补)缺失值。
1、识别缺失数据:
R语言中,NA代表缺失值,NaN代表不可能值,Inf和-Inf代表正无穷和负无穷。推荐使用is.na,is.nan,is.finite,is.infinite4个函数去处理。
代码语言:javascript复制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")
代码语言:javascript复制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
代码语言:javascript复制备注:0表示变量的列中没有缺失,1则表示有缺失值。 第一行给出了没有缺失值的数目(共多少行)。 第一列表示各缺失值的模式。 最后一行给出了每个变量的缺失值数目。 最后一列给出了变量的数目(这些变量存在缺失值)。
aggr(a,prop=F,numbers=T)
代码语言:javascript复制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
>