解密数据清洗,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.rhkb.cn/news/250766.html

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

相关文章

#从零开始# 在深度学习环境中,如何用 pycharm配置使用 pipenv 虚拟环境

为Python项目创建虚拟环境 在深度学习环境和一般python环境中安装pipenv基本一致&#xff0c;只需要确认好pipenv指定的python版本即可,安装pipenv前&#xff0c;可以通过python --version来确认安装版本 快捷键&#xff1a;crtl alt S 查看interpreter&#xff0c;查看所有…

深度学习入门笔记(七)卷积神经网络CNN

我们先来总结一下人类识别物体的方法: 定位。这一步对于人眼来说是一个很自然的过程,因为当你去识别图标的时候,你就已经把你的目光放在了图标上。虽然这个行为不是很难,但是很重要。看线条。有没有文字,形状是方的圆的,还是长的短的等等。看细节。纹理、颜色、方向等。卷…

C#代码添加脚本头

目录 前言 代码展示 前言 创建脚本的时候添加脚本的介绍 代码展示 using System.IO;/// <summary> /// 创建脚本自动添加头注 /// </summary> public class CommentFirst : UnityEditor.AssetModificationProcessor {/// <summary>/// 在资源创建生成.me…

JProfiler for Mac:提升性能和诊断问题的终极工具

在当今的高性能计算和多线程应用中&#xff0c;性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具&#xff0c;旨在帮助开发者更好地理解其应用程序的运行情况&#xff0c;提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括&#xff1a;…

小白Linux学习笔记-Vim 编辑器

Vim 编辑器 文章目录 Vim 编辑器Vim 简介Vim - 难以驾驭的神器Vim 入门帮助Vim 模式介绍正常模式命令模式插入模式 Vim 实例Vim 第一步首次运行 Vim插入文本移动光标删除字符其它编辑命令退出光标的指定移动简单搜索复制粘贴替换字符 Vim 的保护机制 Vim 编辑器课后作业 Vim 简…

【劳德巴赫 Trace32 高阶系列 3 -- trace32 svf 文件操作命令】

请阅读【嵌入式开发学习必备专栏 之 Trace32 系列 】 文章目录 Trace32 SVF 文件操作命令JTAG.PROGRAM.autoJTAG.PROGRAM.SVF命令参数介绍IRPREIRPOSTDRPREDRPOSTInitStateIgnoreTDOVerbose使用示例Trace32 SVF 文件操作命令 JTAG.PROGRAM.auto Format: JTAG.PROGRAM.</

[office] excel表格怎么绘制股票的CCI指标- #媒体#学习方法#笔记

excel表格怎么绘制股票的CCI指标? excel表格怎么绘制股票的CCI指标&#xff1f;excel表格中想要绘制一个股票cci指标&#xff0c;该怎么绘制呢&#xff1f;下面我们就来看看详细的教程&#xff0c;需要的朋友可以参考下 CCI指标是一种在股票&#xff0c;贵金属&#xff0c;货…

Django4.2(DRF)+Vue3 读写分离项目部署上线

文章目录 1 前端2 后端2.1 修改 settings.py 文件关于静态文件2.2 关于用户上传的文件图片 3 Nginx4 镜像制作4.1 nginx4.3 Django镜像4.3.1 构建 5 docker-compose 文件内容 1 前端 进入前端项目的根目录&#xff0c;运行如下命令进行构建 npm run build构建完成后&#xff…

计算机硬件基础知识

mos管 电阻 电容 MOS管的功能&#xff1a; 开关功能&#xff1a;MOS管可以用作开关&#xff0c;通过控制栅极电压来控制电流的通断。当栅极电压为高电平时&#xff0c;MOS管导通&#xff0c;允许电流通过&#xff1b;当栅极电压为低电平时&#xff0c;MOS管截止&#xff0c;阻止…

IP地址查询网络威胁:解析威胁、防范攻击

随着互联网的不断普及和发展&#xff0c;网络威胁也愈发严峻。对IP地址进行查询以解析网络威胁&#xff0c;成为网络安全领域一项重要的工作。本文将深入探讨IP地址查询网络威胁的原理、应用场景、防范策略以及未来的发展方向。 IP地址查询网络威胁原理 IP地址查询IP数据云 -…

正点原子--STM32定时器学习笔记(1)

这部分是笔者对基本定时器的理论知识进行学习与总结&#xff01;&#xff0c;主要记录自己在学习过程中遇到的重难点&#xff0c;其他一些基础点就一笔带过了&#xff01; 1. 定时器概述 1.1 软件定时原理 使用纯软件&#xff08;CPU死等&#xff09;的方式实现定时&#xf…

【linux】校招中的“熟悉linux操作系统”一般是指达到什么程度?

这样&#xff0c;你先在网上找一套完整openssh升级方案&#xff08;不是yum或apt的&#xff0c;要源码安装的&#xff09;&#xff0c;然后在虚拟机上反复安装测试&#xff0c;直到把他理解了、背下来。 面试的时候让你简单说说linux命令什么的&#xff0c;你就直接把这个方案…

PSQL常用操作

目录 前言 准备工作 添加postgres用户 初始化数据库 启动服务 创建数据库 psql连接数据库 常规操作 数据库 schema相关 插件 其他 前言 老折腾&#xff0c;还是记录点啥吧...... 基于本地PG数据库(打包为绿色版本了)&#xff0c;实操记录&#xff0c;版本pgsql12…

TanDEM-X30米DEM数据介绍

一、背景 之前介绍了Copernicus 30米DEM以及Alos 30米DEM数据的详细介绍以及接入到Cesium中的效果展示&#xff0c;有遥感专业工作者对比了Copernnicus、ALOA、ASTER、NASA、SRTM这几家30米DEM数据&#xff0c;得出了Copernicus 30米DEM数据是最好的全球级30米DEM数据&#xf…

给大家分好类!看下C++ STL标准模板库,有哪些模板容器类?

C STL&#xff08;Standard Template Library&#xff09;标准模板库&#xff0c;提供了多种容器&#xff0c;这些容器可用于存储和操作数据。 本文对一些常见的 C STL 容器做个简单分类&#xff0c;方便大家根据不同项目需要进行选择使用。 01 序列容器&#xff1a; std::v…

万户 ezOFFICE DocumentEditExcel.jsp SQL注入漏洞

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

华为机考入门python3--(7)牛客7-取近似值

分类&#xff1a;数字 知识点&#xff1a; str转float float(str) 向上取整 math.ceil(float_num) 向下取整 math.floor(float_num) 题目来自【牛客】 import math def round_to_int(float_num): # 如果小数点后的数值大于等于0.5&#xff0c;则向上取整&#xf…

maven helper 解决jar包冲突方法

一 概要说明 1.1 说明 首先&#xff0c;解决idea中jar包冲突&#xff0c;使用maven的插件&#xff1a;maven helper插件&#xff0c;它能够给我们罗列出来同一个jar包的不同版本&#xff0c;以及他们的来源&#xff0c;但是对不同jar包中同名的类没有办法。 1.2 依赖顺序 …

【八大排序】冒泡排序 | 快速排序 + 图文详解!!

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 交换排序一、冒泡排序1.1 算法步骤 动图演示1.2 冒泡排序的效率分析1.3 代码实现1.4 …

图片热区功能

一、需求描述及效果图 1.需求描述&#xff1a; 根据后端返回的坐标及人员信息&#xff0c;在图片上的相应位置添加图片热区功能&#xff0c;点击可展示出对应的人员信息。 图片可进行缩放 2.示例&#xff1a; &#xff08;定位是随便写的&#xff0c;仅做示例&#xff09; …