第 6 章:数据分析导论

前几章专门用于查找和收集数据。但是现在我们有了数据,我们应该用它做什么?本章将帮助您了解如何执行简单的数据分析。

在许多方面,术语数据分析描述了一个非常基本的操作:访问数据集。与任何面试一样,这意味着您对数据集提出问题。有时这些问题并不是特别复杂,您可以通过例如将一列从最大值到最小值进行排序来回答它们。其他时候它们更复杂,您需要运行多个分析来回答它们。

本章将向您介绍通过表格进行数据分析的基本概念,表格是 Google 帐户持有人可以免费访问的基于网络的程序。我们讨论的大多数功能也可在 Microsoft Excel 中使用。

虽然我们在本章中使用的许多方法和工具都可以很容易地在 Python 中复制,但对于初学者在过于专注于编写代码之前专注于分析的概念步骤是有帮助的。换句话说,在将它们作为代码执行之前,在 Sheets 或 Excel 等界面中进行分析是很有用的。为此,在本章中,我们将使用各种方法来完成数据分析过程,以检查两个 Twitter 帐户的活动。

数据分析的过程

一个常见的假设是,数据集是可靠的事实集合,我们可以像接收数据一样在研究中使用它们。通常我们认为的数据集只是汇总数据。但是汇总数据中的发现来自对调查或其他原始数据数据库的相当杂乱、千差万别的答复,即尚未处理的数据。

美国人口普查局等组织提供的数据表通常是从数千(如果不是数百万)原始数据条目中清理、处理和聚合的,其中许多可能包含数据科学家努力解决的几个不一致问题。例如,在列出人们职业的简单表格中,这些组织可能已经解决了不同但本质相同的回答,例如“律师”和“律师”。

同样,我们在本书中看到的原始数据——来自社交网络的数据——可能非常不规则且难以处理,因为它是由真实的人产生的,每个人都有独特的怪癖和发帖习惯。我们必须对其进行总结,以找出能够回答我们提出的问题的趋势和异常情况。这种处理不一定复杂和困难;通常它只是意味着我们必须经历一些乏味但相当简单的任务。

分析数据的过程中涉及到一些主要的方法。我们将在本章中看到的内容改编自 Amanda Cox 和 Kevin Quealy 的纽约大学数据新闻课程,可在 http://kpq.github.io/nyu-data-journalism-2014/classes/sort-filter-聚合合并/。

修改和格式化 数据几乎从来没有以我们需要的格式组织一致。通过修改和格式化它,我们可以更轻松地比较值。

聚合 我们可以通过应用简单的数学运算来查询格式化的数据,这称为聚合。聚合数据的形式可以是查找数据列中所有值的总和,也可以意味着对给定值的实例进行计数,例如名称在电子表格中出现的频率。

排序和过滤 我们可能只想询问我们的数据在任何给定列或类别中的最大值或最小值是多少。我们通常可以通过对数据进行排序和过滤来回答这些基本问题。例如,通过按降序对电子表格进行排序,我们可以轻松地在电子表格的顶部看到最大值。通过过滤,我们可以找出哪些行共享特定值。

合并 比较两个数据集的最有效技术之一是合并它们,或将它们合并为一组。

抽象地说,这些方法可能不是很直观,但在这里我们将使用它们来调查和更好地了解两种类型的 Twitter 用户的活动:自动机器人帐户的活动和人类的活动。

机器人发现

社交网络上既有像你我这样的真人,他们在社交媒体上与朋友联系,也有机器人,它们是通过代码控制的自动帐户。机器人按照脚本的指示发布内容(其中许多是用 Python 编写的!)。这些机器人并不总是恶意的:一些自动帐户发布令人愉快的俳句,而另一些则向您发送新闻机构的最新头条新闻。

在本章中,您将学习如何使用 Google 表格检查 Twitter 帐户的社交媒体数据,数字取证研究实验室的专家已将其识别为机器人。然后,我们会将这些数据与真实社交媒体用户的活动进行比较。

注意有关数字取证研究实验室及其研究的更多详细信息,请参阅 https://www.digitalsherlocks.org/。

我们的分析非常类似于 BuzzFeed 新闻分析通过识别 Twitter 机器人可能显示的各种特征来发现自动帐户。图 6-1 显示了 BuzzFeed 制作的两个图表,用于说明机器人和人类活动之间的区别。

图 6-1:两个图表显示了人类活动与 2017 年机器人异常高活动的对比

出于经济或政治动机的人们可以使用机器人开始在线辩论并将对话引向特定主题。 在最坏的情况下,可以使用大量机器人来严重夸大持有某种观点的人数。

虽然没有万无一失的方法来确定虚假或欺骗性在线演员的身份,但机器人最明显的迹象之一是当帐户发推文超出人类可能的范围时。 因此,在本练习中,我们希望查看机器人和真人的日常活动水平。 我们将导入、清理、格式化和分析从 Twitter 帐户 @sunneversets100 收集的帖子数据集。 通过这样做,我们将熟悉 Google 表格提供的有用工具。

好的,准备好开始机器人发现了吗? 我们走吧。

Google 表格入门

要使用表格,您需要一个 Google 帐户。如果您还没有,可以在 https://accounts.google.com/SignUp 免费注册。拥有帐户后,导航到 Google Drive (https://drive.google.com/),这是一种基于云的存储,可让您整理所有文件。

组织数据非常重要。与编码一样,数据分析可能需要多次尝试才能正确,并且可能涉及多个步骤。那么,数据组织不仅是为了整洁,也是为了准确性。我们越有条理,就越容易追踪我们的步骤、修改我们的方法以及在未来重现我们的分析。

让我们首先在我们的 Google Drive 中创建一个文件夹来存储与我们的数据分析相关的任何文件。将每个项目保存在一个文件夹中始终是一个好习惯。类似于我们脚本中的注释就像是对我们未来的自己当时思考过程的注释一样,我们创建的不同文件和文件夹是帮助我们导航分析的一种方式。文件夹和评论使我们和其他人能够更轻松地复制我们的工作,并且可以补充我们可能编写的任何其他注释来记录我们的数据分析步骤。要创建文件夹,请选择新建>文件夹。

接下来我们需要命名文件夹。为数据文件夹和文件制定明确的命名约定是确保我们和观察者都能清楚地了解文件夹用途的好方法。您为项目采用的命名约定取决于您,但要保持一致。我通常使用日期和一些显示文件夹包含内容的关键字来命名文件夹,例如:mmddyyyy-related-keywords。对于本练习,让我们使用该约定并将我们的新文件夹命名为“04062019-social-media-exercises”。

现在让我们创建一个新的电子表格文件。如果您不在新文件夹中,请通过 Google Drive 的左侧导航双击它。创建文件时,它应该自动存储在该文件夹中。

要创建新电子表格,请选择新建 > Google 表格 > 空白电子表格。这应该会弹出一个新选项卡,浏览器会在其中加载新的电子表格(见图 6-2)。如果您以前使用过 Microsoft 的 Excel 软件,那么该窗口应该看起来很熟悉。

图 6-2:空白电子表格

让我们使用我们用于“04062019-social-media-exercises”文件夹的相同约定命名我们的电子表格文件:“04062019-tweet-analysis-@sunneversets100”。

接下来,我们需要用数据填充我们的电子表格。在本练习中,我们将使用来自“@sunneversets100”的数据,这是一个从 Twitter API 下载的用于发布政治新闻的 Twitter 帐户(在此处找到有关 Twitter API 的更多信息:https://developer.twitter.com/)。这些推文是使用社交媒体数据脚本收集的,您可以在 https://github.com/lamthuyvo/social-media-data-scripts/ 找到这些数据脚本以及如何使用它们的详细纲要。数据以“.csv”文件的形式从 API 收集,这是 Google 表格知道如何与之交互以生成电子表格的一种文件类型。您可以在此处下载数据:https://github.com/lamthuyvo/social-media-data-book。

要开始导入,请转至文件 > 导入 > 上传。出现提示时,选择上传功能,导航到您下载 @sunneversets100 数据的文件夹,然后上传 .csv 表。

Google 表格应该会要求您选择导入选项。选择导入位置、分隔符类型并转换为数字和日期。选择替换当前工作表作为您的导入位置——这就是我们使用 Twitter 数据填充当前空工作表的方式。由于数据格式为 .csv 文件,因此选择逗号作为分隔符。 (您还可以让 Sheets 自动检测分隔符,这通常也能正常工作。)最后,当 Sheets 要求将文本转换为数字和日期时,选择否。

对于数据分析,无论是在 Sheets、Python 还是任何其他工具中,了解文本转换的工作原理都很重要。格式化,或者,正如 Sheets 在这里所说的,“转换文本”,对于编程语言来说是至关重要的。 Sheets 等软件可识别字符串(即文本)与其他类型的数据(如整数、浮点数(数字)或日期时间)之间的差异。虽然我们人类可以根据它的书写方式确定一个值是代表日期、数字还是单词,但大多数软件和编程语言无法自动做到这一点,因此他们通常需要进行复杂的猜测。如果我们在导入选项 Convert Text to Numbers and Dates 下选择 Yes,Google Sheets 就会这样做:它会尝试猜测哪个值是数字、日期或单词。这是我们不应该自动化的步骤。例如,我们希望将邮政编码解释为文本,而不是数字,因为邮政编码就像一个区域的标签,即使它们只包含数字。但是,如果我们将其留给 Google 表格,它可能会将它们转换为数字并可能丢失信息(例如,以零开头的邮政编码会丢失第一位数字)。当涉及到猜测时,尽可能少地自动化。

完成上述所有步骤后,您应该拥有一个如图 6-3 所示的电子表格。

图 6-3:电子表格中导入和未更改的数据

好的! 现在我们准备进行一些数据处理!

修改和格式化数据

为了有效地使用 Sheets 函数,我们需要确保 Sheets 正确解释每个数据列。这是格式化派上用场的地方。但是,在您开始更改电子表格之前,我们需要执行数据分析中最重要的步骤之一:制作未更改的原始数据集的副本。

人类是会犯错的。我们应该始终三重检查我们的数据操作和计算,但我们也应该确保我们可以回到原始数据集,以防我们在此过程中出错。虽然 Google 表格与其他 Google 产品一样,会在您工作时自动跟踪您的更改(请参阅文件 > 版本历史记录),但您应始终以易于访问的格式保留一份数据副本,并允许您在执行操作时引用它分析。这样,当您想查看数据最初的外观时,您就无需调出旧版本的电子表格。

最简单的方法是为数据分析的每个步骤创建工作表的副本并相应地重命名。当我们从数据集中创建、更改或删除值或整个列时,这尤其有用。对我们数据的破坏性修改以后可能很难撤消,因此从长远来看,通过多个工作表跟踪我们的步骤可以使事情变得更容易。

首先,转到工作表底部,双击工作表 1 工作表选项卡,并为其指定一个描述内容的名称。在这种情况下,我们重命名第一个工作表原始数据。然后,要复制工作表,请单击工作表名称旁边的箭头并从弹出的菜单中选择复制,如图 6-4 所示。

图 6-4:复制工作表

这应该会打开第二个工作表,我们也可以重命名它。 对于此练习,将其称为步骤 1:修改和格式化。 这是我们将用于应用格式的电子表格。 在第 1 步电子表格中,通过单击列标题上方的字母选择包含每条推文的收藏计数的列(在本例中,我们感兴趣的值是 B 列中的时间戳)。 整个列应突出显示为蓝色。 然后选择格式>数字>数字,如图6-5所示。

这会将该列中的每个值从字符串转换为数字。 您需要为转发列重复这些步骤,该列也包含数字。

图 6-5:电子表格格式选项

请注意,我们从 API 获得的时间戳非常精细,代表了 Twitter 如何在数据库中构建和存储它。数据的粒度很棒。它允许我们以各种方式聚合我们的数据:我们可以查看发送推文的确切时间,精确到秒,或者查看发布推文的日期。但是,要访问这些不同类型的数据摘要,首先我们需要修改我们的数据。

正如我所提到的,数据分析通常包括将数据转换为正确格式的乏味且有时令人叹息的过程。特别是对于人类创建的数据,这意味着我们需要先清理数据,然后才能比较值。例如,如果我们正在收集推文文本数据,我们可能需要解析同一单词的各种拼写(例如,“gray”与“grey”)或删除拼写错误和拼写错误。对于通过代码或机器人收集的数据,我们可能需要通过将其拆分为各个部分或寻找不同的组合方式来修改数据。例如,在时间戳数据的情况下,我们可能希望将推文的发布日期与发送时间分开。

让我们快速回忆一下我们的任务是什么:我们正在分析可疑机器人的 Twitter 活动,以将其与人类活动区分开来。我们可以通过查看可疑帐户“@sunneversets100”推文每天的平均次数来做到这一点。专家表示,与人类发推文相比,机器人活动异常高。根据数字取证研究实验室的说法,每天发推文 72 次或更多是可疑的,每天发推文 144 次或更多是高度可疑的。现在我们可以使用 Sheets 来确定 @sunneversets100 的活动水平是否高得令人怀疑。

目前,我们的时间戳数据显示了推文发布的日期和时间,如下所示:2017-05-01 05:43:57。我们可以通过计算任何给定日期在我们的原始数据中出现的次数来获得每日发布的推文“@sunneversets100”。为了完成此任务,我们将使用称为数据透视表的表格功能。但是要使用数据透视表,首先我们必须创建一个仅包含每条推文发布日期的新列。我们需要通过删除小时、分钟和秒来修改包含整个时间戳的列,这样我们就只剩下日期了。

分离数据的一种简单方法是使用“数据”菜单下的“将文本拆分为列”工具。此内置工具会在列值中查找重复特征。一旦检测到模式,它就会尝试将值拆分为两列。模式可以包括诸如用逗号分隔的名字和姓氏(如“Smith, Paul”)之类的东西,或者在这种情况下,用空格分隔的日期和时间。

要使用该工具,首先我们将在 created_at 列的右侧创建一个空列。右键单击 created_at 列上方的字母,然后从菜单中选择 Insert 1 right。现在我们可以使用 Split Text to Columns 工具而不会覆盖任何其他数据。单击包含时间戳数据的列的字母,然后选择数据 > 将文本拆分为列。

系统会提示您通过一个小弹出菜单选择分隔符。分隔符默认为自动检测,但由于我们确定分隔日期和时间的部分是空格,我们可以选择空格。该工具应将值保留在当前列中的分隔符左侧,并将内容移动到我们刚刚创建的新列中的分隔符右侧。

此工具最适用于格式化为纯文本的数据,Sheets 将其解释为字符串。请记住,当我们第一次导入数据并且 Sheets 要求将文本转换为数字和日期时,我们选择了 No。这确保每个数据单元格都将被解释为字符串而不是数字或日期。对于本练习,最好先将我们的值作为字符串进行操作,然后再将它们格式化为任何其他数据类型。

我们经常需要重新格式化整个列,以告诉 Sheets 如何解释每种数据类型。如果字符串被格式化为类似于 created_at 列中的日期,我们只能利用基于日期的函数。同样,数学运算只能对已格式化为数字的值进行。

我们现在不需要更改电子表格中数据值的格式。然而,为了内务管理,我们应该重命名我们的新列。命名具有新隔离日期日期的列和具有新隔离时间时间的列。

等等!我们已将一列的值分成两部分,现在可以继续计算日期出现的频率。

聚合数据

我们现在已经完成了设置用于分析的数据的基本步骤。首先,我们将数据导入到表格中,然后我们对其进行了修改,使其格式设置为允许我们对其进行分析。现在数据已准备好,我们可以继续进行数据分析过程的下一步:聚合数据。我们将使用两个 Sheets 功能来做到这一点:数据透视表和公式。

使用数据透视表汇总数据

数据透视表是 Sheets 最强大的功能之一。它们使我们能够汇总大量详细数据并以各种方式对其进行分析——例如,我们可以计算某个术语在列中出现的次数,或者计算基于日期或类别的数值总和。换句话说,数据透视表在易于导航的界面中为我们提供了大量数据的鸟瞰图。他们通过创建一个汇总表来做到这一点,其中包含有关我们原始数据的统计信息,例如某个值在列中出现的总次数。

我们可以使用数据透视表来查找 Twitter 数据集中每个日期的频率。由于我们知道数据集中的每一行都代表有关单个推文的信息,因此我们可以有把握地说,特定日期出现的次数也代表了“@sunneversets100”帐户在任何给定日期发布的推文数量。

要进行此分析,首先我们需要选择要包含在数据透视表中的数据。要选择步骤 2 中的所有数据:修改和格式化工作表,请单击第一行上方第一列左侧的矩形。然后选择“数据”>“数据透视表...”(参见图 6-6)并在“工作表”询问插入数据透视表的位置时选择“新建工作表”选项。这应该会打开一个名为 Pivot Table 1 的新工作表。

图 6-6:访问数据菜单中的数据透视表

在新创建的工作表的右侧,工作表提供了许多用于填充数据透视表的选项。我们想用我们在列中隔离的日期填充我们的行。

选择行 > 添加,然后从下拉菜单中选择日期列。选择日期列后,表格会为数据集中出现的每个日期创建一行。然后我们需要告诉数据透视表为汇总日期显示什么样的值。这些值将出现在日期旁边的列中。

我们想计算每个唯一日期出现的次数。单击“值”>“添加”,再次选择日期列,然后选择您希望 Sheets 对数据执行的数学运算类型。在这种情况下,有两个选项听起来可能适用于我们的分析:COUNT 和 COUNTA。我们将选择 COUNTA,因为 COUNT 仅适用于格式化为数字的数据。您可以将 COUNTA 视为可以计算任何内容的工具。

这将创建一个数据透视表,汇总日期在详细数据集中出现的次数(图 6-7)。这个数据透视表允许我们对 @sunneversets100 帐户进行初步评估。我们知道,一个每天推文 72 次或更多的帐户是可疑的,而一个推文 144 次或更多次的帐户是高度可疑的。是否有此帐户每天发布 72 次或更多推文的日子?当然!它是否有超过 144 次推文的日子?的确!在最繁忙的一天,该帐户发布了 586 条推文。这意味着 @sunneversets100 在 24 小时内大约每 2.5 分钟发布一次推文,这听起来不像是一个普通人如果只想与世界分享他们的想法会做的事情。

图 6-7:我们使用 COUNTA 查找每个日期的出现次数生成的数据透视表

使用公式做数学

我们只是使用数据透视表来回答有关我们数据的一个重要问题:特定 Twitter 帐户每天发推的频率如何?使用此工具,我们可以查看机器人发推文的次数对人类用户来说是可疑的高数的日子。然而,推特行为每天都在变化。即使一个帐户一天发了 72 次或更多次推文,这并不一定意味着该帐户一直在发推文的次数可疑。

假设我们还需要找到该帐户发布的平均推文数。我们将使用一个新功能来回答我们的问题——欢迎来到公式的乐趣!

您可以将公式视为内置于表格中的函数。表格通过等号 (=) 区分普通数据和公式。所有公式都包含一个等号,后跟一个函数名称和一个左括号和右括号——例如,=lower(A2)。

我经常告诉我的学生,如果他们在 Excel 或 Sheets 中使用公式,那么他们已经在进行基本的编码。与 Python 函数一样,公式有严格的规则(即语法),接受参数,并允许我们根据这些规则和参数之间的交互创建新值。

例如,我们在第 1 章中使用 Python len() 函数并将字符串“apple pie”传递给它以查找该字符串的长度:

>>> len("apple pie")
9

Sheets 有一个名为 len 的公式,它可以完成完全相同的事情。 要使用它,请打开一个新的电子表格并在左上角的单元格中输入以下内容:

=len("apple pie")

您用来编写公式的单元格应显示数字 9。

更令人兴奋的是,我们可以将电子表格单元格作为参数传递给公式。 我们通过使用单元格的列字母和行号在电子表格上找到它的坐标来指定一个单元格作为参数,这可以分别在电子表格的顶部和左侧找到。

接下来,在第一列的第二个单元格中输入 apple pie。 这意味着该单元格位于 A 列和第 2 行。我们可以通过将“apple pie”替换为存储在第一个单元格中的公式中的单元格坐标 A2 来找到该字符串的长度,如下所示(注意我们不使用引号 当我们使用单元格坐标时标记):

=len(A2)

我们还可以将多个单元格传递给某些公式。 选择多个单元格的语法会根据我们尝试选择的单元格而变化。

回到我们的数据分析,我们想要找到@sunneversets100 帐户发布的平均帖子数。 我们可以使用恰当命名的 =average() 公式来做到这一点。

=average() 公式采用一组单元格并找到它们值的平均值。 该公式允许您选择单个单元格或范围内的单元格。 例如,我们可以通过向 =average() 公式传递一个单元格列表来获得数据透视表中所有单元格的平均值,每个单元格用逗号分隔:

=average(B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15)

不过,使用 =average() 公式的一种更清晰、更方便的方法是使用冒号来选择一系列连续的单元格。 范围从冒号之前指定的单元格开始,并包括通过冒号之后指定的单元格的所有单元格。

例如,要获得单元格 B2 到 B15 的平均值,我们使用以下公式:

=sum(B2:B15)

要选择一整列,我们可以使用没有任何行规范的冒号,例如:=average(A:A)。行也是如此:=average(2:2)。 Sheets 还允许我们从同一文件的不同工作表中选择单元格,方法是在引号中指定工作表名称,后跟感叹号,如下所示:=average(‘Sheet 1’!A:A)。

选择单元格的最后一种方法是使用光标。选择一个空单元格,然后开始写公式直到左括号。在本练习中,我们将重复使用 =len() 公式,因此输入 =len(。然后使用光标选择要传递给公式的单元格。在本例中,选择单元格 A2 . 这应该使用单元格坐标自动填充公式。添加一个右括号。只要单元格 A2 包含单词“apple pie”,完成的公式 =len(A2) 应该显示 9。

现在您已经了解了公式的工作原理,您可以回到 Twitter 分析并应用您所学到的知识。返回数据透视表并在空单元格中输入公式 =average(B2:B15)。一旦你点击返回,你应该看到来自 @sunneversets100 帐户的平均每天推文数是 212。仍然高得令人怀疑!

谷歌表格带有无数这样的公式。例如,如果我们在单元格中输入公式 =sum() 并选择一列数字,我们可以找到这些值的总和。

公式的一大优点是我们可以将它们复制并粘贴到多个单元格中,以对多列或多行数据执行相同的操作。更好的是,Sheets 允许智能复制和粘贴。要查看其工作原理,请返回步骤 1:修改和格式化工作表。

假设我们想测量电子表格中每条推文的长度。我们可以在 H 列的右侧创建一个新列,其中包含每条推文的文本。如果我们在单元格 I2 中输入公式 =len(H2),复制公式,然后将其粘贴到 I2 之后的所有行中,Sheets 足够智能,可以计算出每条推文的长度,而不仅仅是 H2 处的推文原公式参考。

这是因为 Sheets 不只是复制公式的实际字母;它具有内置逻辑,可以根据应用它的单元格更改公式的参数。换句话说,Sheets 记得我们正在尝试测量包含公式的单元格旁边的推文的长度,而不是位置 I2 的单元格。

我们不可能涵盖通过 Sheets 提供的所有公式,但未来需要记住的一个方便的工具是当 Sheets 检测到您正在使用公式时会显示的小帮助窗口。当您开始输入公式时会弹出该窗口,通常会显示有关公式采用什么类型的参数的信息,向您展示如何使用公式的示例,并说明公式输出的数据,如图 6- 8.它不是一个完整的公式词汇表,但它是开始试验的好地方。

借助数据透视表和公式,您现在拥有了执行简单操作的工具,只需单击几下即可回答有关数据集的问题。更重要的是,希望您也看到了可以通过多种方式回答数据查询。

图 6-8:表格中弹出的公式助手窗口

对数据进行排序和过滤

既然您知道如何导入、修改和聚合数据,下一步就是对结果进行排序和过滤,以便对我们要查找的数据进行排序或隔离。

将数据结果从大到小排序,反之亦然,这是为结果分配层次结构的好方法,并且可以更轻松地进行交流。在我们分析的背景下,我们可以对数据透视表中的数据进行排序,以了解可疑机器人帐户在其最繁忙的一天发布推文的频率。一种方法是使用我们的聚合结果创建一个新工作表并将整个工作表更改为过滤器视图。

首先,通过在要包含在排序表中的所有单元格上单击并拖动光标来选择数据透视表的结果。突出显示单元格后,通过在突出显示的单元格之一内部单击鼠标右键并选择复制(或使用快捷方式 cmd-C for Mac 或 ctrl-C for PC)来复制选择。

然后,与其他步骤一样,遵循最佳实践,创建一个用于对数据透视表数据进行排序的新工作表。要使用数据透视表结果填充此工作表,我们将使用一种称为特殊粘贴的方法。

因为在表格中复制会将公式和数据透视表功能复制到新电子表格中,所以我们将无法修改数据透视表中显示的实际值。不过,对我们来说幸运的是,Sheets 允许我们根据公式和数据透视表的结果粘贴值。右键单击新工作表第一行第一列的单元格,然后选择选择性粘贴> 仅粘贴值。这应该将值而不是公式粘贴到单元格中。当您粘贴这些值时,它们将被删除任何格式。这意味着我们复制并粘贴到新单元格中的日期可能会被格式化为整数字符串。要将它们再次格式化为日期,请使用光标突出显示包含日期的单元格,右键单击突出显示的单元格之一,然后选择格式 > 数字 > 日期。

现在我们需要选择我们想要变成过滤视图的数据。选择当前工作表中所有数据的最简单方法是单击第一列旁边和第一行上方的空白矩形。接下来,单击过滤器图标(看起来像一个漏斗)旁边的小箭头,选择单元格后,选择“创建新的过滤器视图”(图 6-9)。

图 6-9:Google Drive 中的过滤视图选项

过滤视图工具允许我们访问每一列的各种功能,例如按值或条件过滤我们的数据(例如,我们可以过滤我们的表以仅显示大于 100 的值)。我们还可以对数据进行排序。这个工具不会修改我们的数据集——它只是改变我们看到数据的顺序或它的哪些部分是可见的(当我们过滤掉值时,我们不会删除它们;它们只是在过滤器时隐藏起来被申请;被应用)。

让我们看看我们的过滤器选项。通过单击每个列标题旁边的三角形,我们可以过滤电子表格以仅显示整个数据集的子部分。我们可以选择和取消选择每列中的值,并根据行是否包含每个值来隐藏或显示行。

当我们只想分析数据的一个子集时,过滤会很有帮助。它通常用于根据最小或最大阈值或特定时间范围来隔离原始数据。过滤器选项还可以帮助我们针对数据集提出更具体的问题。例如,在我们的推文分析中,我们可能只对至少有 100 次转发的推文感兴趣。或者,我们可能想查看特定月份内发布的推文。

我们还可以根据条件或条件(我们之前在讨论 Python 时探讨过的概念)过滤值。谷歌表格在其过滤工具中内置了许多方便的条件,允许我们根据相当简单的条件过滤数据。例如,如果我们选择 Filter by Condition>Cell Is Not Empty 选项,我们的工作表将只显示有数据的单元格(见图 6-10)。

图 6-10:Google Drive 中的过滤器选项

最后,我们可以使用 Sort AŽZ 和 Sort ZŽA 选项对我们的数据进行排序。 Sort AŽZ 允许我们按升序对行进行排序:从最小数值到最大,从最早到最晚日期,或按字母顺序从 A 到 Z。 Sort ZŽA 按降序对我们的数据进行排序,这与升序相反。

对数据集进行排序可能会帮助您回答许多研究问题中的一个。对于我们的 Twitter 分析,这可能包括以下问题:该帐户最早发送的推文是什么?最新的是什么?哪条推文最受欢迎?哪一个得到了最多的转发?尝试过滤数据以回答这些问题。

合并数据集

我们将考虑用于数据分析的最后一种方法是合并或加入数据集。将一个数据集与另一个数据集进行比较是使用 Sheets 等工具最强大的方法之一。通过合并两张工作表,我们可以轻松地比较基于共同类别的值。

然而,在得出关于数据集之间关系的主要结论时,我们应该谨慎。相关性不等同于因果关系。这意味着即使两个数据集看起来像是有关系——也就是说,数据集看起来是相关的——但这并不意味着一个数据集导致了另一个数据集的结果。数据集之间的相关性和因果关系应该得到来自报告、专家或实地研究的其他研究的支持。但即使是两个或多个数据集之间最简单的比较也非常具有说明性。

那么我们如何在 Sheets 中连接两个表呢?我们可以使用一个名为 =vlookup() 的方便的公式来帮助我们交叉引用两个电子表格并根据一个共同的值合并它们。我们通过引用一个值并在用作字典的表中查找来使用此公式。

例如,要将“@sunneversets100”的推文活动与真实的人(您)在 2017 年的前两周内操作的 Twitter 帐户的活动进行比较,您可以执行与“@sunneversets100”相同的步骤,您自己的帐户。如果您没有 Twitter 帐户,您可以复制一份电子表格 https://github.com/lamthuyvo/social-media-data-book,其中包含人工管理的“@nostarch”帐户 (https://twitter.com/nostarch/) 的信息。

要合并这两个电子表格,请先在电子表格中创建另一个选项卡。你很快就会用你感兴趣的日期填充左列——在这种情况下,是 2017 年上半年的数据,因为那是 @sunneversets100 发推文的时间段。我们可以将此列称为“merged_counts_sunneversets100_”,其中“”是人工控制的 Twitter 帐户的名称。

对于时间序列,我们可以在顶部输入一个名为 date 的列标题,然后为每一行填写一个日期。我们将从最早的日期 4/13/2017 的单元格 A2 开始。将此日期输入电子表格。然后在 A3 中输入 4/14/2017。我们希望列中的其余行包含日期,直到我们到达 @sunneversets100 发推文的最后一个日期,5/01/2017。您可以使用一些方便的表格功能来填写列的其余部分,而不是单独输入每个日期。输入两个日期,选择它们,然后将鼠标悬停在第二个单元格的右下角,直到光标变成一个小十字。然后双击或单击并将十字向下拖动到第 20 行。工作表将根据它在前两个单元格中检测到的模式自动填充行。

接下来,我们需要使用=vlookup() 公式将@sunneversets100 推文的数据透视表与包含我们的日期的表合并,该公式在一个表中查找值,在另一个表中查找值,然后检索数据基于这个共同的价值观。不过,在我们这样做之前,请在日期列旁边为“@sunneversets100”的每日推文计数设置一个新列。

=vlookup() 公式在其括号内使用了四个参数。首先,它想知道您要查找哪个值:

=vlookup(A2, ...)

这是=vlookup() 将在另一个表中查找的值。 在这种情况下,A2 单元格应包含我们的日期系列中的第一个日期,4/13/2017。

对于第二个参数,公式想知道哪个范围代表我们将在其中查找值的参考表或字典。

=vlookup(A2, 'Pivot Table 1'!A:B, ...)

在我们的例子中,这是表示我们将在单元格 A2 (4/13/2017) 中查找值的表格的值范围。我们首先将包含我们的查找表的工作表名称和每日推文数指定为一个字符串(在本例中为“数据透视表 1”),然后是一个感叹号 (!),表示 '数据透视表 1' 是不同工作表的名称。之后,就像我们之前选择单元格时所做的那样,我们需要指定查找表的值所在的列,在本例中为 A 列和 B 列,在表格中表示为 A:B。

我们选择的范围应包括我们将用于连接数据集的列(A 列中的日期)以及我们要用于填充新表和合并表的值(B 列中的计数)。在这种情况下,我们需要确保 A 列包含日期,因为我们试图在该列中查找单元格 A2 (4/13/2017) 中表示的日期。对于数据透视表,我们始终需要确保范围内的第一列包含我们要查找的值。

一旦 Sheets 在我们的“数据透视表 1”的 A 列中找到单元格 A2 (4/13/2017) 中表示的日期,它将检查包含日期 4/13/2017 的行,然后在该行中查找值它应该转移到我们合并的数据集。这是 vlookup() 公式的第三个参数发挥作用的地方: vlookup() 要求我们告诉它哪一列包含我们想要拼接到新合并表中的值。而且,更复杂的是,它想知道相对于我们范围的第一列的列位置。在我们的例子中,此数据位于日期列旁边的列中,因此代表我们范围内的第 2 列。

=vlookup(A2, 'Pivot Table 1'!A:B , 2, ...)

想象 Sheets 像一个无方向的机器人一样穿过这两个表可能会有所帮助,它需要真正万无一失的指示来做什么。 到目前为止,通过这个公式,我们已经告诉表格记住单元格 A2 中包含的日期(2017 年 4 月 13 日)。 然后我们让 Sheets 转到数据透视表 1 并筛选 A 列和 B 列以找到 2017 年 4 月 13 日的日期。 一旦它在 A 列中找到包含日期的行,我们希望它转到我们通过“数据透视表 1”选择的范围的第二列(或第 2 列)!A:B。

差不多好了! 最后,我们需要向 =vlookup() 解释我们正在查看的范围是否与我们为数据合并创建的表的排序顺序相同。 在这种情况下,我们选择 FALSE(为了安全起见,默认为 FALSE 是好的,因为即使查找表已按照与当前表相同的顺序排序,选择此选项也会返回正确的结果)。

=vlookup(A2, 'Pivot Table 1'!A:B, 2, FALSE)

要在我们指定的时间范围内(2017 年 4 月 13 日至 5 月 1 日)在整个列中运行此公式,我们可以将其复制并粘贴到整个列中。 如前所述,Sheets 允许智能复制和粘贴,并将为每个日期运行每个公式,而不是将相同的公式逐字粘贴到每个单元格中,这只会将我们的公式应用于单元格 A2。

执行此操作后,@sunneversets100 列中的单元格现在应该包含一系列公式。

如果我们用人类 Twitter 帐户复制我们对 @sunneversets100 遵循的过程,我们会得到一个新的合并表,允许我们并排查看数据,如图 6-11 所示。

图 6-11:我们的分析,在 vlookup() 公式无法从查找表中检索数据的单元格中呈现错误

您可以看到我们的一些结果是#N/A,这意味着不可用并表明我们的公式返回了错误。这是因为我们为数据透视表生成的某些日期没有数据。这些是帐户 @sunneversets100 或人类帐户没有发推文的日期。

为了避免这些错误,我们应该用数值 0 填充当前包含 #N/A 的单元格。一种方法是修改我们当前的公式,以便它可以在发生错误时处理错误。这是在分析过程中要牢记的一个重要概念,因为这个问题经常在程序员的整个工作流程中反复出现。

Sheets 提供了一个名为“=iferror()”的有用公式,我们可以在这里使用它。 =iferror() 公式有两个参数。第一个是我们想要在单元格上运行的公式——在本例中为 vlookup()。由于我们已经编写了该公式,因此只需将它及其参数嵌套在我们的 iferror() 公式中。

以下是 iferror() 公式及其第一个参数的外观:

=iferror(vlookup(A2, 'Pivot Table 1'!A:B, 2, FALSE), ...)

注意这里我们不需要 vlookup() 公式的等号; 我们只需要在单元格的开头添加一个就可以向表格表明我们将使用公式。

iferror() 的第二个参数是 Sheets 应该回退到的值,以防第一个参数 - 在这种情况下,我们的 vlookup() 公式 - 返回错误。 出于我们的目的,我们希望该回退值是 0。这是因为我们的数据透视表仅汇总了数据集中发布推文的日期的推文数量,并且我们还希望包括其他日期以消除 # 不适用结果。

完成的 iferror() 公式应该如下所示:

=iferror(vlookup(A2, 'Pivot Table 1'!A:B, 2, FALSE), 0)

一旦我们在两列之间复制了公式,合并后的表格应该并排显示两列(见图 6-12)。

如您所见,机器人的推文比我们分析的人类账户多得多。 虽然这不是最具统计代表性的分析,但这些轶事数据仍然可以帮助我们了解自动化账户与真实人类账户的比较。

图 6-12:我们完成的电子表格应该是什么样子

此外,我们还学到了一些非常重要的原则。您现在知道您需要修改和格式化您的数据,以便计算机能够真正理解它。您已经学习了如何根据类别将原始数据聚合成更大的摘要。您已经了解到,对数据进行排序和过滤可以通过显示层次结构使您的分析更加清晰。您已经了解了合并数据集的威力。这些概念将在您在 Sheets 和 Python 中完成的许多工作中发挥作用。当您继续发展作为数据分析师的技能时,它们应该有助于指导您的思维过程。

其他使用 Google 表格的方法

本章介绍了 Google Sheets 中的许多不同功能,但该程序还有许多其他功能,我们没有空间在这里讨论。谷歌有一个方便的手册,其中介绍了其中的一些:https://support.google.com/docs/answer/6000292?hl=en&ref_topic=2811806。

可能值得深入研究 Sheets 中可用的其他公式。一些最流行的公式通常用于操作字符串或进行数学运算(您可以在此处找到一长串公式:https://support.google.com/docs/table/25273。

最终,如果您发现自己一遍又一遍地执行相同的任务,您甚至可能想要编写自己的自定义函数。下面是如何做到这一点的一个方便的演练:https://developers.google.com/apps-script/guides/sheets/functions。

Sheets 能够处理大量简单的分析,并且在线提供了丰富的资源,可以满足您的需求。但它确实有其局限性,尤其是在它冻结或减慢之前可以处理的数据量方面。我们将在后面的章节中查看 Python 库 pandas 以进行类似于我们在这里介绍的一些分析的分析,但规模要大得多。

概括

在本章中,您看到了如何使用 Google Sheets 进行简单的数据分析:您学习了如何在 Sheets 中导入和组织数据,如何针对数据集提出特定问题,以及如何通过修改、排序、过滤、并汇总数据。

在下一章中,我们将在本章开始的分析的基础上,学习如何通过视觉效果更好地理解我们的发现。我们将使用条件格式和图表等工具来更有效地解释和传达我们的结果。