pandas数据预处理 缺失值
缺失值的分类
按照数据缺失机制可分为:
-
可忽略的缺失
-
完全随机缺失(missing completely at random, MCAR),所缺失的数据发生的概率既与已观察到的数据无关,也与未观察到的数据无关
-
随机缺失(missing at random, MAR),假设缺失数据发生的概率与所观察到的变量是有关的,而与未观察到的数据的特征是无关的。
-
-
不可忽略的缺失(non-ignorable missing ,NIM) 或非随机缺失(not missing at random, NMAR, or, missing not at random, MNAR),如果不完全变量中数据的缺失既依赖于完全变量又依赖于不完全变量本身,这种缺失即为不可忽略的缺失。
【注意】:Panda读取的数值型数据,缺失数据显示“NaN”(not a number)。
数据值的处理方法
主要就是两种方法:
-
删除存在缺失值的个案;
-
缺失值插补。
【注意】缺失值的插补只能用于客观数据。由于主观数据受人的影响,其所涉及的真实值不能保证。
1、删除含有缺失值的个案(2种方法)
(1)简单删除法
简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。
(2)权重法
当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。
如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。
对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。
2、可能值插补缺失值
【思想来源】:以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。
(1)均值插补
属于单值插补。数据的属性分为定距型和非定距型。如果缺失值是定距型的,就以该属性存在值的平均值来插补缺失的值;如果缺失值是非定距型的,就用该属性的众数来补齐缺失的值。
(2)利用同类均值插补
属于单值插补。用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。
假设为信息完全的变量,为存在缺失值的变量,那么首先对或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。
如果在以后统计分析中还需以引入的解释变量和做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。
(3)极大似然估计(Max Likelihood ,ML)
在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。
这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。
该方法比删除个案和单值插补更有吸引力,前提是适用于大样本,有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
(4)多重插补(Multiple Imputation,MI)
多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。
多重插补方法的三个步骤:
-
为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。
-
每个插补数据集合都用针对完整数据集的统计方法进行统计分析。
-
对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。
三种缺失符号
1、np.nan np.nan是一个麻烦的东西,首先它不等与任何东西,甚至不等于自己
2、None None比前者稍微好些,至少它会等于自身
https://mp.weixin.qq.com/s/_wI_uvkDDE3-fhdb9oNHuA
知识点:dropna()
df1 = df.dropna(axis=0,subset = ['b']) (过滤掉b列有缺失的行,注意:若缺失值为空字符串则无法过滤)
详解: Signature: df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
axis : {0 or 'index', 1 or 'columns'}, default 0
0, or 'index':删除包含丢失值的行
1, or 'columns':删除包含丢失值的列
默认为0 how : {'any', 'all'}, default 'any'
'any': 如果存在NA值,则删除该行或列
'all': 如果所有值都是NA,则删除该行或列
thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列。
subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index’,subset中元素为列的索引;如果axis=1或者‘column’,subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。
inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。