1. 程式人生 > >R語言 處理缺失值(二)

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

考慮到這兩天都是周末, 而週末的銷售額一般要比周一到週五要多,所以插值結果比較符合實際情況