2021-09-10

标题 《数据清洗》学习笔记

第一章 数据清晰概述

前言

简单认识数据清洗的背景、定义、原理、基本流程、清洗策略以及常见的数据清洗方法。

以下是本篇文章正文内容。

1.1 数据清洗的背景

     当今时代,企业信息化的要求越来越迫切。对于企业的决策者来说,正所谓“垃圾进垃圾出(garbage in,garbage out)”如果作为决策支持的数据仓库存放的数据质量达不到要求将直接导致数据分析和数据挖掘不能产生理想的结果,甚至还会产生错误的分析结果,从而误导决策。因此,我们需要对数据仓库中的数据进行相关清洗操作,得出可靠、可准确反映企业实际情况的数据,用以支持企业战略决策。由此可见,数据质量在企业战略决策中占据着重要的地位。本节将讲解数据质量概述、数据质量的评价指标以及数据质量的问题分类。

1.1.1 数据质量概述

显著特点:
“业务需求”会随时间变化,数据质量也会随时间发生变化。
数据质量可以借助信息系统度量,但独立于信息系统存在。
数据质量存在于数据的整个生命周期,随着数据的产生而产生,随着数据的消失而消失。

1.1.2 数据质量的评价指标

  数据质量的评价指标主要包括数据的准确性(accuracy)、完整性(completeness)、简洁性(concision)及适用性(applicability),其中数据
的完整性、准确性和简洁性是为了保证数据的适用性。下面进行详细的介绍:
1、准确性
  数据的准确性就是要求数据中的噪音尽可能少。
2、完整性
  完整性指的是数据信息是否存在缺失的状况。数据缺失的情况可能是整条数据记录缺失,也可能是数据中某个字段信息的记录缺失。不完整的数据所能借鉴的
价值会大大降低,也是数据质量更为基础的一项评估标准。
  3、简洁性
  简洁性就是要将尽量选择重要的本质属性,并消除冗余。
  4、适用性
    适用性是评价数据质量的重要标准。从数据的实际效用上讲,适用性才是评价数据质量的核心标准。

1.1.3 数据质量的问题分类

数据质量的问题可以分为两类:一类是基于数据源的“脏”数据分类;另一类是基于清  洗方式的“脏”数据分类。下面分别针对基于数据源的“脏”数据分类和基于清洗方式的“脏”  数据分类进行详细讲解。

1.基于数据源的“脏”数据分类
通常情况下,将数据源中不完整、重复以及错误等有问题的数据称为“脏”数据。由于数 据仓库的数据来自底层数据源,因此“脏”数据出现的原因与数据源有密切的关系。基于数 据源的“脏”数据分类,如图1-1所示。
请添加图片描述
2、基于清洗方式的“脏”数据分类
基于数据源的“脏”数据分类方法需要为每种类型的“脏”数据设计单独的清洗方式。从数据清洗方式的设计者角度看,可以将“脏”数据分为“独立型“脏”数据”和“依赖型“脏”数据”两类。基于清洗方式的“脏”数据分类如图1-2所示。
请添加图片描述

1.2数据清洗的定义

数据清洗技术是提高数据质量的有效方法。这项技术是一个较新的研究领域,对大数据集的清洗工作需要花费很长的时间。由于不同的应用领域对数据清洗有不同的解释,因此数据清洗直到现在都没有一个公认、统一的定义。数据清洗主要应用于3个领域,即数据 仓库领域、数据挖掘领域以及数据质量管理领域。
1.3数据清洗的原理

数据清洗是利用相关技术将“脏”数据转换为满足质量要求的数据。
需要注意的是,数据清洗的目的是解决“脏”数据问题,即不是将“脏”数据洗掉,而是将“脏”数据洗干净。干净的数据指的是满足质量要求的数据。

1.4 数据清洗的基本流程
数据清洗的基本流程一共分为五个步骤,分别是数据分析,定义数据清洗的策略和规则、搜寻并确定错误实例、纠正发现的错误以及干净数据回流。具体如图1-4所示。
请添加图片描述

1.5数据清洗的策略
在数据仓库环境中,数据清洗可以在不同阶段实现,并且存在不同的清洗策略,目前数据清洗的策略主要分为一般的数据清洗的策略和混合的数据清洗策略。下面针对数据有优的两种策略进行讲解。
1.一般的数据清洗策略

  按照数据清洗的实现方式与范围划分,一般分为手工清洗策略、自动清洗策略、特定应用领域的清洗策略以及与特定应用领域无关的清洗策略,这4种清洗策略的具体介绍如下。
  手工清洗策略,即通过人工直接修改“脏”数据。
  自动清洗策略,即通过编写专门的应用程序检测并修改“脏”数据。
  特定应用领域的清洗策略,即根据概率统计学原理检测并修改数值异常的记录。
  与特定应用领域无关的清洗策略,即根据相关算法检测并删除重复记录。

2.混合的数据清洗策略

混合的数据清洗策略主要以自动清洗为主。

1.6常见的数据清洗方法

常见的数据质量问题主要包括缺失值、重复值以及错误值等问题。

1、缺失值的清洗
缺失值的清洗主要分为两类,及忽略缺失值数据和填充缺失值数据。
(1)忽略缺失值数据方法是直接通过删除属性或实例忽略缺失值的数据。
(2)填充缺失值数据方法是使用最接近缺失值的值替代缺失的值,包括人工填写缺失值,使用一个全局常量填充空缺值(即将缺失的值用同一个常量Unknown替换)以及使用属性的平均值、中间值、最大(小)值填充缺失值,或使用最可能的值(即通过回归、贝叶斯形式化方法的工具或决策树归纳确定的值)填充缺失值。
2.重复值的清洗
目前清洗重复值的基本思想是“排序和合并”。清洗重复值的方法主要有相似度计算和基于基本近邻排序算法等方法。
(1)相似度计算是通过计算记录的个别属性的相似度,然后考虑每个属性的不同权重值,进行加权平均后得到记录的相似度,若两个记录相似度超过某一个阈值,则认为两条记录匹配,否则认为这两条记录指向不同的实体。
(2)基于基本近邻排序算法的核心思想是为了减少记录的比较次数,在按关键字排序后的数据集上移动一个大小固定的窗口,通过检测窗口内的记录判定它们是否相似,从而确定并处理重复记录。
3,错误值的清洗
错误值的清洗方法主要包括使用统计分析的方法识别可能的错误值(如偏差分析、识别不遵守分布或回归方程的值)、使用简单规则库(即常识性规则、业务特定规则等)检测出错误值、使用不同属性间的约束以及使用外部的数据等方法检测和处理错误值。

以上内容均节选自黑马程序员编著的《数据清洗》

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
这里是使用 Python 的 PyMySQL 完成上述任务的代码: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='test') # 创建游标 cur = conn.cursor() # 创建 users 表 cur.execute(''' CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(20), age INT ) ''') # 创建 orders 表 cur.execute(''' CREATE TABLE orders ( id INT PRIMARY KEY, order_date DATE, amount INT, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ) ''') # 插入数据 users_data = [ (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28) ] orders_data = [ (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4) ] for user in users_data: cur.execute('INSERT INTO users VALUES (%s, %s, %s)', user) for order in orders_data: cur.execute('INSERT INTO orders VALUES (%s, %s, %s, %s)', order) # 提交事务 conn.commit() # 查询语句 # 1. 查询订单总金额 cur.execute('SELECT SUM(amount) FROM orders') print(cur.fetchone()[0]) # 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 cur.execute('SELECT ROUND(AVG(age), 2) FROM users') print(cur.fetchone()[0]) # 3. 查询订单总数最多的用户的姓名和订单总数。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_orders DESC LIMIT 1 ''') print(cur.fetchone()) # 4. 查询所有不重复的年龄。 cur.execute('SELECT DISTINCT age FROM users') print([row[0] for row in cur.fetchall()]) # 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 cur.execute('SELECT SUM(amount) FROM orders WHERE order_date BETWEEN "2021-09-01" AND "2021-09-04"') print(cur.fetchone()[0]) # 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id WHERE age <= 25 GROUP BY users.id ORDER BY total_orders DESC ''') print(cur.fetchall()) # 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 3 ''') print(cur.fetchall()) # 8. 查询订单总金额最大的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 1 ''') print(cur.fetchone()) # 9. 查询订单总金额最小的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount ASC LIMIT 1 ''') print(cur.fetchone()) # 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 cur.execute('SELECT * FROM users WHERE name LIKE "%李%" ORDER BY name ASC') print(cur.fetchall()) # 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 cur.execute('SELECT * FROM users WHERE age > 20 ORDER BY age DESC LIMIT 5') print(cur.fetchall()) # 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC ''') print(cur.fetchall()) # 关闭游标和连接 cur.close() conn.close() ``` 注意:在运行代码之前,需要先安装 PyMySQL 模块,可以使用以下命令进行安装: ``` pip install pymysql ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值