Chapter 4 数据科学的其他话题

4.1 定义数据科学问题

数据分析的第一步是明确定义数据分析的问题。在进行数据分析之前,关键是明确所要提出的问题类型。根据使用数据回答问题的难易程度进行排序,可以将数据分析问题类型分为描述性、探索性、推断性、预测性、因果性和机械性。

  1. 描述性数据分析旨在总结单个数据集中的测量结果,不涉及进一步的解释。例如,美国人口普查就是一个描述性数据分析的例子,其目标是总结人口普查数据并描述人口的分布情况,而解释和利用这些数据则留给决策者和公众。

  2. 探索性数据分析通过研究多个变量之间的发现、趋势、相关性或关系,来寻找新的想法或假设。探索性数据分析的目的是发现潜在的模式或关联,但很少能够确认这些发现。

  3. 推断性数据分析超越了探索性分析,通过量化观察到的模式是否可能在手头的数据集之外持续存在。推断性数据分析通常是在正式的科学文献中进行的,其目标是确定关系的强度,并确定该关系是否具有普遍性。

  4. 预测性数据分析使用一组测量值(特征)来预测另一个测量值(结果)。预测性数据分析的目的是构建模型来预测未来的结果,但并不一定能够解释为什么这种预测有效。

  5. 因果性数据分析旨在找出一个测量值如何影响另一个测量值。因果性数据分析可以确定变量之间的关系,包括其大小和方向,例如,在随机临床试验中确定治疗方法对结果的影响。

  6. 机械性数据分析旨在识别嘈杂变量之间的平均效应。机械性数据分析不仅着眼于了解效应的存在,还试图解释效应的运作方式,例如,分析翼型设计如何影响飞机的气动性能。

在进行推断性分析时,特别要注意不要将相关性误解为因果关系。此外,还应该避免将探索性分析或预测性分析解释为推断性分析,以免导致错误的结论。因此,在数据分析过程中,要根据所研究的问题类型,选择合适的分析方法,并谨慎使用相关的语言和术语。

4.2 建模与统计推断

在统计建模和推断中,主要目标是利用一小部分个体的子样本来推断整个群体的情况。采用子样本的原因通常是测量整个群体数据的成本或难度。子样本是通过概率确定的。统计建模和推断用于试图将我们在样本中观察到的情况推广到整个群体。推断包括两个独立步骤,首先是对我们在群体中期望的情况进行最佳估计。推断还用于量化我们对所估计数量的不确定性。这种不确定性可能由多种来源引起,包括我们只有群体的样本、用于测量数据的技术,或者被测量个体之间的自然变异。良好的统计模型应考虑所有这些变异来源。

在进行探索性和验证性分析时,如果可能的话,应该使用不同的数据集。如果打算在没有先验模型或假设的情况下探索数据集中的新关系,则应将数据拆分为两个随机子样本。在数据的第一部分进行探索,并确认你检测到的任何关系是否出现在分析结束时的第二部分中。典型的拆分比例是70%用于发现,30%用于验证。在定义人口、样本、个体和数据时,应明确区分它们。例如,在临床试验中,人口可以是可能接受糖尿病药物的所有人。样本是我们将在试验中招募的人的子集,个体(有时称为抽样单位)是试验中的人,数据是这些人的测量数据。

识别样本可能不代表整体群体的原因很重要。如果从人口中完全随机地抽取样本,那么它将是代表性的,或者可以理解它为何不代表整体群体。然而,通常无法从人口中随机抽样。因此,人们会根据便利性、成本和时间进行样本选择。确保报告样本可能不代表整体群体的所有原因也很重要。

确定遗漏数据的分布也很重要。应确定缺失值是否与数据集中的任何变量相关联。如果一个变量的缺失值的存在与第二个变量相关联,则检测到的两个变量之间的关联可能会失真。对离群值进行检查也很重要,因为单个变量的异常值可能会导致汇总统计量(如相关性或回归系数)中的明显大关系。确保估计具有合理的符号和幅度也很重要。如果发现每增加一年的教育,收入就增加100万美元,那么数据集或分析可能存在问题。对于非常小或非常大的样本,应谨慎使用不确定性的估计。在非常小的数据集中,没有足够的数据来准确衡量不确定性。在非常大的数据集中,不确定性的度量值将是准确的,但问题可能不再是我们对估计值有多少不确定性 - 我们将对它们非常确定。在这种情况下,可以专注于估计值的值是否有意义,或者与其他值有意义地不同 - 而不是潜在的不确定性。

在进行多重假设检验时,应该纠正多重检验。经典假设检验设计是为了在5%的情况下呼叫结果显著,即使零假设是真的(例如,没有发生任何事情)。对多重检验进行校正的一个常见选择是使用误发现率来控制你称之为显著的事物是错误发现的速率。人们喜欢这个度量,因为你可以将其视为你发现的信号中的噪声率。当存在许多真正的发现时,这个错误率是最广泛使用的。另一个常见的错误率是家族错误率,即在你执行的所有测试中进行至少一次错误显著呼叫的概率。控制家族错误率的标准方法是Bonferroni校正。使用误发现率比家族错误率会导致更多的测试结果被认为是显著的,但显著结果可能包含更多的假阳性。

当你有时间、距离或时间测量的数据时,应进行平滑处理。这是统计学中最古老的思想之一 - 回归是平滑的一种形式。常见的平滑方法包括平滑样条、移动平均和loess。

了解你的真实样本大小非常重要。数据集的大小可能会让人误解。想象一下,你有一个简单的黑色圆圈在白色背景上的图像,以像素的形式存储。随着分辨率的增加,数据的大小会增加,但信息量可能并不会增加(因此矢量图形)。同样,在基因组学中,你测量的读数数量(这是数据大小的主要决定因素)不是样本大小,而是个体的数量。在社交网络中,网络中的人数可能不是样本大小。如果网络非常密集,则样本大小可能要小得多。通常来说,样本大小越大越好,而样本大小和数据大小并不总是紧密相关的。

常见错误包括未考虑相关性、过度关注p值而忽视置信区间、在没有探索数据的情况下进行推断,假设统计模型拟合良好等。确保报告估计值的不确定性也很重要,否则你就是在声称你知道该参数的确切值。此外,在数据集中拟合统计模型后,评估模型描述数据的能力也很重要。最后,进行推断时,应确保对正确的群体进行推断,因为如果推断到错误的群体或者在采样后群体发生变化,则所有结果都将存在偏差。

4.3 因果推断

在因果数据分析中,金标准是将特定的实验设计(如随机研究)与标准的统计分析技术相结合。如果正确执行,实验设计可以帮助确定变量如何平均影响彼此。然而,非随机实验的因果数据分析通常难以证明。观察性研究中的因果数据分析需要更多技术性的统计分析和对不可测试且常常不切实际的假设的信任。

即使在随机研究中,因果解释也可能存在困难。临床试验中的一些常见困难包括患者退出试验倾向于某种治疗方法、试验的不盲性以及难以接受或遵守的治疗。这些问题使得即使在随机研究中,因果分析也很困难。因此,对于随机研究,需要使用探索性分析来确认随机分组是否起作用,以确保各组之间的所有非随机变量测量大致相同。

因果数据分析的目标是确定通常嘈杂变量之间的平均效应。例如,数十年的数据显示吸烟和癌症之间存在明显的因果关系。但即使存在因果关系,也不能确定每个个体都会患癌症,因为因果效应是对平均风险的影响。因此,除非进行了随机实验或使用因果技术,否则在分析中应避免使用因果语言。

在因果数据分析中,常见的错误之一是将相关性或关联性解释为因果关系。因此,即使发现了著名的冰淇淋销量和谋杀案之间的相关性,也不应将相关性解释为“冰淇淋销量导致谋杀率增加”。

4.4 分析结果展示

数据分析是一项涉及沟通的工作,其重要性不亚于统计学。一份书面数据分析报告的目标是以清晰易读的方式向非技术人员传达信息,讲述一个明确、精确且引人入胜的故事。在整个报告中,需要重点关注文本、图表、方程式和代码等各个元素,确保它们能够有助于讲述故事。

一份书面分析报告通常包括标题、引言或动机、所使用的统计或机器学习模型的描述、结果(包括不确定性度量)、结论(包括可能存在的问题)以及参考文献等要素。

在撰写分析报告时,首先应该明确你尝试回答的问题,这个问题应该是一个科学或商业应用问题,而不是一个统计或计算问题。接下来,应该解释实验设计,包括数据来源、采集方式以及相关技术和系统的信息。

对于数据集的描述也是至关重要的,应该解释对数据进行了哪些处理,并产生了什么样的整洁数据。通常,可以通过一张表来总结整洁数据集中的变量,并包括样本量、变量数量、每个变量的平均值和方差或标准差等信息,以帮助识别数据版本问题。

在描述统计模型时,应该使用方程式或伪代码进行规范说明。模型的数学规范应该完全清晰,每个术语和指标都应该用简单的语言解释。另外,对于模型中的错误项应该指定其不确定性分布和所做的假设。

每个参数的估计值和不确定性度量都应该以科学尺度报告,并解释其重要性。报告时应该注意避免报告无关的分析,并及时报告可能存在的问题。

最后,在使用统计或机器学习方法时,务必引用其原始来源,以便读者了解其背后的理论基础。即使是常见的技术也应该至少引用教科书。

4.5 数据科学演讲

在展示数据方面,数据科学演讲可以帮助你:结交朋友、让人们对你的想法/软件/结果感到兴奋、帮助人们理解你的想法/软件/结果。第一点的重要性不容忽视。你进行演讲的主要目的是让人们了解你。有名望且受人尊敬可以让你工作中的许多方面变得更容易。因此,首先要确保在演讲之前、之后和期间都不要忘记与人交流。

第二点比第三点更重要。作为一名数据科学家,很难接受演讲的主要目的是宣传,而不是数据科学。参考希拉里·梅森的出色演讲《娱乐,而不是教育》。以下是娱乐更重要的原因:尽管如此,在娱乐时要非常小心,避免进行TED演讲。如果你进行的是数据科学演示,则目标是传达特定的想法。因此,在娱乐的同时,不要忘记你娱乐的目的。

将你的演讲定制给你的听众。这取决于活动和活动的目标。以下是一个非全面的列表:小组会议、会议上的短讲、长格式正式演讲、求职演讲。

将你的演讲按故事形式排序。在进行演讲时最大的陷阱是假设其他人会跟随你,因为你跟随着演讲。了解你的听众知道和不知道的内容至关重要。通常,最好假设你的听众知道的比你认为的要少。人们喜欢感觉聪明。我很少听到有人因为解释太基础而抱怨,但经常听到有人迷失方向的抱怨。此外,一定要用大字体。字体永远不会太大。小字体会引起愤怒。确保包含联系信息,图中的坐标轴标签应为简明易懂的英文。尽量减少幻灯片上的文字。解释每张幻灯片上的图表。使用方程使想法具体化,但使用时应谨慎。愿意承认“我不知道”。回答问题时要区分你的响应类型。永远不要咄咄逼人。按时结束演讲。将你的演讲放在合适的位置。

4.6 可重复性

可重现性涉及使用分析人员提供的代码和原始数据来重新计算数据分析中的确切数字。实现可重现性通常很困难,并且已经减缓了重要数据分析错误的发现。可重现性不应与数据分析的“正确性”混淆。一个数据分析可以完全可重现,重现分析中的所有数字,但仍然可能是误导性或不正确的。

确保分析可重现的主要方法是创建能够准确生成分析中所有数字和图形的代码脚本。R markdown和iPython notebooks都对组织脚本很有用。这些工具将代码、纯文本和图形集成到一个文档中,是所谓的“文学编程”的示例。R markdown文档包含文本、代码和图形,可以轻松转换为pdf或HTML格式。

记录软件和参数的版本很重要。如果你使用的是R或Python等开源软件,则软件包通常会更新,其行为可能会发生变化。至少应记录执行分析所使用的软件版本。在R中,你可以使用sessionInfo()命令或更详细的devtools::session_info()命令来获取此信息。

对数据分析文件的良好组织结构是将单独的文件夹用于数据、图形、R代码和文本。当进行分析时,保持对所编写软件版本的跟踪是个好主意。其中一个非常流行的方法是使用Github。你可以将R脚本、R markdown文档和小型数据集放在Github上,然后使用版本控制系统Git来管理你的分析。

设置种子对于涉及随机抽样的计算(例如,如果你使用自助法或排列),则需要设置随机数种子。这将确保不同的人在运行你的分析时计算机生成的伪随机数始终相同。在R中,你可以使用命令set.seed(13323)来实现这一点,其中13323可以替换为任何正整数。

如果你正在处理大型数据集,请创建一个脚本来计算摘要度量。然后以整洁的格式将中间数据集保存在csv或制表符分隔的文件中,以便轻松共享。

检查可重现性的最佳方法是让其他人在不同类型的计算机上运行你的数据分析脚本。他们应该能够运行分析并获得相同的图形和结果,而无需向你提问。

4.7 总结

数据分析清单

  1. 回答问题
    1. 在处理数据之前,你是否明确指定了数据分析问题的类型(例如,探索、关联、因果)?
    2. 在开始之前,你是否定义了成功的度量标准?
    3. 你是否了解问题的背景和科学或业务应用?
    4. 你是否记录了实验设计?
    5. 你是否考虑了问题是否可以用现有数据回答?
  2. 检查数据
    1. 你是否绘制了数据的单变量和多变量摘要?
    2. 你是否检查了异常值?
    3. 你是否确定了缺失数据代码?
  3. 整理数据
    1. 每个变量是否为一列?
    2. 每个观察值是否为一行?
    3. 不同的数据类型是否出现在每个表中?
    4. 你是否记录了从原始数据到整洁数据的步骤?
    5. 你是否创建了一个代码手册?
    6. 你是否记录了应用于数据的所有参数、单位和函数?
  4. 探索性分析
    1. 你是否识别了缺失值?
    2. 你是否制作了单变量图(直方图、密度图、箱线图)?
    3. 你是否考虑了变量之间的相关性(散点图)?
    4. 你是否检查了所有数据点的单位,确保它们处于正确的范围内?
    5. 你是否尝试识别任何错误或变量的错误编码?
    6. 你是否考虑使用对数刻度绘图?
    7. 散点图是否更具信息性?
  5. 推断
    1. 你是否确定了你试图描述的大型人群?
    2. 你是否清楚地确定了模型中感兴趣的数量?
    3. 你是否考虑了潜在的混杂因素?
    4. 你是否确定并建模了潜在的相关源,例如随时间或空间的测量?
    5. 你是否为科学尺度上的每个估计量计算了不确定度的度量?
  6. 预测
    1. 你是否确定了你的误差度量?
    2. 你是否立即将数据分为训练集和验证集?
    3. 你是否仅在训练数据上使用交叉验证、重采样或自举法?
    4. 你是否仅使用训练数据创建特征?
    5. 你是否仅在训练数据上估计参数?
    6. 你是否在将其应用于验证数据之前固定了所有特征、参数和模型?
    7. 你是否仅将一个最终模型应用于验证数据,并报告错误率?
  7. 因果关系
    1. 你是否确定你的研究是否是随机的?
    2. 你是否确定了导致因果关系可能不适用的潜在原因,例如混杂因素、缺失数据、非可忽略的退出或非盲实验?
    3. 如果没有,你是否避免使用会暗示因果关系的语言?
  8. 书面分析
    1. 你是否描述了感兴趣的问题?
    2. 你是否描述了数据集、实验设计和你要回答的问题?
    3. 你是否清楚地指定了你正在回答的数据分析问题的类型?
    4. 你是否清楚地用符号表示了你正在拟合的确切模型?
    5. 你是否解释了在感兴趣的尺度上每个估计量和不确定度的含义?
    6. 你是否为科学尺度上的每个估计量报告了不确定度的度量?
  9. 图表
    1. 每个图是否传达了重要的信息或回答了感兴趣的问题?
    2. 你的所有图是否都包含了简明扼要的轴标签?
    3. 字体大小是否足够大以供阅读?
    4. 每个图是否都有详细的说明,解释了图中的所有轴、图例和趋势?
  10. 演示
    1. 你是否以简明易懂的语句开头描述了你的问题?
    2. 你是否在解释模型之前解释了数据、测量技术和实验设计?
    3. 你是否在解释模型之前解释了你将用于建模数据的特征?
    4. 你是否确保所有图例和轴都可以从房间的后面看清楚?
  11. 可重复性
    1. 你是否避免手动计算?
    2. 你是否创建了一个能够重现所有分析的脚本?
    3. 你是否保存了原始和处理后的数据版本?
    4. 你是否记录了用于处理数据的所有软件版本?
    5. 你是否尝试让其他人运行你的分析代码,以确认他们得到了相同的答案?
  12. R包
    1. 你是否使你的包名“可搜索”?
    2. 你是否为你的函数编写了单元测试?
    3. 你是否为所有函数编写了帮助文件?
    4. 你是否编写了一个文档?
    5. 你是否尝试减少对活跃维护的包的依赖?