本节书摘来自异步社区《数据整理实践指南》一书中的第2章,第2.2节,作者【美】Q. Ethan McCallum(麦卡伦),更多章节内容可以访问云栖社区“异步社区”公众号查看
一旦数据格式已经可读且可操作,下一步是要弄清楚数据的含义。在某些情况(遗憾的是,这种情况非常罕见)下,提供了关于数据的所有信息。通过需要对数据做一些探索。有些数据第一行可能会提供一些信息,有些数据可能每个字段都有一个键值,这些取决于数据的格式。幸运的话,这些数据可能稍有些冗余信息,你可以理解,或者至少你认识的一些人可以理解。关于这方面,我常常求助于一位俄罗斯藉QA。这是工作场所多样化的另一个优势。
一个常见的错误是误解字段的单位或含义。货币字段的单位可以是美元、美分甚至是0.000001元(如Google的AdSense API计量单位)。收入字段可能是毛收入,也可能是净收入。距离可以使英里、千米、米等。查看字段的定义和实际值可以避免因误解而得到错误的结论。
你还可以查看一些其他字段,确保它们在上下文中是有意义的。举个例子,字段PageView往往是个整数,而不会是小数或字符串。货币字段(价格、成本、PPC、RPM)往往是小数,通常小数点后有两位到四位。UserAgent字段包含的字符串应该看起来和常见的用户代理类似。IP地址应该是整数或以点号分隔的字符串。
数据集中的常见问题是缺失值或空值,这有时候不会出什么问题,有时会导致记录不准确。这些值可以通过很多方式来表示。我经常看到它们被表示为空(比如,若使用t 分隔,则出现连续tt这种形式)、空串(单引号或双引号)、字符串NULL或未定义或N/A或NaN,还有以数值0表示。不管在你的数据集中是如何表示,要知道用什么表示缺失值或空值,并确定数据中确实是按此方式表示的,这样可以避免后期使用数据带来很多麻烦。
我经常把这些常规检查延伸到字段的真实校验。绝大多数的校验方式可以通过正则表达式实现。由于历史原因(我用了20多年),我通常用Perl写校验脚本,但是还有很多更好的选项。几乎每一门语言都实现了正则表达式。
对于枚举字段,所有值是否都落在正确的区间?举个例子,“month”字段只应该包含月份信息(从1~12的整数,字符串值只能是Jan、Feb…或者January、February…)。
my $valid_month = map { $_ => 1 } (0..12, qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec January February March April May June July August September October November December)); print "Invalid!" unless($valid_month{$month_to_check});对于数值字段,所有值都是数值吗?下面这段代码检查字段是否指包含数字。
$ cat sample.txt one two 3 one two three 1 2 3 1 2 three $ cat sample.txt | \ perl -ape 'warn if $F[2] !~ /^\d+$/' one two 3 Warning: something's wrong at -e line 1, <> line 2. one two three 1 2 3 Warning: something's wrong at -e line 1, <> line 4. 1 2 three对于固定格式的字段,是否所有值都和正则表达式匹配?举个例子,IP地址通常是以点分隔的(比如127.0.0.1),可以通过这样的正则表达式匹配^d+.d+.d+.d+$(或者更严格的匹配)。
$ cat sample.txt fink.com 127.0.0.1 bogus.com 1.2.3 $ cat sample.txt | \ perl -ape 'warn "Invalid IP!" if $F[1] !~ /^\d+\.\d+\.\d+\.\d+$/' fink.com 127.0.0.1 Invalid IP! at -e line 1, <> line 2. bogus.com 1.2.3对于数值字段,我想做些简单的统计检查。最小值在字段的上下文中是否有含义?计数器的最小值(点击数、网页浏览数PV等)的值应该是大于等于0的值,很多其他字段也是如此(比如PPC、CTR、CPM)。同样,最大值是否有意义?极少数字段在逻辑上值可以是10亿,在很多情况下,如果实际值远小于该值则没有意义。
根据实际的定义,类似于CTR的比率值应该小于1。当然,不管定义是什么,其值经常会超过1(毕竟本书探讨的是噪音数据),但是其值也不应该比1大太多。如果你看到CTR值是几百或几千,很可能有问题。
财务相关的字段值应该有一个合理的上限值。至少对于我所处理的数据,PPC或CPC字段值在数百美元可能还是有意义的,但如果是几千或更大值,就肯定不合理了。你可以接受的范围很可能不同,但不管数据值是多少,都应该检查数据,确保是合理的。
你还可以查看一个字段的平均值(如类似取模或中位数的简单统计),确保它看起来是合理的。举个例子,如果一个装饰物的售价在10美元左右,而在“装饰物”字段是999美元,那很可能是哪里出了差错。它也可以帮助校验数值的单位是否正确。如果该字段值的单位是美分,而不是美元,那值999就很合理了。
关于这些校验,幸运的是可以很容易通过自动化实现,这对于频繁更新的数据集,就非常便利。花上数个小时的时间查看新的数据集其实挺有意思,因为通过这个过程可以对数据有一些初步理解,但是多次做重复的事情就很让人烦了。如果你有一个小时的时间,可能宁可作为迪士尼的丛林巡航导游(“这真是太有趣了,再来一次吧!再来一次吧……”)。
相关资源:数据整理实践指南.[美]Q.Ethan McCallum(带详细书签) PDF 下载