R語言 處理缺失值(二)
阿新 • • 發佈:2019-01-07
資料來源: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
考慮到這兩天都是周末, 而週末的銷售額一般要比周一到週五要多,所以插值結果比較符合實際情況