美文网首页程序员
海藻!海藻!—R实战案例一(上)

海藻!海藻!—R实战案例一(上)

作者: 只是不在意 | 来源:发表于2017-07-06 15:51 被阅读0次

    文中案例援引自:《数据挖掘与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")
    

    相关文章

      网友评论

        本文标题:海藻!海藻!—R实战案例一(上)

        本文链接:https://www.haomeiwen.com/subject/rfoncxtx.html