解密数据清洗,SQL中的数据分析

大家好,数据库表中的数据经常会很杂乱。数据可能包含缺失值、重复记录、异常值、不一致的数据输入等,在使用SQL进行分析之前清洗数据是非常重要的。

当学习SQL时,可以随意地创建数据库表,更改它们,根据需要更新和删除记录。但在实际操作中,几乎从不会这样,因为可能没有权限更改表、更新和删除记录。但如果有数据库的读取权限,可以运行大量的SELECT查询。

本文将创建一个数据库表,在其中填充记录,并了解如何使用SQL清洗数据。

创建一个名为employees的员工表,如下所示:

-- 创建employees表
CREATE TABLE employees (employee_id INT PRIMARY KEY,employee_name VARCHAR(50),salary DECIMAL(10, 2),hire_date VARCHAR(20),department VARCHAR(50)
);

接下来,向表中插入一些虚构的样本记录:

-- 插入20个样本记录
INSERT INTO employees (employee_id, employee_name, salary, hire_date, department) VALUES
(1, 'Amy West', 60000.00, '2021-01-15', 'HR'),
(2, 'Ivy Lee', 75000.50, '2020-05-22', 'Sales'),
(3, 'joe smith', 80000.75, '2019-08-10', 'Marketing'), 
(4, 'John White', 90000.00, '2020-11-05', 'Finance'),
(5, 'Jane Hill', 55000.25, '2022-02-28', 'IT'),
(6, 'Dave West', 72000.00, '2020-03-12', 'Marketing'),
(7, 'Fanny Lee', 85000.50, '2018-06-25', 'Sales'),
(8, 'Amy Smith', 95000.25, '2019-11-30', 'Finance'),
(9, 'Ivy Hill', 62000.75, '2021-07-18', 'IT'),
(10, 'Joe White', 78000.00, '2022-04-05', 'Marketing'),
(11, 'John Lee', 68000.50, '2018-12-10', 'HR'),
(12, 'Jane West', 89000.25, '2017-09-15', 'Sales'),
(13, 'Dave Smith', 60000.75, '2022-01-08', NULL),
(14, 'Fanny White', 72000.00, '2019-04-22', 'IT'),
(15, 'Amy Hill', 84000.50, '2020-08-17', 'Marketing'),
(16, 'Ivy West', 92000.25, '2021-02-03', 'Finance'),
(17, 'Joe Lee', 58000.75, '2018-05-28', 'IT'),
(18, 'John Smith', 77000.00, '2019-10-10', 'HR'),
(19, 'Jane Hill', 81000.50, '2022-03-15', 'Sales'),
(20, 'Dave White', 70000.25, '2017-12-20', 'Marketing');

这里使用了一小部分名字和姓氏作为样本,并为记录构建了姓名字段。

注意:本教程中的所有查询都是针对MySQL的,但可以自由选择使用喜欢的关系型数据库管理系统(RDBMS)。

1. 缺失值

数据记录中的缺失值总是一个问题,因此必须对其进行相应的处理。

一种简单的方法是删除包含一个或多个字段缺失值的所有记录。然而,除非确定没有其他更好的处理缺失值的方法,否则不应该这样做。

employees表中,可以看到department列中有一个NULL值(参见employee_id13的行),表示该字段缺失:

SELECT * FROM employees;

图片

可以使用COALESCE()函数将NULL值替换为Unknown字符串:

SELECTemployee_id,employee_name,salary,hire_date,COALESCE(department, 'Unknown') AS department
FROM employees;

运行上述查询应该会给出以下结果:

图片

2. 重复记录

数据库表中的重复记录可能会扭曲分析结果。在数据库表中选择了employee_id作为主键,因此在employee_data表中不会有重复的员工记录。

仍然可以使用SELECT DISTINCT语句:

SELECT DISTINCT * FROM employees;

如预期所示,结果集包含了所有的20条记录:

图片

3. 数据类型转换

可以注意到,hire_date列目前是VARCHAR类型,而不是日期类型。为了在处理日期时更方便,使用STR_TO_DATE()函数,如下所示:

SELECTemployee_id,employee_name,salary,STR_TO_DATE(hire_date, '%Y-%m-%d') AS hire_date,department
FROM employees;

在这里只选择了hire_date列,而没有对日期值执行任何操作。因此,查询的输出结果应与前一个查询的结果相同。

如果想执行诸如给值添加偏移日期之类的操作,那么该函数可能会有所帮助。

4. 异常值

一个或多个数值字段中的异常值可能会影响分析结果,因此应该检查并清除异常值,以过滤掉不相关的数据。判断哪些值构成异常值需要领域知识,还需要利用领域知识和历史数据。

假设知道salary列的上限为100000,因此,salary列中的任何条目最多只能是100000,而大于此值的条目则是异常值。

可以通过运行以下查询来检查这样的记录:

SELECT *
FROM employees
WHERE salary > 100000;

如图所示,salary列中的所有条目都是有效的。因此结果集为空:

图片

5. 数据输入不一致

数据输入和格式不一致的情况很常见,尤其是在日期和字符串列中。

employees表中,可以看到员工joe smith对应的记录不是以标题大小写形式显示的。

但是,为了保持一致性,选择所有以标题大小写格式显示的姓名。需要将CONCAT()函数与UPPER()SUBSTRING()函数结合使用,如下所示:

SELECTemployee_id,CONCAT(UPPER(SUBSTRING(employee_name, 1, 1)), -- Capitalize the first letter of the first nameLOWER(SUBSTRING(employee_name, 2, LOCATE(' ', employee_name) - 2)), -- Make the rest of the first name lowercase' ',UPPER(SUBSTRING(employee_name, LOCATE(' ', employee_name) + 1, 1)), -- Capitalize the first letter of the last nameLOWER(SUBSTRING(employee_name, LOCATE(' ', employee_name) + 2)) -- Make the rest of the last name lowercase) AS employee_name_title_case,salary,hire_date,department
FROM employees;

图片

6. 验证范围

在谈论异常值时,希望对salary列设置上限为100000,并将任何超过100000的薪资条目视为异常值。但同样也不能在salary列中有任何负值。因此,可以运行以下查询来验证所有员工记录的salary列值是否都在0和100000之间:

SELECTemployee_id,employee_name,salary,hire_date,department
FROM employees
WHERE salary < 0 OR salary > 100000;

如图所示,salary列值都在0和100000之间。因此结果集为空:

图片

7. 派生新列

派生新列本质上并不是数据清洗的步骤。在实际操作中,可能需要使用现有列派生出对分析更有帮助的新列。

例如,员工表包含一个hire_date列。更有帮助的字段可能是一个years_of_service列,表示员工在公司任职的年限。

以下查询会计算当前年份与hire_date中年份值的差值,从而计算出years_of_service

SELECTemployee_id,employee_name,salary,hire_date,department,YEAR(CURDATE()) - YEAR(hire_date) AS years_of_service
FROM employees;

应该会看到以下输出:

图片

与我们运行的其他查询一样,这不会修改原始表。要向原始表中添加新列,需要拥有ALTER数据库表的权限。

综上,希望大家理解相关的数据清洗任务如何提高数据质量并促进更相关的分析,同时学习如何检查缺失值、重复记录、不一致的格式、异常值等。可以尝试创建自己的关系型数据库表,并运行一些查询来执行常见的数据清洗任务。

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

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

相关文章

Ruff应用:打破传统,IoT技术赋能工业制造数字化转型之路

近年来&#xff0c;随着物联网、大数据、云计算、5G等数字技术的快速应用&#xff0c;工业制造领域正在经历着前所未有的变革。工业4.0时代&#xff0c;各种数字技术与工业制造的结合&#xff0c;不仅提高了工业生产效率、降低运营成本&#xff0c;更是极大地推动了传统工业数字…

HP Pavilion Gaming Laptop 15-cx0069tx,15-cx0075tx原厂Win10系统,恢复出厂OEM预装系统镜像

hp惠普光影精灵4笔记本电脑原装Windows10系统包 适用型号&#xff1a; 15-cx0052tx&#xff0c;15-cx0054tx&#xff0c;15-cx0058tx&#xff0c;15-cx0059tx&#xff0c;15-cx0065tx&#xff0c;15-cx0071tx&#xff0c;15-cx0074tx&#xff0c;15-cx0075tx等 链接&#xf…

React通用后台模板

一. 项目初始化 1. 创建项目 环境 npm init vite 打开package.json,参考以下各模块版本: "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^7.2.8", …

软件价值3-A*算法寻路

A*算法&#xff08;A-star算法&#xff09;是一种启发式搜索算法&#xff0c;主要用于在图或网络中找到从起始节点到目标节点的最佳路径。它结合了Dijkstra算法的广度优先搜索和贪婪最优优先搜索的特点&#xff0c;通过估算从起始节点到目标节点的代价来指导搜索方向。 A*算法…

【Go】微服务架构下实现etcd服务注册与服务发现

中心网关&#xff1a;gateway 四个微服务&#xff1a;user、message、note、relationship 1 中心网关实现服务发现 1.1 设计EtcdDiscovery类 package entityimport ("context""fmt"clientv3 "go.etcd.io/etcd/client/v3""gonote/gatewa…

redis复习笔记05(小滴课堂)

案例实战之注册登录-图形验证码谷歌开源Kaptcha引入 验证码配置工具类。 验证码存储Redis逻辑编码实战 工具类用于获取本机ip和md5加密&#xff0c;直接使用就行&#xff0c;我们这里主要是学习redis不是学习这个。 获取验证码并存到redis中的接口&#xff1a; 运行测试&…

重写Sylar基于协程的服务器(1、日志模块的架构)

重写Sylar基于协程的服务器&#xff08;1、日志模块的架构&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

STM32F407移植OpenHarmony笔记3

接上一篇&#xff0c;搭建完环境&#xff0c;找个DEMO能跑&#xff0c;现在我准备尝试从0开始搬砖。 首先把/device和/vendor之前的代码全删除&#xff0c;这个时候用hb set命令看不到任何项目了。 /device目录是硬件设备目录&#xff0c;包括soc芯片厂商和board板级支持代码…

Leetcode—1570. 两个稀疏向量的点积【中等】Plus

2024每日刷题&#xff08;一零四&#xff09; Leetcode—1570. 两个稀疏向量的点积 实现代码 class SparseVector { public:SparseVector(vector<int> &nums) {for(int i 0; i < nums.size(); i) {if(nums[i]) {indexNum[i] nums[i];}}}// Return the dotProd…

机器学习复习(3)——分类神经网络与drop out

完整的神经网络 以分类任务为例&#xff0c;神经网络一般包括backbone和head&#xff08;计算机视觉领域&#xff09; 下面的BasicBlock不是一个标准的backbone,标准的应该是复杂的CNNs构成的 Classfier是一个标准的head,其中output_dim表示分类类别&#xff0c;一般写作num…

【数据结构】链表(单链表实现+测试+原码)

1.链表 1.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 现实中&#xff1a;链表就像是一列动车&#xff0c;一节连着一节 数据结构中的链表 注意: 1.从上图可看出…

ElementUI Form:Radio 单选框

Radio 单选框 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue 页面效果图 项目里el-radio.vue代码 <script> export default {name: el_radio,data() {return {radio: 1,radio2: 2,radio3: 3,radio4: 上海,radio5: 上海,radio6: 上海,radio7: 上海,r…