本文的python版本为python3.7
缺失值类型
1.完全随机缺失(missing completely at random,MCAR):指缺失值是完全随机,不依赖于其他任何变量(完全变量和非完全变量);
2.随机缺失(missing at random,MAR):指缺失值的缺失依赖于其他完全变量;
3.完全非随机缺失(missing not at random,MNAR):指缺失值的缺失与不完全变量自身有关。
小结:由于缺失值类型的特性,当前统计学上对完全随机缺失和完全非随机缺失缺失类型没有权威的处理方法,对随机缺失缺失类型学术上有着广而多的讨论。
缺失值原因
1.爬虫时,网络错误、程序bug等形成的技术性错误,产生收集到的数据存在缺失值;
2.爬虫时,目标网页信息不全,使得收集的数据集产生缺失值;
3.问卷访谈时,目标人群基于信息的重要性等不愿意填;
等等。
小结:在当今时代缺失值的产生原因很多,随着时代的发展,数据的收集方式更倾向与网络爬虫等技术,爬虫技术产生缺失值的一般只有两种情况:技术问题及原始网页数据质量问题。
处理方法
查看缺失值情况:
#调用布尔值,查看变量是否含有缺失值,True表示变量存在缺失值,False表示变量不存在缺失值
data.isnull().any()
#查看变量缺失值的数量(当样本量多时,缺失值情况更直观)
data.isnull().sum()
#查看存在缺失值的样本情况
data[data.isnull().any(axis = 1) == 1]
#查看缺失值占比
data.isnull().sum()/data.shape[0]
删除法
当样本存在缺失值/都是缺失值,采用删除该样本的方法。
#样本存在缺失值则删除该样本
data = data.dropna(how='any')
#样本都是缺失值则删除该样本
data = data.dropna(how='all')
优点:处理起来简单快捷;当样本量极大,缺失值比例及小时,删除对总体的影响不大;
缺点:删除样本,则删掉了许多该样本的隐藏信息,当缺失值类型为MAR时,不推荐用该方法;当缺失值的样本拥有一定特性时,删除会显得不科学。
统计量填充
用均值、中位数、众数等统计量进行填充(也可以自己构建合适的统计量进行填充,本文不做赘述)。
#均值填充,math为有缺失值的变量(或可用inplace = True参数,直接替代原数据)
data['math'] =data['math'].fillna(data['math'].mean())
#中位数填充,math为有缺失值的变量
data['math'] =data['math'].fillna(data['math'].median())
#众数填充,math为有缺失值的变量
data['math'] =data['math'].fillna(data['math'].mode()[0])
优点:简单、快捷;
缺点:均值填充会减低总体样本的方差,中位数和众数填充会以偏概全(总体样本的分部出现倾斜)。
算法拟合填充
算法拟合填充的方法多而杂,在后续博文中会针对这块进行更详细的探讨。
回归填充
基于完全变量和非完全变量建立回归模型(线性回归、Logistic回归等回归模型),根据建立的模型得出估计值进行填充。
KNN填充
KNN根据一定的距离规则找到最近的K个样本,计算K个样本的统计量(均值、中位数、众数等等)来填补缺失值。设定K值的不同,会有不同的填充结果。
随机森林填充、多重插补等等
其他方法填充
用缺失值的上一个值进行填充、下一个值进行填充、上下两个值的均值进行填充。
#变量的前一个值进行填充,当前一个值也是缺失值,则用前前一个值填充缺失的两个值
data['math'] = data['math'].fillna(method='pad')
#变量的后一个值进行填充
data['math'] = data['math'].fillna(method='bfill')
#前后两个值的平均值进行填充
data['math'] = data['math'].interpolate()
优点:方便,快捷;
缺点:填充的值有随机性,且会根据不同的样本排列顺序产生不同的填充值。