良好的数据分析

作者:Patrick Riley

特别感谢:Diane Tang、Rehan Khan、Elizabeth Tucker、Amir Najmi、Hilary Hutchinson、Joel Darnauer、Dale Neal、Aner Ben-Artzi、Sanders Kleinfeld、David Westbrook 和 Barry Rosenberg。

历史记录

概览

从大量数据中提取真实信息和数据洞见是一项强大但容易出错的工作。最优秀的数据分析师和数据头脑的工程师凭借基于数据做出的可信声明而享有盛誉。可是他们是如何做的 赢得他们的信任呢?我经常听到像“细心”和“有条不紊”这样的形容词,但最仔细和条理清晰的分析师实际上会怎么做呢?

这个问题不是轻而易举,尤其是考虑到 Google 会定期收集的数据类型。我们通常不仅要处理非常大的数据集,而且这些数据集极其丰富。也就是说,每行数据通常具有多个属性。如果将这一点与给定用户的事件时间序列结合起来,就可以通过多种方式来查看数据。相比之下,典型的学术心理学实验让研究人员关注每一个数据点变得轻而易举。我们的大型高维数据集所提出的问题与大多数科学工作历史中遇到的问题截然不同。

本文档总结了谨慎、有条理的分析师在大型高维数据集中使用的理念和技术。虽然本文档重点介绍来自日志和实验分析的数据,但其中的许多技术适用范围更广。

本文档的其余部分包括三个部分,介绍数据分析的不同方面:

  • 技术:有关操作和检查数据的理念和技术。
  • 流程:关于如何处理数据、要询问哪些问题以及需要检查哪些事项的建议。
  • 心态:如何与他人合作并传达见解。

技术

我们来了解一些检查数据的技巧。

查看您的发行版

大多数从业者使用汇总指标(例如平均值、中位数、标准差等)来传达分布情况。但是,您通常应通过生成直方图、累积分布函数 (CDF)、分位数 (Q-Q) 图等来检查更丰富的分布表示法。通过这些更丰富的表示,您可以检测数据的重要特征,例如多模态行为或重要类别的离群值。

考虑离群值

仔细研究离群值,因为它们可能是煤矿中的金丝雀,指示您的分析存在更基本的问题。您可以从数据中排除离群值,或将它们归入“异常”类别,但您应确保自己知道数据最终计入该类别的原因。

例如,查看点击次数最少的查询可能会发现您未能统计的元素的点击次数。查看点击次数最多的查询可能会发现您不应统计的点击次数。另一方面,可能存在一些您永远无法解释的离群值,因此您需要谨慎选择在此任务上投入的时间。

考虑噪声

随机存在,并且会欺骗我们。有些人认为:“Google 有这么多数据,噪音就消失了。”这是不可能的。您生成的每个数据或数据摘要都应该附带一个表示您对此估算值的置信度的概念(通过置信区间和 p 值等测量方法)。p-values

查看示例

每次生成新的分析代码时,您都需要查看底层数据的示例,以及代码如何解读这些示例。如果不执行此步骤,几乎不可能生成任何复杂程度的有效代码。您的分析会从底层数据中提取很多细节,以生成有用的摘要。通过查看各个示例的完整复杂度,您可以确信摘要的合理性。

如何对这些示例进行采样非常重要:

  • 如果要对基础数据进行分类,请查看属于每个类的样本。
  • 如果类别较大,请查看更多样本。
  • 如果要计算某个数字(例如网页加载时间),请务必查看极端示例(最快和最慢的 5%;您确实知道您的分布情况是什么样的吧?)以及整个测量空间内的点。

细分数据

切片意味着将数据拆分为多个子组,并分别查看每个子组的指标值。我们通常会按浏览器、语言区域、网域、设备类型等维度进行划分。如果底层现象在不同子组之间可能会以不同的方式发挥作用,您必须对数据进行切片,以确认是否确实如此。即使您预计切片不会产生不同的结果,但查看几个切片以确保内部一致性可让您更有信心地衡量正确的指标。在某些情况下,特定切片可能包含错误数据、损坏的用户互动,或者在某些方面存在根本性差异。

每次对数据进行细分以比较两个组(例如实验组与对照组,甚至是“时间 A”与“时间 B”)时,您都需要注意组合的变化。混合偏移是指每个组的切片中的数据量不同。这可能会导致出现 辛普森矛盾和其他混淆。通常,如果两组切片中数据的相对量相同,您就可以放心地进行比较。

考虑实际意义

面对大量数据,您可能倾向于只关注统计显著性或深入研究每一位数据的细节。但您需要问问自己:“即使 X 值确实比值 Y 高 0.1%,这还重要吗?”如果您无法理解部分数据/对其进行分类,这样做尤为重要。如果您无法理解日志中的某些用户代理字符串,那么无论这些字符串代表数据量的 0.1% 还是 10%,都将在很大程度上决定您应调查这些情况的程度。

或者,有时您有少量数据。许多更改看起来并不具有统计显著性,但这不同于声称这些更改是“中性”的。您必须问自己,“还有多少可能仍然存在实际显著变化?”

检查一段时间内的一致性

您几乎始终应该尝试按时间单位切片数据,因为随着我们的系统的不断发展,底层数据会出现许多干扰。(我们通常使用天,但其他时间单位可能也很有用。) 在首次发布某项功能或新数据收集期间,从业者通常会仔细检查是否一切按预期运行。但是,随着时间的推移,可能会发生许多破坏或意外行为。

特定日期或日期集是离群值,并不意味着您应该舍弃相应的数据。在舍弃某天或多天之前,将数据作为钩子来确定该日期不同的因果原因。

通过查看逐日对比数据,您还可以了解数据的变化,这些变化最终会导致置信区间或声明具有统计显著性。这通常不应取代严格的置信区间计算,但通常对于大幅变化,从日同比图表中就可以看出,它们具有统计显著性。

确认滤除并计数

几乎所有大型数据分析都会先在不同阶段过滤数据。也许您只想考虑美国用户、网页搜索或带广告的搜索。无论是哪种情况,您都必须:

  • 确认并明确说明您所进行的过滤。
  • 计算每一步过滤的数据量。

通常,要实现该目标,最佳方式就是计算所有指标,甚至包括要排除的用户群体。然后,您可以查看该数据来回答诸如“垃圾信息过滤功能移除了多大比例的查询?”这样的问题。(根据您执行过滤的原因,系统未必总能执行这类分析。)

比率应有明确的分子和分母

最有趣的指标是基础测量的比率。很多时候,有趣的过滤或其他数据选择隐藏在分子和分母的精确定义中。例如,下面哪一项“查询 / 用户”实际上表示?

  • 查询次数 / 提出查询的用户数
  • 查询次数 / 今天访问过 Google 的用户数
  • 查询次数 / 拥有有效账号的用户数(是的,我必须定义“有效”

这里要做到清楚明确,可以避免您自己和他人感到困惑。

另一种特殊情况是只能根据部分数据计算的指标。例如,“点击时间”通常表示“考虑到有点击,点击时间”。每当您查看此类指标时,您都需要确认过滤功能并找出要比较的群组之间的过滤功能变化。

处理

本部分包含有关如何处理数据、针对数据提出哪些问题以及需要检查哪些内容的建议。

将验证、说明和评估分开

数据分析可以分为三个相互关联的阶段:

  1. 验证1:我是否相信数据是自洽的、收集得当,且符合我的预期?
  2. 说明:什么是对此数据的客观解读? 例如,“用户执行的归类为 X 的查询变少了”“在实验组中,X 和 Y 之间的时间增加了 1%”以及“转到下一页结果的用户较少”。
  3. 评估:根据以上描述,数据是否表明正在为用户、Google 或整个世界带来好事?

通过分离这些阶段,您可以更轻松地与他人达成一致。说明应当是所有人都能就数据达成共识的内容。 评估可能会引发更多的争论。如果您没有将说明和评估分开,那么您很可能会只看到对希望看到的数据的解释。此外,评估往往要困难得多,因为确定指标的规范值(通常是通过与其他功能和指标进行严格的比较)需要大量投资。

这些阶段并非线性推进。在探索数据时,您可以在阶段之间来回切换,但任何时候都应清楚自己所处的阶段。

确认实验和数据收集设置

在查看任何数据之前,请确保您了解数据的收集情境。如果数据来自实验,请查看实验配置。如果数据来自新的客户端插桩,请确保您至少对数据的收集方式有大致的了解。您可能会发现异常/错误的配置或填充限制(例如,仅适用于 Chrome 的有效数据)。此处值得关注的事项可以帮助您在以后构建和验证理论。需要注意的一些事项:

  • 如果实验正在运行,请自行尝试。如果无法做到这一点,请至少浏览一下屏幕截图/行为说明。
  • 检查实验运行的时间范围是否存在任何异常情况(节假日、大型发布等)。
  • 确定哪些用户群体进行了实验。

检查不应更改的内容

在“验证”阶段,在实际回答您感兴趣的问题(例如,“添加一张人脸的图片是否增加或减少了点击次数?”)之前,请排除数据中可能影响实验的任何其他可变性。例如:

  • 用户数量是否发生了变化?
  • 我的所有子群组中是否显示了正确数量的受影响查询?
  • 错误率是否发生了变化?

无论是比较实验/对照组,还是研究一段时间内的趋势,这些问题都是合理的。

标准层级、自定义层级

在查看新功能和新数据时,人们特别倾向于直接查看这项新功能的新指标或特殊指标。不过,您应始终先查看标准指标,即使预计这些指标会发生变化也是如此。例如,向网页添加新的通用块时,请务必先了解“网页搜索结果点击次数”等标准指标的影响,然后再深入研究有关此新结果的自定义指标。

与自定义指标相比,标准指标的验证效果更好,且更有可能获得正确结果。如果自定义指标与标准指标没有意义,则自定义指标很可能是错误的。

测量两次或更多次

尤其是在您尝试捕获新现象时,应尝试以多种方式衡量同一基础对象。然后,确定这些测量值是否一致。通过多次测量,您可以识别测量或日志记录代码中的 bug、底层数据的意外功能或重要的过滤步骤。如果能使用不同的数据源进行测量,效果会更好。

检查可重现性

一段时间内的切片和一致性都是检查可再现性的具体示例。如果某个现象重要且有意义,您应该会在不同的用户群和时间中看到它。但验证可重现性意味着不仅仅执行这两项检查。如果要构建数据模型,您希望这些模型在底层数据出现小幅波动时保持稳定。使用不同的时间范围或随机的数据子样本,也可以了解此模型的可靠性/可重现性。

如果模型不可重现,则可能是因为您没有捕获到有关生成数据的底层过程的基本信息。

检查是否与过去的测量结果一致

通常情况下,您需要计算的指标类似于过去计算的指标。您应将自己的指标与过去报告的指标进行比较,即使这些衡量是针对不同的用户群体的也是如此。

例如,如果您查看的是某个特殊群体的查询流量,经过测算,平均网页加载时间为 5 秒,但过去针对所有用户的分析显示的平均网页加载时间为 2 秒,则您需要进行调查。您的电话号码可能适合这个群体,但现在您需要执行更多工作来验证这一点。

您无需获得确切的一致意见,但双方应保持一致。否则,在能够完全说服自己之前,请认为是错误的。但最出人意料的数据往往是错误的,而不是一个不可思议的新洞见。

应先将新指标应用于旧数据/特征

如果您创建新的指标(可能通过收集新的数据源)并尝试学习新指标,那么您将无法确定新指标是否正确。对于新指标,您应该首先将其应用于已知的特征或数据。例如,如果您有一个用于衡量用户满意度的新指标,则应确保该指标有助于您了解最佳的特征有助于用户提高满意度。如果您有关于用户将注意力引导到网页的新指标,请确保它与我们通过眼动追踪或评分者研究了解的图片对网页注意力的影响一致。当你学习新知识时,通过这种方法进行验证。

提出假设并寻找证据

通常,对复杂问题的数据分析是迭代式的。2 您将发现数据的异常情况、趋势或其他特征。您自然会制定各种理论来解释这些数据。不要只是提出一个理论并宣称其是真实的。寻找证据(数据内外)以确认/否认这一理论。例如:

  • 如果您发现某些内容看起来像是学习趋势,请查看该趋势对于高频用户来说是否最为明显。
  • 如果您认为异常值是由于某些功能的启动造成的,请确保相应功能所发布的用户是唯一受该异常影响的用户。或者,确保更改的幅度与发布的预期一致。
  • 如果您发现某个语言区域的用户增长率发生变化,请尝试寻找一个外部来源来验证该语言区域变化率。

出色的数据分析应该有说服力。为确保故事正确无误,您需要讲述故事,然后寻找证据来证明这是错误的。一种方法是问自己:“我应该运行哪些实验来验证/使我讲述的故事无效?”即使您没有/无法进行这些实验,也可以为您提供一些思路,让您了解如何用自己拥有的数据进行验证。

好消息是,这些理论和可能的实验可能会带来新的研究领域,而不仅仅局限于尝试了解任何特定特征或数据。然后,您将进入一个领域,不仅理解这些数据,还能为未来的各种分析得出新的指标和技术。

端到端迭代的探索性分析优势

在进行探索性分析时,请对整个分析进行尽可能多的迭代。通常,您需要执行多个步骤,包括信号收集、处理、建模等。如果您花费太多时间使初始信号的第一阶段变得完美,就会错失在相同时间内执行更多迭代的机会。此外,当您最终查看数据时,您可能会发现一些发现会改变您的方向。因此,您最初的关注点不应放在完美上,而是要一直追求合理的价值。请自行记录,并承认过滤步骤和无法解析或异常的请求等情况,但不要浪费时间在探索性分析开始时将其全部清除。

留意反馈

我们通常会围绕用户成功制定各种指标。例如,用户是否点击了某条结果?如果您随后将这些数据反馈给系统(我们实际上在很多地方进行此操作),就会造成大量评估混乱。

您不能使用反馈回系统的指标作为评估更改的基础。如果展示的广告越多,点击次数也越多,就不能以“更多点击次数”作为判断用户满意度的依据,尽管“点击次数更多”通常意味着“更满意”。此外,您甚至不应对反馈给和操纵的变量进行划分,因为这会导致难以理解或不可能实现的混合变化。

心态

本部分将介绍如何与他人协作和交流洞见。

数据分析始于问题,而非数据或分析法

分析数据总是值得的。将您的需求表述为问题或假设有助于确保您收集到应收集的数据,并且您正在考虑数据中可能存在的缺口。当然,您提出的问题应该会随着您查看数据而不断变化。然而,如果没有问题的分析,结果将毫无意义。

避免这样一种陷阱:先找到最喜欢的分析法,然后只找到该技术可以解决的问题部分。同样,创建清晰的问题有助于避免这种陷阱。

持怀疑态度,勇于拥抱

在使用数据时,您必须既是所获得数据洞见的拥护者,又对这些数据持怀疑态度。你有望在研究的数据中发现一些有趣的现象。当您检测到有趣的现象时,请思考以下问题:

  • 我还可以收集哪些数据来证明这有多棒?
  • 我能发现什么会让这项政策失效?”

尤其是当您为真正需要特定答案的人进行分析时(例如,“我的功能很棒!”),您必须扮演怀疑者以免出错。

相关性 != 因果关系

在就数据提出理论时,我们经常需要断言“X 会导致 Y”,例如“网页加载速度变慢导致用户点击的次数减少”。即使是 xkcd 也知道,您不能简单地通过相关性来建立因果关系。通过考虑如何验证因果理论,您通常可以更好地了解因果理论的可信度。

有时,人们会试图坚持认为某项关联有意义,方法是做出以下陈述:即使 A 和 B 之间没有因果关系,也必须存在巧合,使一个信号成为另一个信号的良好指标或代表性。这对于多个假设测试问题来说是危险的;正如 xkcd 也知道的,如果有足够的实验和足够的维度,某些信号将与特定实验保持一致。这并不意味着相同的信号将来会相一致,因此您有相同的义务考虑因果理论,例如“有一个隐藏效应 C 导致 A 和 B”,这样您可以尝试验证这种情况的合理性。

数据分析师经常必须针对希望使用数据的人员处理这些因果问题。您应该与这些消费者明确,关于因果关系,您可以说些什么,不可以说些什么。

先与同行分享,其次与外部消费者分享

前面几点建议了一些方法,以帮助您执行正确的健全性检查和验证。但与同事分享是强迫自己做所有这些事的最佳方式之一。熟练的同行可以提供与数据使用者不同性质的反馈,尤其是在消费者通常有议程的情况下。对等设备在分析过程中在多个时间点都很有用。很早,您就可以发现您的同行知道的陷阱、对衡量指标的建议以及过去在此领域的研究。接近最后,类似应用非常擅长指出奇怪之处、不一致之处或其他混淆之处。

理想情况下,您应该从对您正在查看的数据有所了解的同行那里获得反馈,但即使是只拥有一般数据分析经验的同行也极具价值。

承认无知和错误并接受

我们从数据中学到的内容有很多限制。Nate Silver 在信号和噪声中有一个很好的例子,只有接受我们确定的极限,我们才能改进预测。承认无知是一种通常不会立即带来回报的能力。当时感觉很不舒服,但从长远来看,这对您和您的团队来说是巨大的好处。犯错后才(甚至太晚!)发现错误会更糟糕!但主动承担错误会让您倍感尊重。这种尊重会转化为信誉和影响力。

结束语

进行高质量数据分析的许多工作对分析的使用者来说不会立即显现出来。您仔细检查人口规模并验证这种影响在各个浏览器之间一致,可能无法让试图根据这些数据做出决策的用户意识到这一点。这也解释了为什么良好的数据分析需要的时间比大多数人想象的要长(尤其是在他们只看到最终输出时)。作为分析师,我们工作的一部分是逐步引导基于数据分析的消费者,了解这些步骤的含义以及重要性。

对数据进行所有这些操作和探索的需求也提出了良好的数据分析语言和环境的要求。我们有很多工具可用来检查数据。不同的工具和语言更适合上面讨论的各种技术;选择正确的工具对分析师而言是一项重要技能。您不应受限于自己最熟悉的工具的功能;您的工作是提供真正的数据洞见,而不是应用特定工具。

 


  1. 这有时称为“初始数据分析”。请参阅 维基百科中关于数据分析的文章 

  2. 从技术上讲,只有在进行探索性分析时,它才应该是迭代式分析,而不能是确认性分析。