您的位置:首页 > 其它

R语言 处理缺失值(二)

2016-05-18 22:25 288 查看
数据源: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

考虑到这两天都是周末, 而周末的销售额一般要比周一到周五要多,所以插值结果比较符合实际情况
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: