只需4步,微软数据科学家教你用OpenRefine搞定数据清洗
只需4步,微软数据科学家教你⽤OpenRefine搞定数据清洗
导读:本⽂将使⽤OpenRefine清理我们的数据集;它很擅长数据的读取、清理以及转换数据。
作者:托马兹·卓巴斯(Tomasz Drabas)
如需转载请联系⼤数据(ID:hzdashuju)
本⽂的源代码与数据集都可在Github上获取。如果要复制代码库,打开你的终端(Windows环境下的命令⾏、Cygwin 或Git Bash,Linux/Mac环境下的Terminal),键⼊下⾯这条命令:
注意,你的机器得装好Git了。安装指南参见:
本⽂将使⽤⼀个数据集,包含985项真实的房产交易。这些交易是连续5天内在Sacramento发⽣的。数据下载⾃:电影八佰票房
精确地说,来⾃:
数据已转成多种格式,放在GitHub代码库的Data/Chapter01⽂件夹中。
01 使⽤OpenRefine打开并转换数据
OpenRefine诞⽣时被称作GoogleRefine。Google后来开放了源代码。这是个优秀的⼯具,可⽤于快速筛选数据、清理数据、排重、分析时间维度上的分布与趋势等。
在接下来的技巧中,我们将处理Data/Chapter1⽂件夹下的readEstate_trans_dirty.csv⽂件。这个⽂件有些问题,我们会看到解决办法。
⾸先,从⽂本⽂件中读取数据时,OpenRefine默认转为⽂本类型;本技巧将进⾏数据类型转换。否则没法针对性地处理数字列。
其次,数据中有重复(下⽂“排重”部分会处理这个问题)。
再次,city_state_zip列,顾名思义,是市、州、邮编的混合体。我们还是希望拆分它们,在下⽂“⽤正则表达式与GREL 清理数据”中,我们将看到如何提取这些信息。交易价格也有缺失—我们将在“估算缺失值”中估算这些价格。
1. 准备
要完成这些例⼦,你得在你的计算机上安装OpenRefine并能正常运⾏。OpenRefine可从这⾥下载:
安装指导在:
OpenRefine在浏览器中运⾏,所以你的计算机中得有⼀个浏览器。我在Chrome和Safari上测试了,没发现问题。Mac OS X Yosemite预装了Java 8。但OpenRefine不⽀持。你需要安装Java 6或7—参考:
然⽽,即便安装了Java的历史版本,我依然在Mac OS X Yosemite和El Capitan系统中遇到了2.5版OpenRefine的问题。使⽤beta版(2.6),虽然还在开发中,却能正常使⽤。
2. 怎么做
⾸先启⽤OpenRefine,打开浏览器,输⼊:
会打开类似下图的窗⼝:
你要做的第⼀件事就是创建⼀个⼯程。单击Choose files,进⼊Data/Chapter1,选中realEstate_trans_dirty.csv。单击OK,然后Next,最后Create Project。数据就打开了,你会看到类似这个的界⾯:
注意beds、baths、sq__ft、price、latitude以及longitude数据都被当成⽂本处理,sale_date也是如此。⽤OpenRefine,转换前⾯那些字段容易,转换sale_date可就没那么容易了:
举个例⼦,如果⽂本数据的格式类似2008-05-21这样,我们只需调⽤GREL(Google Refine Expression Language)的.toDate()⽅法,OpenRefine会替我们转换好。本例中正确转换⽇期需要⼀些⼩技巧。⾸先选中Transform选项,如下图所⽰:
在打开的窗⼝中,使⽤GREL转换⽇期:
这⾥的value变量代表选中列(sale_date)中每个单元格的值。表达式的第⼀部分从值中提取出⽉份和天数,也就是说,我们截取第4个到第10个字符的⼦字符串,得到May 21。
第⼆个substring(...)⽅法从字符串中提取出年份。使⽤...+','+...表达式将两块以逗号分隔。最后得到May 21, 2008这样的格式。这就⽅便OpenRefine处理了。也就是说,我们⽤括号包装两个substring⽅法,并使⽤了.toDate()⽅法,以正确转换⽇期。右边的Preview标签页会展⽰表达式的效果。
3. 参考
Ruben Verborgh和Max De Wilde合著的《Using OpenRefine》从各⽅⾯介绍了OpenRefine,深⼊浅出,娓娓道来:02 使⽤OpenRefine探索数据
理解数据是建⽴成功模型的前提。对数据做不到了如指掌,你建⽴的模型就可能在纸⾯上很美,却在⽣产环境中⼤错特错。探索数据集是检测数据是否有问题的⼀个好办法。
1. 准备
要学习本技巧,你需要在计算机上装好OpenRefine以及⼀个浏览器。⾄于如何安装OpenRefine,参阅本⽂01部分的准备部分。
我们假设你使⽤了前⼀技巧,所以你的数据已经加载到OpenRefine,且数据类型代表着列中的数据。
2. 怎么做
有了Facets,⽤OpenRefine探索数据就简单了。⼀个OpenRefine Facet可以理解成⼀个过滤器:它让你快速地选择某些⾏,或直接探索数据。每⼀列都可以创建⼀个facet—只消单击列旁边的下拉箭头,菜单中选Facet组。
OpenRefine中有四种基本的facet:⽂本、数字、时间线以及分布图。
你可以⾃⾏定制facet,或者使⽤OpenRefine⼯具库中复杂⼀些的facet,⽐如词或⽂本的长度。
⽂本facet可以让你快速地对数据集中⽂本列的分布有⼀个感觉。⽐如,我们可以到数据集中,2008年5⽉15⽇到5⽉21⽇之间销售额最⾼的是哪个城市。
聪明的你⼀定猜到了,既然我们⼀直在分析Sacramento的数据,那估计就是Sacramento了吧,的确是这样,其后是Elk Grove、Lincoln、Roseville,如下图所⽰:
这让你对数据是否合理有⼀个直观的感受;可以充分判定提供的数据是否符合假设。
数字facet可以让你粗略了解数字型数据的分布。⽐如,我们可以检查数据集中价格的分布,如下图所⽰:
价格的分布⼤体上如我们所料:左倾的分布是合理的,落在右端的交易较少,因为那部分是有意愿也有能⼒购置⼤庄园的买家。
这个facet也发现了我们数据集的⼀个不⾜:在价格列缺少89份数值。本⽂后⾯第05节中将解决这个问题。
在已知拿到7天(2008年5⽉15⽇⾄5⽉21⽇)数据的情况下,检查交易的时间线是否有空⽩也是个好办法:
我们的数据横跨了7天,但我们发现两天没有交易。翻下⽇历就会发现,5⽉17号、18号是周末,这⾥没啥问题。时间线facet允许你使⽤左右两边的滑动条过滤数据:这⾥我们过滤出2008年5⽉16⽇之后的数据。
散布图facet能分析数据集中数字型变量间的相互作⽤:
收养孩子的条件单击某⼀⾏和列可以详细地分析相互作⽤:
03 排重
我们应该默认待处理的数据是有瑕疵的(除⾮能证明没有)。检查数据是否都整理好了是⼀个好习惯。我⾸先检查的总是重复⾏。
1. 准备
要学本技巧,你需要在计算机上装好OpenRefine以及⼀个浏览器。
我们假设你应⽤了前⼀项技巧,所以你的数据已经加载到OpenRefine,且数据类型与列中的数据相符。什么基金
2. 怎么做
我们先假设7天的房产交易中,出现同样的地址就意味着有重复的⾏。这么短的时间周期内,同⼀套房⼦不太可能被卖两回。所以,我们在重复的数据上Blank down:
这样做的效果就是保留了数据的第⼀次出现,⽽将重复出现的置为空⽩(截图中第四列):服务质量承诺书
Fill down选项效果相反—它会⽤上⼀⾏的数据填补空⽩,直到出现新的数据。
现在创建⼀个关于空⽩的Facet,这样我们可以快速选中空⽩⾏:
创建这样的facet可以快速选中并移除空⽩⾏:
现在数据集中没有重复记录了。
04 使⽤正则表达式与GREL清理数据
清理并准备使⽤数据时,可能需要从⽂本字段中提取⼀些信息。有些时候,我们只需要⽤些分隔符将⽂本字段拆开。但当数据符合⼀些模式,并不是简单地拆分⽂本就能做到时,我们就需要求助于正则表达式了。
1. 准备雨落长安
要学本技巧,你需要在计算机上装好OpenRefine以及⼀个浏览器。
我们假设你应⽤了前⼀项技巧,所以你的数据已经加载到OpenRefine,且数据类型与列中的数据相符。
此外没有要求了。
2. 怎么做
我们先看下city_state_zip列中的模式。顾名思义,第⼀个元素是城市名,然后是州名,最后是5位数邮编。可以⽤空格作为分隔符拆分这个字段。
这对很多记录(例如Sacramento)都能起作⽤,⽽且其被解析成城市、州和邮编。不过这个⽅法有个问题—有些地名不⽌⼀个词(例如Elk Grove)。这种情况下,我们就需要做些改变。
这就轮到正则表达式展⽰⾝⼿了。你可以在OpenRefine中使⽤它转换数据。现在要将city_state_zip拆成三列:city、state和zip。单击列名旁边的向下按钮,出来的菜单中,根据情况选择Edit column或Add column。会如下图所⽰,出现⼀个窗⼝:
和以前⼀样,值指的是每个单元格的值。.match(...)⽅法应⽤到单元格的值上。它以⼀个正则表达式作为参数,返回的是匹配模式的⼀列值。正则表达式被封装在/.../之间。我们⼀步步解释这个正则表达式。
我们知道city_state_zip列的模式:⾸先是城市名(可能不⽌⼀个词),然后是州名的两字母缩写,最后是5位数字的邮编。下⾯给出了描述这个模式的正则表达式:
(.*) (..) (d{ 5})
从后往前理解这个表达式要容易些。⾸先⽤(d{5})提取出邮编。d表⽰任何数字(等价于([0-9]{5})),{5}从字符串尾部开始选取5个数字。然后是(..)┐,⽤两个点来提取州名的两字母缩写。注意我们为了阅读⽅便,⽤┐替代空格符。
这个表达式提取两个字符以及⼀个空格—不多,不少。最后(从右往左读)是(.*),这可理解为:(如果有的话)提取出未被另两个表达式匹配的所有字符。
总体上,这个正则表达式⽤普通话来表述就是:提取字符串(即使是空的)中州名的两字母缩写(前⾯有⼀个空格),后⾯跟有⼀个空格和五位表⽰邮编的数字。
.match(...)⽅法⽣成⼀个列表。本例中得到的是包含三个元素的列表。要得到城市名,可以使⽤下标[0]获取列表的第⼀个元素。要得到州名和邮编,可以分别使⽤下标[1]和下标[2]。
现在拆完city_state_zip列了,可以将⼯程导出成⼀个⽂件。在⼯具的右上⾓,你会看到Export按钮;选择Comma separated value。⽂件默认下载到Downloads⽂件夹。
3. 参考
强烈推荐Felix Lopez和Victor Romero合著的《Mastering Python Regular expressions》⼀书:
关于作者:托马兹·卓巴斯(Tomasz Drabas),微软数据科学家,致⼒于解决⾼维特征空间的问题。他有超过13年的数据分析和数据科学经验:在欧洲、澳⼤利亚和北美洲三⼤洲期间,⼯作领域遍及⾼新技术、航空、电信、⾦融和咨询。
询。
延伸阅读《数据分析实战》
点击上图了解及购买
如何制作辣椒酱
转载请联系:togo-maruko
推荐语:通过⼤量的现实案例,详细讲解数据分析相关的各种⽅法。
Q:你都在⽤哪些⼯具处理数据?
转载 / 投稿请联系:baiyu@hzbook

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。