R语言 处理缺失值(二)

数据源:http://pan.baidu.com/s/1miRcns0

##设置工作空间

#把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter4/示例程序")
#读取销售数据文件,提取标题行
inputfile=read.csv('E:\\大三下半年\\R语言数据分析与数据挖掘\\图书资料\\R语言数据分析与挖掘实战\\数据及代码_免费下载\\chapter3\\示例程序\\data\\catering_sale.csv',he=T) 


#变换变量名
inputfile=data.frame(sales=inputfile$'销量',date=inputfile$'日期')


#数据截取
inputfile=inputfile[5:16,]


#缺失数据的识别
is.na(inputfile)#判断是否存在缺失
n=sum(is.na(inputfile))#输出缺失值个数


#异常值识别
par(mfrow=c(1,2))#将绘图窗口划为1行两列,同时显示两图
dotchart(inputfile$sales)#绘制单变量散点图
boxplot(inputfile$sales,horizontal=T)#绘制水平箱形图


#异常数据处理
inputfile$sales[5]=NA #将异常值处理成缺失值
fix(inputfile)#表格形式呈现数据


#缺失值的处理
inputfile$date=as.numeric(inputfile$date)#将日期转换成数值型变量
sub=which(is.na(inputfile$sales))#识别缺失值所在行数
inputfile1=inputfile[-sub,]#将数据集分成完整数据和缺失数据两部分
inputfile2=inputfile[sub,]


#行删除法处理缺失,结果转存
result1=inputfile1


#均值替换法处理缺失,结果转存
avg_sales=mean(inputfile1$sales)#求变量未缺失部分的均值
inputfile2$sales=rep(avg_sales,n)#用均值替换缺失
result2=rbind(inputfile1,inputfile2)#并入完成插补的数据

result2

     sales     date
5  3442.10  190
6  3393.10  189
7  3136.60  188
8  3744.10  187
10 4060.30  185
11 3614.70  183
12 3295.50  182
13 2332.10  181
14 2699.30  180
16 3036.80  178
9  3275.46  186
15 3275.46  179


#回归插补法处理缺失,结果转存

model=lm(sales~date,data=inputfile1)#回归模型拟合

model

Call:
lm(formula = sales ~ date, data = inputfile1)


Coefficients:
(Intercept)         date  
   -8127.54        61.87  

inputfile2$sales=predict(model,inputfile2)#模型预测
result3=rbind(inputfile1,inputfile2)
      sales date
5  3442.100  190
6  3393.100  189
7  3136.600  188
8  3744.100  187
10 4060.300  185
11 3614.700  183
12 3295.500  182
13 2332.100  181
14 2699.300  180
16 3036.800  178
9  3380.642  186
15 2947.539  179


#多重插补法处理缺失,结果转存
library(lattice) #调入函数包
library(MASS)
library(nnet)
library(mice) #前三个包是mice的基础
imp=mice(inputfile,m=4) #4重插补,即生成4个无缺失数据集
fit=with(imp,lm(sales~date,data=inputfile))#选择插补模型
pooled=pool(fit)
summary(pooled)
result4=complete(imp,action=3)#选择第三个插补数据集作为结果

result4

sales date
5  3442.1  190
6  3393.1  189
7  3136.6  188
8  3744.1  187
9  3442.1  186
10 4060.3  185
11 3614.7  183
12 3295.5  182
13 2332.1  181
14 2699.3  180
15 2699.3  179
16 3036.8  178

考虑到这两天都是周末, 而周末的销售额一般要比周一到周五要多,所以插值结果比较符合实际情况



你可能感兴趣的:(R语言)