在进行数据分析之前,我们往往需要对数据进行预处理,而最重要一部分就是怎么处理哪些缺失的数据。

通常的方法有四种:

删除这些缺失的数据。
用最高频数来补充缺失数据。
通过变量的相关关系来填充缺失值。
通过案例之间的相似性来填充缺失值。

下面通过R语言对上面4种方法进行说明(algae数据来源:http://www.dcc.fc.up.pt/~ltorgo/DataMiningWithR/extraFiles.html)

#方法一:删除这些缺失的数据。

algae[!complete.cases(algae),];#显示所有含有缺失数据的行

nrow(algae[!complete.cases(algae),]);#行数ncol():列数

algae<-na.omit(algae);#删除缺失数据的行。

data(algae);

manyNAs(algae,0.3);#得到缺失值个数大于列数30%的行标。

apply(algae,1,function(x)sum(is.na(x)));#统计每行中含有缺失数据的个数。

apply(algae,2,function(x)sum(is.na(x)));#统计每列中含有缺失数据的个数。

algae<-algae[-c(62,199),];#删除含有较多缺失数据的行。

#方法二:用最高频数来补充缺失数据

data(algae);

algae[48,”mxPH”]<-mean(algae$mxPH,na.rm=T);#使用平均值(正态分布)补充缺失的数据。

algae[is.na(algae$Cl),”Cl”]<-median(algae$Cl,na.rm=T);#使用中位数补充这一列中所有缺失的数据

#方法三:通过变量的相关关系来填充缺失值

#1、使用函数cor()来获取变量之间的相关值矩阵。

cor(algae[,4:18],use=”complete.obs”);

symnum(cor(algae[,4:18],use=”complete.obs”));

#2、通过得到的关联矩阵,得到哪些变量之间有较强的线性关系

data(algae);

algae<-algae[-manyNAs(algae),];

lm(PO4~oPO4,data=algae);#通过函数lm(,)来得到它们线性关系PO4=a+b*oPo4;

algae[28,”PO4″]<-42.897+1.293*algae[28,”oPO4″];

#建立一个函数;

fillP04<-function(x){

      if(is.na(x))

        retrun(NA)

      else

        return(42.897+1.293*x)

}

algae[is.na(algae$PO4),”PO4″]<-sapply(algae[is.na(algae$PO4),”oPO4″],fillP04);

histogram(~mxPH|size*speed,data = algae);

#方法四: 通过案例之间的相似性来填充缺失值

algae<-knnImputation(algae,k=10);

algae<-knnImputation(algae,k=10,meth=”median”);

发表回复

您的电子邮箱地址不会被公开。