数据清理——确保数据质量的关键步骤

简介

在数据分析和机器学习中,数据清理是预处理过程中的重要一环。良好的数据清理能够提高数据的质量,从而提升模型的准确性和可靠性。本篇文章将深入探讨数据清理的几个关键知识点,包括缺失值处理、数据不一致问题和噪声处理。通过详细的概念解释、丰富的案例分析和逐步的代码示例,帮助初学者掌握数据清理的实用技巧。


1. 缺失值处理

由于各种原因,许多现实世界的数据集包含缺失值,通常编码为空白、NaN 或其他占位符。然而,这样的数据集与 scikit-learn 估计器不兼容,后者假设数组中的所有值都是数值,并且都具有并保留意义。
使用不完整数据集的基本策略是丢弃包含缺失值的整行和/或整列。然而,这样做的代价是丢失可能有价值的数据(即使不完整)。更好的策略是估算缺失值,可以使用提供的常量值来估算缺失值,或者使用缺失值所在的每列的统计数据(平均值、中位数或最常见值)。

1.1 均值填充

均值填充是将缺失值用该特征(列)的均值来替代。适用于数据分布较为均匀的情况。

1.1.1 使用fillna()函数用于填充缺失值

示例代码

import pandas as pd
import numpy as np# 创建示例数据
data = pd.DataFrame({'年龄': [25, 30, np.nan, 35, 40],'收入': [50000, 70000, 80000, np.nan, 110000]
})# 查看原始数据
print("原始数据:")
print(data)# 使用均值填充缺失值
data['年龄'] = data['年龄'].fillna(data['年龄'].mean())
data['收入'] = data['收入'].fillna(data['收入'].mean())print("\n均值填充后的数据:")
print(data)

输出结果:

原始数据:年龄       收入
0  25.0  50000.0
1  30.0  70000.0
2   NaN  80000.0
3  35.0      NaN
4  40.0  110000.0均值填充后的数据:年龄       收入
0  25.0   50000.0
1  30.0   70000.0
2  32.5   80000.0
3  35.0   77500.0
4  40.0  110000.0
1.1.2 使用SimpleImputer类提供了用于估算缺失值的基本策略

示例代码

import numpy as np
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='mean') 
imp.fit([[1, 2], [np.nan, 3], [7, 6]])  #fit表示训练,X表示训练数据集
X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X)) #transform表示转换,X表示待转换数据集

输出结果:

[[4.         2.        ][6.         3.66666667][7.         6.        ]]
1.2 直接去掉

缺失值占总数据量的比例较小时,可以选择直接删除含缺失值的行或列。

示例代码
import pandas as pd
import numpy as np# 创建示例数据
data = pd.DataFrame({'年龄': [25, 30, np.nan, 35, 40],'收入': [50000, 70000, 80000, np.nan, 110000]
})
# 删除含缺失值的行
data_dropna = data.dropna()
print("\n删除缺失值后的数据:")
print(data_dropna)

输出结果:

删除缺失值后的数据:年龄        收入
0  25.0   50000.0
1  30.0   70000.0
4  40.0  110000.0

2. 数据不一致问题

数据不一致是指数据集中存在相互矛盾或不符合逻辑的信息。例如,年龄和出生日期不一致,可能导致分析结果不准确。

2.1 生日和年龄不一致

可以定义一个映射函数,根据生日计算年龄,然后用该函数遍历整个数据集,并对不一致的数据进行修改或替换。

示例代码
  • 定义一个函数用于计算实际年龄,将字符串的生日转换为datetime的日期对象datetime.strptime(birthdate, "%d/%m/%Y"),再与当前日期datetime.now()进行比较,计算实际年龄。
def calculate_age(birthdate, reference_date=None):# 将字符串的生日转换为 datetime 对象birthdate = datetime.strptime(birthdate, "%d/%m/%Y")# 如果没有提供参考日期,则使用当前日期if reference_date is None:reference_date = datetime.now()# 计算年龄age = reference_date.year - birthdate.year - ((reference_date.month, reference_date.day) < (birthdate.month, birthdate.day))return age
  • 定义映射函数,检查年龄是否匹配,不匹配则用计算的年龄替换。
def correct_age(row):calculated_age = calculate_age(row['Birthdate'])# 如果年龄与生日计算的不一致,则用计算的年龄替换if row['Age'] != calculated_age:return calculated_agereturn row['Age']
  • 遍历整个数据集,并对不一致的数据进行修改或替换。示例代码:
import pandas as pd
from datetime import datetime# 假设数据是这样的一部分
data = pd.DataFrame({'Age': [42, 30, 25, 40],'Birthdate': ['03/07/1997', '01/01/1993', '06/12/1998', '04/05/1983']
})
print('原始数据:\n', data)# 定义一个函数计算实际年龄
def calculate_age(birthdate, reference_date=None):# 将字符串的生日转换为 datetime 对象birthdate = datetime.strptime(birthdate, "%d/%m/%Y")# 如果没有提供参考日期,则使用当前日期if reference_date is None:reference_date = datetime.now()# 计算年龄age = reference_date.year - birthdate.year - ((reference_date.month, reference_date.day) < (birthdate.month, birthdate.day))return age# 定义映射函数,检查年龄是否匹配,不匹配则用计算的年龄替换
def correct_age(row):calculated_age = calculate_age(row['Birthdate'])# 如果年龄与生日计算的不一致,则用计算的年龄替换if row['Age'] != calculated_age:return calculated_agereturn row['Age']# 应用函数修改数据
# apply 方法:对 DataFrame 的每一行应用 correct_age 函数进行处理
data['Age'] = data.apply(correct_age, axis=1)print('修正后数据:\n', data)

输出结果:

原始数据:Age   Birthdate
0   42  03/07/1997
1   30  01/01/1993
2   25  06/12/1998
3   40  04/05/1983
修正后数据:Age   Birthdate
0   27  03/07/1997
1   31  01/01/1993
2   25  06/12/1998
3   41  04/05/1983

3. 噪声处理

在数据处理过程中,噪声数据指的是那些偏离正常模式的数据点,这些数据点可能是由于输入错误、传感器故障或极端的异常值。常见的处理方法有如统计检测异常值、根据业务规则过滤、离群点删除等。

3.1 自定义临界点

对于某些特征,可以设置合理的上限值,超出该值的记录被认为是噪声。

示例代码

import pandas as pd
import numpy as np# 创建一个包含噪声的示例数据集
data = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],'Salary': [50000, 60000, 70000, 2000000, 65000]  # David 的工资是噪声数据
})print("原始数据:")
print(data)# 假设合理的工资范围是 0 到 100000,我们可以根据这个阈值去掉噪声数据
salary_threshold = 100000
data_cleaned = data[data['Salary'] <= salary_threshold]print("\n清除噪声后的数据:")
print(data_cleaned)

输出结果:

原始数据:Name   Salary
0    Alice    50000
1      Bob    60000
2  Charlie    70000
3    David  2000000
4      Eve    65000清除噪声后的数据:Name  Salary
0    Alice   50000
1      Bob   60000
2  Charlie   70000
4      Eve   65000
3.2 离群点删除

离群点是指在数据集中与其他数据点差距较大的值,它们可能对统计分析和模型构建产生不利影响。可以使用z-score方法或IQR方法来检测离群点,并将其删除。

IQR方法

IQR(Interquartile Range)方法是基于四分位数来判断离群点。计算上四分位数(Q3)和下四分位数(Q1),并通过 IQR(Q3 - Q1)来定义上下限。
在这里插入图片描述

示例代码

import pandas as pd
import numpy as np# 创建一个包含噪声的示例数据集
data = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],'Salary': [50000, 60000, 70000, 2000000, 65000]  # David 的工资是噪声数据
})print("原始数据:")
print(data)# 计算四分位数
Q1 = data['Salary'].quantile(0.25)
Q3 = data['Salary'].quantile(0.75)
IQR = Q3 - Q1# 定义上下限(通常用 1.5 倍 IQR)
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR# 过滤掉异常值
data_cleaned_stat = data[(data['Salary'] >= lower_bound) & (data['Salary'] <= upper_bound)]print("\n基于 IQR 清除噪声后的数据:")
print(data_cleaned_stat)

输出结果:

原始数据:Name   Salary
0    Alice    50000
1      Bob    60000
2  Charlie    70000
3    David  2000000
4      Eve    65000基于 IQR 清除噪声后的数据:Name  Salary
0    Alice   50000
1      Bob   60000
2  Charlie   70000
4      Eve   65000

总结

数据清理是数据预处理的核心步骤,它能够显著提高数据的质量。通过处理缺失值、解决数据不一致问题和清理噪声数据,可以为后续的分析和建模奠定坚实的基础。希望这篇文章能帮助大家掌握数据清理的基本概念和实用技巧,提升数据处理能力。

如有任何问题或讨论,欢迎留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460554.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

isp框架代码理解

一、整体框架如下&#xff1a; 1 外层的src中 1.1 从camera.c->task.c&#xff1a;封装了3层&#xff0c;透传到某个功能的本级。 1.2 core.c和capability.c中实现&#xff1a;开机初始化加载参数。2. plat/src中 2.1 fun.c中继task.c又透传了一层&#xff1b;以及最后功能…

状态机模型

文章目录 一、大盗阿福二、股票买卖 IV三、股票买卖 V四、设计密码4.1kmp题目4.2设计密码 一、大盗阿福 题目链接 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N 1e5 10; int f[N][2]; int main() {int…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划&#xff1a; 资源准备 虚拟机软件&#xff1a;就别自己找了 现在换网站了 下载比较费劲 Centos8&#xff1a; 阿里云镜像地址下载&#xff08;下载比较版 但是有不同版本&#xff09;&#xff1a;centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

如何在Linux系统中使用Zabbix进行监控

如何在Linux系统中使用Zabbix进行监控 Zabbix简介 安装Zabbix 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 配置Zabbix数据库 创建数据库 导入数据库 配置Zabbix服务器 访问Zabbix Web界面 完成初始配置 配置Zabbix Agent 安装Agent 配置Agent 添加主机到Zabbix 创…

uniapp编译多端项目App、小程序,input框键盘输入后

项目场景&#xff1a; uniapp编译后的小程序端&#xff0c;app端 在一个输入框 输入消息后&#xff0c;点击键盘上的操作按钮之后键盘不被收起&#xff0c;点击其他发送按钮时&#xff0c;键盘也不被收起。 问题描述 在编译后的app上普通的事件绑定&#xff0c;tap,click在发…

代码随想录day15 二叉树(3)

文章目录 day11 栈与队列(2)栈与队列的总结 day13 二叉树&#xff08;1&#xff09;day14 二叉树&#xff08;2&#xff09;day15 二叉树&#xff08;3&#xff09; day11 栈与队列(2) 逆波兰表达式求值 https://leetcode.cn/problems/evaluate-reverse-polish-notation/ 逆…

【C#】搭建环境之CSharp+OpenCV

在我们使用C#编程中&#xff0c;对图片处理时会用到OpenCV库&#xff0c;以及其他视觉厂商提供的封装库&#xff0c;这里因为OpenCV是开源库&#xff0c;所以在VS资源里可以直接安装使用&#xff0c;这里简单说明一下搭建的步骤及实现效果&#xff0c;留存。 1. 项目创建 1.1…

环形运输距离Conveyor Belts

Conveyor Belts 题面翻译 传送带 题目描述 传送带 $ m_n $ 是一个大小为 $ n \times n $ 的矩阵&#xff0c;其中 $ n $ 是一个偶数。矩阵由顺时针移动的同心带组成。 换句话说&#xff0c;当 n 2 n2 n2 时&#xff0c;传送带矩阵就是一个 2 2 2 \times 2 22 的矩阵&a…

ffmpeg视频滤镜:添加边框-drawbox

滤镜介绍 drawbox 官网链接 > FFmpeg Filters Documentation 这个滤镜会给视频添加一个边框。 滤镜使用 参数 x <string> ..FV.....T. set horizontal position of the left box edge (default "0")y <string&…

CPU算法分析LiteAIServer视频智能分析平台噪声检测功能在视频监控中的应用与优势

在视频监控系统中&#xff0c;噪声问题一直是影响视频画面清晰度和可用性的关键因素。这些噪声可能源于多种因素&#xff0c;如低光环境、摄像机传感器的高灵敏度或编码压缩过程中的失真等。为了应对这些挑战&#xff0c;CPU算法分析LiteAIServer引入了噪声检测功能&#xff0c…

HTB:BoardLight[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on BoardLight? 2.What is the domain name used by the box? 3.What is the name of the application running on a virtual host of board.htb? 4.What version of Dolibarr is running on Board…

mysql 5.7实现组内排序(连续xx天数)

需求&#xff1a;查询出连续登录的用户及其连续登录的天数 我先说一下思路&#xff1a;要实现连续登录的判断&#xff0c;可以找一下他们之间的规律。这里我拿一个用户来说&#xff0c;如果这个用户在1、2、3号都有登录记录&#xff0c;可以对这个用户的数据按照时间排序&…

★ Linux ★ 基础开发工具的使用(上)

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起学习 linux 基础开发工具的使用~ 目录 壹 Linux编辑器 - vim使用 1.1 vim的基本概念 1.2 vim正常模式命令集 1.2.1 插入模式 1.2.2 移动光标命令 1.2.3 编辑命令 1.3 vim末行模式命令集 贰 Lin…

solidworks学习6吊环-20241030

solidworks学习6吊环 图 1 使用到的命名&#xff1a;拉伸曲面&#xff0c;旋转曲面&#xff0c;镜像实体&#xff0c;剪裁曲面&#xff0c; 前视基准面绘制 图 2 绘制旋转轴 图 3 旋转曲面 图 4 上视基准面绘制&#xff0c;标准圆边尺寸的时候需要按住shift键标注&#x…

提示词高级阶段学习day4.1

第一步&#xff1a;你要有一个大模型帐号&#xff0c;至少已经熟悉和它们对话的方式。最强性能当属ChatGPT4&#xff0c;当然也推荐国产平替&#xff1a; Kimi.ai - 帮你看更大的世界 智谱清言 第二步&#xff1a;看 OpenAI 的官方文档&#xff1a; 目录&#xff1a;OpenAI …

开源趣味艺术画板Paint Board

什么是 Paint Board &#xff1f; Paint Board 是简洁易用的 Web 端创意画板。它集成了多种创意画笔和绘画功能&#xff0c;支持形状绘制、橡皮擦、自定义画板等操作&#xff0c;并可以将作品保存为图片。 软件功能&#xff1a; 不过非常可惜&#xff0c;老苏最期待的数据同步还…

建设NFS服务器并实现文件共享

关闭防火墙和s0 systemctl stop firewalld setenforce 0 安装NFS yum install nfs-utils -y 新建共享目录并设置权限 echo "hello" > /nfs/shared/test1 chmod -Rf 777 /nfs/shared/ 配置服务端的NFS配置文件 vim /etc/exports /nfs/shared *(ro) 启动…

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

python通过keyboard库实现模拟/监听键盘

keyboard介绍 如果我们想要通过快捷键&#xff0c;来调用某段代码&#xff0c;我们可以使用python的keyboard库&#xff0c;这个库可以用于发送&#xff0c;挂钩&#xff0c;以及模拟键盘事件等&#xff0c;并且同时支持多种操作系统&#xff08;但是需要注意的是&#xff0c;…