1. 数据缺失分类
- 行记录的缺失,又称数据记录丢失
- 列值的缺失,即数据记录中某些列(变量)的值空缺
2. 数据列缺失的处理思路
2.1 丢弃
- 缺失值所在的行或者列整体删除,减少缺失数据对总体的影响
- 整行删除的前提:缺失行占总体的比例非常低,一般在5%以内
- 整列删除(对应变量删除)的前提:缺失值占整列的比例较高,一般在70%左右
- 注意,在大量的数据记录不完整或者缺失值的特征表现较明显的情况下,不采用此方法
2.2 补全
通常有以下几种方法
- 统计法:
- 对于数值型数据,使用均值、加权均值、中位数等方法补全;
- 对于分类型数据,则选择众数补全
- 模型法:将缺失字段作为目标变量,根据已有的其他字段进行预测,得到补全值。
- 对于数值型变量,采用回归模型;
- 对于分类型变量,采用分类模型(如KNN模型)
- 行业法:对于少量且具有重要意义的数据,通过行业专家补全
- 其他法:随机方法、特殊值法、查找法
2.3 真值转换
- 当缺失数据被认为是一种规律,需要作为输入维度参与后续的处理和建模时,就不能对其随意处理,此时采用的处理思路就是真值转换
- 举例描述:以用户性别字段为例,很多数据集无法对性别做补全处理,也不能丢弃,所以将缺失值作为未知变量,和男、女变量一起从一个变量的多个值分布转换为多个变量的真值分布状态。
- 转换前:性别(值域:男、女、未知)
- 转换后:性别_男(值域1或0)、性别_女(值域1或0)、性别_未知(值域1或0)
- 最后,将这三个新的字段作为输入维度替换原来的一个字段,用来参与后续的建模过程
2.4 不做处理
- 这种思路在于之后的建模应用和数据分析,很多模型对缺失值具有容忍度的处理方法,因此在预处理阶段可以先不做处理
- 模型举例:决策树和随机森林、神经网络和朴素贝叶斯、KNN等
- 另外,在后期建模时字段或者特征的重要性判断也决定是否处理缺失值
3. 实际操作(Python)
相关函数和属性
- 判断数据是否有缺失值:isnull()
- 获得每一列的判断结果:any()
- 计算变量的缺失值个数:sum()
- 计算数据集的行数和列数:shape,返回值:(行数, 列数)
- 删除字段或数据行:drop()
- 缺失值填充:fillna()
需要的库
import pandas as pd
数据
# 创建DataFrame对象,生成一份随机数据 data = pd.DataFrame(np.random.randn(6, 4), columns=['col1', 'col2', 'col3', 'col4'])
3.1 判断数据列(变量)的缺失值
代码如下
data1 = pd.read_csv() # 判断各变量中是否存在缺失值 data1.isnull().any(axis=0) # 各变量中缺失值的数量 data1.isnull().sum(axis=0) # 各变量中缺失值的比例 data1.isnull().sum(axis=0)/data1.shape[0]
3.2 判断数据行的缺失值
代码如下
# 判断数据行中是否存在缺失值 data1.isnull().any(axis=1).any() # 缺失值的行数 data1.isnull().any(axis=1).sum() # 缺失值的比例 data1.isnull().any(axis=1).sum()/data1.shape[0]
3.3 删除缺失数据
代码如下
参考资料:
《Python数据分析与数据化运营》
公众号 - 数据分析1480