此地古同R语言

R小姐:缺失值 and 异常值的分析、处理

2018-11-24  本文已影响1人  鲨瓜

现实生活中我们遇到的绝大部分数据都包含有缺失值,因此如何处理缺失值变得尤其重要。

缺失值的处理一般分为两个步骤:缺失值的识别,缺失值的处理。

缺失值的识别: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
上一篇 下一篇

猜你喜欢

热点阅读