第5章数据的清洗与检验学习目标
(1) 掌握数据去重的方法
(2) 掌握缺失值处理的方法
(3) 掌握异常值处理的方法
(4) 了解数据检验的作用数据清洗是一项复杂且烦琐的工作,同时也是整个数据分析过程中最重要的环节。数据清洗的目的在于提高数据质量,将“脏”数据(“脏”数据在这里指的是对数据分析没有实际意义、格式非法、不在指定范围内的数据)清洗干净,使原数据具有完整性、唯一性、权威性、合法性、一致性等特点。常见的数据清洗操作包括重复值的处理、缺失值的处理、异常值的处理等操作,同时,为了保证数据的有效性,少不了数据校验操作。本章将针对数据清洗和校验进行详细讲解。
5.1数据去重
数据去重又称重复数据的删除,通常指的是找出数据文件集合中重复的数据并将其删除,只保存唯一的数据单元,从而消除冗余数据。通常,数据去重方法分为两种,分别是完全去重和不完全去重。本节将针对这两种数据去重的方式进行讲解。
5.1.1完全去重
完全去重指的是消除完全重复的数据,这里提到的完全重复数据指的是数据表记录字段值完全一样的数据。例如,现在有两个表格,分别记录不同年份的用户信息,现要求合并统计所有用户信息,发现合并后的表格存在完全重复的数据,示例如图51所示。
图51用户名单
从图51中可以看出,合并后的数据表中存在完全相同的数据,为了便于后期更加方便地使用这些用户数据,通常情况下会对数据进行去重操作。
接下来使用Kettle工具演示如何消除这些完全重复的数据,具体步骤如下。
1. 数据准备
合并后的用户名单存放在CSV文件merge.csv中,具体内容如图52所示。图52merge.csv文件的内容
第5章数据的清洗与检验数据清洗2. 打开Kettle工具,新建转换
使用Kettle工具创建转换repeat_transform,并添加“CSV文件输入”控件、“唯一行(哈希值)”控件以及Hop跳连接线,具体效果如图53所示。
图53创建转换repeat_transform3. 配置“CSV文件输入”控件
双击图53中的“CSV文件输入”控件,进入“CSV文件输入”界面,如图54所示。
图54“CSV文件输入”界面
在图54中单击“浏览”按钮,选择要进行完全去重处理的CSV文件merge.csv,如图55所示。
图55选择要进行完全去重处理的CSV文件merge.csv
在图55中单击“获取字段”按钮,Kettle会自动检索CSV文件,并对文件中的字段类型、格式、长度、精度等属性进行分析,具体如图56所示。
图56Kettle检索CSV文件
在图56中单击“预览”按钮,查看CSV文件merge.csv的数据是否加载到CSV文件输入流中,具体效果如图57所示。
图57预览数据
从图57中可以看出,CSV文件merge.csv的数据已经成功抽取到CSV文件输入流中,单击“关闭”→“确定”按钮,完成“CSV文件输入”控件的配置。
4. 配置“唯一行(哈希值)”控件
双击图53中的“唯一行(哈希值)”控件,进入“唯一行(哈希值)”界面,如图58所示。
图58“唯一行(哈希值)”界面
在图58中的“用来比较的字段”处添加要去重的字段,这里可以单击“获取”按钮,添加需要去重的字段,具体如图59所示。
图59添加需要去重的字段
在图59中单击“确定”按钮,完成“唯一行(哈希值)”控件的配置。
5. 运行转换repeat_transform
单击转换工作区顶部的按钮,运行创建的转换repeat_transform,实现消除CSV文件merge.csv中完全重复的数据,具体如图510所示。
图510运行转换repeat_transform
从图510中执行结果窗口的“步骤度量”选项卡可以看出,“CSV文件输入”控件输入10条数据并写入该控件9条数据(其中有1条数据为表头);“唯一行(哈希值)”控件从“CSV文件输入”控件读取9条数据,写入该控件7条数据,拒绝2条数据(这2条数据为完全重复数据)。也就是说,CSV文件merge.csv中有2条数据与其他数据完成重复。
选中图510中的“唯一行(哈希值)”控件,单击执行结果窗口的Preview data选项卡,查看是否消除CSV文件merge.csv中完全重复的数据,具体如图511所示。
图511查看是否消除CSV文件merge.csv中完全重复的数据
从图511中可以看出,CSV文件merge.csv中的数据已经没有了完全重复的值,说明通过Kettle工具实现了消除完全重复数据的功能。
注意: 本小节操作只是将CSV文件merge.csv的数据读取到Kettle中进行完全去重处理,并不会改变CSV文件merge.csv的原始数据,如需保存处理后的数据,须添加相关输出控件。
5.1.2不完全去重
数据清洗过程中,所有字段值都相等的重复值是一定要剔除的。根据不同的业务场景,有时还需要选取其中若干字段进行去重操作。
假设现在有一份用户访问网站的数据文件people.txt,具体内容如图512所示。
图512文件people.txt的内容
从图512中可以看出,第1条记录和第11条记录都指向同一个用户,只是访问的时间不同。下面通过Kettle工具将文件people.txt中不完全重复的数据进行去重处理,即使用Name(姓名)、UserLevel(用户级别)和Phone(手机号)3个字段作为去重处理的比较对象判断唯一用户,具体步骤如下。
1. 打开Kettle工具,创建转换
使用Kettle工具创建转换part_repeat_transform,并添加“文本文件输入”控件、“唯一行(哈希值)”控件以及Hop跳连接线,具体效果如图513所示。
图513创建转换part_repeat_transform
2. 配置“文本文件输入”控件
双击图513中的“文本文件输入”控件,进入“文本文件输入”界面,如图514所示。
图514“文本文件输入”界面
在图514中单击“浏览”按钮,选择要去重的文件people.txt,效果如图515所示。
图515选择要去重的文件people.txt
在图515中单击“增加”按钮,将要去重的文件people.txt添加到转换part_repeat_transform中,具体效果如图516所示。
图516添加文件people.txt至转换part_repeat_transform中
在图516中单击“内容”选项卡,切换到“内容”选项卡界面,如图517所示。
图517“内容”选项卡界面
在图517中清除分隔符处的默认分隔符“;”,并单击Insert TAB按钮,在分隔符处插入一个制表符;取消勾选“头部”复选框,若不取消,则在进行数据抽取操作时会排除文件第一行的数据。“内容”选项卡的配置如图518所示。
图518“内容”选项卡的配置
在图518中单击“字段”选项卡,切换到“字段”选项卡界面,如图519所示。
图519“字段”选项卡界面
在图519中,根据文件people.txt的内容添加对应的字段名称,并指定数据类型,这里需要注意的是,制表符可看作是由多个空格组成,因此在“去除空字符串方式”列时,所添加的字段都应选择“不去掉空格”,否则在抽取数据操作时,会把制表符当作空格去除,而不能把制表符作为分隔符实现文本文件内容的分隔。“字段”选项卡的配置如图520所示。
图520“字段”选项卡的配置
在图520中单击“预览记录”按钮,查看文件people.txt的数据是否成功抽取到文本文件输入流中,具体效果如图521所示。
图521预览数据
从图521中可以看出,文件people.txt的数据已经成功抽取到文本文件输入流中,单击“关闭”→“确定”按钮,完成“文本文件输入”控件的配置。
3. 配置“唯一行(哈希值)”控件
双击图513中的“唯一行(哈希值)”控件,进入“唯一行(哈希值)”界面,如图522所示。
图522“唯一行(哈希值)”界面