缺失值处理
数据缺失的原因
缺失值的产生的原因多种多样,主要分为机械原因和人为原因。机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据
数据缺失的类型
将数据集中不含缺失值的变量称为 完全变量
,数据集中含有缺失值的变量称为 不完全变量
完全随机缺失(MCAR)
指的是数据的缺失是随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失
随机缺失(MAR)
指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量,如财务数据缺失情况与企业的大小有关
非完全随机缺失(MNAR)
指的是数据的缺失依赖于不完全变量自身,如高收入人群不愿意提供家庭收入
数据缺失的处理方法
一、不处理
有一些模型自身能够处理数据缺失的情况(如随机森林、xgboost),在这种情况下不需要对缺失数据做任何的处理,这种做法的缺点是在模型的选择上有局限
二、删除
import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer
from sklearn.ensemble import RandomForestClassifier
df = pd.read_csv('person.csv')
df
删除有缺失数据的样本
df = pd.read_csv('person.csv')
df = df.dropna(how='any')
df
删除有过多缺失数据的特征
df = pd.read_csv('person.csv')
df = df.drop(['height','weight'], axis=1)
df
三、填充
固定值填充
df = pd.read_csv('person.csv')
df['sex'] = df['sex'].fillna('female')
df
均值填充
df = pd.read_csv('person.csv')
df['height'] = df['height'].fillna(df['height'].mean())
df
中位数填充
df = pd.read_csv('person.csv')
df['height'] = df['height'