整理数据的流程


34

通过对R的数据科学的有限了解,我意识到清除不良数据是准备数据进行分析的非常重要的一部分。

在处理数据之前,是否有任何最佳做法或流程来清理数据?如果是这样,是否有任何实现这些最佳实践的自动化或半自动化工具?


1
清除一点可能是个好主意,在清理数据下您
要说的

2
进一步说明清洁数据的含义将有所帮助。在我工作的环境中,清理与格式化无关-我只是称其为解析/导入-但这意味着要讲嘈杂的用户数据并验证其一致性。使用的技术是特定于数据集的,从简单的统计规则到模糊算法,尤其是在数据稀疏时。
AdrianBR 2014年

Answers:


21

R含有一些标准为数据操纵功能,其可被用于数据清洗,在其基极封装(gsubtransform等),以及在各种第三方软件包,如stringr重塑 / reshape2,和plyr / dplyr。以下文件描述了使用这些软件包及其功能的示例和最佳实践:http : //vita.had.co.nz/papers/tidy-data.pdf

此外,R提供了一些专门针对数据清理和转换的软件包:

全面和一致的办法数据清理中的R,包括实施例和使用的editrulesdeducorrect包,以及的描述工作流框架数据清理中的R),其示于下面的纸张,我强烈建议:HTTP ://cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo-Introduction_to_data_cleaning_with_R.pdf


2
我还要添加dplyr,这是某些plyr工具的优化措辞,并且data.table是处理数据的完全不同的方法。两者都是哈德利·威克姆(Hadley Wickham)的作品。
shadowtalker 2014年

@ssdecontrol:我同意-更新了答案。Hadley是该dplyr软件包的作者,但不是该软件包的作者data.table
Aleksandr Blekh 2014年

16

从我的角度来看,这个问题适合两步回答。第一部分,我们称之为软预处理,可以看作是使用不同的数据挖掘算法对数据进行预处理的方式,以使其适合进一步分析。注意,如果目标足够简单以至于可以一次解决,这可能就是分析本身。

第二部分,即硬预处理,实际上先于其他任何过程,可以看作是使用简单的工具或脚本来清理数据,选择要处理的特定内容。对于这个问题,POSIX为我们提供了一套奇妙的魔术工具,可用于构成简洁且功能强大的预处理脚本。

例如,对于处理来自社交网站(Twitter,Facebook等)的数据的人数据检索通常会生成具有非常特定格式的文件-尽管结构可能并不总是很好,因为它们可能包含缺少的字段,等等。 。对于这些情况,一个简单的awk脚本可以清理数据,生成一个有效的输入文件以供以后处理。从魔法设置,还可以指出grepsedcutjoinpastesort,和其他工具众人。

如果简单的源文件包含太多细节,则可能有必要产生一束清理数据的方法。在这种情况下,通常最好使用脚本语言(而不是外壳语言),例如Python,Ruby和Perl。这允许建立API以非常直接和可重用的方式选择特定数据。此类API有时会由其编写者公开,例如IMDbPYStack Exchange API等。

因此,回答问题:是否有最佳实践?通常取决于您的任务。如果您始终要处理相同的数据格式,通常最好编写一个有组织的脚本对其进行预处理;然而,如果你只需要一个简单的和一些数据集快速清理,指望POSIX工具简洁shell脚本,将做整个工作快于Python脚本,还是这样。由于清理取决于数据集和您的目的,因此很难完成所有工作。但是,有很多API可以让您半途而废。


hm-获取数据,格式化数据(awk sed grep的东西),首先消除噪音,然后再深入。因此,如果使用您的
热敏电阻

@MolbOrg是的,这就是我的意思。我将脚本处理称为硬预处理,而对数据挖掘算法的使用进行软预处理,通常可以减少问题的大小(清理数据库)。我还指出,第二部分,即硬预处理,实际上先于任何其他过程。如果对这些术语不太清楚,我很乐意考虑其他建议以改善答案。
鲁本斯2014年

1
嗯是的,没有足够重视原始数据预处理。经过测试的atm-是,对于300 MB中的3.5kk字符串,perl oneliner比grep慢3倍,比grep慢3倍,其中perl花费了1.1秒,grep花费了0.31秒。我看到了一篇文章,指出Perl regexp很慢,实际上比实际要慢得多((我怀疑这也适用于grep))http://swtch.com/~rsc/regexp/regexp1.html
MolbOrg

@MolbOrg不错的参考!AFAIK,grep默认情况下使用POSIX基本正则表达式,当以身份运行时允许扩展的POSIX正则表达式,以身份运行时允许grep -EPCRE grep -P
鲁本斯

1
这是一个很好的帖子。R非常适合数据操作,但由于其冗长的字符串操作语法以及对数据结构的列表和矩阵的严格遵循,R 在数据清理方面非常繁琐。
shadowtalker 2014年

11

数据清理很少会完全自动化的一个原因是,要根据您的特定问题,方法和目标来定义“清理”的含义,需要进行大量判断。

它可能像为任何丢失的数据估算值一样简单,也可能像诊断以前的自动化过程(例如,编码,检查,转换)中的数据输入错误或数据转换错误一样复杂。在后两种情况下,从外观上看数据看起来不错,但确实是错误的。这种诊断通常需要人工分析和检查,还需要带外信息,例如有关数据源及其使用的方法的信息。

另外,当错误或丢失的数据留为空白(或不适用)而不是估算或提供默认值时,某些数据分析方法会更好地工作。当存在不确定性和无知的明确表示形式(例如Dempster-Shafer Belief函数)时,这是正确的。

最后,对清洗过程进行特定的诊断和度量很有用。随机分布的缺失值或错误值,还是以可能影响分析结果的任何方式集中它们。测试替代清洁策略或算法的效果以查看它们是否影响最终结果,这很有用。

考虑到这些问题,我非常怀疑任何以肤浅,轻率或全自动的方式处理数据清理的方法或过程。在这些细节中隐藏了许多恶魔,值得给予他们认真的注意。


1
附带说明一下:我认为,在管道中进一步发现由某些问题引起的错误数据是一项黄金技能。很多时候,我想知道为什么我的分析会产生奇怪的结果,而当我查看管道时,我发现了某种错误。例如:我想知道为什么我的所有数据都严重偏向高价-偏离了我的思维模式。当我四处询问时,我发现一些分包商误解了简报并提供了高收入人群的数据,而我们却渴望混合的数据……
Christian Sauer

是! 数据错误通常是过程问题的征兆。知道在过程中的什么地方引入了错误以及机制,这将大大有助于清洁过程。但是,更好的办法是解决流程问题,以便它们产生干净的(或更干净的)数据。
MrMeritology

5

关于自动清除:实际上,您无法自动清除数据,因为错误的数量和错误的定义通常取决于数据。例如:您的“收入”列中可能包含负值,这是一个错误-您必须对案例进行一些处理。另一方面,“每月节省”列可以合理地包含负值。

此类错误在很大程度上取决于领域-因此要找到它们,您必须具有领域知识,这是人类擅长的领域,而自动化过程则不那么多。

您可以并且应该自动化的地方是重复的项目。例如,必须每月产生的报告。如果发现错误,则应放置一些自动化流程,以在随后的几个月中发现这些类型的错误,从而节省时间。


5

我认为在进行实际研究之前,没有通用的技术可以“清除”数据。另一方面,我的目标是进行可重复的研究。通过进行可重复的研究,如果您使用带有错误或错误的参数/假设的清洁技术,其他人可能会发现。

有一个很好的R包针织机,它对可重复性研究有很大帮助。

当然,并非所有研究都可以完全复制(例如实时Twitter数据),但是至少您可以轻松记录清理,格式化和预处理步骤。

您可以在Coursera上查看我为可再生研究课程准备的评估


3

OpenRefine(以前称为Google Refine)是一个很好的工具,您可以在其中交互地执行数据清除和转换。您的最终输出可以导出为多种标准格式(json,csv)或任何自定义格式(例如wiki)。

确切的重复项可以在OpenRefine中进行处理,方法是使用“空白”功能对+进行排序。它还具有近似字符串(模糊)聚类功能,您可以在其中将外观相似的重复项(例如公司名称或地址)分组。仅此功能就很棒。


1
这是一个出色的,报告不足的工具。
Thanks_in_advance 2016年

2

Coursera中有专门针对此课程的整个课程。您可能想复习他们提到的技术,而重要的部分是知道何时使用什么。

https://www.coursera.org/learn/data-cleaning

最好手动而不是自动执行此操作,因为每个数据集都有其自身的问题,并且并非所有步骤都适用于所有数据集。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.