小言_互联网的博客

超详细:R语言缺失值及异常值处理

714人阅读  评论(0)

缺失值

缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类,分组,删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。

**缺失值的处理方法:**对于缺失值的处理,从总体上来说分为删除存在缺失值的个案和缺失值插补。对于主观数据,人将影响数据的真实性,存在缺失值的样本的其他属性的真实值不能保证,那么依赖于这些属性值的插补也是不可靠的,所以对于主观数据一般不推荐插补的方法。插补主要是针对客观数据,它的可靠性有保证。

删除含有缺失值的个案:主要有简单删除法和权重法。

  1. 简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。
  2. 当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。另外对于存在多个属性缺失的情况不适用。

可能值插补缺失值:原理是以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。如果因为一个属性值的缺失而放弃大量的其他属性值,这种删除是对信息的极大浪费,所以产生了以可能值对缺失值进行插补的思想与方法。常用的有如下几种方法。

  1. 均值插补:如果缺失值是数值型的,就以该属性存在值的平均值来插补缺失值;如果缺失值是类别型的,就根据统计学中的众数原理,用该属性的众数(即出现频率最高的值)来补齐缺失的值;
  2. 利用同类均值插补:同均值插补的方法都属于单值插补,不同的是,它用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。首先对信息完全的变量或其子集行聚类,然后按缺失个体所属类来插补不同类的均值;
  3. 极大似然估计(Max Likelihood)。在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。可以保证ML估计值是渐近无偏的并服从正态分布。但该方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
  4. 多重插补(Multiple Imputation)。思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。

缺失值检测
关于缺失值的检测应该包括:缺失值数量、缺失值比例、缺失值与完整值数据筛选

sum(is.na(data))                #查看data里缺失值个数
sum(is.na(data$DINNER_PRICE)    #查看data里维度DINNER_PRICE缺失值个数
data=data[!is.na(data$DINNER_PRICE),]     #删除DINNER_PRICE缺失样本
data=na.omit(data)              #去除有NA的行(方法1)
data[complete.cases(data),]     #去除有NA的行(方法2)
data[complete.cases(data[,5:6]),]    #只过滤第5列,第6列中含有NA的行

缺失值检测-整体

sum(complete.cases(data))   #不含缺失值记录 
sum(!complete.cases(data))    #含缺失值记录
mean(!complete.cases(data))       #有缺失值记录比例  
head(data[!complete.cases(data),])  #筛选出有缺失值的记录 
sum(is.na(data))     #数据集中缺失值总计数量

缺失值检测-维度检测

sum(complete.cases(data$CHANNEL_GRADE))   #不含缺失值 
sum(!complete.cases(data$CHANNEL_GRADE))    #含缺失值
mean(!complete.cases(data$CHANNEL_GRADE))       #有缺失值占比
head(data[!complete.cases(data$CHANNEL_GRADE),])    #筛选出CHANNEL_GRADE有缺失值的记录

把缺失值数据集、非缺失值数据集分开

sub <- which(is.na(data$CHANNEL_GRADE))  #识别CHANNEL_GRADE中缺失值所在行数  
inputfile1 <- inputfile[-sub,]   #将数据集分成完整数据和缺失数据两部分  
inputfile2 <- inputfile[sub,] 

异常值(outlier)

指样本中的个别值,其数值明显偏离它(或他们)所属样本的其余观测值,也称异常数据,离群值。

目前人们对异常值的判别与剔除主要采用物理判别法和统计判别法两种方法。

  1. 物理判别法就是根据人们对客观事物已有的认识,判别由于外界干扰、人为误差等原因造成实测数据值偏离正常结果,在实验过程中随时判断,随时剔除;
  2. 统计判别法是给定一个置信概率,并确定一个置信限,凡超过此限的误差,就认为它不属于随机误差范围,将其视为异常值剔除。当物理识别不易判断时,一般采用统计识别法。

异常值检验

方法1:箱线图检验离群值

sp=boxplot(hon_01$CHARGE_T,boxwex=0.7)  
title("异常值检测箱线图")  
xi=1.1  
sd.s=sd(hon_01[complete.cases(hon_01),]$CHARGE_T)  
mn.s=mean(hon_01[complete.cases(hon_01),]$CHARGE_T)  
points(xi,mn.s,col="red",pch=18)  
arrows(xi, mn.s - sd.s, xi, mn.s + sd.s, code = 3, col = "pink", angle = 75, length = .1)  
text(rep(c(1.05,1.05,0.95,0.95),length=length(sp$out)),labels=sp$out[order(sp$out)],  
     sp$out[order(sp$out)]+rep(c(150,-150,150,-150),length=length(sp$out)),col="red")  

方法2:当前值在平均值的±3个标准差之外

a<-matrix(1:12,nrow=3) 
list_mean<- apply(a,2,mean)        #按列求均值
list_sd<-apply(a,2,std)            #按列求标准差
max<-list_mean+3*(list_sd)         #按列求最大值
min<-list_mean-3*list_sd           #按列求最小值
apply(a,2,mean,na.rm=TRUE)         #如果有空值,可以加入na.rm=TRUE,忽略掉空值

方法3:
3.1、计算下四分位数、上四分位数和四分位距

QL <- quantile(value, probs = 0.25)
QU <- quantile(value, probs = 0.75)
QU_QL <- QU-QL

3.2、找出异常点

which(value > QU + 1.5*QU_QL)
value[which(value > QU + 1.5*QU_QL)]

异常值处理
盖帽法:整行替换数据框里99%以上和1%以下的点,将99%以上的点值=99%的点值;小于1%的点值=1%的点值

q1 <- quantile(hon_01$USER_AGE, 0.01)        #取得时1%时的变量值  
q99 <- quantile(hon_01$USER_AGE, 0.99)       #取得时99%时的变量值
hon_01[hon_01$USER_AGE < q1,]$USER_AGE <- q1  
hon_01[hon_01$USER_AGE > q99,]$USER_AGE < -q99  
summary(hon_01$USER_AGE)      #盖帽法之后,查看数据情况  

转载:https://blog.csdn.net/yawei_liu1688/article/details/79175433
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场