缺失值处理1

数据预处理步骤有数据清洗、数据集成、数据变换、数据规约。实际工作中不是每一步都必须。

版本一:

缺失值处理
对于缺失值的处理总的来说分删除法和插补法
(1)删除法:删除存在缺失值的记录(仅当样本量很大且缺失值记录所占样本比例<5%时可行)
(2)插补法:若属性是连续的,则使用该属性存在值的平均值去插补缺失值;若属性是离散的,则可取该属性的众数来插补缺失值。
数据集成
即相当于从原始的ODS中将各个数据表尽量整合成一个一个方便查询的表
数据规约
由于用于分析的数据集中可能包含数以百计的属性,但是其中大部分属性可能与挖掘任务不相关,或者是冗余的,则要尽量挑选出有用的属性,这是一项困难费时的任务。

所以数据规约目标在于找到最小的属性集,使现有概率分布尽可能接近使用所有属性时的原始分布。

数据变换
数据变化是将数据由一种表现形式变为另一种表现形式。常见的数据变换方式是:数据标准化、数据离散化、语义转换。
(1)数据标准化
分为0-1标准化和z-score标准化
(2)离散化
指将连续性数据切分为多个“段”,有些数据挖掘算法要求数据是分类属性的形式。
(3)语义转换
将{非常好,好,一般,差,非常差}这种转化为{1,2,3,4,5}来替代。

版本二:

数据清洗包括缺失值和异常值,这里只讨论缺失值。

数据集成的实现是将两个数据框以关键字为依据,在R里用merge函数实现,语句为merge(dataframe1, dataframe2,by=”关键字“”),默认按升序排列。

数据变换就是转化成适当的形式,来满足软件或分析理论的需要。

  1. 简单函数变换
    简单函数变换用来将不具有正态分布的数据变成有正态分布的数据,常用的有平方、开方、取对数、差分等。如在时间序列里常对数据对数或差分运算,将非平稳序列转化成平稳序列。
  2. 规范化
    规范化就是剔除掉变量量纲上的影响,比如:直接比较身高和体重的差异,单位的不同和取值范围的不同让这件事不能直接比较。
  3. 连续属性离散化
    将连续属性变量转化成分类属性,就是连续属性离散化,特别是某些分类算法要求数据是分类属性,如:ID3算法。

数据规约能够降低无效错误的数据对建模的影响、缩减时间、降低存储数据的空间。

  1. 属性规约
    属性规约是寻找最小的属性子集并确定子集概率分布接近原来数据的概率分布。
    合并属性:
    将一些旧的属性合并一个新的属性;
    逐步向前选择:
    从一个空属性集开始,每次在原来属性集合选一个当前最优属性添加到当前子集中,一直到无法选择最优属性或满足一个约束值为止;
    逐步先后选择:
    从一个空属性集开始,每次在原来属性集合选一个当前最差属性并剔除当前子集中,一直到无法选择最差属性或满足一个约束值为止;
    决策树归纳:
    没有出现在这个决策树上的属性从初始集合中删除,获得一个较优的属性子集;
    主成份分析:
    用较少的变量去解释原始数据中大部分变量(用相关性高的变量转化成彼此相互独立或不相关的变量)。
  2. 数值规约
    通过减少数据量,包括有参数和无参数方法,有参数如线性回归和多元回归,无参数法如直方图、抽样等。

一、完整的处理方法

1.识别缺失数据
2.检查导致数据缺失的原因
3.删除包含缺失值的实例或用合理的数值代替(插补)缺失值

二、缺失数据的分类

1.完全随机缺失MCAR:某变量的缺失数据与其他任何观测或未观测变量都不相关
2.随机缺失MAR:某变量的缺失数据与其他观测变量相关,与它自己的未观测值不相关
3.非随机缺失NMAR:不属于MCAR和MAR的情况

三、具体处理步骤

1.识别缺失值
①概念解释
1)NA:不可得,代表缺失值(is.na())
2)NaN:不是一个数,代表不可能值(is.nan())
3)Inf、-Inf:正无穷,负无穷(is.infinite())

②识别矩阵或数据框中没有缺失值的行

install.packages(c("VIM","mice"))
data(sleep,package="VIM") #加载数据集
sleep[complete.cases(sleep),] #列出没有缺失值的行
缺失值处理1_第1张图片
sleep[!complete.cases(sleep),] #列出有一个或多个缺失值的行
缺失值处理1_第2张图片

complete.case()只将NA和NaN识别为缺失值,结果显示42个实例为完整数据,20个实例含一个或多个缺失值

③列表显示缺失值

library(mice)
md.pattern(sleep)
缺失值处理1_第3张图片

缺失值处理1_第4张图片

mice包中的md.pattern()‘生成一个以矩阵或者数据框形式展示缺失值模式的表格。第一列表示个缺失值模式的实例个数,最后一列表示各模式中有缺失值的变量的个数,缺失值总个数等于第一列和最后一列一一对应相乘再相加。同时最后一行给出了每个变量中缺失值的数目。即缺失值总个数也等于最后一行之和。

④图形探究缺失数据

library(VIM)
aggr(sleep,prop=FALSE,numbers=TRUE)#计数
aggr(sleep,prop=TRUE,numbers=TRUE)#比例
缺失值处理1_第5张图片

缺失值处理1_第6张图片

VIM包中的aggr()函数不仅绘制每个变量的缺失值数,还绘制每个变量组合的缺失值数

⑤用相关性探索缺失值
先用指示变量替代数据集中数据,(1表示缺失,0表示存在),即影子矩阵

head(sleep,n=5)
as.data.frame(is.na(sleep))
as.data.frame(abs(is.na(sleep)))
x=as.data.frame(abs(is.na(sleep)))
head(x,n=5)
缺失值处理1_第7张图片

缺失值处理1_第8张图片

缺失值处理1_第9张图片

提取含(但不全是)缺失值的变量

y<-x[which(apply(x,2,sum)>0)]
y
缺失值处理1_第10张图片

再求这些指示变量之间的相关性

cor(y)

可以得出Dream和NonD常常一起缺失,相对可能性比较小的是Sleep和Dream。
最后求含缺失值变量和其他可观测变量之间的关系

cor(sleep,y,use="pairwise.complete.obs")

缺失值处理1_第11张图片

2.理解缺失值的来由
①弄清楚几个问题:
1)缺失数据的比例多大
2)缺失数据是否集中在少数几个变量
3)缺失是随机产生的吗
4)缺失数据间的相关性或者与其他可观测数据间的相关性,是否可以表明产生缺失值的机制
②判断哪种统计方法最适合用来分析你的数据:
1)如果缺失数据集中在几个相对不太重要的变量,则可以删除这些变量
2)如果一小部分数据随机分布在整个数据集,即MCAR,则可以分析数据完整的实例,仍可以得到有效结果
3)如果假定数据为MCAR或者MAR,则可以应用多重插补法来获得有效结论
4)如果数据为NMAR,则需借助专门方法,收集新数据。
3.实际处理缺失数据
①行删除/个案删除
当数据是MCAR时,后续样本量的减少对统计检验效力不会造成很严重的影响时,行删除法非常有用。
只有每个变量都包含了有效数据值的观测才会被保留下来,导致包含一个或多个缺失值的任意一行都会被删除
当变量有较大缺失并且对研究目标影响不大时,可以使用mydata【,-p】直接删除变量

newdata<-mydata[complete.cases(mydata),]
#等价形式
newdata<-na.omit(mydata)
#na.omit删除含缺失值的行

②多重插补MI
当数据为MCAR或MAR时,并且缺失数据问题非常复杂时,多重插补很实用。
是一种基于重复模拟的处理缺失值的方法,它将从一个包含缺失值的数据集中生成一组完整的数据集(通常是3到10)。每个模拟数据集中,缺失数据将用蒙特卡洛方法来填补。
这里我们重点学习mice包。
mice包:利用链式方程的多元插补。具体过程:首先从一个包含缺失数据的数据框开始,返回一个包含多个(默认5个)完整数据集的对象;然后,with()函数可依次对每个完整数据集应用统计模型;最后,pool()函数将这些单独的分析结果整合为一组结果。最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。
mice如何插补缺失值:通过Gibbs抽样完成。每个缺失值由数据集中其他预测变量预测得来,该过程不断迭代,直到所有预测值收敛。
通常过程:

library(mice)
imp <- mice(mydata, m)#mydata是待插补的数据框,m默认5,imp里含有m个插补数据集
fit <- with(imp, analysis)#analysis是一个表达式对象,设定应用于m个插补数据集的统计分析方法
pooled <- pool(fit)#fit包含了m个单独统计分析结果
summary(pooled)#pooled包含m个统计分析平均结果

注:还有回归插补,回归插补指的是将插补的变量当作因变量y,其他变量看错自变量,利用回归模型进行拟合,在R里使用lm回归函数对缺失值进行插补。
③推理法
当数据存在冗余信息或者有外部信息可用时,推理法可用来恢复缺失值。
根据变量间的数学或者逻辑关系来填补或者恢复缺失数据。
④成对删除(尽量避免使用)

cor(sleep,y,use="pairwise.complete.obs")

⑤简单(非随机)插补(尽量避免使用)
即用某个值(如均值,中位数或众数)来替换变量中的缺失值。
⑥总结
变量中如果有缺失值,针对缺失值有四种情况:
缺省值极少:若缺省值样本占总数比例极高,直接舍弃,因为作为特征加入反而会引入噪声值。
非连续特征缺省值适中:如果缺值的样本适中,而该属性非连续值特征属性,就把NaN作为一个新类别,加入到类别特征中。
连续特征缺省值适中:如果缺值的样本适中,考虑给定一个step,然后离散化,将NaN作为一个type加入到属性类目中。
缺省值较多:考虑利用填充的办法进行处理。其中有均值、众数、中位数填充;用sklearn里的RandomForest模型去拟合数据样本训练模型,然后去填充缺失值;拉格朗日插值法。

你可能感兴趣的:(缺失值处理1)