许多年来,我一直领导谷歌搜索日志的数据科学团队。经常需要我们对一些乱七八糟的结果来赋予意义,对日志记录的操作来挖掘新现象,验证别人的分析,以及用于解释用户行为的度量指标。有些人似乎天生就擅长做这种高质量的数据分析。这些工程师和分析师常常被描述为“谨慎”、“有技术”。但实际上这些形容词是什么意思?您怎么做才能赢得这些标志?
为了回答这些问题,我将Google公司的经验整理进一篇文档,并得意地将他简单命名为“好的数据分析”。令我惊奇的是,这篇文档比我在谷歌过去十一年做的其他任何文档的阅读量都高。在上次大改版之后的四年时间里,每次检查的时候,我甚至发现有许多Goolge员工翻看它。
为什么经过这段时间,这个文档使那么多人产生共鸣?我认为最主要的原因是全文都是关于具体的可以实施的方案,不只是抽象的理想。我见过许多工程师和分析师养成了这些(文中涉及的)习惯,并进行高质量的工作。我将在这个博客中分享那篇文档的内容。
建议总结起来,分为三大类:
技术:如何操作和检测数据的思想和技术。 过程:一些建议,关于怎样处理您的数据,应提出怎样的问题,还有一些需要检查的事情。 沟通:如何与他人合作及交流,关于您的数据和见解。
技术
看看你的数据分布
虽然我们一般会使用总体度量(均值、中值、标准差,等等)和人交流数据分布,但是您应该常常关注分布的更丰富的表示形式。直方图、累积分布函数(CDFs)、Q-Q图,诸如此类给予您了解是否存在重要有趣的数据特征,如多模态行为或是一个明显的异常类,您需要决定如何总结它们。
考量异常值
您应当关注您数据中的异常值。它们会成为煤堆中的金丝雀,是您的分析所暴露的更基本的问题。从您的数据中将他们排除,或把它们放在一起形成一个“异常”类别,这样做可以,但您应该确保您知道为什么一些数据最后被放在这一类。例如,点击率(CTR)最低的查询,可能显示了在用户界面中有一些点击元素是您无法统计的。点击率高的查询,可能又会反映了您不应统计的点击。另一方面,一些异常值是您永远无法解释的,所以这里投入多少时间您需要特别留意。
报告噪音或者置信度
首要的是,我们必须意识到存在随机性,这很坑。如果您不小心,您发现的模式就混着噪声。每个您生成的估计量,您应当附上估计的置信度。有时这可以相当正式和精确(采取一些测量方法,如估计量的置信区间或可信区间,以及结论的p值或贝叶斯因子),有时也没那么严格。例如,假如一个同事问您,多少查询关于周一我们获得的青蛙数量,您可能会做一个快速分析,看了两个星期一就报告“通常介于1000万到1200万”(而不是真实数字)。
看实例(这里的实例指数据的实际情况)
当您在编写新的分析代码,您需要看下这些底层数据的实例,您写的代码是如何解释这些实例的。不这样做,要用的分析代码复杂一些您基本上就写不出来了。您的分析能从底层数据挖出许多特征,并梳理成有用的总结。通过查看个体实例的全部复杂情况,您会得到合理的总结,从而信心百倍。
您应该做分层抽样,在整个分布中都得到采样,这样就不会只集中在最普遍的例子上。
举例来说,如果您要计算“点击时间”(TimetoClick),确保您能看到整个分布的实例,特别是极端情况。如果您没有合适的工具或者可视化方式来查看您的数据,您需要先完成这个。
划分数据
这里的划分意味着将数据划分为不同的子集,分别看下在这些子集中您测到的值。在网站流量分析中,我们一般按照一些维度来划分,如“移动端还是桌面端”、“浏览器种类”、“所在地”等等。如果底层现象可能在子集之间以不同的方式工作,您必须划分数据看看是否是这样。即使您不期望一段数据能有什么用,看下几个段之间的内部一致性(译者注:原本是一列数据,但是被划分到不同子集中),如果您测量的是正确的东西,那也带给您更大的信心。在某些情况下,个别子集可能存在坏数据、损毁的记录,或者在某种程度上是完全不同的东西。
每次您划分数据来比较两组(比如实验组/控制组,但即使是时间A与时间B的比较),您都需要注意混淆的迁移(mixshift,译者注:按照下文辛普森悖论的推论,这里指原本存在某种特征的两个组,分别讨论时存在这种特征,但是两组混在一起时这种特征却消失)。混淆的迁移出现在当每段的数据量在各比较组之间不同的时候。这可能是辛普森悖论和其他混淆导致的。一般来说,如果在您的两组中,一段的数据量是大致相同的,您可以放心进行比较。
考虑实际意义
有大量数据的话,只关注统计学意义,或处理每一小组数据的细节,都是十分诱人的。但是您需要反问您自己,“如果X的值确实比Y的值多0.1%,这有影响么?”这可能特别重要,如果您不能很好理解或是归类您的部分数据。如果您不能理解我们的日志中的一些用户代理字段,不管它是0.1%还是10%有很大的差异,取决于多大程度上您要研究这些案例。
另一方面,您有时会有一个较小的数据集。许多变化达不到统计学显著意义,可是又不同于说这是“中性”。您必须问自己“实际上仍然具有显著性变化的可能性有多大”?
检查经过时间后的一致性
您应该总是使用的一种特定划分方法,就是以时间为单位划分(我们经常使用的是日期,但其他单位可能也行)。这是因为许多基础背后的干扰因素系统随时间演进而产生的。通常一个特征或初始数据集的初始版本将会受到仔细的检查,但是依这种方法继续,出现例外并不罕见。
仅仅因为某一天或某些天出现异常,并不意味着您应该舍弃它。在您丢弃之前,使用这个异常数据作为一个钩子,找到为什么这天出现异常的原因。
看这种“一天又一天”的数据的另一个好处是,它给您数据不断变化的感觉,最终将形成一个置信区间或声明其统计学显著性。这通常不能取代严格的置信区间计算,但仅从“一天又一天”图表中您往往可以看到统计显著的大致变化。
过程
分开验证、描述、评估
我认为探索性数据分析有三个相互关联的阶段:
验证或初步数据分析:我是否相信数据是自我一致的(self-consistent),是否采用正确的数据收集方法,我认为这些数据代表什么?这通常叫做“健康检查”。例如,如果完成了手动测试某种特征,那么我可以看看手动测试的日志吗?移动设备功能推出的特性,日志是否记录了台式机也存在这种特性?
描述:这个数据的客观解释是什么?例如,“用户很少用7字查询这些数据吗?”,“点击页面加载的时间(这里经过点击后)超过1%”,还有“进入下一个结果的页面的用户比例更小。”
评估:鉴于描述,数据告诉我们,对于用户、对于谷歌、对于世界一些好事将会发生吗?例如,“用户可以更快找到结果”或“点击质量更高了”。
分成这些阶段,您可以更容易地与他人达成共识。描述应该是每个人都能从数据达成一致的事情。评估可能会存在更多的争议,因为您对数据灌输了一些意义和价值。如果您不把描述和评价分开,您更有可能只看到您希望看到的数据解释。此外,因为要建立规范的测度值,通常是通过与其他特征和测量进行严格的比较,需要大量的投入,评估往往会更加困难。
这些阶段不是按顺序递进的。当您要探索数据,您可能在这些阶段之间反复,但在任何时候您应该清楚您处于什么阶段。
确认实验及数据收集的建立
看任何数据之前,确保您了解实验和数据收集的设置。实验者和分析师之间交流融洽,是一个巨大的挑战。如果您能直接看到实验协议或配置,那您就应当这样做。否则,写下您自己理解的设置,确保负责采数据的人能明白它的正确性。
您可能会发现不正常或不好的配置,或样本集的限制(如仅在一个特定的浏览器下能得到有效数据)。这里提到的可能会帮助您构建并验证理论。下面一些方面需要考虑:
如果它是一个产品的特征,那么就要试着找出它。如果不能,至少要看行为的截图或是描述;
寻找任何实验运行时间内的不寻常事件(假期、大新闻的发布,等等)。
检查关键标记
在真正回答您感兴趣的问题之前(例如,“用户使用我厉害的新功能了吗?”),您需要检查大量的相关事宜,这些可能不是您感兴趣的,但这可能对以后的分析或指出数据的问题是很有用的。用户数量变化了吗?受影响查询数量是否正确得显示在我所有的子组当中?出错率变了吗?就像您的医生每次总是检查您的身高、体重、和血压,检查您的生命体征数据是否潜在大问题。这是一个“验证”阶段的重要组成部分。
标准化第一,个性化第二
这是一个不容改变的检查规则。特别是当看到新特性和新数据的时候,那么用新的或特别的测量这个新特征的方法往往很诱人。但是您应该先看看标准测量方法,即使您希望改变他们。例如,当添加一个全新的UI特征来搜索页面,您应该确保您先理解标准测量,比如结果的点击数的影响,然后对这个新的UI功能采用特别的测量方法。您这样做是因为标准测量更加有效,更可能是正确的。如果您的新、自定义的测量与标准的测量不一致,那这个测量很可能是错的。
测两遍,甚至更多
尤其是如果您想要捕捉一个新现象,试图用多种方式测量同样的底层数据。然后,检查这多个测量结果是否一致。通过使用多种测量,您可以鉴别测量或日志记录代码中的错误,底层数据的意外特征,或过滤出一些重要的步骤。如果您用这些测量方法测量不同的数据源,那将更好。
检查再现性
分割和一致性随着时间的推移是检查再现性的特定例子。如果一个现象是重要的和有意义的,你应该看到它穿过不同的用户群体和时间。但再现性意味着比这更好。如果您正在构建数据模型,则希望这些模型在基础数据中的小扰动上保持稳定。使用不同的时间范围或随机的子样本的数据将告诉你这个模型如何可靠/可重复。如果它是不可重复的,你可能没有捕捉到一些产生了这个数据基本的过程。
检查与过去测量的一致性
通常你会计算一个与过去被用来计数相似的指标。你应该比较你的指标和在过去报告中的指标,即使这些测量是在不同的用户群。例如,如果你正在测量特殊人群的搜索量,并且测量值比普遍接受的数字要大得多,那么你需要调查。你的数字可能是正确的,但现在你必须做更多的工作来验证这一点。你在测量同样的东西吗?是否有一个合理的理由相信这些人群是不同的?你不需要完全一致,但你应该在同一个变动范围。如果你不是,假设你是错误的,直到你可以充分说服自己。最令人惊讶的数据将变成一个错误,而不是一个极好的新的洞察。
新的指标应该首先适用于旧的数据/特征。
如果你收集了全新的数据,并尝试学习新的东西,你不会知道你是否回答正确。当你收集一种新型数据时,您应该首先将此数据应用到已知的特征或数据。例如,如果你有一个对用户满意度的新标准,你应该确保它告诉你帮助满意的好特征。这样做对你后面学习新的东西提供了验证。
提出假设和寻找证据
通常情况下,一个复杂问题的探索性数据分析是迭代的。您将发现数据的异常、趋势或其他特征。很自然地,你会提出假设来解释这个数据。这是必要的,你不只是做一个假设,并宣布它是真实的。寻找证据(内部或外部的数据)来证实/否定这一理论。例如,如果你相信一个异常是由于一些其他特征的推出或在加德满都(尼泊尔首都)度假,确保人口特征的推出是唯一一个被异常影响地。另外,确保更改的大小与推出的预期一致。
良好的数据分析将会告诉你一个故事。为了确保这是一个正确的故事,你需要告诉自己这个故事,还预测了什么你应该在数据中能看到的,如果假设是真的,然后寻找证据表明它是错误的。这样做就是问自己,“什么实验会让我讲的故事变得有效/无效吗?“即使你不做这些实验,它也许可能会给你如何验证你已有的数据的想法。
好消息是,这些假设和可能的实验可能会引导超越试图了解任何特定的特征或数据的新查询线。然后,您进入理解的领域,不只是这个数据,而产生能够用于未来各种分析的新指标和技术。
从端到端迭代获益的探索性分析
在做探索性分析时,你应该努力得到尽可能多的对于整体分析的迭代。通常情况下,你会有多个步骤的信号采集,处理,建模等。如果你在获得初始信号完美的第一阶段花太长时间,你将错过在相同时间里获取更多迭代的机会。此外,当你最后观察你结束时的数据,你可能会发现改变了你的方向。因此,你最初的重点不应该是完美,而是一路得到合理的东西。给自己留笔记,并承认像过滤步骤和数据记录这样你不能分析/理解的东西,但所有在探索性分析开始时试图摆脱这些就是在浪费时间。
沟通
数据分析从问题开始,而不是数据或技术
总是有一个你要做一些分析的理由。如果你花时间来把你的需求化为问题或假设,它会是一个很长的路来确保你收集你应该收集的数据,并且你正在思考数据中可能存在的空白。当然,你问的问题可以和应该演变因为你在观察数据。但不带问题的分析会终止地毫无目的。
此外,你必须避免找到一些最喜欢技术的陷阱,并随后只发现这些技术工作部分的问题。再次,确保你是明确问题是什么将帮助你避免这个问题。
注意到并计数你的过滤
几乎每一个大的数据分析通过过滤在不同阶段的数据开始。也许你只想考虑美国用户,或网络搜索,或结果点击的搜索。不管是什么情况,你必须:
承认并明确指定你在做什么样的过滤 计数在你的每一个步骤中有多少是被过滤
通常好的方法来做后者实际上是计算所有你的指标,即使对你不包括的人口。然后你可以看看这些数据回答了像“查询中哪部分被我的过滤删除了?“的问题。
此外,寻找哪些被过滤了的例子对过滤步骤是必不可少的并且对您的分析是新颖的。当你制定一个简单数据排除规则的时候,很容易不小心包括了一些“好”的数据。
比率应该有明确的分子和分母
许多有趣的指标是潜在测量们的比值。不幸的是,你的比值是什么往往是模糊的。例如,如果说一个网站上搜索的结果的点击率,它是:
“点击网站的次数/那个网站结果的数量 “点击该网站的搜索结果页面的数量“/”网站显示的搜索页面数量
当你交流结果时,你必须清楚这一点。否则你的观众(和你!)将有与过去结果进行比较和正确解释一个指标的麻烦。
教育你的消费者
你经常会向那些不是数据专家的人展示你的分析和结果。你工作的一部分是教育他们如何解释和从你的数据中得出结论。这可以达到各种目的,从确保他们理解置信区间到为什么某些测量在你的定义域里是不可靠的,到什么样的典型影响大小是“好”和“坏”的变化,到了解样本偏差效应。
当你的数据具有较高的被曲解或选择性地列举的风险时这一点尤其重要。您负责提供上下文和一个完整的数据图片,而不仅仅是消费者要求的数字。
同时做怀疑者和拥护者
当你处理数据时,你必须做一个获得见解的拥护者以及一个怀疑论者。你会希望在你观察的数据中发现一些有趣现象。当你发现一个有趣现象,你应该问:“我能收集到什么其他数据显示这有多么了不起?”和“我能找到什么来使它无效?“。尤其是你为真的想要一个特定回答的某人做分析的情况下,(例如“我的特征是了不起的”)你要扮演怀疑者来避免犯错误。
与同行分享第一,外部消费者第二
一个熟练的同行评审可以比你数据的消费者提供更有质量不同的反馈和健全的检查,特别是因为消费者通常有一个他们想得到的结果。理想的情况下,你会有一个知道你正在寻找的数据的同行,但即使是一个有这样观察数据经验的同行,大体上是非常有价值的。以前的观点提出了一些方法来让自己做正确类型的健全检查和验证。但与同行分享是迫使自己做所有这些事情的好方法之一。同行在多维分析是有用的。在初期你能找到你的同伴所知道的事情,得到建议测量什么东西,和过去有哪些在这方面的研究。临近结束时,同行很善于指出古怪、不一致,或者其他的困惑。
预期和接受无知和错误
我们能从数据中学到的东西有十分有限。NateSilver在信号和噪声中指出,只有承认我们对于确定的限制,我们才可以取得更好的预测。承认无知是一种力量,但它通常不会立即得到回报。在当时会感觉很糟糕,但最终你会赢得你有数据头脑的同事和领导人的尊重。当你犯了一个错误,并很晚发现(或太晚了!)会感觉更糟糕,但积极地承认你的错误将转化为信誉。信誉是任何数据科学家的关键社会价值。
最后的想法
没有什么缩减的建议列表可以是完整的,即使当我们突破了前10名列表格式的障碍(对没有计算的你们,这里有24个)。当你将这些想法应用于实际问题时,你会发现在你的领域中最重要的习惯和技术,帮助你快速而正确地做这些分析的工具,以及你放在这个列表上的建议。确保你分享你所学到的东西,所以我们都可以成为更好的数据科学家。