现实生活中我们遇到的绝大部分数据都包含有缺失值,因此如何处理缺失值变得尤其重要。
缺失值的处理一般分为两个步骤:缺失值的识别,缺失值的处理。
缺失值的识别:is.na() / complete.cases()
缺失值的处理:删除法 行删除(na.omit),列删除(data[ ,- p])
替换法 利用均值、中位数、众数替换缺失值
插补法 回归模型插补、多重插补
多重插补较为复杂,下期内容消化。
1
识别缺失值
#加载数据包
library('mice')
library('VIM')
library('ggplot2')
library('tidyverse')
#设置工作空间
setwd('D:/chapter3/示例程序')
#读取数据
saledata <- read.csv(file = './data/catering_sale.csv',header = T)
#更改数据框的变量名
saledata <- rename(saledata,Date=日期,Sale=销量)
> #统计Sale列的缺失值个数
> sum(is.na(saledata$Sale))
[1] 1> #统计sale列的缺失值比例
> mean(is.na(saledata$Sale))
[1] 0.004975124> #以行为单位,统计不完整数据的个数
> sum(!complete.cases(saledata))
[1] 1> #以行为单位,统计不完整数据的比例
> mean(!complete.cases(saledata))
[1] 0.004975124
#利用mice包中函数的查看缺失值
md.pattern(saledata)
image
图形显示的更直观,200个完整数据,1个Sale数据缺失。
#利用VIM包中函数查看缺失值
aggr(saledata,prop=T,numbers=T,col=c('grey80','cornsilk'))
image
略粉色表示缺失数据,灰色表示完整数据。显示了两种数据的比例。
2
处理缺失值
1.分而治之:将缺失数据与完整数据分开
#将数据框中的Date列转换成数字
saledata$Date <- as.numeric(saledata$Date)
#返回sale列中的缺失位置
sub <- which(is.na(saledata$Sale))
#返回除缺失值的所有行
file1 <- saledata[-sub,]
#返回含有缺失值的行
file2 <- saledata[sub,]
2.删除法
#删除法得到的数据,转存为result1
result1 <- file1
3.均值替换法
#计算完整数据的均值
avg_file1 <- mean(file1$Sale)
#将均值替换缺失数据,有几个缺失数据就写几次
file2$Sale <- rep(avg_file1,1)
#将两个数据框合并
result2 <- rbind(file1,file2)
#利用完整数据创建一个线性模型
model <- lm(Sale ~ Date,data = file1)
#利用模型预测缺失数据
file2$Sale <- predict(model,file2)
#将两个数据框合并
result3<- rbind(file1,file2)
3
异常值
对于异常值来说,处理步骤与缺失值一样:识别、处理。
异常值可被当做缺失值处理。
1.识别异常值
散点图初判离群值
#传递数据
ggplot(saledata,aes(x=Date,y=Sale)) +
#设置散点图的数据点的类型,颜色,透明度
geom_point(shape=19,colour='red',alpha=.4) +
#设置背景主题
theme_bw() +
#删除网格线
theme(panel.grid = element_blank(),
##设置边框颜色
panel.border = element_rect(colour = 'blue'),
#设置坐标轴标签字体,类型,颜色
axis.text = element_text(family = 'serif',face = 'italic',colour = 'blue'),
#设置坐标轴标题字体,类型,颜色
axis.title = element_text(family = 'serif',face = 'italic',colour = 'blue'))
image
识图,与大量数据分开的便是异常值(也称离群值)
2.箱图再判离群值
#传递数据
ggplot(saledata,aes(x='Sale',y=Sale)) +
#设置箱图的填充色,边框色,宽度
geom_boxplot(fill='cornsilk',colour='grey60',width=0.2,
#设置异常值类型,大小
outlier.shape = 21,outlier.size = 2,
#设置异常值边框色,填充色
outlier.colour = 'red',outlier.fill = 'white') +
#设置背景主题
theme_bw() +
#删除网格线
theme(panel.grid = element_blank(),
#设置边框颜色
panel.border = element_rect(colour = 'lightblue'),
#设置坐标轴标签
axis.text = element_text(family = 'serif',face = 'italic',colour = 'blue'),
#设置坐标轴标题
axis.title = element_text(family = 'serif',face = 'italic',colour = 'blue'))
image
箱图显示离群值更明显一些,大家自行查阅箱图判定离群值的原理。
由于利用多重插补法处理缺失值较为复杂,下期定当补充。
回台回复:2018/11/23。获取往后文章所用数据。
下期再见。
你可能还想看
等你很久啦,长按加入古同社区
image
网友评论