良好的数据分析

作者: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-values等衡量方式)。

查看示例

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

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

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

对数据进行细分

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

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

考虑实际显著性

当数据量庞大时,人们往往倾向于单纯地关注统计显著性,或者关注每一个数据的细节。但您需要问自己:“即使 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. 从技术上讲,只有进行探索性分析时才能迭代,而不是确认性分析。