探索性数据分析EDA(二)—— 缺失值处理

article/2025/9/21 18:23:09

接上一篇 《探索性数据分析(1)—— 变量识别和分析》, 这篇笔记主要内容为缺失值处理方法介绍,以及相关python工具包sklearn.impute的使用介绍。

目录

  • 1. 为什么需要处理缺失值
  • 2. 为什么数据有缺失值
      • a) 完全随机缺失(Missing completely at random,MCAR)
      • b) 随机缺失(Missing at random,MAR)
      • c) 完全非随机缺失(missing not at random,MNAR)
  • 3. 缺失值的处理方法
    • 1)删除 Deletion
    • 2)均值、中位数、众数插补 Mean/ Mode/ Median Imputation
    • 3)预测模型
    • 4)K近邻法
  • 4. python代码及sklearn.impute工具介绍
    • 1)基础的入门方法
    • 2)检查数据缺失情况
    • 3)批量删除有缺失值的列
    • *4)SimpleImputer (重点)
    • 5)扩充插补法
    • 6)K近邻法 KNNImputer
    • 7)其他Imputer


1. 为什么需要处理缺失值

这就是个废问题,不处理就会影响结果准确性,但处理不好也会帮倒忙、增加噪音。所以要根据每个缺失值的具体情况,选择适合的处理方法。

2. 为什么数据有缺失值

缺失值的产生的原因多种多样,主要分为机械原因和人为原因:

  • 机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。
  • 人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据 。

缺失值可能出现在两个阶段:

  • 数据提取(Data Extraction),在提取信息的过程中出现错漏,一般这些错误只要仔细检查步骤流程,和数据管理者核对就可以解决。
  • 数据采集(Data collection):可以分成下面3种具体情况。

a) 完全随机缺失(Missing completely at random,MCAR)

完全随机缺失指的是数据的缺失是随机的,数据的缺失不依赖于任何不完全变量或完全变量。

当数据是完全随机丢失的时候,数据丢失的机率对于所有观测值都是一样的。比如,数据收集过程中的受访者决定在掷硬币后宣布他们的收入。如果出现人头,受访者会申报其收入;如果出现图案,则不申报。在这里,每一个观察值都有相同的丢失值的机会。

b) 随机缺失(Missing at random,MAR)

指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量。

数据的缺失的机率受其他变量的影响。例如,当收集年龄数据时,女性更不愿公开自己的年龄,因此女性的缺失值会远远大于男性。

c) 完全非随机缺失(missing not at random,MNAR)

指的是数据的缺失依赖于不完全变量自身,这里有两种情况:

1)缺失值与未观察的输入变量相关(Missing that depends on unobserved predictors):

缺失值不是随机的,而是与未观察的输入变量相关。

比如在医学研究中,如果某一特定治疗导致不适,那么患者退出研究的可能性就会更高,因此这些“不适”的患者没有被观察和测量,产生了缺失值。如果我们删除这部分缺失样本,则完全把不适的患者排除在分析样本之外。
这个缺失的值不是随机产生的,而是依赖于“不适”这个未被观察到的变量。

2)缺失情况与变量本身直接相关(Missing that depends on the missing value itself):

缺失是因为变量本身,比如高/低收入的人更不愿意提供自己的收入信息。

3. 缺失值的处理方法

1)删除 Deletion

适合完全随机缺失Missing completely at random,有两种删除方法:

  1. 成列删除List Wise Deletion:将整个样本删掉。
  2. 成对删除Pair Wise Deletion:只删掉缺失值的部分;一些样本虽然有缺失值,但是依旧可以使用其他未缺失的部分进行分析。
    在这里插入图片描述

2)均值、中位数、众数插补 Mean/ Mode/ Median Imputation

即用将缺失值填充掉,使用均值/中位数/众数替代缺失值。

  1. 广义插补(Generalized Imputation): 使用所有已知的数据,计算平均数/中位数替代缺失值。例如,上面的例子中,Manpower 的缺失值可用其平均数28.33填充。
  2. 相似插补(Similar case Imputation): 按照每个缺失值的样本特性,选择已知相似样本的平均数/中位数来插补缺失值。例如按性别计算平均数, “Male” (29.75) 和“Female” (25) ;然后根据每个样本的性别来选择替代缺失值的平均数,男性则插补29.75,若样本为女性则使用25。

插补法的扩充标记
在补充数据的同时,增加一列缺失值的标记。如下所示,这样是否为缺失值也可以成为一列新的特征。
在这里插入图片描述

3)预测模型

首先,将数据集分成两组,一组没有缺失值,另一组包含缺失值。则第一组数据作为模型的训练集,而第二组为测试集,缺失值即是目标变量。
然后,可以用方差分析,逻辑回归等方法建模并计算出缺失值。
这个方法有两个缺点:

  1. 模型估计值通常比真实值表现得更好
  2. 如果与数据集中的属性和缺失值的属性没有关系,那么模型将不能精确地估计缺失值

4)K近邻法

在该方法中,使用给定数量的与缺失值的属性最相似的属性进行缺失值的赋值。两个属性的相似性是通过距离函数来确定的。众所周知,它也有一定的优势和劣势。

  • 优点: k近邻可以预测定性和定量属性;不需要为每个缺少数据的属性创建预测模型;可以很容易地处理缺少多个值的属性;考虑了数据的相关结构特性

  • 劣势: KNN算法在分析大型数据库时非常耗时。它搜索所有数据集,寻找最相似的实例;k值的选择是非常关键的:k的高值会包含与我们需要的显著不同的属性,而k的低值则意味着丢失了重要的属性。


4. python代码及sklearn.impute工具介绍

1)基础的入门方法

在训练集Train中,常用的处理方法,简单易懂,适合处理特征不多的数据集。

#检查统计缺失值
train.isnull().sum() #删除行
train.dropna(inplace=True)#众数插补: 
train['Gender'].fillna(train['Gender'].mode()[0],inplace=True)#中位数插补 
train['LoanAmount'].fillna(train['LoanAmount'].median(), inplace=True)#平均数 
train['LoanAmount'].fillna(train['LoanAmount'].mean(), inplace=True)

2)检查数据缺失情况

当有数据集有很多列时,使用train.isnull().sum() 显示不全,可以用下面代码检查缺失值情况

def missing_value_table(df):#计算所有的缺失值mis_val = df.isnull().sum()# %比mis_val_percent = 100*df.isnull().sum()/len(df)#合并mis_val_table = pd.concat([mis_val,mis_val_percent],axis=1)mis_val_rename = mis_val_table.rename(columns = {0:'Missing valyes',1:'% of total values'})#剔除没有缺失值的列,然后排序mis_val_rename = mis_val_rename[mis_val_rename.iloc[:,1]!=0].sort_values('% of total values',ascending=False)return mis_val_rename

3)批量删除有缺失值的列

同样,当处理大的数据集时,如果特征太多,需要批量处理。

# 获取全部有缺失的列名
cols_with_missing = [col for col in X_train.columnsif X_train[col].isnull().any()]# 对训练集X_train和验证集X_vail的缺失列删除处理
reduced_X_train = X_train.drop(cols_with_missing, axis=1)
reduced_X_valid = X_valid.drop(cols_with_missing, axis=1)

*4)SimpleImputer (重点)

SimpleImputer是sklearn自带的处理缺失值的工具。它可以快速实现前面提到过的的插补方法(指定数值、中位数、众数和均值)。

尤其是处理多特征的数据集时,直接实用工具,可以避免给每个特征的计算、插入过程。

此外,SimpleImputer 也支持对稀疏矩阵的处理。

参数介绍SimpleImputer(*, missing_values=nan, strategy='mean', fill_value=None, verbose='deprecated', copy=True, add_indicator=False)

  • missing_values:int, float, str, (默认)np.nan或是None, 即缺失值是什么。这里也可以定义缺失值是其他非空数值/文本。

    • 如下所示:设定为缺失值100,使用均值插补。就会将100当做是缺失值,对100以外的数据求均值,最后使用该均值替换掉100 在这里插入图片描述
  • strategy:空值填充的策略,共四种选择(默认)mean、median、most_frequent、constant。

    • constant表示将空值填充为自定义的值,但这个自定义的值要通过fill_value来定义。
  • add_indicator:boolean,(默认)False,True则会在数据后面加入n列由0和1构成的同样大小的数据,0表示所在位置非缺失值,1表示所在位置为缺失值。

  • 其他参数意义见官方文档:sklearn.impute.SimpleImputer

#导入包
from sklearn.impute import SimpleImputer
# 定义工具参数和名称,默认是对所有缺失值填充均值
my_imputer = SimpleImputer()# fit_transform() 是fit()和transform()的结合,意味着根据X_train的来训练工具,并且对X_train的缺失值进行填充。一般情况下使用比较多。
imputed_X_train = pd.DataFrame(my_imputer.fit_transform(X_train))# transform() 使用已经训练好的工具,直接对X_vaild插补。
imputed_X_valid = pd.DataFrame(my_imputer.transform(X_valid))# 对补充好的数据重命名
imputed_X_train.columns = X_train.columns
imputed_X_valid.columns = X_valid.columns

5)扩充插补法

这里接上面3)的代码,已取得全部有缺失值的列名cols_with_missing
这个方法是前面提到的:在插补缺失值的同时,还要新增一列标记列。

# 先复制原有的数据
X_train_plus = X_train.copy()
X_valid_plus = X_valid.copy()# 增加新的列标记是否为插补值
for col in cols_with_missing:X_train_plus[col + '_was_missing'] = X_train_plus[col].isnull()X_valid_plus[col + '_was_missing'] = X_valid_plus[col].isnull()# 补充数据
my_imputer = SimpleImputer()
imputed_X_train_plus = pd.DataFrame(my_imputer.fit_transform(X_train_plus))
imputed_X_valid_plus = pd.DataFrame(my_imputer.transform(X_valid_plus))# 换名字
imputed_X_valid_plus.columns = X_valid_plus.columns

6)K近邻法 KNNImputer

参数介绍:KNNImputer(*, missing_values=nan, n_neighbors=5, weights='uniform', metric='nan_euclidean', copy=True, add_indicator=False)
官方文档:sklearn.impute.KNNImputer

使用方法和楼上类似,就不多赘述了,直接贴例子代码。

import numpy as np
from sklearn.impute import KNNImputer
nan = np.nan
X = [[1, 2, nan], [3, 4, 3], [nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2, weights="uniform")
imputer.fit_transform(X)#输出结果
array([[1. , 2. , 4. ],[3. , 4. , 3. ],[5.5, 6. , 5. ],[8. , 8. , 7. ]])

7)其他Imputer

MissingIndicator 转换器可用于将数据集转换为相应的二进制矩阵,以指示数据集中是否存在缺失值。此转换与插补结合使用时很有用。使用插补时,保留有关缺少哪些值的信息可以提供信息。

IterativeImputer 是将具有缺失值的每个特征建模为其他特征的函数,并将该估计值用于插补。(还处于试验阶段,先留个空日后那年用到了再回来补。)

参考资料:

  1. A Comprehensive Guide to Data Exploration
  2. Sklearn 官方介绍:Imputation of missing values
  3. Kaggle Notebook:Handling Missing Value

有任何翻译错误或内容补充,欢迎大家在评论区留言指出,欢迎一起讨论。


http://chatgpt.dhexx.cn/article/tprAA3kD.shtml

相关文章

数据分析汇总

一、本文说明: 本文为自己学习的笔记,用来记录数分的相关知识,方便记录查阅。 二、指标体系建设与数据分析: 1、指标体系概念: ①:什么是指标体系: 企业指标的集合 ②:好…

5whys分析法在美团工程师中的实践

2019独角兽企业重金招聘Python工程师标准>>> 前言 网站的质量和稳定性对于用户和公司来说至关重要,但是在网站的快速发展过程中,由于各种原因导致事故不可避免的发生,这些大大小小的事故对公司难免会造成一些负面的影响&#xff0…

单因素方差分析的计算过程详解

统计分析之单因素方差分析计算过程详解 Excel方差分析 用Excel计算方差分析,三种方法: 一步步手推法 用Excel的数据分析→单因素方差分析自动生成 在1的基础上通过SUMX2MY2优化法 Excel版操作步骤可参见 Excel单因素方差分析操作详解 P…

哈佛大学——差异表达分析(九)DESeq2步骤描述

文章目录 学习目标DESeq2差异基因表达分析流程第一步:估计大小因子第二步:估计基因离散(gene-wise dispersion)第三步:拟合曲线到基因的分散估计第四步:将基因离散估计值向曲线预测值收缩MOV10 DE分析:探讨离散估计和评…

数学建模之层次分析法(AHP)

层次分析法(Analytic Hierarchy Process) AHP是对一些较为复杂的,较为模糊的问题作出决策的简易方法,它特别适用于那些难以完全定量分析的问题。由美国运筹学家T.L.Saaty教授于上世纪70年代初期提出。 目录 层次分析法&#xff0…

时序分析-季节因素

目录 1时序分析的基础 1.1 简介 1.2 分类 2 分析套路 3 主流时序分析模型 3.1移动平均 3.2 指数平滑法 3.3 组合模型 3.4 ARIMA 4 研究细分领域 4.1 异常值检测 4.2 季节序列分析 4.1 同期平均法 4.1.1 简单季节指数法 4.1.2 趋势季节指数法 4.2 长期趋势剔除法…

html5播放器的示例代码

本次的分享是一个基于HTML5标签实现的一个自定义视频播放器。其中实现了播放暂停、进度拖拽、音量控制及全屏等功能。 效果预览 核心思路 我相信一定会有些没有接触过制作自定义播放器的童鞋对于 标签的认识会停留在此。 <video controls"controls" autoplay"…

HTML5音乐播放器

明月浩空-HTML5浮窗音乐播放器研发于2014年&#xff0c;并持续更新至今 是基于QQ音乐、酷狗音乐、网易云音乐等歌曲ID全自动解析的网页音乐播放器 依靠服务器强大的接口功能&#xff0c;只需要一个ID既可获取全部信息 同时播放器主体会跟随专辑图片主色值自动变色&#xff0c;歌…

h5的开源播放器组件

哈喽&#xff0c;大家好&#xff0c;今天我要给大家推荐一个非常棒的看片神器&#xff0c;那就是【moovie】.它是一款专注于电影的HTML5 播放器。 先展示一下效果&#xff0c;测试了一下&#xff0c;支持倍速播放、快捷键操作、字幕偏移即时调整&#xff0c;还有一些参数展示&a…

H5播放器使用方法。

1.使用webkit-playsinline playsinline 在iOS微信webview中视频不会弹出来&#xff0c;直接播放。 <video id"test_video" class"test_video" webkit-playsinline playsinlinesrc"http://res.imtt.qq.com/qqbrowser/js/advideo.mp4"control…

H5,Audio音乐播放器(移动版)

有些时候&#xff0c;总是感觉自己进步的没有以前快了。于是就怀疑自己是不是也被时间磨灭了&#xff0c;这可真是一件不幸的事儿。可能是自己会的东西太少了&#xff0c;总是有种莫名的危机感。 前一段时间&#xff0c;想写一个移动版音乐播放器&#xff0c;于是就开始利用下班…

H5 video 播放器demo

H5 video 播放器demo 前言 最近在做一个wap端的项目&#xff0c;需要视频播放功能。大家也知道wap对flash支持很差&#xff0c;所以优先考虑使用h5播放器video,在这里我介绍用video实现视频播放方法。之后在介绍几个插件和第三方视频实现方法。 H5 video 因为video样式是原…

SkeyeWebPlayer.js H5播放器开发之播放器video动态创建(三)

SkeyeWebPlayer.js H5播放器是由成都视开信息科技开发和维护的一个完善的RTSP、FLV、HLS等多种流媒体协议播放&#xff0c;视频编码支持H.264&#xff0c;H.265&#xff0c;音频支持AAC&#xff0c;支持TCP/UDP协议&#xff0c;是一套极佳的且适合用于综合安防视频云服务播放组…

H5音乐播放器(包含源码与示例)

H5音乐播放器&#xff08;包含源码与示例&#xff09; 基于Angularionic的H5音乐播放器&#xff0c;源码&#xff1a;https://gitee.com/CrimsonHu/h5-music-player 示例地址 建议使用原版chrome或edge访问&#xff1a;http://intelyes.club:5300/ 功能 实时歌词显示支持歌…

基于H5+js开发一款音乐播放器

前言&#xff1a;当下音乐播放器不胜其数&#xff0c;为了更好的掌握一些东西&#xff0c;我们来自己制作一个音乐播放器。 文章目录&#xff1a; 一.开发环境&#xff1a;二.页面视图&#xff1a;1.主文件入口&#xff08;首页&#xff09;&#xff1a;2.音乐播放界面&#…

H5纯原生播放器 【学习video】

这是一个纯原生的H5播放器&#xff0c;尽管网上有很多第三方库&#xff0c;但是基础打的牢固&#xff0c;一定会帮你走的更远。 大厂也非常重视基础&#xff0c;再说了那些第三方库也是基础一点点搭起来的&#xff0c;所以有兴趣学习的同学可以下载来学习。 代码中的细节我都…

MuiPlayer - 一款优秀的 H5 视频播放器框架

Mui Player Gitee | Docs | 中文文档 介绍 MuiPlayer 是一款 HTML5 视频播放插件&#xff0c;其默认配置了精美可操作的的播放控件&#xff0c;涉及了常用的播放场景&#xff0c;例如全屏播放、播放快进、循环播放、音量调节、视频解码等功能。 支持 mp4、m3u8、flv 等多…

[h5]一个基于HTML5实现的视频播放器代码详解

什么是 HTML5&#xff1f; HTML5 是最新的 HTML 标准。 HTML5 是专门为承载丰富的 web 内容而设计的&#xff0c;并且无需额外插件。 HTML5 拥有新的语义、图形以及多媒体元素。 HTML5 提供的新元素和新的 API 简化了 web 应用程序的搭建。 HTML5 是跨平台的&#xff0c;被…

一个牛逼的开源 H5 视频播放器

【公众号回复 “1024”&#xff0c;免费领取程序员赚钱实操经验】 大家好&#xff0c;我是章鱼猫。今天给大家分享的这个开源项目&#xff0c;对于前端开发者来讲非常非常的有用。因为它是一个 H5 的视频播放器。 字节跳动出品&#xff0c;必属精品啊&#xff01;尤其是我感觉在…

H5移动端页面使用DPlayer视频播放器

背景&#xff1a; 如果使用原生video标签&#xff0c;那在不同类型手机浏览器上样式都不一样&#xff0c;而且播放表现不一样&#xff0c;比如使用css隐藏播放按钮在PC端有效&#xff0c;在手机端就无效&#xff0c;故我们选择引入第三方成熟的播放器。 需求&#xff1a; 1、自…