文中案例援引自:《数据挖掘与R语言》的第一个案例:海藻。加入自己的解读和部分代码修改。本文主要是可视化检查数据及处理缺失数据。下一篇是数据分析和预测。
数据描述:在一年的四季,收集了多条河流的不同水样。测定它们的化学性质和7种有害藻类(a1-a7)的存在频率
求:预测藻类模型,了解影响藻类的因素。
第一步:加载各种包和数据
library(DMwR)
library(car)
library(lattice)
library(Hmisc)
library(ggplot2)
head(algae)
summary(algae)
从数据中可见,数据包括取样季节,河流size,水质的化学参数,藻类(a1-a7)数目等。summary语句给出数据的统计特性概览。
第二步,图形可视化检查数据
这本书大概写的比较久,所以图形很朴素。用来解释数据是够了。
par(mfrow=c(1,2))
hist(algae$mxPH,prob=T,xlab='',main='Hist of max PH', ylim=0:1)
lines(density(algae$mxPH,na.rm=T))
rug(jitter(algae$mxPH))
qq.plot(algae$mxPH,main='Normal QQ plot of max PH')
左边是MxPH的直方图,同时显示变量分布的核密度。右边是QQ图,绘制正态分布的散点图,虚线显示置信区间。——可见MxPH服从正态分布。
2.png用箱线图等检查各变量的离群点
par(mfrow=c(1,2))
boxplot(algae$oPO4,ylab="Orthophosphate(oP04)")
rug(jitter(algae$oPO4),side=2)
abline(h=mean(algae$oPO4,na.rm=T),lty=2)
plot(algae$NH4)
abline(h=mean(algae$NH4,na.rm=T),lty=1)
abline(h=mean(algae$NH4,na.rm=T)+sd(algae$NH4,na.rm=T),lty=2)
abline(h=median(algae$NH4,na.rm=T),lty=3)
#identify是手动点击辨认离群点
identify(algae$NH4)
下面是绘制lattice包的条件分位箱图,但不知道为什么不work。也没有报错。
equal.count是将变量离散化,转换为因子类型。number设置区间个数,overlap设置区间靠近边界的重合。
lattice::bwplot(size~a1,data=algae,xlab="Algal A1",ylab="River Size")
#min02<-equal.count(na.omit(algae$mn02),number=4,overlab=1/5)
第三步,处理数据缺失
方法1:将缺失部分剔除
#检查缺失行数
nrow(algae[!complete.cases(algae),])
#剔除缺失数据(过于简单粗暴,不采用)
#algae<-na.omit(algae)
apply(algae,1,function(x)sum(is.na(x)))
apply(..function(x)..)是对数据框调用该函数,1是计算每一行NA的数量,2是计算每列。可见第62行和199行数据缺失较多。
函数manyNAs的功能是找出缺失值大于列数20%的行,之后会用到。
#algae<-algae[-manyNAs(algae),0.2]
.
方法2 :用最高频率值来填补缺失值
除了单个用平均数、中位数等补缺以外,还可以使用centralImputation函数,它是用中心趋势值填补数据集所有缺失值。对数值型变量用中位数;对名义变量用众数。
#中数单个插补法,没有实际使用
#algae[is.na(algae$Chla),"Chla"]<-median(algae$Chla,na.rm=T)
#对数值用中位数,对名义变量用众数填补缺失数据集的centralImputation函数
algae<-centralImputation(algae)
这个方法速度较快,适用于大数据集,但可能导致数据偏差。
方法3:通过变量的相关关系填补缺失值
检查缺失值
symnum(cor(algae[,4:18],use="complete.obs"))
用符号表示相关值,可见NH4和NO3之间,PO4和oPO4之间的相关值很高。所以要找到这两个变量之间的线性相关关系。采用lm方法。
manyNAs是个满tricky的函数,虽然前面有讲过,但在这里才用,不然会影响cor相关关系。
另外一定要赋值给新数据框,不要覆盖。不然就要重新安装DMwR包才能upload海藻数据,好麻烦。
algae2<-algae[-manyNAs(algae)]
head(algae2)
lm(PO4~oPO4,data=algae2)
从lm结果可以得出:PO4=42.897+1.293 * oPO4
所以补充28行数据框如下,并删去缺失值较多的62和199行。
algae2[28,"PO4"]<-42.897+1.293*algae2[28,"oPO4"]
algae2<-algae2[-c(62,199),]
将季节因子化并排序,观测mxPH与季节,河流size的关系。(此步略,lattice包又不work了)
algae2$season<-factor(algae2$season,levels=c("spring","summer","autumn","winter"))
#histogram(~mxPH/season,data=algae2)
#histogram(~mxPH/size*speed,data=algae2)
#stripplot(size~mxPH/speed,data=algae,jitter=T)
.
方法4:探索案例直接相似性来填补缺失值。knnImputation函数用欧氏距离来寻找距离个案最近的k个邻居,用中位数填补缺失值。
clean.algae<-knnImputation(algae2,k=10,meth="median")
可以见到数据集完整了。
0.png
本文主要讲图形化检查数据及填补缺失数据。下文主要是讲获取预测模型,选取了多元线性回归和决策树模型。——估计也看晕了,休息休息: )
上半部完整代码如下:
library(DMwR)
library(car)
library(lattice)
library(Hmisc)
library(ggplot2)
head(algae)
summary(algae)
######
par(mfrow=c(1,2))
hist(algae$mxPH,prob=T,xlab='',main='Hist of max PH', ylim=0:1)
lines(density(algae$mxPH,na.rm=T))
rug(jitter(algae$mxPH))
qq.plot(algae$mxPH,main='Normal QQ plot of max PH')
par(mfrow=c(1,2))
boxplot(algae$oPO4,ylab="Orthophosphate(oP04)")
rug(jitter(algae$oPO4),side=2)
abline(h=mean(algae$oPO4,na.rm=T),lty=2)
plot(algae$NH4)
abline(h=mean(algae$NH4,na.rm=T),lty=1)
abline(h=mean(algae$NH4,na.rm=T)+sd(algae$NH4,na.rm=T),lty=2)
abline(h=median(algae$NH4,na.rm=T),lty=3)
identify(algae$NH4)
bwplot(size~a1,data=algae,xlab="Algal A1",ylab="River Size")
#min02<-equal.count(na.omit(algae$mn02),number=4,overlab=1/5)
#######
nrow(algae[!complete.cases(algae),])
#algae2<-na.omit(algae)
apply(algae,1,function(x)sum(is.na(x)))
apply(algae,2,function(x)sum(is.na(x)))
#algae[is.na(algae$Chla),"Chla"]<-median(algae$Chla,na.rm=T)
#对数值用中位数,对名义变量用众数填补缺失数据集的centralImputation函数
#algae<-centralImputation(algae)
symnum(cor(algae[,4:18],use="complete.obs"))
algae2<-algae[-manyNAs(algae)]
head(algae2)
lm(PO4~oPO4,data=algae2)
algae2[28,"PO4"]<-42.897+1.293*algae2[28,"oPO4"]
algae2<-algae2[-c(62,199),]
algae2$season<-factor(algae2$season,levels=c("spring","summer","autumn","winter"))
clean.algae<-knnImputation(algae2,k=10,meth="median")
网友评论