原文:
annas-archive.org/md5/3274833fb18d92bf583cc3cb9a8936c2译者:飞龙
第六章:开始使用 Power BI
将数据可视化以理解业务中“发生了什么”:这是组织在利用数据时最初且始终存在的需求。毫不奇怪,商业智能应用程序是公司最早采用的工具,它们往往比“更炫酷”的高级分析工具提前数月(甚至数年)出现。尽管我们可以—可以理解地—对由机器学习算法驱动的预测和指导能力感到兴奋和迫不及待,但一个简单的在线仪表板,展示关键业务指标的演变,往往能在短期内占据主导地位。让更多员工接触到数据将增加识别商业机会的概率,并促使业务经理做出更为有意识和有效的基于数据的决策。这个场景太具吸引力,无法被忽视,现在是时候为我们的数据分析工具箱增加一款能释放描述性分析潜力的工具了:Power BI。
本章将回答以下问题:
-
什么是 Power BI,我该如何开始使用?
-
如何加载、转换和组织数据?
-
如何创建能够互相交互的数据可视化?
-
Power BI 仪表板是什么样的,我该如何创建一个?
在熟悉 Power BI Desktop 用户界面后,我们将一步步构建一个完整的仪表板。最终目标是让你在读完最后一页时,具备创建自己仪表板的所有能力。本章的重点是 Power BI 以及你开始使用它所需的基础内容。接下来的两章将帮助你提升数据可视化和讲故事的能力,让你能够制作出能够有效说服他人的数据图表。一件事一件事地来:现在让我们认识一下我们在数据分析探索中的新英雄。
Power BI 简介
Power BI是微软提供的一项商业智能服务,允许创建在线数据仪表板。让我们来看看它的最基本功能:
-
Power BI 附带一款传统的应用软件,叫做Power BI Desktop,你可以免费下载并安装到你的计算机上。Power BI Desktop 提供了 Power BI 的完整设计功能:你可以使用这款软件创建仪表板,保存为本地文件(.pbix 格式),然后与其他用户分享,后者也可以查看和编辑你的仪表板。为了完成本章内容,你只需要使用 Power BI Desktop 应用程序。
-
需要知道的是,Power BI 主要作为云服务提供。如果您决定在公司大规模使用 Power BI,以利用企业数据源并通过浏览器或移动应用程序在线提供仪表板(无需所有用户安装 Power BI Desktop 并通过电子邮件打开共享的文件),那么您可以通过购买 Pro 或 Premium 许可证来实现。这样,您的仪表板将依赖于 Microsoft 云平台 Azure 来托管、处理并将数据提供给最终用户。
如果您的公司使用 Microsoft 365 云服务,您可能已经拥有 Power BI Pro 许可证:值得检查一下这一点。
-
Power BI 利用一个用户友好的 可视化界面,让您无需编写任何代码即可设计仪表板。不过,如果您想指定高级查询,可以使用一种编程语言 DAX,即 数据分析表达式(Data Analysis eXpressions)的缩写。本书中不会涉及 DAX,但了解如果需要,您可以利用它来扩展 Power BI 的功能。
-
Power BI 提供的功能远不止简单的数据可视化。它允许您从不同的来源提取数据,转换并统一表格,应用一些逻辑和算法,并通过互动图表或其他非传统方式使数据变得可访问。例如,Power BI 的一个显著功能是让用户可以通过用简洁的英语输入问题来获取数据,比如 X 品牌在过去两年的利润变化是什么? 在这种情况下,您作为设计师的角色将是“教” Power BI 如何理解同事们的问题,例如决定哪些词可以作为同义词来描述相同的实体(例如,文章、SKU 和 产品)。
-
Power BI 可以通过额外的功能和可视化效果来扩展。您可以访问 Microsoft 应用商店 AppSource(appsource.microsoft.com),在这里您可以免费下载额外的自定义可视化效果。扩展 Power BI 功能的另一种方式是添加 Python 或 R 代码片段,以便实现专业图表或增加机器学习功能。
总的来说,Power BI 承诺成为一个强大且全面的工具,通过易于访问的仪表板帮助公司实现数据民主化:这正是我们所需要的,可以完成我们的数据分析工具箱,并为我们的业务释放可观的价值。在探索其用户界面并熟悉命名约定之前,让我们先在你的计算机上启动 Power BI Desktop。你可以从下载页面 (powerbi.microsoft.com/en-us/downloads) 获取并安装它,或者在 Windows 的 Microsoft Store 应用中查找它。虽然本章并不要求,但你也可以注册一个免费的 Power BI 许可证。这将使你能够访问基于云的服务,并将报告保存在云端(与他人共享则需要购买付费许可证)。
走进 Power BI
在 Power BI 中构建一个可用的仪表板需要经过四个基本步骤:加载数据、转换数据、定义数据模型,以及利用数据模型创建数据可视化。如图 6.1所示,这四个步骤交替进行,形成一个循环——你的仪表板可能需要几次迭代才能准备好投入使用:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_01.png
图 6.1:典型的 Power BI 设计流程:加载数据并转换数据,定义模型,构建可视化,并进行迭代
这个过程的每个步骤都依赖于应用程序中的某些特定视图或对话框。通过仅使用少量视图,你就能访问构建仪表板所需的所有功能。图 6.2展示了一个简单的“地图”,标明了在哪里可以找到最有用的 Power BI 视图和窗口,以确保你在过程中不会迷失方向:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_02.png
图 6.2:感觉迷失了吗?这里是你在 Power BI 中找到最有价值视图的地方
在接下来的几页中,我们将带你完成创建仪表板的完整过程,并探索那些在过程中将帮助我们的关键 Power BI 功能。
加载数据
不出所料,您在 Power BI 中需要做的第一件事就是加载一些数据。如果您直接点击欢迎屏幕上的获取数据,或者点击顶部主页功能区中的图标,您将进入获取数据窗口,如图 6.3所示。这个窗口展示了多种可能的数据连接器,并按左侧显示的类别组织(文件、数据库、在线服务等)。第一类也是最常用的类别是文件:在这里,您不仅可以导入 Excel 或 CSV 单个文件,还可以导入整个文件夹,甚至可以从 PDF 报告中提取数据。从数据库类别中,您可以连接到许多类型的数据库,并指定 SQL 查询来获取所需数据。在这里,您还可以连接到基于云的平台,如 Amazon Web Services(Redshift)、Google Cloud Platform(BigQuery)以及当然的 Microsoft Azure。在线服务类别让您可以连接到其他外部服务,比如 Google Analytics、Salesforce 报告和 Sharepoint 列表。也可以查看其他类别:名为Web的源让您可以从网页抓取数据,并下载感兴趣的表格或其他网页元素。
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_03.png
图 6.3:Power BI 中的获取数据窗口:定义如何获取所需的数据
通过设置数据连接器,您定义了一个可重复的流程的第一步,用于获取和转换您感兴趣的数据:在 Power BI 中,这样的流程被称为查询。定义查询是一种强有力的方式,可以确保您的仪表板能够持续更新。每次刷新报告时,查询都会连接到各个数据源,并拉取最新版本的可用数据。
转换数据
对于每个查询,您可以关联一系列的数据转换步骤,这些步骤将在每次新数据到达时应用。在 Power BI 中,您可以通过一种名为Power Query 编辑器的工具以可视化方式完成此操作,无需编写任何代码,如图 6.4所示。在查询编辑器的左侧,您会看到一个名为查询的面板,您可以从中选择要设置转换步骤的查询:只需点击您希望处理的查询名称即可。
你会看到一个类似 Excel 的电子表格视图,位于窗口中间,显示了你转换后的查询的预览。单元格的值是只读的:你无法逐个更改它们,实际上,你在这里的目的是为整张表定义可重复的转换步骤,而不是进行单元格级别的更改。你可以使用电子表格的表头来应用一些转换,例如筛选和排序,类似于你在 Excel 中的操作。在右侧,你会看到一个名为 应用步骤 的面板,其中列出了至今为止应用的转换步骤的有序列表。第一步很可能是 来源,它指示了你加载的原始数据来源的定义。一些转换步骤的右侧会有一个齿轮图标:点击它,你可以编辑该转换步骤的参数。例如,如果查询从 Excel 文件中提取数据,你可以通过点击 来源 步骤旁边的齿轮图标来编辑文件路径。
当你选择一个特定的步骤时,电子表格视图会相应更新,显示执行该特定步骤后的查询预览:这在你想要检查每个步骤中发生了什么时非常有用:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_04.png
图 6.4:Power BI 中的 Power Query 编辑器窗口:设计应用于每个查询的转换步骤
通过浏览 Power Query 编辑器 窗口顶部的前三个功能区选项卡,即 主页、转换 和 添加列,你可以找到一个包含众多可用转换步骤的菜单。这些转换步骤中的许多与我们在 第二章 和 第三章 中通过 KNIME 使用节点应用的步骤相同。我们来看一下其中最常用的几个。
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_05.png
图 6.5:Power Query 编辑器窗口中的主页功能区选项卡
-
从 主页 选项卡 (图 6.5) 开始,你可以找到 选择列 和 删除列 图标,它们让你筛选列,只保留你真正需要的列。
-
同样,保留行 和 删除行 使你能够减少行数:例如,你可以只保留前 10 行,或删除重复的行。
如果你想根据行的值来筛选行,则需要点击预览电子表格中每列表头右侧出现的箭头。在这里,你还可以使用你喜欢的顺序来排序行。
-
拆分列 图标允许你通过使用分隔符(例如,你可以设置
-为分隔符,将JUN-22拆分为JUN和22)或按字符数拆分字符串,将其分为多个列。 -
分组功能会根据给定的分组定义和汇总逻辑(如求和、平均值或计数)聚合所有行。如果你使用此转换步骤,那么在你的仪表板中将无法使用表格的非聚合版本,因此请谨慎使用此功能。你始终可以通过直接在构建可视化时定义聚合来动态地聚合表格,这是我们大多数时候的做法。
-
合并查询允许你通过应用一次性连接操作来合并查询。在这里,我们会看到在第三章《数据转换》中介绍过的相同连接类型,如内部连接、左外连接、右外连接、全外连接,以及更多类型,如左反连接(这意味着仅保留左侧表中在右侧没有匹配的行)。你可以创建一个新的查询,包含连接的结果,或者用它替代当前查询。
需要注意的是,合并查询功能并不是在 Power BI 中连接具有匹配键的两个表的唯一方式。正如我们将在接下来的几页中学习的,当我们构建数据模型时,我们可以在不静态地一次性连接它们的情况下指定表之间的关系。这意味着只有当你想要运行两个表的最终合并,并接受需要额外空间来保持静态合并版本时,才应使用合并查询。
-
使用附加查询图标,你可以通过将一个表的行添加到另一个表的行底部来连接两个具有相同列的表。https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_06.png
图 6.6:Power Query 编辑器窗口中的转换标签页
-
转到转换标签页(图 6.6),我们可以看到数据类型下拉菜单,它允许我们选择与列相关联的类型,并尝试进行转换。例如,我们可以使用此功能将包含日期的字符串转换为日期和时间字段。
-
使用替换值,你可以将所有具有某个特定值的单元格替换为指定的新值。你也可以用它来将固定值应用于某一列中的所有空单元格。为此,只需使用
null字符串来指定你想要处理空单元格。 -
填充图标让你可以用表格中上方或下方的值替换所有空单元格。当你有一些按时间排序的值,并且你希望填补空白以填充最近的可用值时,这非常有用。
-
顾名思义,通过使用数据透视列,你可以创建数据透视表,其中列中的值会作为独立列进行汇总。你可能还会发现其反向功能取消透视列有用,它会将表格中的列转换为多行显示。
-
格式图标允许你操作字符串:例如,你可以将字符串首字母大写(将
tessa变成Tessa)或将其转换为全大写格式(TESSA)。 -
使用四舍五入功能,你可以指定小数数字的四舍五入逻辑,按你的喜好设置小数位数。
-
在日期和时间列部分,你可以提取特定的日期和时间字段,如年份、月份、小时和秒。如果你想提取多个字段,可以首先复制该列(右键点击列标题,然后选择复制列),然后根据需要创建多个副本,再将它们替换为所需的字段。https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_07.png
图 6.7:Power Query 编辑器窗口中的“添加列”标签页
-
在添加列标签页中(图 6.7),你可以通过应用一些逻辑来创建计算列。例如,使用自定义列图标,你可以应用数学公式,如
[价格]*[折扣率],并将其他列中的值作为变量使用。 -
条件列允许你基于对其他列的逻辑条件进行评估,生成一个新的列,这与我们在 KNIME 中使用规则引擎节点的做法类似。例如,你可以为所有价格列大于 2.5 的行创建一个值为
Expensive的新列,为其他行创建一个值为Cheap的列。
当你完成所有必要的转换步骤后,查询将生成恰好符合你需要的形状和格式的表格。完成后,你可以保存查询(点击关闭并应用图标,位于首页标签页),并进入下一个步骤:定义数据模型。
定义数据模型
在这个过程中,你需要定义由查询生成的表格之间的逻辑关系。为此,只需声明表格之间匹配列的关系,即可以在需要时用于合并表格的列。完成这个简单的步骤后,你将定义一个单一的数据模型,随后可以在仪表板可视化中自由使用它。我们这样做是因为一个直接且重要的原因:通过连接匹配键,你可以在同一可视化中使用存储在不同表格中的数据——就像所有表格都已连接,并且可以随时使用,这非常方便。定义清晰的数据模型的一个结果是,你可以通过过滤或选择在图表之间启用交互。例如,假设一个可视化展示了按类别生成的总销售额:点击某个类别名称后,你可以看到另一个可视化展示该类别内最活跃的客户名称,而这些信息存储在不同的表格中。通过知道类别、销售和客户之间的匹配列,Power BI 能够展示用户所需要的数据,并启用深入分析和其他形式的交互。
在 Power BI 中构建数据模型非常轻松。你还记得我们在第三章《数据转换》中介绍过的实体-关系(ER)图吗?(请参考图 3.10复习一下)。Power BI 让你通过使用可用的表格,绘制 ER 图的方式来直观地构建模型。
如你在图 6.8中看到的,模型视图显示了表格(每个表格都来自于查询中声明的完整转换步骤)作为框体:表格名称以粗体显示在框体的顶部,而列则列在框体内。表格通过线条连接,表示它们之间的关系:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_08.png
图 6.8:Power BI 中的模型视图:连接表格并构建你的 ER 图
通过使用模型视图,你可以轻松地在匹配的列之间声明关系。例如,要在两个不同表格的匹配列之间绘制关系,只需拖放一个列到另一个匹配的列上即可。例如,在图 6.8中,你可以看到如何通过公共列StockCode来建立高亮显示的关系(在 ProductMD 和 Transactions 表格之间)。连接上的箭头表示交叉筛选方向:在这种情况下,对 ProductMD 项目应用的筛选也会筛选 Transactions 中的行,而反之则不会发生。连接器末端显示的1和符号明确了关系的预期基数:图中显示的都是一对多*(1-to-)关系,意味着我们期望 ProductMD 中的一行对应 Transactions 中的多行。关系基数的其他可能类型是一对一*(1-to-1)和多对多(-to-)。
当我们完整地进行教程时,数据模型的作用将更加明显。目前需要记住的是,通过定义关系及其基数和交叉筛选方向(所有这些在模型视图中以可视化的方式显示),我们可以确保即使在仪表板中同时使用多个表格时,Power BI 的行为也不会含糊不清。
构建好数据模型后,我们可以进入仪表板创建的最后一个也是最激动人心的部分:设计数据可视化。
构建可视化
Power BI 中的仪表板按一组页面组织,每个页面包含多个互相关联的可视化元素,如表格、折线图、散点图、文本标签和按钮。当你执行这一步时,你需要像设计师一样思考,既要保证结构和视觉效果,又要将业务理解和创造力相结合。这项工作既能充满乐趣,又可能非常耗时:但当你最终拥有一个功能完善、价值高的仪表板,供人们用来发现商业机会并做出优越决策时,它肯定会带来回报。当你打开报告视图(如图 6.9所示)时,你会发现所有需要的工具,来将可视化元素组合在一起,并将它们与底层数据模型中的表格链接起来:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_09.png
图 6.9:Power BI 中的报告视图:连接表格并构建你的 ER 图
让我们逐一了解报告视图中的每个组件,并学习它们的作用:
-
报告页面:这看起来像一张空白纸,你可以在上面绘制你美丽的仪表板。通过使用鼠标,你可以根据需要放置、调整大小和重新定位可视化元素。在报告页面下方,你会找到一组标签,每个标签对应仪表板的一个独立页面。
根据 Power BI 的官方命名规范,我们在本章中构建的是报告,而不是仪表板:后者是对选定可视化元素的单页汇总聚合功能,仅在 Power BI 服务中可用。为了简便起见,我将在这里继续使用仪表板和报告这两个词来指代我们的最终结果:一组供最终用户交互的连接可视化元素。
-
筛选器:在此部分,你可以通过设置筛选器来决定每个可视化元素显示的数据范围。例如,你可以通过将“类别”列从字段面板拖放到筛选器面板上的一个框中来设置筛选器。你可以使用筛选器仅显示你选择的数据部分,或者实现某些逻辑,比如只显示列表中销售前五的产品。筛选器部分有三个不同的面板,分别对应你希望筛选器操作的级别:有些筛选器仅限于特定可视化元素,而其他筛选器则会应用于页面上所有可视化元素,甚至是整个仪表板中任何可视化元素。
-
可视化元素:这一部分是最有趣的,因为它列出了你可以添加到仪表板中的所有可视化类型。正如你从图 6.10中看到的那样,安装 Power BI 后,你可以使用超过 30 种不同的可视化类型:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_10.png
图 6.10:Power BI 中可用的可视化类型:哪种图表最能让你的数据“发声”?
你还可以通过启用某些测试版功能的预览(前往文件 | 选项和设置 | 选项 | 预览功能进行激活)或从 AppSource 下载它们来添加额外的可视化类型(点击最后一个可视化**…**图标进行下载,登录 Power BI 后即可访问 AppSource,即使是免费账户也可以)。你可以在图 6.11中看到从那里获取的额外可用可视化类型的预览:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_11.png
图 6.11:创意枯竭了?你可以查看 AppSource 获取更多的可视化类型,并将其添加到你的 Power BI 中。
-
属性:在这一部分,你可以配置你的可视化效果应如何表现和呈现。正如你在图 6.12中看到的,这一部分有三个可用的选项卡,分别是字段、格式和分析。字段选项卡是首先要处理的部分:通过将数据模型中可用的列拖放到该选项卡中的各个元素中,你可以决定哪些数据应当被可视化。根据你使用的可视化类型,你需要配置的元素会有所不同。例如,图 6.12中的示例是一个折线图,其中列Invoice_time控制着横轴的内容,而通过折线展示的数值则由列Quantity控制。在格式选项卡中,你可以使用多个选择器来控制可视化的“外观和感觉”。你可以调节多个可视化属性,从标题到显示在顶部的颜色和线条粗细。最后,在分析选项卡中,你可以启用一些基础的建模功能,比如趋势线(基本上是简单线性回归模型或时间序列预测的结果):https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_12.png
图 6.12:可视化属性部分:将数据列连接到图表,并决定其显示方式。
-
字段:这个部分位于报告视图的右侧,执行了一个简单但至关重要的功能。它列出了数据模型中不同表格中所有可用的列,使你可以轻松地将这些列拖放到过滤器或属性部分。当你点击任何列时,列工具功能区会出现在窗口顶部。你可以使用它来更改列的数据类型,或设置其默认的聚合方法(如求和、计数或平均值):当你希望在使用这些列进行可视化时,精细调整它们的行为时,这个功能非常有用。
我们做到了!我们已经完成了在 Power BI 中构建仪表板所需的四个基本步骤,并借此机会简要了解了该软件的主要功能。
让我们总结一下我们刚刚看到的内容:一切始于将一些原始数据加载到 Power BI 中,选择并配置获取数据窗口中提供的正确连接器。利用Power Query Editor的丰富功能集,我们将原始数据提升到了一个新的水平,并应用了一系列有序的转换步骤,这使我们得到了多个形状和格式正确的表格(可以随时通过类似电子表格的数据视图预览)。此时,我们使用模型视图将所有这些表格连接在一起,定义匹配列之间的关系,构建了一个统一的数据模型。最后,我们打开了报告视图,在这里我们找到了构建仪表板所需的所有元素(表格和可视化)。现在是时候在接下来的教程中,看看这个过程如何通过从零开始构建一个完整的 Power BI 仪表板来实际操作了。
教程:销售仪表板
本教程将带我们回到一个熟悉的业务,这个业务我们已经变得非常熟悉并且喜爱:这是一家位于英国的在线零售商,销售各种场合的礼物。通过使用 KNIME 自动化每周的 Excel 报告(我们在第三章,数据转换中做过的事),我们获得了相当的声誉,这也把我们再次推到了聚光灯下。随着业务的不断增长,对使更多员工能够使用描述性分析的需求也在扩大。更新一些回答固定问题的 Excel 报告已不再足够。我们希望能够提供机会,让同事们深入了解按季度、国家和产品层级的详细信息,以便他们能够“探索”数据并发现有趣的洞察。
在财务分析师的帮助下(他仍然对我们充满感激)并且在采访了一些经理,了解他们最常见的需求后,我们已经准备好总结出每个用户组的需求,具体如下:
-
所有经理应能够一目了然地看到各类别和子类别在总收入中的相对权重,并看到每个产品组随时间变化的销售演变情况。
-
市场经理应该能够分别查看国内(英国生成的)和国际销售数据,能够按国家和类别深入分析,并相应地规划针对特定国家的数字营销活动。
-
类别经理应有机会按类别深入分析,识别出每个季度和每个国家销售最多的商品。
数据遵循我们在图 3.10中遇到的相同模型,并通过三个独立的文件提供给我们:SalesDashboard-CustomerMD.csv和SalesDashboard-ProductMD.csv分别包含客户和产品的主数据表,而SalesDashboard-Transactions.xlsx则包含最新的交易数据(这次,所有数据都包含在一个文件中)。
现在是时候启动 Power BI Desktop 并在我们的计算机上运行,开始创建任何仪表板的第一阶段:加载所需数据:
-
首先,我们加载存储在文本文件中的客户主数据,该文件为逗号分隔值文件。为此,点击获取数据图标,该图标位于主页功能区选项卡上,然后选择文本/CSV作为数据源类型,再点击连接。此时,您将看到一个对话框,您可以选择用于作为数据源的文件,在我们的例子中是
SalesDashboard-CustomerMD.csv。此时,您将看到文件中记录的表格的预览(图 6.13)。Power BI 已正确识别其格式:有两列,列标题以粗体显示在顶部。看起来一切正常,不需要更改任何设置(例如,您可以看到逗号正确地用作列分隔符),所以我们可以点击加载以完成此步骤:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_13.png图 6.13:客户主数据源的预览。您可以从窗口中的菜单中修改导入设置。
-
我们可以重复相同的过程(获取数据然后选择文本/CSV)来加载产品主数据表。这一次,预览窗口(图 6.14)显示列名未被正确识别,而是被分配了一些默认标识符(Column1,Column2,等等)。这需要进行一些小的转换,才能在我们的数据模型中使用此表格。因此,这次我们点击底部的第二个按钮,转换数据:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_14.png
图 6.14:产品主数据表的预览:列标题未被识别
-
点击转换数据后,我们要求 Power BI 为查询添加一些转换步骤,以注入产品主数据表:这是Power Query 编辑器的工作,它的窗口将会出现。在这种情况下,唯一需要的更改是将 CSV 文件中读取的第一行提升为表格的列标题。为此,点击将第一行用作标题按钮,该按钮可以在主页功能区菜单中找到(请参见图 6.15中的箭头作为指南)。完成后,右侧的应用的步骤列表将增加一个提升标题步骤:这意味着每次加载新数据时,Power BI 都会作为查询的一部分执行此步骤。我们可以点击左上角的关闭并应用图标,继续下一步:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_15.png
图 6.15:产品主数据表的 Power Query 编辑器。我们需要将第一行用作标题
-
包含交易的表格存储在 Excel 文件中。要加载它,您可以点击常规的 获取数据,然后选择 Excel,或者直接点击 首页 功能区菜单中出现的 Excel 图标。随后,您将看到一个对话框,您可以预览 Excel 文件中各个工作表包含的表格(图 6.16):https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_16.png
图 6.16:Excel 预览对话框:选择您要从 Excel 文件导入的表格
此外,在这种情况下,我们需要向查询中添加一些转换,因此勾选左侧的
Transactions复选框,然后点击 转换数据,这将打开 Power Query 编辑器。当我们查看“交易”表的预览时,我们注意到至少需要进行两次转换才能使其可用。首先,Invoice_time 列看起来不对,因为它没有被识别为日期和时间字段。其次,由于我们的业务需求大部分要求分析收入,而我们每个交易只有单价 Price 和 Quantity 两列,因此我们需要实施一个简单的数学公式,通过乘这两列来获得收入。让我们看看 Power Query 编辑器 如何帮助我们解决这两个问题。
-
如果您查看电子表格视图的标题,您会注意到在每个列标题的左侧,可以找到一个图标,表示其数据类型。例如,靠近 StockCode 的 ABC 图标告诉我们它是文本字符串,而靠近 Price 的 1.2 图标表示它是一个十进制数字。如果您点击这些图标中的任何一个,您将看到一个弹出菜单(图 6.17),在这里您可以强制转换为不同的数据类型。Power BI 将尝试将其转换为您所希望的类型。让我们对 Invoice_time 列进行操作:点击其左侧的类型图标并选择 日期/时间(如果弹出窗口询问是否替换当前查询步骤或添加新步骤,选择第一个选项)。您会注意到电子表格视图现在显示了日期和时间,这正是我们想要的:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_17.png
图 6.17:Power Query 编辑器中的列类型选择:通过做出正确选择转换列
-
下一步是添加一个新列,包含每笔交易产生的收入。为此,进入 添加列 功能区菜单,然后点击 自定义列 图标。您将看到如 图 6.18 所示的窗口,在这里您可以定义表达式,类似于我们在 KNIME 中使用 数学公式 节点的操作。可用的列显示在右侧:双击 数量 使其出现在 自定义列公式 框中,然后在键盘上输入
*,最后—双击右侧的 价格 列。这样,您将得到表达式[数量]*[价格],这正是我们计算销售额所需要的。现在,您可以通过在顶部的 新列名称 框中输入销售额来指定列名,然后点击 确定 按钮:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_18.png图 6.18:在 Power BI 中添加自定义列:使用列作为变量定义数学公式
您会自豪地发现,新计算出的列 销售额 出现在电子表格视图的右侧。然而,它的数据类型仍未定义,您会在标题的左侧看到一个模糊的 ABC123 图标。您可以通过点击该图标并选择 小数 快速解决此问题。
始终声明列的数据类型。这样,列可以在您的仪表板可视化中得到最优化使用,并且也能得到适当的聚合。数值列默认在 Power BI 中通过求和聚合,但您可以随时更改每列的聚合函数。为此,进入 数据 视图(请参见 图 6.2 查找它),选择一列,并使用 汇总 下拉菜单,该菜单位于 列工具 功能区(对于数值列,您可以选择 求和、平均值、最小值、最大值、计数 和 唯一计数)。
完成此步骤后,您将看到,在 Power Query 编辑器的帮助下,您创建了一个包含七列的表格,如 图 6.19 所示。在右侧的 已应用步骤 面板中,您可以找到所有需要进行的转换的排序列表(例如获取存储在 Excel 中的数据、添加列、修改其类型等),以生成您想在仪表板中使用的表格。您可以点击每个步骤以“回到”转换流程的那个阶段。您还可以删除任何步骤(点击当选择特定步骤时出现的左侧 X 图标)或编辑它:例如,您可以通过点击 已添加自定义 步骤右侧的齿轮图标来更改我们添加的自定义公式定义:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_19.png
图 6.19:您的交易表的完整查询定义:Power Query 编辑器是您在 Power BI 中进行可重复数据转换的得力助手
尽管大多数转换通常是在添加新数据源时定义的,但您可以稍后通过重新打开 Power Query 编辑器视图来编辑查询(点击转换数据图标,位于主页功能区菜单中)。
要继续操作,请点击左上角的关闭并应用图标,我们就可以进入仪表板创建过程的下一个阶段:定义数据模型。
-
如果您进入模型视图(点击 Power BI 主窗口左侧工具栏中的第三个图标),您会看到一个熟悉的界面:由我们三张表组成的数据库的 ER 模型(请回到前几页,查看图 6.8,它展示了数据模型视图的截图)。Power BI 自动识别了表之间的关系并建立了连接,无需我们的干预。当然,在这个案例中比较简单,因为匹配的列正好具有相同的名称和类型。无论如何,我们可以通过使用模型视图手动声明或编辑表之间的任何关系。我们可以通过“拖放”一个表中的列到另一个表中的列来创建新的关系。要编辑现有连接,您可以双击连接两张表的线条。点击产品主数据与交易表之间的关系:您将看到编辑关系视图,如图 6.20所示。下拉菜单让您选择要连接的两张表,而您可以通过点击中间显示的预览表来指定匹配的列。在我们的案例中,我们注意到两个表中的StockCode列都被高亮显示,这正是我们想要的。左下角的基数下拉菜单让您选择关系的类型(多对一、一对一、一对多或多对多):通过这样做,您是在告诉 Power BI 第一张表中的多少行应与第二张表中的多少行匹配。在这个案例中,我们选择多对一,因为多个交易(第一张表)可以对应同一个产品,因此对应到产品主数据表(第二张表)中的一行。您可以将交叉过滤方向下拉菜单保持在默认值(单向,这是推荐的设置,因为大多数情况下,性能更佳)。由于所有默认选项在此案例中都能很好地工作,因此我们无需做任何更改:点击确定并继续:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_20.png
图 6.20:在数据模型中管理表之间的关系:哪些列应该匹配?
在 Power BI 中,两个表之间的活动关系只能通过一对匹配的列来定义。如果你希望在两个表之间匹配多个列,你需要进行一个简单的变通方法:进入Power Query 编辑器(点击常规的转换数据图标),选择你想要作为单一键值使用的两个或多个列,然后从转换菜单中点击合并列。在另一个表上也进行此操作,之后你就可以在合并的列之间创建关系了。
-
双击连接事务表和客户主数据表的关系线,检查这两个表之间的其他关系。确保匹配的列是Customer_ID,基数是多对一,并且交叉过滤方向是单向。然后点击确定,你的数据模型就准备好了!
此时,我们已经准备好进入最后一个阶段,对一些人来说,这是最令人兴奋的部分:通过一步步构建可视化内容来设计你的仪表盘。许多人在第一次创建数据仪表盘时常犯的一个错误是,在没有明确目标的情况下,直接跳入制作五彩斑斓的图表。我的建议是,始终花一些时间后退一步,思考你具体的业务需求,并简单地勾画出仪表盘的样子。考虑你的最终用户可能提出的问题,并思考如何有效地引导他们找到所需的答案。如果有机会,可以将你的草图(或用你熟悉的任何软件制作的数字原型)展示给一些最终用户,听取他们的初步反应。你会发现,早期在仪表盘规划上的投入(此时不需要细节,简单的内容概览就足够了)会在后期避免一些昂贵(且令人沮丧)的返工,从而带来回报。
当你从事大型描述性分析项目时(比如从零开始构建公司的商业智能应用层),规划阶段变得尤为关键。在这种情况下的建议是,保持敏捷思维,并在小规模(但总是经过良好规划的)迭代中工作,每一步都逐渐添加功能。另一个建议是,确保及早与业务伙伴(代表仪表盘的最终用户)合作,共同设计功能,而不是等到完成后才展示最终产品。
对于我们的销售仪表板,我们需要制作一个概览页面,其中必须包含按类别和子类别划分的销售情况。条形图和树图可以很好地展示每个产品元素的相对大小(此时不用担心可视化类型;我们将在下一章学习如何选择最佳的图表类型)。折线图将有助于展示随时间变化的趋势,同时,将销售分布可视化到世界地图上,可以揭示任何地区性模式。最后,用户需要能够选择特定的年份范围,并选择是否只查看国内销售(在英国生成的),或者国际销售,或两者都有:需要添加一些筛选器,提供简单的方式来过滤感兴趣的数据。考虑到最终用户的需求,我们设计了你在图 6.21中看到的草图:在这一阶段,我们有意远离完美,但至少我们可以自信地继续构建可视化,知道我们正在为之努力的目标是什么:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_21.png
图 6.21:销售概览仪表板页面的粗略草图:在创建任何图表之前,最好先决定你需要可视化的数据,以满足你的业务需求
-
转到报告视图(主窗口左侧垂直栏上的第一个图标)。在右侧的可视化面板中(显示不同图表类型的所有图标),点击带有水平条形图的图标(其工具提示标签,在鼠标停留一秒钟后显示,标注为堆积条形图)。此时报告页面上会弹出一个空框:这是我们条形图的占位符。现在我们需要告诉 Power BI,想让这个条形图展示哪些数据。正如图 6.22中的箭头所示,我们需要将数据模型中可用的列(在右侧的字段面板中列出)拖放到可视化的属性面板中。更具体地说,类别列(在“产品主数据”组中找到)应该被放入属性面板中的轴框中,而销售列(在“交易”表中)应该被放入值框中。一旦这样做,条形图会神奇地出现在左侧,你的第一个 Power BI 可视化就完成了!我们可以通过格式面板(带有油漆滚轮图标)来改变新创建的可视化的外观与感觉(更改颜色、标题、字体、标签等),但目前我们专注于构建仪表板的其余部分,接下来我们将继续制作以下图表:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_22.png
图 6.22:在 Power BI 中构建条形图:选择用于轴类别和条形高度的列
-
按照草图的要求,我们现在添加一个树状图:它将显示每个类别/子类别组合在销售方面的相对大小。在报表页面中点击一个空白区域,然后点击树状图可视化图标。为了构建这个可视化,拖动并将感兴趣的字段放入右侧的属性框中(图 6.23):Category 应放入Group,Subcategory 放入Details,Sales 放入Values。到目前为止,你应该已经掌握了在 Power BI 中构建图表的精髓:我们决定需要哪种类型的可视化,然后将数据列与该类型图表可用的不同属性字段连接:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_23.png
图 6.23:树状图可视化:显示每个组和子组的相对大小
你会注意到每个图表的边缘和角落都有一些灰色的控制手柄。利用它们调整图表大小,必要时移动图表,以便将其放置在你喜欢的位置。根据草图的指引,开始将可视化放置到合适的位置。
-
接下来要添加的可视化是一个折线图,显示随时间变化的销售情况。在报表空间中点击一个空白区域,然后点击折线图图标。你可以使用Invoice_time作为控制图表轴的列,而Sales则决定要可视化的数值。Power BI 默认只使用时间层次结构的顶级:这意味着一开始,图表将显示按年份汇总的销售数据,只显示 2017-2019 范围内每年的三个值。由于我们想按月显示销售演变,因此需要通过点击可视化右上角的分支箭头,展开时间层次结构的下级(参考图 6.24)。下一级显示按年份/季度的拆分,但这还不够,因为我们想进一步细化到年份/月,因此你需要再次点击图标:此时,图表的标题将变为按年、季度和月份的销售情况,这表明我们已经得到了所需的结果:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_24.png
图 6.24:构建折线图显示随时间演变:你可以根据需要点击图表右上角的箭头图标,以在年份/季度/月/天的层次结构中导航
-
我们销售概览页面中的下一个图表是世界地图,显示各国的销售情况。好消息是,Power BI 会自动识别表格中的地理名称,简化了创建地图图表的过程。点击报告中的空白区域,然后点击地图可视化(图标看起来像一个地球仪;不要和填充地图混淆,后者显示的是美国的简图)。如图 6.25所示,将国家列(来自客户主数据表)拖到位置框中,然后使用销售额来控制气泡的大小。现在,你可以看到一张世界地图,展示收入的来源地:不出所料,最大的气泡出现在英国,考虑到本地客户的普遍存在。
描述自动生成](https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_25.png)
图 6.25:完整的地图图表:Power BI 能识别国家、州和城市等位置,使得构建数据丰富的地图变得简单。
在地图可视化中(与 Power BI 中的任何其他图表一样),当你将鼠标悬停在可视化元素上(在这种情况下,是地图上的气泡)时,默认会显示一个工具提示标签,提供该特定元素的精确值(例如,某个国家的总销售额)。许多图表类型允许你通过将字段添加到工具提示框中来控制在工具提示中显示的内容。
-
现在是时候添加一些切片器,让用户选择要在页面上显示的内容。第一个切片器将控制时间维度:我们希望允许用户将销售概览页面上的所有可视化内容限制在特定的时间范围内,以便他们能够在给定的时间段内按类别、子类别或国家评估销售情况。为此,只需要添加一个切片器可视化,并将发票时间列拖到字段框中,如图 6.26所示。切片器在 Power BI 中非常受欢迎:你可以根据需要添加多个切片器,并将多个字段组合成一个切片器,以便进行多层次的选择。例如,我们可以将类别和子类别结合起来,这样用户就可以在选择关注的内容时浏览整个产品层级。
描述自动生成](https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_26.png)
图 6.26:Power BI 中的切片器:可视化过滤你的数据,以便集中关注最重要的内容。
-
根据我们的草图,我们的第二个切片器应该区分国内销售和国际销售。由于我们没有一个指定客户所属组别的列,因此我们需要添加一个新的列来满足这一需求。Power BI 提供了条件列:这些是计算列,通过应用一组逻辑规则(比如一组if-then 语句)来确定每一行的值。你会注意到,这与我们在 KNIME 中使用的规则引擎节点非常相似。要在 Power BI 中添加条件列,我们需要通过点击首页功能区上的转换数据图标返回到 Power Query 编辑器窗口。在左侧的列表中选择客户主数据查询后,我们可以通过进入添加列功能区并点击条件列来添加列。系统会弹出一个类似于图 6.27所示的窗口:在顶部的文本框中选择新列的名称后,我们可以定义一个或多个if-then 语句,利用如等于、大于、包含等操作符。通过点击添加语句按钮,你可以附加其他条件,并且还可以指定当没有条件满足时使用的默认值(底部的Else框)。在我们的案例中,我们只希望新列(我们可以将其命名为Type)在Country为
United Kingdom时显示Domestic,在其他任何情况下显示International:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_27.png图 6.27:添加条件列:定义一组逻辑语句来控制列的值
-
现在我们有了新的列Type,我们可以按照我们为时间切片器所采用的相同步骤,添加一个新的切片器,并将新的条件列拖到字段框中。
-
现在,我们可以通过进入插入功能区并点击文本框图标来给页面添加标题。我们可以输入任何文本(在这个例子中,我们输入页面标题
Sales Overview),并调整字体大小和样式来使其看起来更好。通过拖动所有可视化图表并根据我们的原始草图重新排列它们,我们获得了图 6.28所示的页面:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_28.png图 6.28:销售概览页面:对于我们的第一个 Power BI 创建作品,表现得相当不错!
该页面在其简洁性上已经足够吸引人:它包含了几个可视化图表,展示了我们在线零售业务中的关键维度。切片器允许用户在特定的时间框架或国家范围内筛选分析数据。非常重要的是,这些可视化图表彼此互联:用户可以与某个可视化元素互动,导致其他可视化图表重新排列其范围。例如,尝试点击第一个类别柱状图中的任意一条柱子:折线图将显示该特定类别的销售演变,世界地图会重新排列气泡的大小,只考虑该特定国家的收入。如果我们从右上角的树状图中选择一个子类别,同样的事情会发生,所有其他可视化图表将显示该子类别的详细信息。这非常强大,因为我们让用户自主发现数据,根据自己的需求定制视图,而不是直接提供现成的数据分析体验。
在 Power BI 中,你可以通过按住CTRL键一次选择多个元素。尝试按住CTRL键并点击柱状图中的两个不同类别:这两个类别的销售数据将在折线图中聚合在一起。你还可以使用此功能在不同的可视化图表之间切片数据。例如,点击地图图表中的一个气泡,并且在按住CTRL键的同时,点击树状图中的一个子类别:折线图将显示你从世界地图中选择的特定国家/地区的该子类别的销售时间演变。
由于各个图表之间是互动的,我们可能需要微调和修改它们的动态行为。例如,如果你点击柱状图中的任何一个类别,树状图会高亮你的选择,意味着其他所有类别的颜色将会变淡。如果我们希望树状图有不同的反应呢?我们想要它不是高亮柱状图中选择的类别,而是仅显示那个类别并过滤掉其他所有类别吗?让我们把这个挑战当作一个机会,来看看如何在 Power BI 中改变不同可视化图表之间的交互行为。
-
转到格式功能区菜单(当你选择任何图表时会出现),然后点击左侧的编辑交互图标。通过点击可选择控制其他可视化的图表(我们可以称之为前置图表)。在我们的案例中,点击显示按类别分销销售的条形图。这样,树形图图标的右上方将出现三个图标(确保调整图标大小,以便看到这三个图标)。点击这些图标(见图 6.29),你将决定当选择前置图表时,树形图如何响应:筛选图标将使该可视化筛选掉其他数据并“聚焦”于选择;高亮图标(默认行为)将使该可视化通过不同的颜色强调前置图表上应用的选择;无图标将断开连接,使树形图完全“独立”于条形图的任何选择。在我们的案例中,我们点击筛选图标(这是我们想要的行为),然后再次点击编辑交互图标返回到正常编辑模式:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_29.png
图 6.29:更改可视化交互行为的三个步骤:点击“编辑交互”,选择前置图表,然后点击随后的所有可视化上的行为图标(筛选、高亮或不做任何操作)
并非所有的可视化类型都允许我们在本示例中看到的三种交互方式。例如,折线图只允许筛选和无交互。
通过查看原始需求集,我们意识到需要更多的可视化来完成我们的目标。市场营销和类别经理需要超越现有的可视化概览,访问一些更详细的表格展示。我们决定通过添加一页名为“销售详情”的页面来完成仪表板,并配备符合我们剩余需求的一些表格。
-
点击报告视图底部的**+符号:这将向你的仪表板添加一个空白的新页面。你可以通过右键点击页面标签并选择重命名页面**来重命名每个页面。
-
让我们在新页面上添加一个矩阵可视化(不要与我们稍后使用的表格可视化混淆)。现在,将以下字段添加到各个框中:先将类别放入行框,然后在其下方放入子类别。接下来,将发票时间拖到列框中,最后,将销售额放入值框中。
-
此时,表格仅显示产品和时间层级的顶层(如图 6.30所示),因为这是其默认行为。为了使其对我们的业务用户更有用,我们需要通过点击可视化右上角的分支箭头来扩展这些层级(参见图 6.30中的步骤 2)。完成行的扩展后,使用钻取下拉菜单选择列(参见图 6.30中的步骤 3),然后再次点击分支箭头(就像我们之前对行所做的那样)。现在,你已经获得了一个相当丰富的表格,显示了按类别和子类别分的季度销售情况:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_30.png
图 6.30:构建矩阵可视化:选择要使用的字段,并决定行和列的聚合级别
-
为了使矩阵图表更易于访问,我们可以微调一些设置,移除一些不必要的数字。进入格式面板(带有油漆滚筒图标的面板),在选项列表中向下滚动,打开小计视图,并关闭列小计,因为我们不需要年度总和(参见图 6.31中的步骤 1)。然后向下滚动,打开字段格式视图:在这里,将值的小数位数设置为
0,这样我们就去除了所有不必要的小数值,这些值只会增加杂乱(参见图 6.31中的步骤 2):https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_31.png图 6.31:移除矩阵可视化中的杂乱:停用列小计并移除小数位
-
让我们添加一个新可视化,以便用户根据需要专注于国内或国际销售。这一次,添加一个圆环图,并按如下方式设置其字段(我们无需查看截图,因为这个过程现在应该已经非常熟悉):将列类型设置为图例,将销售设置为值。
-
为了完成我们的详细视图,我们将显示按国家和商品汇总的销售情况。首先,从国家开始:添加一个表格可视化,并将国家和销售列直接拖放到其中(只需确保按照指定顺序,先国家,再销售)。通过点击新表格可视化中的销售标题,按销售额降序排列国家销售,这是我们想要的结果。
-
为了添加商品详情,让我们再实现一个表格可视化,然后按照以下顺序拖放以下列:描述、数量和销售。同样,像之前做的那样,点击表格可视化中的销售标题,将畅销商品排在列表顶部。为了避免杂乱,请移除这里和前一个表格中的小数位,使用字段格式 | 值的小数位数选择器,就像我们对矩阵视图所做的那样。
-
我们也应该给这个页面加个标题。去插入功能区菜单,点击文本框图标并写入
销售详情。为了保持一致性,尽量使用和第一页相同的字体大小和类型:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_32.png
图 6.32:销售详情页面:我们的 Power BI 仪表板现在已经完善,可以查看到更精细的国家和产品详情
我们终于完成了:你刚刚整理出来的第二页(见图 6.32)很完美地填补了我们之前的空白。用户现在可以深入查看子类别/季度/国家组合(只需点击表格标题,按住CTRL键过滤到所需的组合),并检索到各个业务细分中的畅销商品。
当你在 Power BI 服务中发布你的新仪表板(如果你有账户,即便是免费账户,去主页功能区菜单,点击发布图标试试看),并将其 URL 分享给同事时,你会突然成为他们的英雄!他们现在可以通过任何浏览器访问所需的数据(见图 6.33),并自主深入到他们最感兴趣的业务部分:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_33.png
图 6.33:在 Power BI 服务上发布后的销售概览页面的浏览器视图:我们的仪表板在云端看起来很棒
在旅行中,我们的同事甚至可以在路上查看销售结果:你可以在图 6.34看到我们仪表板在智能手机上 Power BI 应用中的样子:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_34.png
图 6.34:通过 iPhone 上的 Power BI 应用访问的销售详情页面:你几乎可以在任何地方访问你的数据
仪表板的维护相对轻便,因为所有可视化的更新现在可以轻松地每天进行。我们定义的各种查询知道从哪里获取数据以及需要哪些转换步骤。当有新数据出现时,只需点击刷新图标(位于主页功能区菜单上),刷新仪表板,整个仪表板就能保持最新状态。
你不仅通过一个可持续的、现在可以轻松重复的过程,最终让公司内销售数据的访问实现了民主化,而且你还为财务分析师节省了很多宝贵的时间。她不再需要回答那些她以前经常收到的“临时”问题,这些问题迫使她每次都要进行繁琐的手动数据提取。由于数据现在随时可用,人员可以更快、更方便地自己去获取所需的信息,从而将更多的时间交还给我们的财务分析师,让她可以进行更高级的分析。这是一个真正的双赢,你应该为能够促成这一切感到非常自豪。
总结
完成本章后,你已经为你的数据分析师背包中添加了另一个宝贵的工具:Power BI。你已经学习了如何加载数据,并建立一套数据清洗和转换的常规步骤,使这些数据变得有用。你已经看到了如何定义连接所有表格的关系,从而形成一个统一且连贯的数据模型。你还了解到如何构建互联的可视化图表,允许用户进行交互。你已经创建了一个仪表板,使得业务用户能够在需要时探索他们所需的数据,捕捞洞察力并揭示商业机会,完全独立。
现在,想想公司数据库中(甚至是存储在个人笔记本上的 Excel 文件中)那些大部分未被利用且无法访问的数据。通过一个简单的仪表板将这些数据以可视化方式呈现出来,待解锁的商业机会是巨大的,并且在很多情况下,通过像 Power BI 这样的工具,可以轻松实现:你在本章中所学到的知识可以让你成为许多人心中的英雄。
在下一章中,我们将学习一些实用的指南,以提升我们的数据可视化技能:目标是让我们从现在开始,充分利用每一个图表。
第七章:有效地可视化数据
一图胜千言,这句古老的格言常被引用。视觉表达通常是传达数字信息的首选方式。正如你从自己的经验中可以验证的那样,数据图表在商业备忘录、演示文稿、报纸文章和科学论文中无处不在。然而,从表格中的数据转化为图形表达(这一过程称为数据可视化)远非简单且无风险。尽管许多软件(包括 Power BI、Excel、KNIME 等)提供了快速创建图表的方式,但制作有效且具有专业外观的视觉效果远非易事:它需要结构化的规划和有纪律的执行。
本章将为你提供一套实用的指导方针,确保通过有效的数据可视化过程清晰地传达商业信息。具体来说,我们将探讨以下问题:
-
有哪些类型的图表可供选择,它们各自有什么特点?
-
根据我想要传达的具体信息,应该使用哪种图表?
-
我如何确保视觉效果直接且不易产生误解?
-
在可视化数据时需要避免的常见陷阱是什么?
在上一章我们聚焦于 Power BI,而在本章中,我们将学习一些适用于任何能够生成视觉效果的软件的技巧:实际上,把数据可视化看作一种工具无关的技能,是你在数据分析师工具包中必须具备的能力。
本章的流程涵盖了数据可视化的两个基本阶段。第一步是规划我们的图表,考虑我们想要表达的具体观点,以及哪些图表类型最适合我们的需求。然后,我们进入构建图表的阶段,包括微调视觉属性、打磨各个图形元素,并避免常见的错误:这一部分将总结为一份实际的数据可视化质量规则清单。在进入规划阶段之前,我们快速框定一下数据可视化的普遍需求。
什么是数据可视化?
虽然数据可视化的基本概念很简单,但我们还是需要花些时间来合理地设定场景。数据可视化的核心目标是将基于数据的信息传递给另一个人。有效进行这一沟通过程意味着接收者能够理解原始的基于数据的信息,并通过认知“理解”它。图 7.1 展示了一个传递数据消息失败的图示:将所有数据按原始格式呈现。
![文本]
图像描述自动生成
图 7.1:以原始格式呈现数据:如你所见,决策者明显感到不知所措,并且大多数数据被忽视了。
这里的决策者显然被如此大量的原始数据所压倒。这是可以理解的:每个人的认知能力都是有限的,我们的大脑一次只能处理一定量的信息。如果我们试图同时呈现过多数据,便会超出接收者的认知极限,导致他们得到的只是原始信息的部分或扭曲版本。结果,我们的初衷要么被忽视,要么——更糟糕——被误解。坏消息是,无论我们面对的是谁,无论他们有多聪明,能理解的有效信息总是有限的:其余的将被简单地忽略。
另一个坏消息是,如果有几个人在查看相同的数据,他们的“收获”将会有所不同,因为他们各自的敏感性会让他们关注原始数据的不同切片或方面。好消息是,我们有一种已建立的有效沟通数据的方法:将数据转化为一种抽象的可视化形式,传达我们希望传递的关键内容。这就是数据可视化的核心所在。
数据可视化之所以强大,是因为它利用了我们大脑最发达的功能之一:视觉。作为自然进化的一部分,人类一直依赖眼睛来执行生命中至关重要的活动,如寻找食物来源和识别关键威胁。因此,我们的大脑不断优化其视觉能力。正如罗切斯特大学医学光学教授大卫·威廉姆斯所注意到的,现在大脑皮层(大脑表面)中超过 50% 的部分参与处理视觉信息:这比所有其他四种感官加起来还多!大脑可以迅速通过识别一些关键特征(如大小、颜色、曲率、位置、坡度等)来解读图像,这些特征是我们不加意识努力就能本能察觉的。它们被称为注意前属性,我们在数据可视化中广泛利用这些特性。
在图 7.2中,你可以看到数据可视化的潜在用途:通过将数据(即使是大量数据,经过适当筛选和聚合)编码成图形摘要,决策者的认知能力得到了最充分的利用,且接收到的信息是明确无误的:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_02.png
图 7.2:通过可视化呈现数据:通过选择正确的设计方案,决策者可以轻松理解你的信息
如图所示,数据可视化就像一个可定制的漏斗,正确使用需要一些调整。事实上,并没有一种唯一的方式来可视化相同的数据:通过做出一些设计选择(如图表类型、要以图形方式编码的度量、视觉属性等),你可以“调整”漏斗,使其最适合实现你的精确沟通目标。你的责任是做好这个调整。需要注意的是,这些设计选择并非仅仅出于美学需求。图表中的每一个视觉模式都有其含义,并且会被我们的脑海解读,我们本能地会在其中识别出一些视觉线索(先觉属性)。每一个图形元素都占用了部分认知能力,因此除非它在我们的沟通目标中有意义,否则我们不会使用任何视觉线索。正如我们稍后会深入了解的,数据可视化的口号是少即是多,而简约无疑是最佳的选择。
尽管漏斗的类比是对现实的粗略简化(数据可视化不仅仅是“压缩”数据),但它很好地描绘了我建议你在可视化数据时保持的思维方式。记住这一点:要将数据转化为直观、具有影响力且不含糊的视觉效果,你必须做出正确的设计选择。你需要像设计师一样思考。在这一章中,你将扮演图中“漏斗操作者”的角色,即决定如何根据要传达的特定信息来表现数据的视觉设计师。你将学会如何为你的图表始终如一地做出正确的设计选择。
现在,场景已经设定,你作为视觉设计师的角色也揭晓了,接下来让我们进入规划阶段,在这一阶段我们将做出一些关键的设计选择。
每个信息都有一个合适的图表类型
每一个图表背后的终极目标应该是传达一个精准的基于数据的信息。不出所料,当我们规划图表时,首先要做的就是决定我们要传递的具体信息。你可以把这个信息看作是对某个特定业务问题的回答,比如品牌 X 的市场份额是否持续增长?或收入与服务价格之间有何关联?。尽管业务问题往往模糊且多面,但在大多数情况下,它们属于以下三种类型之一:
-
演变:这些问题涉及随着时间推移数量的变化。如果你的业务问题包含像增长、下降、增加、减少、加速、减速、落后、滞后、超越或趋势等词汇,那么它很可能属于演变类型。这是数据图表回答的最常见问题之一,因为理解业务绩效指标如何演变是无处不在的需求。
-
大小:这些问题询问的是组成部分相对于整体的比例(也称为部分与整体)或在可比数量中的排名。你可以在此类问题中找到的典型词汇包括驱动因素、消耗因素、高、低、顶部、底部、最大、最小,以及——通常——所有以est结尾的最高级形容词。每当我们涉及基准、排名、比较或深入分析组成部分时,我们都会提出与大小相关的商业问题。
-
关系:这类问题探讨不同指标之间的相互关系。当我们使用诸如相关、共同增长/下降等词汇时,通常是在询问一个数量如何相对于另一个数量发生变化,这类问题就属于这一类型。
表 7.1 提供了按每组分类的商业问题示例列表。看完后,想想你最近在工作中参与的一些问题:很有可能你会在这三类中的每一类中找到相关的示例。
| 信息类型 | 商业问题示例 |
|---|---|
| 演变 | 销售是在增加还是减少?变化速度如何? |
| 趋势是否有加速或减缓? | |
| 我们在消费中是否看到季节性变化? | |
| 尺寸 | 哪些产品推动了销售增长? |
| 哪些品牌是我最大的竞争对手? | |
| 我的竞争对手在哪个产品线中赚取的利润最多? | |
| 销售流失方面最重要的机会是什么? | |
| 关系 | 利润如何随着包装尺寸的增加而分布? |
| 可支配收入在全国范围内是如何分布的? | |
| 不同品牌之间价格与盈利能力有关系吗? |
表 7.1:按信息类型组织的一些商业问题示例
确定你想要传达的商业信息类型是规划数据可视化设计的必要初步步骤。事实上,每种信息类型(演变、大小或关系)都对应一个或多个匹配的图表类型,如图 7.3所示。图中,每一行表示一种基本的图表类型(柱状图、折线图、树图和散点图):它们有一组备选的呈现方式,你可以根据具体情况考虑使用:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_03.png
图 7.3:图表选择矩阵:每种信息类型都有其偏好的图表类型。两个星号是显而易见的匹配,但一个星号的组合也可以很好地工作
我希望你能发现图表选择矩阵简单易记,因为它可以成为你根据所要传达的消息快速决定使用何种图表类型的最佳助手(通过这样做,你可以回答你当时面临的商业问题)。你应该考虑到,市面上有更多的图表类型,有些具有很强的视觉吸引力;然而,超过 90%的情况下,你仅使用这个简单的图表类型列表就能传达清晰的信息。坚持使用这些已知图表的另一个好处是,商业伙伴们自然能够识别这些图表并知道如何解读它们,从而使你的信息——记住数据可视化的终极目标——更加简洁和直接。
在介绍了四种图表类型及其选择时机后,我们来逐一了解每种类型及其最佳使用方式。对于每种图表类型,你将看到一个简要描述,包含它是什么样的,提供一些视觉示例,并列出一系列规则(这些规则会以粗体突出显示),在构建这种图表时可以随时参考。
条形图
条形图(图 7.4)可能是地球上最具代表性的图表类型。对于横轴上的每个类别,你都有一个或多个条形,其长度与要可视化的数量成比例。长度是一个非常直观的预注意属性:大脑会自然地感知每个条形之间的相对大小差异。这使得条形图特别适合传递关于不同大小的商业实体(如品牌、产品或国家)的信息,便于快速比较、排名和基准测试(尤其是当条形按高度排序时,这是通常推荐的做法)。类别也可以是时间段,如月份、季度或年份:这就是为什么条形图也用于展示随时间变化的信息(当然,在这种情况下,你不应该对条形进行排序,始终保持自然的时间顺序)。
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_04.png
图 7.4:一张简单的条形图:你可以一眼看出不同国家的 GDP 水平。
使用条形图时需要牢记的一个简单规则是,比例尺应始终从零开始。如果不这样做,条形图的长度就不再与我们希望显示的实际值成比例:这会欺骗观众的眼睛,误用了长度这一预注意属性。例如,看看图 7.5:德国人均 GDP 看起来只有挪威的一半,而实际上约为其三分之二:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_05.png
图 7.5:在条形图中,条形应始终从零开始(而不是像这个例子中从 25 开始)
这种图表的一种有趣变体是横向条形图:通常情况下,横向条形比纵向条形更好,尤其是当类别很多或标签较长时。看一下图 7.6中的例子:国家名称不需要倾斜(节省读者的脖子),而且条形可以更长,这样能更容易地比较不同国家之间的差异:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_06.png
图 7.6:横向条形图:更好地利用视觉空间的简单方式
当你有另一个类别变量需要编码时,可以使用堆叠条形图。如图 7.7所示,每个子类别(在这个例子中是国家内的部门)作为图表的一部分显示,用不同的颜色突出显示。通过这种方式,你可以展示每个组件相对于整个条形的大小,并且还可以进行国家/部门组合的比较。建议仅在需要编码的子类别较少时使用(理想情况下不超过四个);否则,读者很难辨认每个条形部分:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_07.png
图 7.7:堆叠条形图:通过使用颜色可以区分子类别
需要考虑的条形图系列中的另一个扩展是直方图:这本质上是一个条形图,展示了通过分组范围的频率分布。请看图 7.8中的例子。这个图表告诉我们,价格落在 €5.8 到 €5.9 区间内的频率最高:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_08.png
图 7.8:直方图:你可以轻松看到落在等大小范围内的值的频率
最后,条形图的另一种有用变体是瀑布图。这种图表非常适合展示前后对比中的正负变化成分,就像图 7.9中显示的 GDP 变化:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_09.png
图 7.9:瀑布图:你可以揭示变化的推动因素和抑制因素
折线图
折线图是展示数量随连续变量(如时间)变化的最自然方式。一个典型的案例是图 7.10:这条线是通过“连接点”得出的,连接了在纵轴上显示的不同销售值(在这种情况下,不需要像条形图那样从零开始),而横轴则表示时间值,按等间隔排列。数据点之间的连接线利用斜率这一预注意属性来传达数量是上升还是下降,以及变化速度:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_10.png
图 7.10:折线图的结构:连续变量(在大多数情况下是时间)位于横轴上
虽然最常见的情况是展示随时间的演变,但你也可以使用折线图来绘制任何连续变量的趋势。例如,如果你想展示不同价格点的销售产品数量,你可以将价格设置为横轴,观察随着价格的提高,销售如何下降。在任何情况下,切勿在折线图的横轴上使用类别变量。原因很简单:在折线图中,大脑将线条的坡度与相邻元素之间的变化联系起来,比如两个随时间连续的点。以图 7.11为例:意大利和挪威之间没有逻辑上的连续性(除了字母顺序,这对我们的信息没有意义),因此我们在两国之间看到的陡峭上升既是人为的,也是令人困惑的:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_11.png
图 7.11:折线图的横轴上使用类别变量:初学者应避免的错误
你还可以使用折线图显示多条时间序列在相同时间框架内的关系,并通过颜色区分不同的线条。然而,建议使用直接标签,将其放置在每条线旁边:这些标签更清晰,可以避免使用图例,从而省去了“映射”颜色到类别的麻烦。此外,这种方法还允许你使用颜色来视觉突出数据的一部分,就像图 7.12中所展示的那样,这将使图表更专注于你想传达的具体信息。
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_12.png
图 7.12:带有直接标签的折线图:尽量避免使用颜色图例,将其替换为直接标签
另一个建议是在采用双轴时要非常小心,双轴意味着在同一图表中允许线条分别对应两个不同的参考轴,且这些轴具有不同的量度尺度。双轴图形可能出现的问题之一是,当两条线相交时,大脑会预先关注这一交叉点:换句话说,它必须意味着某些东西。但实际上,这可能与我们想传达的信息没有任何关系。以图 7.13中的左侧图表为例:份额和销售线在第二季度和第三季度之间交叉,但这完全是由于两个垂直尺度的任意定义所致:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_13.png
图 7.13:双轴图形较为复杂:左侧图表有一个人工交叉点,且比右侧图表更难解读
右侧图表中的组合图是一种更为稳健的替代方案:柱状图和折线图明确地分别对应两个不同的轴,它们既不重叠也不产生交叉。选择右侧图形的另一个理由是其简单的轴增量:选择连续的两个奇数(29%、31%、33%等)作为增量,不如右侧图形(30%、35%、40%等)直观。
另一种更直接的替代方法是将相同数据可视化为多个单独的图表(通常称为层格图或面板图),如图 7.14所示。这种方法对于分离多条重叠数据序列时非常有用。它是一种避免意大利面图表的方法,后者将许多线条挤进一个图表中,使得每条线都很难单独追踪并解读:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_14.png
图 7.14:在层格图中合并的两条线:在这种情况下,我们通过采用数据标签来避免使用垂直坐标轴
在图 7.14的特定情况下,你还可以看到垂直轴已经完全被移除,取而代之的是数据标签,用于显示垂直轴的值。当你更倾向于报告精确值且可视化的数据点不多时,可以考虑使用数据标签,而不是依赖坐标轴。
层级树图
层级树图非常适合展示整体各个部分的相对大小。在层级树图中,整个空间被划分为多个矩形,每个矩形的大小与一个数值变量成正比。正如在图 7.15中所示,可以同时展示层级的多个层次(在此例中,国家和类别是用于分解销售的两个层级),并且可以比较所有元素的大小:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_15.png
图 7.15:展示国家/类别组合的销售相对大小的层级树图:颜色用于突出显示每个国家橄榄销售的普及度
即使你只有一个层级的分割,层级树图仍然是传达整体各部分相对大小的好方法。我敢打赌,有些人现在在想:我们不能用饼图来表示吗? 尽管饼图仍然被广泛使用,数据可视化专家建议避免使用饼图,认为有更直接和更好的替代方案。信息设计专家 Stephen Few 用一个简洁的规则总结了他对饼图的看法:饼图留着当甜点吃吧! 很容易理解为什么:图 7.16展示了一个饼图和一个条形图,它们可视化的是相同的数据集,并清楚地展示了为什么饼图不如条形图。饼图通过角度来编码定量值,而角度比长度更难以立即感知,长度则用于条形图。我们的脑袋在评估角度的幅度时比较困难。再看一下图中的饼图:你能轻松比较中国(饼图中的第一块,从“正午”开始)和法国(第四块,顺时针方向)的大小吗?
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_16.png
图 7.16:饼图更适合搭配茶水,而不是用来展示数据:在这种情况下,条形图做得更好
唯一可以使用饼图(或其其他听起来更好听的替代图表,如甜甜圈图)的情况是当你只有两部分时(如我们在上一章中做的那样——参见图 6.32):在这种情况下,很容易看出哪一部分更大,因此可以使用这些图表。在所有其他情况下,你应该使用条形图或树图来传达关于大小和比例的信息:就是这么简单。
散点图
在散点图中,数据以一系列点的形式显示在一个矩形区域内。两个量用来控制出现在图表中的点的横坐标和纵坐标。通过这种方式,你可以轻松地展示这两个量之间的关系。看看图 7.17中的示例:单位销售数量(编码为纵坐标,或y轴)随着单位价格(用于控制横坐标,或x轴)的增加而明显下降:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_17.png
图 7.17:显示单位销售数量与单位价格关系的散点图:价格越高,销售越少。虚线趋势线使这一关系更加明显
我们可以看到这两个量之间的相互依赖关系(线性相关性):随着价格的上涨,我们的销售量减少。散点图同样给我们提供了关于非线性现象的明显提示。例如,在图 7.17中,我们可以看到在€6.00 的价格阈值之后,销售出现了明显的下降。似乎全数字价格充当了一个心理阈值:顾客对€5.99 的价格标签比€6.00 的价格标签更具吸引力。像这样的线性和非线性模式可以通过散点图轻松发现:这使得它们成为在需要传达基于关系的商业信息时的安全图表选择。
添加一个趋势线,就像你在图 7.17中看到的虚线那样,可以突出线性关系。你还记得我们在第五章《工作中应用机器学习》里遇到的线性回归算法吗?趋势线只是通过横坐标(自变量)解释纵坐标(因变量)数量的线性模型的可视化呈现。你可以回去查看图 5.7,复习一下线性回归的视觉效果。
象限图,如图 7.18所示,是散点图的一种有趣扩展。通过两条参考线——一条垂直线和一条水平线——通常将它们设置在感兴趣范围的“中间”,我们将图表的空间划分为四个象限。每个象限与“低于”和“高于”每个参考阈值的四种逻辑组合之一相关:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_18.png
图 7.18:一个象限图,显示了市场规模和市场份额变化(x 轴和 y 轴)以及业务规模(气泡大小):这个图表提供了一个框架,可以根据每个国家的位置来对其进行分类。
这种图表在将每个象限与明确的商业解释关联时变得非常强大。例如,图 7.18 显示了一个公司在各个国家市场的市场份额年变化(纵轴)和所在市场的规模(横轴)。出现在右上角的国家(在我们的例子中,只有印度)是公司的优势:在这些市场中,公司正在增加其市场份额,同时,整个类别的消费也在增长(可能是由人口增长驱动)。如果这一趋势在未来得到确认,这个市场将变得对公司越来越重要:结合市场份额的增长,印度可以被加入到公司战略优势的列表中。如果你转而查看右下象限,我们会发现一些国家的市场规模在增长,但市场份额却在下降。如果我们不采取行动,这些市场将逐渐侵蚀我们更多的全球份额,因为这些国家的市场份额可能会增加。因此,这些是需要谨慎管理的威胁。在这个象限图中,气泡的大小与当前业务的规模成正比,这使得优先事项更容易看出。这个例子说明了象限图成为数据的商业解释框架的潜力。不幸的是,象限图仍然被低估,我强烈建议在你的工作领域考虑其可能的应用,因为它们可以带来真正的不同。
关于散点图的最后一个考虑:刻度不需要从零开始。因此,当你想要展示的值都远离“零”时,可以用散点图代替条形图来传达关于规模的信息:这会给你带来一个有意义的优势,即将刻度缩小到一个更小的感兴趣范围,使得差异更加明显。例如,图 7.19 是一个散点图,展示了与图 7.4 相同的数据:在散点图中,各国人均 GDP 的差距更加明显。
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_19.png
图 7.19:与图 7.4 中的条形图替代的散点图:如果信息是关于各国人均 GDP 的绝对差距,这种设计效果很好
我们现在已经完成了对数据可视化所需的基本图表类型的概述。条形图、折线图、树图和散点图涵盖了你可以通过数据传达的大多数商业信息。现在我们已经准备好了所有的元素,接下来我们将它们整合在一起,最终确定我们的视觉设计。
完成你的可视化
除了我们在前面几页中遇到的关于每种图表类型的具体设计指南外,还有一些适用于每次数据可视化的通用质量设计规则。这些规则的共同点将我们带回到本章开始时提到的地方:极简主义是有效数据可视化的终极关键。
耶鲁大学教授爱德华·塔夫图在现代数据可视化领域开创了先河。他提出的一个关键概念是数据墨水比,它描述了图表中由数据驱动的视觉元素的普及程度。考虑你在图表中使用的所有“墨水”来绘制数据的本质和非冗余的展示信息:如果我们删除这些图表元素,我们也会去除我们想要传达的潜在商业信息。现在想一想,绘制图表所需的总墨水量,包括不必要的图例、背景图片、不需要的文本等。塔夫图发现,通过去除所有杂乱的元素,我们最大化了数据墨水在总墨水中的比例(数据墨水比),从而获得更有效的数据可视化效果。
让我们通过一个例子来看它可能变得多糟:图 7.20展示了一个糟糕的柱状图,里面包含了几种错误的设计选择:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_20.png
图 7.20:数据可视化中不应采取的做法示例:此图表的数据墨水比处于最低水平
虽然很少能看到像这样的数据可视化如此糟糕,我相信你在工作中看到的许多视觉图表也会存在一个或多个与此类似的错误。在接下来的几页中,我们将通过一套实用的指南,帮助我们避免所有这些问题。我们需要培养出能够发现这些缺陷的设计眼光,以便我们能够始终构建出整洁且专业级别的数据图表。看看图 7.20,我们似乎可以从多种角度来开始分析:
-
**网格线:**网格线有助于引导视线将数据点与坐标轴连接起来,但并非总是必要的。无论如何,网格线应始终保持视觉低调且几乎不可见。尽量让它们尽可能细,且使用浅灰色。不要在每个轴上夸大网格线的数量:每个维度的网格线应不超过 10 条。如果你能够完全避免使用网格线,那就更好了:例如,如果你在数据点上方使用了数据标签,就应该去掉网格线和坐标轴,因为它们已经不再需要了。
-
**刻度标记:**刻度标记有助于将轴标签与数据元素对齐,比如线形图中的时间周期。类似于网格线,刻度标记应当视觉上较为低调,因此应保持其短小和纤细。柱状图通常不需要刻度标记,因为每一根柱子都应当很容易地与某个类别对应。就像任何可视化辅助工具一样,如果你不确定是否需要保留刻度标记,我的建议是将它们去掉,然后检查是否所有内容仍然清晰可见。
-
图表边框:你可以去掉图表的外部边框:它们会浪费墨水,但确实不会提供任何信息。为了避免与幻灯片或文档中的其他元素或文本混淆,围绕图表留出一条宽敞的空白区域:这样看起来既整洁又轻盈,这正是你需要的效果。
-
旋转文本:如前所述,当文本被垂直旋转或倾斜时,它的可读性会降低,需要更多的时间才能阅读,因此应该避免。在条形图的情况下,使用水平条形可以为长标签腾出空间。
-
3D 效果:数据图表是对一组数据点的抽象表示。在数据可视化中,我们完全可以去除真实感的因素。数据图表中的三维视角只会带来负面影响,因为它使得比较大小和参考线变得更加困难。3D 散点图有时在科学领域用于数据探索:在这种情况下,它们总是允许通过适当的旋转和平移与视图进行交互。在商业领域,这几乎是不必要的。不要使用 3D。
-
阴影:与我们在 3D 部分所说的类似,在任何数据可视化中都没有必要添加光影效果。虽然许多软件平台无理地允许这样做,但不要在你的视觉元素中添加阴影。
-
背景:图表的背景应该是中性的,以便前景中的所有元素能够尽可能清晰地区分开来。有时,缺乏经验的用户会在图表的背景中加入颜色或更糟糕的是产品和品牌的图片来使其看起来“酷”:这只会降低他们传达业务信息的成功率,因为图表的可读性变差。有趣的是,Excel 提供了在图 7.20中看到的白色大理石纹理作为背景——我并没有编造!别问我为什么,但 Excel 还有一个预加载的纹理,展示了鱼化石的图案。它非常奇怪,值得一看,但——请不要使用它。
-
标签:使用标签来标识线条或指定数据值非常有用。你应该避免添加重复标签,因为它们会增加不必要的墨水:例如,如果你在折线图或条形图上有数据标签,你可以完全去除坐标轴和网格线,正如我们在图 7.14中所做的那样。使用标签时,请确保它们没有边框或非中性色背景。如果它们显示数据值,避免过多的小数位,就像在图 7.20中那样。一般来说,保持文本标签尽可能简洁,以便清晰地传达你需要的信息。
-
图例:图例用于提供图表中颜色或纹理的解读键。使用图例的问题在于,它们始终需要读者的眼睛和注意力在图表中的数据元素和图例本身之间来回切换。作为一般规则,我们应该尽量避免使用图例,并始终寻找替代方法,就像我们在图 7.12中使用直接标签一样。如果必须使用图例,尽量通过将元素分组或过滤不重要的项来限制项目数量:人眼很难在同一图表中清晰地区分超过五种颜色。
除了前述元素,当我们优化数据图表时,还应注意颜色的使用。重要的是要认识到,颜色是我们大脑在面对图表时解码的最直接的前注意属性之一。至于其他属性,如长度、大小和位置,颜色在数据图表中使用时应始终具有特定的含义。换句话说,颜色从来不是为了装饰或满足任何美学需求而存在。在数据可视化中,颜色是有功能性原因的,比如:
-
突出需要注意的元素,就像我们在图 7.15中强调橄榄类别时所做的那样。正如我们将在下一章看到的,颜色在区分数据的背景和前景时可以非常有力。
-
编码额外维度,就像在图 7.7中展示的堆叠条形图,或通过颜色渐变显示连续变量。
大约 5%的人受到色觉缺陷(CVD)的影响,这是一种让某些颜色组合(如绿色和红色的不同色调)难以区分的色盲形式。因此,通过采用对色盲友好的调色板(davidmathlogic.com/colorblind)或使用明暗对比的颜色差异(当图表仅以黑白墨水打印时,这也很有用),尽量在数据可视化中做到完全包容。
在图 7.21中,你会看到一个改进版的之前看到的糟糕图表。这个图表现在已经通过应用我们在本章中遇到的所有质量指南进行了处理:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_07_21.png
图 7.21:改进版的前一个条形图:简洁胜出
自行判断:极简主义能增强清晰度,并超越任何添加不必要图形修饰的华丽尝试。
总结
本章为你提供了一套实用的工具和指南,用于设计专业且有效的可视化图表,供你在日常工作中使用。我们从设定数据可视化的整体目标开始:通过利用人类的视觉感知将基于数据的信息传递给他人。我们已经看到,在这一过程中,我们需要扮演设计师的角色,做出关于“要可视化什么”和“如何可视化”的选择。在选择了要传达的特定信息类型(可能是时间演变、绝对和相对大小的比较,或数量之间的关系)后,我们学习了如何使用图表选择矩阵来挑选合适的图表类型。我们发现了线性图表、柱状图、树形图和散点图的优缺点以及实施时常见的陷阱,而这些图表正是我们最常需要使用的类型。最后,我们介绍了一套确保数据可视化质量时应遵循的指南。我们发现,所有这些规则有一个共同的目标:它们都邀请我们在构建图表时应用有条理的简化、直接性和极简主义。
本章中我们学到的所有好实践都需要通过实践才能转化为习惯。我的建议是,一旦你开始处理下一个需要刷新或创建的数据图表,就立刻应用我们在这里学到的所有规则。有些规则一开始可能会让你感觉不太习惯——我知道你们当中有些人是饼图的忠实粉丝——但它们无疑会帮助你在数据可视化方面变得更加自信和成功。
在本章中,我们专注于将数据转化为可视化并传达特定的信息。在下一章中,我们将更进一步:我们将学习如何将基于数据的信息转化为引人入胜的故事,这就是数据讲故事的核心。
第八章:用数据讲故事
这是你没有预料到的章节。制作和传达一部虚构作品中,什么可以是分析性的、科学的和专业的呢?尽管看起来充满矛盾,但讲故事却是从数据中创造经济价值的最实用方法之一。在这一章中,你将了解这一过程是如何运作的,并且如何利用它来为自己谋取优势。
我们将很快回答以下问题:
-
故事与商业和数据分析有什么关系?
-
一个故事的构成要素是什么?
-
如何从我的数据开始构建一个故事?
-
我可以使用什么技巧来讲述推动商业价值的故事?
在本章的第一部分,你将发现是什么让故事如此有效地与他人沟通(并说服他人)。在第二部分,你将学习一种简单的方法论以及一些实用技巧,帮助你自己构建强有力的数据故事。本章不同于书中其他章节,因为它旨在培养一套比你之前看到的更柔和的技能。对于一些更熟悉技术和科学的读者来说,这可能会让人感到有些不适。无论如何,我保证这本章值得一读:你可能会像之前的许多人一样,成为一个意想不到的数据故事爱好者。
说服他人的艺术
仅仅“正确”是不够的:这是许多数据从业者面临的平凡且有时令人不安的现实,他们的观点——无论多么真实和深刻——无法被主管接受和听取。正如我们在第一章中看到的那样,通过数据分析创造经济价值有多条路径,我们称之为数据到价值的路径。在大多数情况下,要创造价值,我们需要通过数据来影响他人,促使他们做出正确的决策或采取适当的行动。现在请想一想:到目前为止,你在书中所看到的一切——所有努力转化数据、发现洞察、建立强大模型的工作——如果我们错过了链条的最后一环,即影响他人的行动,这些工作都将悲哀地变得无用。为了防止我们的工作变得无关紧要,最好的办法是将其贯彻到底,直到采取行动,而不是天真地认为“做数学工作就足够了”。为了做到这一点,我们需要通过掌握劝说的艺术与科学,来有说服力地传达我们的观点。
描述劝说动态的最简单(也是最古老)的模型是修辞学:它总结了使演讲或书面文件(在我们的案例中,可以是支持管理决策的演示或商业备忘录)在说服他人时成功的三个基本特征。这些特征,也被称为劝说模式,包括:
-
可信度:发言者、作者或支持者的权威性和个人诚信会使论点更具可信性,更容易被接受。那些能够展示成功的经验记录的人,会更容易获得认可。此外,用于支持某个观点的来源的可靠性,无疑会增强论点的说服力。 |
-
逻辑严谨性:清晰且扎实的理性论证链条能够激发听众的智慧和理性,使其更容易接受。如果你能够使用一种被他人接受(并且—特别—易于理解)的逻辑来证明你的观点,最终他们会信服。如果你的逻辑有任何缺陷或无法理解,你的听众将会质疑整个论点,哪怕你完全是对的。 |
-
情感参与:如果观众在情感上投入,并且感觉到与案件有个人的关联,他们更有可能同意并采取你推荐的行动。发展情感诉求的方式有很多种,比如使用唤起情感的图像,选择带有情感强调的词语,提到亲身经历,做出人们能个人感同身受的类比,或者创作引人入胜的故事保持高关注度。这个特征要求你识别情感,分辨情绪,并根据环境调整风格和内容,这一系列能力被称为情商。
修辞学是一门古老的学科。它最早起源于公元前 5 世纪的西西里岛,在古希腊的叙拉古和阿格里真托的殖民地,作为一种提高法律程序成功几率的技术方法论。它最早由希腊哲学家亚里士多德(384–322 BC)描述,提出了这里展示的三大支柱模型:伦理(ἦθος,指的是可信度)、逻辑(λόγος,逻辑)和情感(πάθος,情感)。 |
让我们回到商业数据,考察一些具体的例子,看看如何利用修辞学为我们带来优势。表 8.1仅展示了我们可以在数据修辞中实施的一些技巧:在浏览这些技巧时,思考一下你是否已经见过它们的实际应用,并开始想象如何在下一次数据呈现中利用这些技巧: |
| 模式 | 驱动因素 | 示例 |
|---|---|---|
| 伦理 | 资历/个人简介 | 我在使用这种方法论方面有 15 年的经验。 |
| 成功案例 | 我们已经在法国尝试了这种方法,它推动了 7%的市场增长。 | |
| 权威来源 | 根据斯坦福大学的研究… | |
| 支持者/推荐人 | 该模型已由我们的财务总监审核。 | |
| 逻辑 | 逻辑推理 | 既然 X 是对的,那么 Y 也必须是对的。 |
| 严谨的商业事实 | 正如表格所示,这个品牌的利润是所有其他品牌的 5 倍。 | |
| 科学有效性 | 经测试,该模型达到了 92%的准确率。 | |
| 情感 | 隐喻/拟人化 | 认识一下我们的典型客户,Matt:他 35 岁,是一名… |
| 情感画面 | 看看调查中的趋势,我们正朝着悬崖边缘走去… | |
| 个人经历 | 我最近也作为消费者亲身经历了相同的情况… | |
| 先前的希望与恐惧 | 想象一下,如果我们再次经历去年那样的衰退,后果会如何… | |
| 引人入胜的叙事与转折 | 看看如果我们不采取行动会发生什么,接下来是我们如何取胜… |
表 8.1:数据修辞的使用示例
根据你的背景、个人倾向和风格,你可能会发现三种说服方式中的每一种对你来说都更自然或不太自然。一般来说,我们可以观察到这些偏好中的一些模式。
例如,许多数据专业人士会觉得使用逻各斯模式最为得心应手:通过将科学方法应用于现有数据,他们能自信地证明自己的观点。数据和逻辑的世界是他们的世界。
偏好伦理学模式在一定程度上取决于个人演讲者的历史及其在组织中的信誉。幸运的是,个人信誉是可以通过努力逐步建立的。
对于大多数数据从业者来说,最难掌握的模式是情感。情感比数字和算法更难以管理。它们无法归入静态和预设的类别。人类的一个迷人之处在于,每个人都是不同的,每个人都有不同的敏感度。毫无疑问,在用数据说服他人时,管理情感模式是最艰难的部分,这将需要本章剩余部分的详细探讨。
好消息是,在用数据进行逻辑论证时,有一种经过验证的方式可以实现高度的情感投入,这正是我们现在要重点关注的:构建伟大的故事。
讲故事的力量
人类是讲故事的生物。这一特性是我们天性的一部分。当我们的祖先第一次围坐在篝火旁时,故事开始被讲述,语言也随之发展。讲故事的根本目的一直是为了传递知识,使其能够深入听众的脑海并说服他们。自人类诞生以来,文化就是通过故事传承的:它们通过口头方式世代相传,远在文字(和 PowerPoint 演示)出现之前。
现在,我们的日常生活完全沉浸在故事中。品牌通过叙事来进行传播:广告将通过一个故事来促使你购买某个产品,而不是单纯列举你应该购买它的理由。当你与好友聊天或在咖啡机旁遇见同事时,你会讲述你生活中的故事,而不是冷冰冰地列出你过去的活动。当你在家消费媒体、读书、看剧或哄孩子入睡时,你正在利用我们每个人都能感受到的对虚构故事的天然吸引力。
在让故事如此核心的众多原因中,有三个具体的原因使得叙事在商业环境中展示数据时如此有效:
-
故事比统计数据更能留在人们心中。多项认知心理学研究证实,当事实以叙事的形式呈现时,它们会比单独列出时更容易在我们的大脑中留下深刻印象。正如斯坦福大学教授戈登·鲍尔和米哈尔·克拉克进行的著名实验所证明的那样,如果通过创造包含这些单词的虚构故事来记忆一系列随机单词,人们的记忆力要比平时强 6 到 7 倍。其他研究还表明,与说明性文本相比,叙事性文本可以阅读得更快,回忆起来也更容易。只要增加一个“串联事实”的情节,你更可能被理解并被记住:就这么简单。
-
故事鼓励接受。当我们观看科幻剧集时,我们完全知道这只是虚构作品,里面的一切都不真实。但我们可能会被它吸引,并且继续观看,迫不及待地跳到下一集。怎么可能呢?这发生是因为,当我们面对一个故事时,我们默契地签署了一项协议,称为叙事契约。它的内容大致是:“我同意暂时放下我的怀疑,因为我知道这个故事一定会带来一些好的东西,无论是新的知识,还是娱乐或短暂脱离现实的体验。”当有人在给我们讲故事时,我们同意怀疑的余地,因为我们接受有可能会被惊讶到(甚至改变自己的想法)。许多商业情境要求你让观众跳出当前的信念,因此叙事契约正是你所需要的!大多数决策是由直觉和过去的个人经验驱动的。当你开始讲故事时,你让观众默契地签署了叙事契约,这是让他们心态开放并聆听的绝佳方式。
正如小说作家所深知的那样,叙事契约只有在我们为虚构世界提供连贯的逻辑时才会有效。正如本章稍后所述,我们必须在数据故事中保持一致性,无论是内容(基本假设、用词)还是外观(如颜色和格式)。
-
故事推动连接。当普林斯顿大学的神经科学家乌里·哈森使用功能性磁共振成像(fMRI)扫描仪研究讲故事者和听众的大脑活动时,他对结果感到惊讶:随着故事的展开,受试者的大脑开始趋于一致,显示出越来越同步的信号模式。故事有能力在参与方之间创造一种情感连接或共鸣的状态。这种连接会让你的受众感觉更亲近你并认同你。因此,他们会更倾向于同意你的数据所建议的内容。
我们在过去几页中看到的所有内容引出了一个简单的结论:故事为我们的数据洞察加上了轮子,让它们走得更快、更远。通过为数据赋予引人入胜的叙事,我们的观点将更具记忆点,更容易被接受。故事讲述是一个有效的工具,它将我们宝贵的洞察带到最重要的地方:决策者的行动能力,改变现状的能力,从而将数据转化为真正的商业价值。既然我们已经了解了为什么故事讲述是如此重要的技能,现在让我们看看如何将其应用到我们的数据中。
数据故事讲述过程
创作一个引人入胜的数据故事需要将创造力的发挥与结构化方法的应用相结合。在接下来的页面中,我们将揭示每一个数据故事讲述过程的步骤,这是你在通过数据和分析影响业务合作伙伴时可以遵循的方法论。它是这样运作的:
-
第一步是设定目标,这意味着定义故事的预期结果(预测它将产生的影响),并明确你的受众组成、驱动因素和已有知识。
-
然后,你需要选择场景,你的故事将由这些场景构成,并草拟它们。我们将介绍五种典型的场景类型,你可以将其作为灵感来让数据发声。
-
一旦你明确了场景,你就可以按顺序排列它们,并应用结构,让你的故事流畅地展开。我们将介绍一种基本的三幕结构,这是一种证明有效的组织叙事的基础。
-
到这时,你将润色场景,使其内容更加突出:你将明确哪些内容应该放在背景中,哪些应该在每个场景的前景中被重点展示。
-
你的草稿可以经历多个周期,你将逐步优化它,重新考虑所有场景及其结构,以确保最终达到最初的业务目标。
-
最终,你的故事将准备好进入黄金时段,你将充满信心地在受众面前呈现它。
图 8.1展示了数据故事讲述过程的图示总结:你先定义目标,然后经历一个迭代过程,选择、构建和润色场景,最后准备好进行讲述:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_08_01.png
图 8.1:数据故事的流程:设定目标,完善场景设置,自信地呈现
构建一个强有力的数据故事并准备好呈现它是需要时间的!你应该主动规划这一过程:如果可能的话,可以在日程中预留一些时间段,为演练留出充足的时间。
让我们从这个过程的第一部分开始:定义你的故事目标。
设定目标
达成任何目标的一个基本条件是明确它的样子。数据故事也是如此:这一过程的第一步是向自己明确你想要获得什么,以及从谁那里获得。
思考你期望的具体结果,并试着在脑海中描绘出成功的生动画面:
-
你是希望让某人意识到一些深刻的数据发现吗?在你完成讲述后,他们应该对你的发现以及它所意味着的内容感到信服。
-
你是在为某个项目争取资金支持,还是为你的团队争取额外的投资?你希望达成的目标是,让决策者在听完你的故事后立即批准它。
-
你是否发现了一个商业机会,并想要说服经理人采纳你找到的解决方案?你的目标是让经理人对当前的现状感到不安,并以紧迫感支持你的推荐。
这些例子有些过于刻板和陈词滥调:在实际的商业环境中,你的目标将会是多个项目的组合。不过,在开始构建你的故事之前,你需要尽可能清晰地定义你想要实现的具体情境。把它写下来,因为你将在最后检查你的故事是否符合这一目标。
讲故事总是涉及到一个观众,而观众的特点将决定你如何构建故事并将其生动呈现。我们不能忽视观众——实际上,越是根据观众的需求来调整我们的故事,我们就越能有效地达成目标。在这个初始阶段,你需要集中精力关注两个定义你面前观众的基本特征,也就是:
-
当前的知识和先前的信念:你可以合理地假设他们已经知道哪些关于你将讨论的话题的信息?他们需要哪些背景知识才能跟得上你的讲解?当你解释你用来分析和建模数据的方法时,他们能理解吗?他们对于你故事中的主题有什么已有的看法?是否需要说服他们摆脱任何先入为主的错误假设?花几分钟思考这些问题——或许可以借助那些最了解他们的人——并记下你内容中必须包含的关键要素。通过思考这些问题,你还能提前预见观众的一些提问,并主动做好回答的准备。
-
关键业务目标:你的观众最关心的是什么?目前他们最关注的具体业务指标是什么?他们现在的战略优先事项是什么?例如,是否更重要的是在其他市场迅速扩展业务,还是在当前市场战胜竞争对手?是增加销售还是通过节省成本来提高生产力?你需要清楚地知道他们最关心哪些业务 KPI,这样你才能以这些为基础分享你的发现和建议。在与观众交谈时,切勿低估与他们关注的事项保持一致的重要性:许多数据故事未能引起注意,因为呈现者未能吸引听众的兴趣。你需要说同样的语言,触动他们的痛点。
在你脑海中清晰地描绘出理想结果,并了解观众当前的知识和动机,将帮助你保持相关性、引人入胜并专注于结果:这是你开始构建一篇出色的数据故事的最佳视角。
选择场景
既然我们谈论的是故事,我相信如果我们借用一些典型的剧院和电影行业的术语,比如场景和幕,你应该不会感到惊讶。在戏剧中,场景指的是在某一特定时间发生在某个特定地点的动作。在数据叙事中,场景代表一个准确的陈述,支持这一陈述的是具体的数据发现。场景可以用简洁、明了的短语总结,例如:自去年九月起,销售额每个月下降 8%或现在推出这项新服务,我们预计在不到两年内即可实现盈亏平衡。场景是你故事的基本组成部分,是构成你叙事链条的各个环节:它们必须独立(由数据有力支持)且简洁,以便有效引导观众了解你的逻辑论证发展。
确定正确的场景组合来构建数据故事是很困难的。如果你有大量的数据,可能会陷入展示超出必要范围的数据的诱惑,包括那些不支持情节发展的数据。你可能最终会展示大量的数据显示,却没有清晰的发现或它们之间的联系:这样做会让你的观众感到非常困惑。另一方面,如果你没有足够的数据证据来支持一个场景,你的故事基础就会崩塌,叙事链条会被打断,论证的逻辑性也会瓦解。此外,一个数据场景必须告诉我们一些吸引人、有价值和对故事发展有功能性作用的信息。如果我们展示某些数据,却没有阐明它为什么重要,我们就会失去观众的关注。
很容易在数据提供的复杂和多样化路径中迷失方向。幸运的是,我们能够识别出几种经常出现的相关数据场景类型:它们作为故事中的转折点效果很好,可以为叙述提供有趣的转折点。在我们头脑中清楚地拥有它们可以帮助我们定义我们故事中的场景,这恰恰是我们作为流程的一部分需要做的事情。最常见的五种数据场景类型包括演变、比较、关系、分解和分布。我们现在将逐一介绍它们,澄清您应该用来支持特定观点的典型数据证据,并提供示例。
演变
这个场景主要突出了随时间推移的某种变化。典型情况是展示 KPI 的增长或下降(过去 5 年,收入年均增长 7%,在过去 3 个月加速增长;在 12 月,用户数量比 11 月减少了 13%):这些信息深刻展示了企业的动态状态。分析指标过去的演变可以突出突破趋势和相关的“异常”(在广告活动期间,我们网站的访问量是平均日访问量的 2.5 倍)。它还可以展示重复的模式和周期,揭示我们企业运作方式中的季节性组成部分(12 月至 2 月间热巧克力的消耗通常占年度类别销售的三分之二)。通过预测模型,我们的场景还可以关注未来可能发生的情况,并警示观众即将发生的事情(明年我们预计月度新合同将下降 15%,相当于 250 万美元)。
比较
当您带领观众通过对比两个或更多项的并列比较结果时使用这种场景类型:当您希望放大显著差异(对于我们的经销商来说,销售 A 制造商的汽车比销售 B 和 C 制造商的汽车分别更有利可图,分别是 3.4 倍和 3.7 倍),或者报告假设模拟的不同结果(选项 A 每周确保 4500 欧元的增量销售,而选项 B 则不然)。这种场景在数据叙述中无处不在:通常,您希望利用对比效应来增强差异,并将您的叙述引向特定方向。
如果您在比较场景中以与业务相关的术语传达关键场景,您将使您的数据故事更具影响力。在比较场景中,尝试将差距“货币化”,将其转换为您的观众评估的同一计量单位(如美元销售额、新订阅者数量或成本降低百分点)。
关系
通过使用这种场景类型,你可以展示两个度量之间的关系。一种常见的情况是,突出两个量之间相互关联的程度。你可以通过相关系数来总结这种关系(85%的冰激凌销售波动可以通过天气条件来解释)或适合这些数据的模型参数(每增加一美元的价格,我们预计市场份额将下降 12 个百分点)。
虽然关系场景用于暗示业务关键绩效指标(KPI)之间的因果关系,但你需要辨别相关性和因果性之间的区别,确保向你的听众明确指出这一点。确保明确提到你揭示的关系不意味着什么,理想情况下通过提出一些反事实来阐明这一点。这样,你可以防止你的故事被误解,避免给业务带来损害。
另一个情况(与演变场景类型部分重叠)是当你展示两个指标的交集,标明一个度量超过另一个的时刻(截至去年,制造商 A 超越了制造商 B,成为市场领导者),或者对两个度量之间逐渐形成的差距进行思考(制造商 A 现在每个月出货量是制造商 B 的两倍)。
分解
当你将某物分解为其组成部分时,可以使用这个场景。例如,你可以深入挖掘,更细致地展示影响业务指标的主要因素(或负面因素)(在当前与目标的$10.4M 差距中,$9.2M 完全是由于产品 X,我们欧洲的收入中,83%来自意大利,其余部分由西班牙和希腊平均分配):当你希望将听众的注意力引导到那些(少数)最重要的组成部分时,这非常有用。你也可以反过来,从详细视图“拉远”到聚合视图,以便与大局进行对比,并为某个具体问题提供更一般性的背景(我们的商店在两年内销售额翻了一番,但仍然是该地区表现最差的商店)。
分布
这个场景帮助你突出数据点分布中的有趣模式。例如,你可以展示如何将相似的商业实体分组为同质化的集群(我们的客户群体可以分为四个群体:A、B、C 和 D),这些群体可以通过它们的典型特征来描述(A 组的客户大多是单身,每年收入在 50 万到 75 万瑞士法郎之间)。或者,你可以揭示一个实体在整个群体中的相对位置(我们的公司财务表现位居行业的上四分之一)或揭示异常情况(X 商店是该地区的异常值,因为其货架生产力是所有其他商店的两倍)。
在本节开头,我们提到过一个好的数据场景总能用一句简明扼要的陈述来总结:通常,这个总结会借助支持性的数据证据。表 8.2总结了五种数据场景类型以及你应该使用的典型数据事实来论证你的观点:
| 场景类型 | 典型转折 | 典型支持数据 |
|---|---|---|
| 演变 | 上升或下降,加速或减速,保持稳定,预见未来,揭示过去的趋势破坏者,季节性 | 与上期的变化,和去年同一时期的变化,每期的平均变化,实际变化与预期演变的差距,季节性指数 |
| 比较 | 并排比较,假设模拟,异同对比 | 相对差异,绝对或货币化差距,场景之间的差异,以及结果对比 |
| 关系 | 不同度量之间的相关性,趋势交汇,差距 | 相关系数,一项度量对另一项度量的影响,反转时间,差距积累程度 |
| 细分 | 深入拆解成分,汇总成聚合,聚焦具体,放眼全局 | 部分与整体的相对贡献,成分的显著性,与更高层次的差异,主要驱动因素和影响 |
| 分布 | 成为异常值,属于某个聚类,排名位置 | 四分位数,方差或标准差,偏离常规的距离,顶端与底端,排名,聚类数量,聚类中心 |
表 8.2:数据场景类型及典型转折和支持数据
在构建你的叙事时,可以参考这个表格,决定你想要为数据故事加入的具体转折点——更重要的是,决定你将使用哪个度量来支持它。
应用结构
选择了数据场景后,是时候将它们组合成一个连贯且吸引人的结构了。在传达数据洞察时,简洁和直接总是有效的,特别是在商业环境中。因此,我们将采用一个简单明了的三幕剧模型来安排我们的数据故事:它基于经典的叙事结构——开端、中间和结尾。这种结构从希腊悲剧到最新的 Netflix 电视剧,一直是虚构作品的骨架。想想你最喜欢的书或电影:它们可能会从介绍主要人物和描述他们的正常生活(开端)开始,可能还会带有一些关于即将发生的悬念暗示。
然后(在中间),一系列激动人心的事件开始发生:它们让人物经历一些重大的变化,并在过程中面临种种复杂和障碍。这些变化使得紧张情绪起伏不定,最终导致一次重大危机或高潮。最后(在结尾),紧张情绪缓解,人物进入一种“新常态”,这通常不同(如果是幸福结局的话,则更好)于开头所描绘的状态。
这种结构有效!在它的简洁性中,它可以以一种让观众不断翻页或凝视屏幕的方式保持张力。让我们逐个审视这三幕,并看看我们如何应用这种结构(如图 8.2所示)来构建一个引人入胜的数据故事:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_08_02.png
图 8.2:数据故事的三幕结构。始末分明的开始、中间和结束仍然有效。
开始
当你开始你的数据故事时,你希望通过使用所谓的引子(Hook)迅速抓住你的听众的注意力:这是一个简短的陈述(可能不需要任何特定的视觉或支持性细节),它使听众渴望听完整个故事,并愿意投入他们的精力跟随你和你的故事几分钟。在数据故事中效果良好的引子可能包括:
-
关于你的主要发现的部分预览(我们将看到导致上个月顾客满意度下降 10%的原因)。
-
一个支持你要讨论的主题紧迫性的声明(数据表明我们只有 20 天的时间来加强生产线,而不影响未完成订单的履行)。
-
如果你的建议被采纳,可能产生的后果的预期(我们将了解如何在未来夏季与去年相比增加 210 万美元的销售额)。
在数据故事的开始,你需要做的另一件事是提供一些通用的背景信息,使每个人在讨论你将要讨论的问题时都处于同一起跑线上。考虑一下你希望稍后在故事中展示的数据场景:观众需要完全理解它们的背景是什么?业务的当前状态是什么?此外,如果之前已经对这个主题进行了一些努力(例如早期尝试解决同样的问题),在开始时提醒听众这些努力及其为什么尚未完全令人满意可能会有所帮助。
有时,数据展示以对数据来源、它们的范围和新鲜度的全面描述以及与其限制性有关的详细声明开始。这是一把双刃剑,因为它甚至可以在讲话开始之前就让谈话停下来:它确实可能降低对那些对这些细节不太感兴趣的观众的注意力。建议是将这些技术内容保持在最低限度,仅提及要点,并准备一些后备材料,以便只有在它被提出作为一个问题时才能深入讨论更多细节。
许多演讲者陷入的另一个陷阱是过多分享与项目相关的个人背景细节。这是迅速失去听众兴趣的另一种方式。只有在你的背景有助于增强你在该主题上的权威性时才谈论自己,而且即使如此,也要节制:过多谈论自己会使你的故事变得不那么突出。谦逊是有好处的。
通过抛出一个吸引人的钩子并铺设必要的背景,你已经完成了故事的开端,可以准备进入故事的核心部分。
中间
故事的中间部分:这是大多数行动发生的地方。在这一部分,你要铺设一系列场景,逐步建立支持你论点的逻辑。正如数据故事专家布伦特·戴克斯所指出的,你首先要做的是确定顿悟时刻:这是你的数据故事的高潮——可以将其看作是戏剧的焦点场景。一旦你明确了顿悟时刻,就可以向后规划所有前面的场景,让观众通过一系列逐渐升高的洞察力被引导,最终将他们带到高潮。
Pixar 的电影导演安德鲁·斯坦顿注意到,观众总是喜欢为他们的饭菜付出努力。鉴于我们人类推理和演绎的倾向,他建议故事的中间部分应该留出机会让观众自己将信息拼凑起来,积极参与这个过程,而不是每一步都端到他们面前。斯坦顿建议:“不要给他们四个,”他说,“而是给他们二加二”。当决策者觉得自己是思考过程的一部分(而不是旁观者)时,他们更有可能接受你的提案。
这就像一个“连点成线”的拼图游戏:编号的点告诉你确切的操作步骤,但你仍然会在自己画线时找到某种内在的满足感,或许还能揭示一些意想不到的东西。实现这一技巧的一个实用方法是,在场景中仅展示一部分可用数据,要求观众思考剩下的部分。例如,你可以利用动画来直观地展示逐步揭示的过程,或者停下来使用翻转白板收集观众的想法(并让他们思考),然后再恢复流程并分享你的观点。通过让他们参与思考,你会将他们带入到这个过程,从而使他们与你更紧密地联系起来。当他们在这个问题上作出立场时,他们也会直接面对自己之前的信念,并可能证明自己错了。
允许观众参与可能会适得其反:例如,某些参与者可能会干扰注意力,转移到他们的具体目标上,从而危及你的叙事。避免这种情况的一个技巧是,在请求观众参与时,明确说明你希望他们做什么:与其仅仅停下来并要求一般性的评论,不如提出一个具体问题,并清楚说明你期望的具体行为。
当你清楚地知道如何通过逐渐升高的洞察力引导到顿悟时刻时,你就可以进入故事结构的下一部分,也是最后一部分。
结束
那又怎样? 这是观众对数据故事可能做出的最令人畏惧的反应。你要尽力避免这种情况。记住:讲故事的工作不是为了打扮数据,使其看起来更美观,或仅仅为了让展示更具吸引力。数据故事实际上是一个实用的工具,用来实现一个非常实际的目标:推动业务行动!故事的结尾有着至关重要的作用——让观众从理论转向实践,从一个好主意转化为实际改变,从一个深刻的洞察力转化为有影响力的决策。许多数据故事——即使逻辑上合理、情感上吸引——在最后一步失败,未能带来任何显著的后果。为避免这种情况,你需要在故事的结尾部分包含两个关键要素。
第一个要素是关键要点的列表:这些是三到五个你希望观众记住的信息。要点无疑包括“顿悟时刻”场景的总结,以及你希望观众牢记的每一条建议。仔细选择你的要点:它们不应根据你自己觉得很自豪的发现来选择,而应该根据它们对业务的价值增益来决定(即观众记住并付诸实践的意义)。
数据故事结尾的第二个要素是提出的下一步行动列表:这可以是简单的要点列表,或者是一个表格,列出每个有意义的行动的做什么、由谁负责以及何时完成等元素。至关重要的是,不仅要描述需要发生的事情,还要标明负责人和完成期限,以避免你的提议因责任模糊而落空。某些下一步可能在你准备的资料中提前填写好,因为你预计它们会被需要,依据你计划展示的内容。其他则可能在观众对你的故事提出意见时即时决定。无论如何,你需要确保把它们写下来,并验证各责任方的对齐情况。
根据你故事呈现的上下文(例如与少数决策者的简短电话、一个大团队会议或市政厅报告等情况),你需要适当调整故事结尾部分的格式。你可能需要加入简短或长篇的问答和讨论环节,以便鼓励观众积极参与并为决策做出贡献,或明确下一步的必要行动。
这里没有统一的格式:只需考虑一下你的特定观众最终会希望在故事的结尾部分做什么,并据此规划。一旦你准备好了一个简明的要点清单和一些务实的下一步行动,你就拥有了自信结束故事所需的一切,你也为进入数据故事讲述过程的下一步——完善你的场景以使它们更出色——做好了准备。
打磨场景
有时,不够经验丰富的数据故事讲述者会天真地认为“让数据说话”就足够了:他们的故事最终变成了一个信息倾泻,一系列图表被简单地粘贴在一长串 PowerPoint 幻灯片中。结果呢?让观众感到困惑、失去兴趣,并将他们推得离原本目标越来越远。通过选择合适的(少量的)场景并将其放入稳固的三幕结构中,你已经采取了一些有效的步骤来避免掉入信息倾泻的陷阱。然而,这还不足够,在结束故事之前,你需要花时间打磨你的场景,使它们聚焦且易于理解。
聚焦注意力
在数据故事讲述中,正如生活中的许多其他事情一样,少即是多。观众的注意力是稀缺且脆弱的资源,你需要不惜一切代价保护它。如果你仅通过语言来讲述数据故事,而没有任何视觉辅助工具,那么你需要保持语言简洁:使句子简短明了;除非叙述需要,否则避免加入不必要的细节。如果像大多数情况一样,你会配合一些辅助视觉材料(比如带有图表的幻灯片),你需要对这些材料进行严格的必要性检查。幻灯片中的每个视觉元素都会占用观众一定的认知带宽。你不能浪费这种资源——它总是稀缺的——来做装饰、杂乱无章或一些可有可无的附加内容。
系统地保持数据场景聚焦的有效方法是遵循这个简单的两步方法:
-
识别需要处于前景的内容以及需要保持在背景的内容。考虑你想在场景中传递的关键信息:所有直接支持你观点的事实都应该被照亮并放在前景中。另一方面,所有为你的信息提供背景支持的其他数据点应被移除或在视觉上弱化。区分前景和背景元素并不难。如果信息是品牌 X 的增长相对于竞争对手过于突出,那么显示品牌 X 增长的线条应位于前景,而竞争对手的品牌则应处于背景。如果你想说的是表现出这两个症状(在 10 个可能的症状中)的患者更可能是阳性,这两个关键症状应处于前景,其他症状则应置于背景以提供背景信息。
非数据元素如图形辅助线(网格线、坐标轴和图例等)、重复文本和标志应始终放在背景中,并应视觉上保持柔和(或者在不必要时移除)。
-
一旦你明确了场景两层中应该包含什么内容,你需要利用你的图形设置来“最小化”背景元素的突出性,以支持前景中的元素。在许多情况下,数据故事在区分这些层面时会失败:所有图表设置都仅保持在它们的“默认”模式下,迫使每个图形元素(线条、柱子、表格单元格等)都平等对待,没有一个能够突出。你希望正好相反的情况发生:注意力应自然地流向应该从众多元素中脱颖而出的少数项目。与其加强关键内容,不如“雕刻”非必要内容:通过这样做,你避免了增加更多可能进一步分散观众注意力的视觉元素。
以下是最常用的引导观众关注重点的方法:
- 颜色:给背景元素以低饱和度的颜色,最好是灰色,并为前景元素指定高饱和度的颜色。大多数情况下,你只需在所有场景的前景中一致使用单一的高饱和度颜色(如蓝色、橙色,甚至黑色),并且其他所有元素只用灰色调即可。如果图表中只有特定的部分应该处于前景(如线的一部分或柱状图中的特定柱),则只需将颜色应用于该部分:这将清晰突出其在故事中的独特角色。
注意颜色!避免在故事中不加考虑地使用多种不同颜色,因为它们可能会严重分散注意力。数据场景中出现的颜色越少越好:作为经验法则,永远不要在单个视图中使用超过五种不同的颜色。
-
尺寸:对于应保持在背景中的内容,请使用较细的线条和较小的字体。较粗的元素和粗体字体非常有效,可以清晰地区分前景内容。
-
分组:将背景中不需要保持分开的元素组合在一起,是使前景内容获得关注的有效方法。典型情况是当图表中有许多重叠的线条(使它们难以区分)或者堆叠在一起的几个(小)子柱难以辨认时,你可以通过将背景中的较小元素聚合为单个项目来解决问题,你可以称其为其他所有。
你的第一轮打磨已经完成:你已经确定了应该放在前景的内容,并使其脱颖而出。
使场景易于访问
数据故事讲述中的清晰度是必须的,但要实现这一点却相当困难。你的观众在背景、资历、前期知识和注意力集中度方面可能非常多样。因此,为每一位观众清晰地展示内容需要额外的努力。如果你希望做到包容性,你的数据场景应该易于所有人理解,并尽可能自我解释。你可能是你所展示内容的专家,但请记住——你的专业知识不应该是观众完整理解你的故事所必需的。
在构建数据故事的视觉支持时,你可以使用一些经过验证的方法,使你的幻灯片简洁明了,便于所有人理解:
-
行动标题:确保每个幻灯片的标题能够直接传达你想表达的观点。一个糟糕的标题是Sales evolution forecast (in US$), next three years,而一个好的标题是我们预计销售在未来 2.5 年内增长 50%。使用标题来告诉观众你希望他们了解什么,而不仅仅是提供关于他们所看到内容的背景信息。你可以使用其他功能(如轴标题)来解释你展示的指标。你还记得我们说过可以用简洁明了的句子来总结场景吗?把这个句子作为幻灯片的标题。
-
引导标签:添加文本框,标示并解释你所展示数据中有趣的部分。典型的做法是,当你圈出一些数据点或一部分线条时,在附近添加一些文字来解释发生了什么。如有必要,可以使用线条或箭头将你想要特别说明的数据与其相关的文字注释连接起来。仅通过查看引导标签,观众应该能够自动理解场景中的大部分动作,而无需额外解释。
使用颜色将文本和视觉元素连接起来,指向同一个实体。例如,如果一条蓝色的线代表某个特定品牌,那么在标题或标签中提到该品牌时,使用相同的蓝色。这是一种非常有效的方式,使你的材料自解释且能明确地引导观众。记住,在整个故事中要保持颜色选择的一致性。
-
构建动画:考虑以逐步构建的方式组织你的视觉材料。通过几步递进的动画,是传达更复杂思维的有力方式,这能让你逐步引导观众,随着一个个场景的展开,展示更多标签和数据块。动画也适用于强化一些场景类型的情感负荷,比如演变(这是我们去年获得的利润,接下来…(动画继续添加预测的开发内容)… 如果产品发布成功,明年可能会达到的目标)和分解(在所有西班牙新订阅的用户中…(动画继续展示深入分析)… 超过 80%的用户仅仅由于收购)。此外,动画还可以防止观众提前阅读你的材料:他们的好奇心可能会分散他们的注意力,使他们偏离你精心设计的讲解流程。
-
可读性:过于复杂的幻灯片可能会导致观众在试图解读他们所看到的内容时,无法集中注意力在你的叙述上。避免视觉信息过载:如果内容太多,你应该问问自己哪些可以删减,哪些可以作为备份材料保留。如果内容都很重要,可以使用多个图表。写字要节省:字数越少越好。保持字数最小化,也能避免“不小心‘读幻灯片’”,而是让你的演讲内容通过表达充分呈现。你还应该检查你使用的字体的可读性:从电脑屏幕前退后两步,看看能否轻松阅读其中的所有数字和文字。
明智地使用标题、标签和动画,你可以使支持数据场景的视觉材料自解释且易于观众理解。一旦你完善了故事的所有部分,你就可以继续向前推进。
完成你的故事
数据叙事过程是迭代的。现在你已经有了完整的故事框架,可以回顾它,并批判性地评估是否有进一步改进的机会。以下检查清单包含了一些你在此阶段应该问自己的有效(有时甚至是严苛的)问题:
-
这个故事达到了最初的目标吗?在你的脑海中想象期望的结果(决策、变化、批准):通过这个故事的呈现,它有多大可能变成现实?
-
当前的脚本符合你所面临的后勤限制吗?你认为有足够的时间完成它吗?你是否给了足够的时间进行问答和讨论?
-
这对于观众特别是关键决策者来说是否有吸引力?站在他们的角度想想:他们会如何反应?这是否与他们当前关注的热点话题相符?这是你希望他们思考的内容吗?这真的是他们关心的事情吗?他们会提出什么问题?
-
你是否有一个强而清晰的开头吸引点?它对关键决策者来说是否具有吸引力?
-
你是否提供了足够的初步背景?你是否在一开始就清晰地表达了目标?
-
你是否有明确的待展示数据场景列表?在这些场景中,是否有一个特别突出的?这个场景是否真能引发“啊哈”时刻的反应?
-
提升的见解是否按一定方式逐步展开,以便观众可以轻松跟随?你是否清楚每个场景中你想要传递的唯一信息?
-
你是否根据类型使用了正确的支持事实来支撑每个场景(参见表 8.2)?
-
在你用来支持数据场景的视觉材料中,是否有明确的行动标题?数据是否在前景中突出于其他内容?你是否通过清晰的引导标签突出了关键要素?颜色使用是否一致?字体是否太小?
-
你是否在结尾总结了关键收获?这些收获不超过 5 点吗?
-
你是否列出了所有提议的后续步骤,并为每个步骤指定了明确的负责人、描述和截止日期?
-
你是否利用了修辞方式来增强说服力(参见表 8.1)?你和你的故事是否看起来可信?有没有什么可以添加的内容,比如来源、个人简介和推荐信,以增强可信度?
-
仔细重新思考你所提供的逻辑思路,并请某人批评并扮演反对者的角色。它是否合逻辑?你的观众是否都能理解并跟随?逻辑链中是否有薄弱环节?
-
你是否通过使用意象、隐喻和个人经验与观众建立情感连接?你的结果是会让人赞同和谦逊,还是让人不悦和傲慢?
当你准备讲述故事时,确保为高质量的排练留出一些时间。故事中的一些弱点只有在实际讲述时才会显现出来。没有比通过几次排练更好的方式来打磨你的故事并增强自己讲述时的自信。我强烈建议你准备一个剧本,写下你想要说的内容。根据你讲演时的自信程度,你可以仅仅写下一个概要或要传达的关键信息要点,或者写一个完整的逐字剧本。即使在实际讲述时无法通过剧本来读,提前准备好剧本也会带来很大的好处:相信我,这真的有效!
如果你决定将你的故事写成完整的剧本,确保你的呈现方式不会显得机械或呆板。多次排练剧本,这样就不必每次都读它。
数据故事画布
本章内容丰富,涵盖的诸多概念、模型和技巧,肯定需要一些实践才能成为习惯。为了随时参考,你可以使用数据故事画布,它可以在图 8.3中找到(如果需要,你也可以从书籍网站下载可打印版本):
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_08_03.png
图 8.3:数据故事画布。按照结构来构建你的下一个故事
画布的结构作为支架,帮助有效构建数据故事。画布的框架将:
-
强迫你思考一些初步的方面,比如目标和受众(先做最重要的事!)。
-
引导你通过数据故事的关键部分(开头、中间和结尾),为你在构建叙事时提供空间,添加场景的占位符。
-
提供一个快速参考(如数据类型列表和简短版检查清单),在准备过程中非常有用,可以随时备用。
你可以在独立模式下使用画布来引导个人思考。如果有机会以团队协作的方式构建故事,你可以重复使用画布的结构来支持合作设计环节。在这种情况下,所有输入和想法可以作为便利贴添加到各个框中,或者作为文本注释添加到虚拟白板上,在进行远程会议时使用。下次尝试一下:这是一种高效的头脑风暴方式,能够汇聚集体创意,最终产生出色的故事。
摘要
我希望你像我一样享受本章带我们进入这个广阔而迷人的数据故事世界的激烈旅程。我们可以成为出色的数据分析师或受人尊敬的业务领域专家。然而,在一个商业组织中,我们常常缺乏自由决策和推动事务发生所需的充分权限,即使数据已经证明我们的观点是有效的。故事讲述扩展了数据分析的潜力,它让我们能够将数据转化为创造价值的行动。
我们从将说服的永恒要素(具备可信度、提供逻辑推理和激发情感参与)应用于商业数据开始,探索了故事在推动我们基于数据的建议方面能带来差异的多种原因。接着,我们经历了一个系统的过程,用来构建能够持久的、令人记住的数据故事,利用(简单但有效的)三幕式故事结构和五种原型数据场景类型。之后,我们掌握了一套实用技巧,用来完善故事并对其进行微调,使其呈现方式最有可能实现预期的结果。最后,我们探索了一个实用工具(数据故事画布),可以在需要时加以利用。
在结束和继续前的最后考虑事项:奇怪的是,在这个数据叙事章节中,你没有找到任何数据图表。现在,你应该清楚叙事和数据可视化之间的区别,有时候它们被混淆在一起令人困惑。图表本身并不能“说服”任何人,而故事可以。设计一个看起来不错的视觉比基于扎实叙述构建一个引人入胜的故事要容易得多。我希望你现在能够意识到在数据分析中叙事的至关重要性。
我告诉过你:这是你没有预料到的章节!
第九章:扩展你的工具箱
迅速掌握最新的数据分析工具和新颖技术无疑是一个永无止境的过程。在这个领域,你需要时刻准备好不断更新和扩展你的知识。到目前为止,本书已经涵盖了许多至关重要、与应用无关的数据技术,如数据清理与建模、机器学习、数据可视化和讲故事技巧。我们还学会了如何通过一个由 KNIME 和 Power BI 组成的坚实应用工具箱来应用这些技术。随着我们接近旅程的尽头,我们应该看看还有哪些工具可用,并且如何将所有应用整合在一起,充分发挥它们的最大潜力。
我们将特别讨论以下问题:
-
什么是 Tableau,我如何使用它进行可视化和讲故事?
-
什么是 Python,我如何开始使用它?
-
我如何通过集成 Python 或其他代码来提升我的工作流?
-
如何使用 KNIME 扩展包来增加功能?
-
什么是自动化机器学习,我应该对其未来的商业应用有何期待?
本章并不是为了让你成为 Python、Tableau 和其他工具的自主使用者。此阶段并不需要这样。你最初的工具箱(KNIME 和 Power BI)已经很好地满足了你的基本分析需求。本章的重点是向你展示其他可用的工具,并激发你对数据分析未来各种扩展方向的好奇心和兴奋感。
我们将首先介绍 Tableau,另一个数据可视化工具:通过一个简单的例子,我们将看到如何将我们在 Power BI 中学到的知识轻松应用到 Tableau 中。接下来,我们将学习 Python,并获得如何在分析中使用它的友好介绍。我们将看到如何通过扩展包将 Python 代码集成到 KNIME 中。最后,我们将了解自动化机器学习,并借助 H2O.ai 平台看到这一概念的实际应用。本章中的所有工具要么是开源的,要么提供免费试用选项,因此你有机会亲自尝试并评估它们如何帮助你和你的业务。
开始使用 Tableau
Tableau 作为斯坦福大学的衍生公司,已经在数据可视化领域开创了近二十年的先河,现在被认为是领先的商业智能平台之一。其直观的拖放式用户界面、与多种数据平台的集成以及高度可定制、高质量的图表类型,使得 Tableau 在商业专业人士、分析师和数据记者中非常受欢迎。
与 Power BI 类似,Tableau 有不同版本。本章我们将使用 Tableau Public:这是一款免费的桌面应用程序(您可以从 public.tableau.com 下载),它几乎包含了完整版(名为 Desktop Professional)中的所有功能,但也有一些重要的限制。首先,它依赖本地数据,因此您无法连接到远程数据源。此外,公共版本仅允许将结果保存在公共 Tableau 服务器上,该服务器对所有人开放:这意味着您无法将工作保存在计算机上。由于缺乏隐私保护,Tableau Public 不适用于日常业务需求,但我们仍然可以用它来探索 Tableau 的功能,并与 Power BI 进行对比。
您可以使用基于云的服务 Tableau Server 在线发布仪表板。您还可以仅通过浏览器设计仪表板,避免安装新软件。为此,您需要在上述 Tableau Public 网站注册,进入个人资料页面,点击 Create a Viz。网页版应用的用户界面与我们将在本章中使用的桌面应用非常相似。
延续本书始终贯穿的精神,让我们通过实践来探索 Tableau。 在这篇简短的教程中,我们将基于第6 章《Power BI 入门》中使用的销售数据库创建几种可视化:一个展示各类别相对权重的树状图和一个展示销售随时间变化的折线图。这次,三个表格(Transactions,ProductMD 和 CustomerMD)保存在一个单独的 Excel 文件 (SalesDashboardTableau.xlsx) 的不同工作表中:
-
打开 Tableau Public。在第一个屏幕上(看起来类似于图 9.1),点击左侧的 Microsoft Excel,并打开包含我们数据的文件:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_01.png
图 9.1:Tableau Public 的初始屏幕:在左侧选择您想使用的文件类型
-
在下一个窗口,名为 Data Source 屏幕(图 9.2)中,您将在左侧看到我们刚刚打开的 Excel 文件中的三个工作表。通过将它们拖到左上方的空白区域,您可以构建一个实体关系图,定义仪表板的基础数据模型:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_02.png
图 9.2:Tableau 中的数据源屏幕:拖放您的源表格并构建数据模型
为了做到这一点,我们需要按照正确的顺序操作。首先,拖动交易(Transactions)表并等待几秒钟,直到数据加载并且预览出现在底部。然后,拖动客户主数据(CustomerMD)表并将其放置在交易框的右侧:两者之间的线表明 Tableau 将连接这两个表。当你释放鼠标按钮时,编辑关系(Edit Relationship)窗口将出现(图 9.3):Tableau 成功识别出*客户 ID(Customer ID)*作为用于匹配行的列。我们可以通过关闭窗口来确认该关系,而不对默认设置进行任何更改。一旦完成此操作,就可以将产品主数据(ProductMD)表拖动到交易右侧,确保结果连接与图 9.2中的相似。最后,通过关闭弹出的窗口确认StockCode作为匹配列:你的数据模型准备就绪。
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_03.png
图 9.3:编辑关系窗口:为你的连接选择一个或多个匹配条件
为了继续,点击底部左侧的工作表 1标签:你将进入 Tableau 的主界面,称为工作区(Workspace)(图 9.4)。让我们来探索工作区中的四个基本部分:
**数据面板(Data Panel)是你找到所有数据列的地方,按表格进行组织。在这里,你可以拖动你希望在可视化中使用的量,或者创建计算字段。这类似于 Power BI 中的字段(Fields)**部分。
可视化视图是你可以构建可视化内容的地方。在这里,你可以将数据面板中可用的字段与可视化中的视觉属性连接,在 Tableau 中,这些视觉属性被称为架子(Shelves)。例如,条形图的高度、点的位置、它们的颜色、大小以及标签上显示的文本,都是通过行(Rows)、**列(Columns)和标记(Marks)架子来控制的(它们的使用将在我们进行教程时变得更加清晰)。在同一视图中,你还可以实现分页功能,并将一个可视化拆分为多个页面,每个页面显示给定列的不同值(你需要将该列拖到页面(Pages)**架子上)。此外,在可视化视图中,你可以决定使用哪些字段来限制要显示的数据(**筛选器(Filters)**架子)。
**显示面板(Show Me Panel)**是你可以选择使用的图表类型的地方,比如折线图、树形图、直方图或地理图。
底部的条形图让你添加工作表标签并在它们之间进行导航。在 Tableau 中,每个工作表可以是三种不同类型之一:工作表(一个单独的图表)、仪表板(多个图表的组合)或故事(一个受控的工作表或仪表板序列,旨在传达数据故事,如你在第八章《用数据讲故事》中学到的那样):
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_04.png
图 9.4:Tableau 中的工作区界面:将列拖放到可视化特性中,选择图表类型,并在可视化、仪表板和故事之间切换
现在我们已经熟悉了工作区界面,可以构建我们的第一个图表,以展示每个类别和子类别在销售额方面的相对大小。然而,我们还没有包含每笔交易生成的收入的列,因此,我们需要首先添加一个计算字段来为我们进行数学计算。
-
右键单击数据面板中的价格列,然后选择创建 | 计算字段…,如图 9.5所示:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_05.png
图 9.5:在 Tableau 中创建计算字段:我们可以添加数学公式并生成新的量来进行可视化
系统会弹出一个对话框(图 9.6),让你输入新列的名称(在左上角的文本框中——在本例中我们使用
Sales),以及要使用的数学表达式,其中字段通过方括号表示。点击窗口最右侧的小箭头。你将打开一个额外的面板,类似于我们在 KNIME 的数学公式节点中看到的那样,提供许多可用的逻辑和数学函数,并且右侧有文本描述。在我们的案例中,表达式[Price]*[Quantity]就可以:将其写入左侧的框中(Tableau 会在你输入列名时帮助自动补全),然后点击确定继续。新的计算字段将出现在数据面板中,之后可以根据需要使用:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_06.png
图 9.6:定义计算字段:根据需要添加合并列的数学表达式
-
我们现在拥有了制作第一个可视化所需的所有元素:在第七章中学习了如何抵制使用饼图的甜蜜诱惑后,我们希望构建一个漂亮的树形图,展示按类别和子类别的销售相对大小。 在 Tableau 中构建可视化需要将感兴趣的数据字段(左侧数据面板中列出的列)拖放到一些可视化属性(在可视化视图中显示的货架)。对于树形图,你可以按照图 9.7中的箭头作为指南。首先将类别(第一个)和子类别(第二个)拖到名为文本的框中(稍后在确定图表类型时,它会自动重命名为标签)。然后,将新创建的销售额字段拖到大小框中。最后,将类别字段也拖到颜色框中,以控制区域的颜色:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_07.png
图 9.7:在 Tableau 中构建树形图:将左侧的字段拖放到标记架右侧的框中
在 Tableau 中构建可视化图表后,你可以轻松地探索不同版本,其中将不同的图表类型应用于相同的数据。要尝试这个操作,请点击右侧Show Me面板中的各种框。那些由于当前数据无法渲染的图表类型会被灰显,且无法选择。Tableau 还可能推荐一种特定的图表类型,并用橙色突出其边框。我建议你在选择图表类型时始终牢记商业问题的背景,正如你在第七章中学到的那样,有效地可视化数据。
做得好!只需四次拖放,你就已在 Tableau 中构建了第一个可视化图表。我们可以轻松地看到“家居”类别(以及其中的“厨房”子类别)为我们的业务创造了最大的一块收入。
接下来是第二个商业问题:这次,我们希望将信息重点放在按类别划分的销售额趋势上。我们决定创建一个折线图,因为它是我们用来传达与数量随时间变化相关的见解的自然图表类型。
-
要创建一个新的可视化图表,点击底部Sheet 1标签右侧的第一个小**+图标(或者,你可以点击顶部菜单中的工作表 | 新建工作表**,或者直接按CTRL + M)。这样会出现一个空白的Sheet 2:这是我们绘制折线图的空间。
-
第一个拖动的字段是发票时间:将其拖到列架上。考虑到其类型(包含每个交易的日期和时间),我们需要告诉 Tableau 我们希望按哪个粒度级别(年、季度、月、周等)进行聚合。在此情况下,我们希望可视化每个月交易的一个数据点:右键单击该字段在架上的显示方式,然后在弹出菜单中选择第二个月项(参考图 9.8作为指导):https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_08.png
图 9.8:使用日期字段进行折线图:右键单击该字段并选择所需的时间粒度。在本例中,我们选择按月份进行聚合。
-
接下来,让我们实现我们想要使用的其他字段,按照图 9.9中的拖放操作进行。将销售额拖到行架上(默认情况下会应用求和聚合,但你可以通过右键单击该字段并在度量子菜单中选择适当的函数轻松更改)。下一个要移动的字段是类别。将其拖放两次:首先拖到颜色框(这样我们就可以按类别区分线条),然后拖到标签框(这样我们就可以为每条线显示直接标签):https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_09.png
图 9.9:在 Tableau 中构建折线图:列和行架分别控制 x 轴和 y 轴
-
在编排仪表板之前,我们可以通过右键点击每个标签并选择Rename来编辑底部的工作表名称。我们可以为第一个和第二个可视化选择更有意义的名称,比如
Business by category和Sales trend。 -
现在是通过组合这两个可视化来构建仪表板的时机。点击底部Sheets选项卡中的第二个**+图标,或者从顶部菜单中选择Dashboard | New Dashboard**。
-
在新仪表板视图的左侧,您会找到我们构建的两个工作表列表,每个工作表对应一个我们创建的图表。要创建仪表板,只需将工作表拖放到右侧的空白区域,就像在图 9.10中看到的那样:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_10.png
图 9.10:在 Tableau 中构建仪表板:将可视化拖放到它们的位置
在仪表板视图的左下方,你会找到几个图标,可以将它们拖放到仪表板中,添加额外的对象,比如文本标签、图片、网页或扩展程序。试试看吧。
-
在发布仪表板之前,让我们配置各可视化之间的交互。如果你点击第一个可视化的任何空白区域,它将被选中,且其边框会高亮(让你可以调整形状,如果需要的话)。同时,几个图标会出现在选中可视化的右上角,正如在图 9.11中看到的那样。如果你点击过滤器图标,正如图中的箭头所示,你将把该可视化设置为仪表板中所有其他可视化的过滤器。你可以快速测试这个功能是否正常工作:如果你点击矩形树图中的任何子类别(你可以按住CTRL键一次选择多个子类别),你会注意到折线图会相应更新,只显示所选部分的趋势。这正是我们所期待的:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_11.png
图 9.11:在 Tableau 仪表板中使用可视化过滤后续图表。点击右上角的过滤器图标
-
现在我们可以将工作发布到服务器:只需打开顶部的File菜单,然后点击Save to Tableau Public…。接下来,选择一个名称(我选择了
Ecom Sales Dashboard),点击OK,并等待几秒钟,直到数据上传完成。浏览器将自动打开并显示发布的仪表板,尽显优雅(你可以在 tiny.cc/ecomdashboard 查看我的版本,并在图 9.12中看到):https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_12.png
图 9.12:发布在 Tableau Public 服务器上的仪表板:让其他人访问并与之互动
在过去几页中,我们快速浏览了 Tableau 的基本功能:我们学习了如何加载数据,如何在一个简单的数据模型中组合数据,创建计算字段,构建可视化并将它们结合在一个交互式仪表板中。我相信你已经注意到 Tableau 与我们在 Power BI 上所学内容之间的相似性。我们本可以继续探索其他商业智能平台,如 Qlik、MicroStrategy 和 TIBCO Spotfire,仅举几例。令人(兴奋的)现实是,它们的工作原理大致相同,最后几章已经为你提供了开始并为你的业务创造价值所需的一切,无论你使用哪个工具。
现在,让我们进入数据分析工具箱的下一个“扩展”阶段,继续使用 Python。
用于数据分析的 Python
Python 是一种日益流行的高级编程语言,特别适用于数据分析和机器学习应用。丰富的数据分析相关库的可用性以及易学的语法,使其成为许多数据科学从业者的首选。
Python 名字背后的故事与蛇无关。它的创造者,荷兰程序员 Guido van Rossum,是 1970 年代 BBC 喜剧系列《Monty Python’s Flying Circus》的忠实粉丝。所以他为这个项目选择了 Python 这个名字,以此向那个节目中英国喜剧团体的不拘一格的天才致敬。
由于本书侧重于可视化编程,我们不会深入讲解编程原理。相反,本节的目的是让你看到 Python 在熟悉的问题上的实际应用,并了解它如何在我们的日常工作中使用。我们将首先通过一个脚本,重复我们在第五章,在工作中应用机器学习中看到的回归教程。然后,我们将看到 Python 如何与 KNIME 平滑集成,以充分发挥两种互补的分析编程方法的优势。
Python 语言的温和介绍
要使用 Python,你可以安装像 Anaconda 这样的开发平台(我们稍后会做这个),或者利用基于网页的界面,如 Colab。Google Colab(Colaboratory 的简称)是一个免费的云服务,允许你编写并运行 Python 代码,而无需任何设置:你可以通过 colab.research.google.com 访问它。
正如你在图 9.13中看到的,Colab 的用户界面是一个交互式网页,你可以在其中添加文本和代码,然后逐行运行:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_13.png
图 9.13:Google Colab 欢迎界面:无需安装任何软件即可开始使用 Python
为了简化与 KNIME 的比较,让我们使用 Colab 来处理我们在第五章《在工作中应用机器学习》中遇到的同一个罗马住房商业案例。作为提醒,目标是通过将线性回归学习算法应用于历史租赁协议数据库来预测租金价格。你可以通过连接到 tiny.cc/romecolab 来一步步跟随完整的 Colab 脚本。
让我们逐步分析代码,并理解每一部分的作用:
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
第一步是将一些有用的库导入到 Python 环境中。这将使得我们能够利用一些额外的功能(例如加载 Excel 文件和计算线性回归)。特别是在前面的代码中,我们使用了几条import语句来引入一些最流行的 Python 库,这些库广泛用于数据分析,具体包括:Pandas 用于数据处理,NumPy 用于数值运算和数组计算,Statsmodels 用于硬核统计分析,Scikit-learn(代码中为sklearn)用于机器学习:
full_data = pd.read_excel("RomeHousing-History.xlsx")
full_data.head()
接下来的步骤,我们通过使用pd.read_excel()函数读取存储在 Excel 文件中的数据,并将其内容分配给full_data变量。然后,我们可以通过可视化数据的前五行来检查导入的数据,使用head()函数,输出如图 9.14所示:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_14.png
图 9.14:head() 函数在 Colab 中显示的输出:我们数据集的前五行,是一个非常有用的预览
我们得到的数据正是我们在第五章《在工作中应用机器学习》教程开始时遇到的数据(见图 5.2中的前几行)。我们可以继续进行每个监督式机器学习过程的第一步,即数据划分:
train_set, test_set = train_test_split(full_data,test_size=0.3)
在train_test_split()函数的帮助下,我们对完整数据集进行了随机抽样,并获得了训练集和测试集(我们将其设为总数据的 30%),这些数据分别存储在train_set和test_set变量中。这行 Python 代码实现了 KNIME 中 Partitioning 节点为我们做的操作。现在,我们已经拥有了使用训练集来训练模型所需的一切:
model = smf.ols(formula='Rent ~ Rooms + Surface + \
Elevator + Floor_number + \
C(Neighborhood) + C(Property_type) + \
C(Floor_type)',data=train_set).fit()
print(model.summary())
利用 smf.ols() 函数,这段代码训练了一个普通最小二乘回归模型(OLS,正如我们在 第五章,在工作中应用机器学习 中遇到的那样),使用 train_set 变量作为输入。输出模型存储在一个名为 model 的对象中。在训练模型时,我们可以编辑代码中看到的公式字符串(Rent ~ Rooms + Surface + ...),以选择哪个列作为目标变量(在我们的案例中是 Rent,出现在 ~ 符号之前)以及其他哪些列应作为预测变量(它们出现在 ~ 符号后,并由 + 符号分隔)。类别列需要被 C() 函数封装(如 C(Neighborhood)):通过这样做,Python 会将它们转换为多个数值列(虚拟变量),这些列与线性回归模型兼容。线性回归公式的定义和名义变量的转换是由 KNIME 中的 线性回归学习器 节点在“幕后”完成的,而在 Python 中,它们需要在代码中明确指定。最后,summary() 函数总结了回归结果,包括每个特征的系数和 p 值。如果将 Python 中获得的输出(图 9.15)与 KNIME 中 线性回归学习器 节点的输出(图 5.9)进行比较,你会发现数字有所不同(当然,随机抽样总会产生略微不同的结果),但它们是一致的。例如,我们注意到,Piazza Navona 是一个高档社区(因为它的系数,在 coef 列中显示,高于所有其他地区),而电梯的存在可以忽略不计(高 p 值,如你在 P>|t| 列中看到的):
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_16.png
图 9.16:对比视图,展示了 Python 的关键函数与进行线性回归所需的相应 KNIME 节点:基本步骤完全相同
本练习澄清了可视化编程(你在 KNIME 中可以做的事情)与传统编程(你可以使用 Python 或任何其他语言来编写代码)之间的区别。每种方法都有其优缺点,个人偏好选择其中任何一种都是很自然的事情。好消息是……你不必在这两种选择之间做出最终决定。实际上,可视化编程和编码可以结合使用,这样就能为你的数据分析魔法创造出强大的效果。在接下来的几页中,你将学习如何将 Python 代码片段嵌入到 KNIME 工作流中。这是一个非常有价值的技巧,因为它能让你最大程度地利用 KNIME 的易用性与 Python 的广泛功能的结合。即使你此时不打算将 KNIME 与 Python 集成,我也建议你还是浏览接下来的几页。它们将让你有机会了解两个你应该知道的重要功能:KNIME 扩展和 KNIME Hub。
Python 与 KNIME 的集成
首先,你需要确保你的计算机上已经安装并运行了本地版本的 Python。获取它最简单的方法是安装Anaconda 个人版,这是一个非常流行的 Python 数据分析分发平台。下载并安装最新版本的软件,免费提供,下载地址为anaconda.com/download。Anaconda 内置了多个用于 Python 和 R 编程的应用程序。例如,Jupyter Notebook,它让你可以通过 Web 浏览器创建 Python 脚本——就像我们在 Colab 中做的一样,但没有任何限制。在Anaconda Navigator的欢迎页面中(图 9.17),你可以启动 Jupyter Notebook 或安装其他应用程序,如 RStudio,用于 R 开发:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_17.png
图 9.17:Anaconda Navigator 的欢迎屏幕:从这里,你可以启动 Jupyter 笔记本进行 Python 编程,或者安装额外的免费包。
如第二章《KNIME 入门》所述,你可以通过安装额外的扩展来扩展 KNIME 的功能。为了在我们的工作流中嵌入 Python,我们需要安装KNIME Python 集成扩展。操作步骤是:打开 KNIME,点击顶部栏的文件 | 安装 KNIME 扩展…,然后在顶部的文本框中输入python进行搜索 (图 9.18)。勾选KNIME Python 集成选项,点击下一步,然后按照安装过程进行操作:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_18.png
图 9.18:在 KNIME 中安装扩展的对话框。看看可用的包列表:你可以轻松地通过成千上万个新的 KNIME 节点扩展你的分析工具包。
完成后,系统会提示你重启 KNIME 以应用软件更新。重启后,去节点库并打开脚本 > Python文件夹。正如你在图 9.19中看到的,通过安装该扩展,你将获得几个可以在工作流中使用的新节点:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_19.png
图 9.19:安装 KNIME Python 集成扩展后的节点库:几个新节点已经显示出来
在此之前,让我们完成设置 KNIME 与 Anaconda 自带的 Python 环境连接所需的最后一步。操作是:在 KNIME 中点击文件 | 首选项,然后在左侧出现的菜单中,选择KNIME > Python,或者使用左侧的文本框搜索 Python 首选项窗口,正如你在图 9.20中看到的那样。你应该能看到预先填充的 Anaconda 安装目录路径(如果没有,你需要通过点击**浏览…按钮来设置)。设置完成后,点击Python 3 (默认)部分中的第二个新建环境…**按钮,正如下图所示:这将创建一个新的 Python 环境,包含所有与 KNIME 集成所需的包:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_20.png
图 9.20:KNIME 首选项中的 Python 窗口:你需要告诉 KNIME 本地 Python 环境的位置
在下一个窗口中 (图 9.21),点击创建新环境,并耐心等待环境生成。完成后,你就完成了所有设置,准备好将你所需的 Python 功能集成到 KNIME 工作流中了:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_21.png
图 9.21:新环境对话框:在 KNIME 中启动 Python 的最后一步
如果你希望在 KNIME 工作流中使用 R 而不是 Python,你需要安装KNIME 互动式 R 统计集成,并通过首选项菜单设置 R 环境,类似于我们为 Python 所做的设置。KNIME 还允许你对表格的每一行运行一些 Java 代码:查看Java 片段节点了解更多信息。
在你通过安装 Python 扩展获得的新节点中(图 9.19),Python 脚本无疑是最通用的:该节点允许你嵌入一系列 Python 代码,应用于存储在输入表格中的数据(通常称为 input_table_1),以生成一个或多个输出表格(称为 output_table_1)。你可以在脚本中引用这些表格,并像使用 Python 中的任何数据框一样自由使用它们。例如,如果你想对两列(数量 和 价格)进行简单的乘法运算,并输出一个附加列(销售额)作为结果,使用此节点的 Python 脚本将如下所示:
output_table_1 = input_table_1
output_table_1['Sales'] = output_table_1['Quantity'] * output_table_1['Price']
第一行代码只是将输入表复制到输出表中,保持不变。第二行代码应用了对两个列的乘法——就这么简单。我们本可以导入任何库(前提是它们已安装在 Anaconda 的 Python 环境中),并利用它执行我们需要的任何操作。
让我们来看一个简单的工作流,展示在我们的分析工作流中集成 Python 的强大功能。我们无需从头开始构建这个工作流,而是可以在KNIME Hub中找到已经存在的版本,KNIME Hub 是一个在线工作流、扩展、组件和节点的资源库。如图 9.22所示,打开KNIME Hub面板(你会在右上角的节点描述标签旁找到它),然后在搜索框中输入 Python Gaussian Fit。在众多选项中,你应该能找到一个包含我的名字和照片的工作流:这就是我为你准备的工作流。要将其导入到你的 KNIME 安装中,你只需将框(如图所示)拖动并放到你的工作流编辑器中。另一种方法是导入KNIME 工作流(文件 | 导入 KNIME 工作流…),你可以在 GitHub 仓库中找到它:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_22.png
图 9.22:KNIME Hub 面板:搜索你需要的工作流、节点或组件,并将它们拖放到你的工作区
如果你打开Python View节点的配置对话框,你将看到如图 9.23所示的代码窗口。中间的文本框是你可以编写 Python 代码的地方。在左侧,你会看到输入表中可用的列列表:通过双击它们,相关的 Python 数据框将被添加到代码中。你还可以通过点击执行脚本或执行选定行按钮来测试你的代码,检查其是否正常运行。如果在执行脚本时遇到任何警告或错误,它们会方便地显示在窗口底部的控制台框中:
![图形用户界面,文本,应用程序
自动生成的描述
图 9.23:Python View 节点的配置窗口:使用 Python 图形库生成任何你喜欢的图表
在这个特定案例中,我们利用Python View节点将高斯函数(著名的钟形曲线)拟合到罗马租金价格的分布,并返回带有拟合曲线的直方图。在此阶段无需详细了解代码,但你会注意到,代码中通过input_table['Rent']引用了Rent列,而生成的图表被保存在名为output_image的变量中:你可以在图 9.24中看到最终结果:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_24.png
图 9.24:Python View 节点的输出:罗马的租金价格约为 €1,000
这为你展示了 Python 节点是如何工作的:输入端口的数据被转换为输入变量,在脚本的末尾,分配给输出变量的内容会被返回到节点的输出端口。在你从 KNIME Hub 下载的相同工作流中,你还会看到一个Python Script节点的示例:本质上,两个节点都在输入数据上运行 Python 代码,但Python View节点“专门”用于输出图像。
在工作流中交织代码具有巨大的潜力。如果你想应用一些复杂的逻辑或重用在 KNIME 之外开发的专用代码来解决你的特定业务需求,你现在可以将这些代码无缝集成进来,极大地扩展你的工具箱功能。
在看到 Python 实际操作后,让我们回到无代码分析的世界,了解高级分析的一个有前景的方向:自动化机器学习。
自动化机器学习
“暴力模式发现”:这可以简洁(且生动)地概括自动化机器学习,简称AutoML,的核心内容。正如你在第四章和第五章中看到的,构建一个机器学习模型远不是一个线性、单次尝试的过程。获得高性能监督学习模型的常规过程是经历一系列的“反复”尝试:每次我们都会对模型或其特征进行一些“调优”,并检查预测性能是否有所提升。我们已经看到过一些这些机制的实际应用:
-
超参数优化:这是对学习算法的操作方式进行调整,比如我们在决策树中启用了剪枝,或改变了多项式回归的次数。在更复杂的模型(如深度神经网络)中,改变参数(例如网络中的神经元数量)可能会显著影响性能。
-
特征选择:通过选择特征的子集(并去除冗余特征),使模型学习集中在最重要的部分,从而提升其预测能力。我们在决定从回归模型中移除一些高 p 值特征时就做了这一操作。此外,减少模型运行所需的特征意味着节省时间和计算资源。
-
特征工程:通过组合或转换原始特征来生成新的特征,使其对模型更具信息量。例如,这就是我们在回归中创建虚拟变量时所做的。
-
集成学习:我们曾提到, 有时可以将不同的算法组合在一个学习过程中。想象一下,预测租金时,使用五个不同的回归模型,然后将这五个中间预测值的平均值作为整体预测:通过将替代模型组合在一起,你可能获得一个更强健的模型。
与其手动逐一检查每个调整步骤的效果,不如构建一个程序,利用所有可用的计算能力来找到通向最佳模型的路径。这正是 AutoML 方法所承诺的目标:自动化识别最大化整体性能(并且——希望——能够带来业务影响)的参数、特征和模型组合的“试错”过程。
AutoML 目前是商业应用 AI 中的热门话题,市面上已有越来越多的产品和开源库,支持将 AutoML 应用于实际任务,包括 H2O.ai、DataRobot、auto-sklearn、Google Cloud AutoML、IBM AutoAI、Amazon AutoGluon 和 Azure AutomatedML。随着我们不断扩展分析工具箱,让我们看看其中一款产品的实际应用:这将给你一个关于目前已有的产品及未来几年内我们公司可能推出的产品的了解。
我们将探索 H2O Driverless AI,一个基于云的服务,允许你使用网页界面上传数据,运行 AutoML 进行预测,并解释结果。如果你想亲自测试,可以访问 h2o.ai/products/h2o-driverless-ai,注册一个免费帐户,并创建一个 Driverless AI 实例。
AutoML 实践:一个 H2O.ai 的示例
在这个示例中,我们将再次使用罗马住房的业务案例:这次,我们将上传 Excel 数据集并创建一个新的实验。图 9.25 显示了界面的样子:你可以选择 目标列(在我们的案例中是 租金),为 评分器 选择一个指标(在图中,你可以看到我们选择了 RMSE),然后调节底部的三个旋钮,设置期望的预测 准确性、训练模型所需的 时间 和 可解释性 水平。这部分非常有趣:当你操作旋钮时,系统会更新其“试错”策略(你可以在左侧看到一个动态摘要),并在 AutoML 搜索过程中执行。如果你选择高准确性和低可解释性,你最终将得到高性能的黑箱模型,而如果将可解释性设置为较高水平,你将得到特征较少、便于解释的简单模型,以便向你的业务伙伴解释它是如何工作的:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_25.png
图 9.25:H2O Driverless AI 中的实验设置页面:通过调节旋钮,确定你希望生成的模型如何被“烹饪”
点击 启动实验 后,远程计算资源将为你完成繁重的工作,而你可以去拿点喝的。下图显示了随着越来越多的模型被迭代尝试,得分指标的实时演变,完成后将显示最佳结果(图 9.26):
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_26.png
图 9.26:AutoML 例程的结果:在左下角,你可以看到随着搜索迭代的进行,评分指标是如何变化的
作为 AutoML 过程的一部分,我们还获得了一些有用的视图,帮助我们理解模型的工作原理。请看看为我们的租金预测生成的解释仪表盘(图 9.27):
-
在右上角,我们看到一个条形图显示 特征重要性:毫不奇怪,邻里是预测租金时最有用的单一列,紧随其后的是物业的 面积。
-
在左下角,我们有一个基于树的 替代模型:这是 AutoML 例程生成的实际预测模型的“简约”版本。通过查看这个树的前三个层次,我们可以得到一个高层次、易于解释的视图,展示了将最重要特征与租金联系起来的模式。
-
在右下角,我们可以看到部分依赖图:它展示了特定特征(在图 9.27中为Surface)对预测结果(Rent)的边际影响。此图为我们提供了一个额外的解释关键,揭示了“租金”如何随着“面积”的增加而上升:https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_27.png
图 9.27:模型解释仪表板:获取有关预测模型如何工作的提示
通过这个例子,我们充分欣赏了 AutoML 方法的所有潜力。只需几次点击,我们便获得了一个强大的预测模型(可以导出并部署以供进一步使用),以及一个简单的框架来解释其结果。需要进一步考虑的是:尽管它看起来像是机器学习的“圣杯”,但在商业环境中使用 AutoML 仍然需要用户始终“知道自己在做什么”。这意味着,构建机器学习专业知识,并且总体上提高数据分析能力(就像在本书中所做的那样),对于充分利用这项技术至关重要,尽管它看起来已变得自动化且易于使用。
AutoML 可以成为我们数据分析工具包中的另一个宝贵工具。好消息是,你会发现这个方法在 KNIME 中也得到了很好的实现,因此你可以将其与本书中所学的其他内容连接起来。如果你打开名为 H2O AutoML for Regression 的示例工作流(你可以在 KNIME Explorer 中的示例服务器或在 KNIME Hub 中搜索到它),你将被要求安装一个新的扩展:KNIME H2O 机器学习集成。通过安装这个扩展,你可以在 KNIME 中使用我们在 H2O Driverless AI 中看到的许多 AutoML 功能。看一下前面提到的示例工作流(图 9.28):通过使用一些 H2O 节点—按照常见的监督学习结构(包括划分、学习者、预测器和评分器)组织—你可以直接在 KNIME 中获得 AutoML 的全部功能:
https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_09_28.png
图 9.28:H2O AutoML 回归 KNIME 工作流:使用 AutoML 为你找到最佳模型
总结
我希望这最后一章能让你对进一步扩展数据分析工具箱的各种方向感到兴奋。我们在 Tableau 中迈出了第一步,意识到它在基本功能上与 Power BI 是如此相似。我们还通过对 Python 的友好介绍,了解了这一在数据科学中无处不在的编程语言。当我们将 Python 集成到 KNIME 中时,我们看到了如何从可视化和编码编程两个世界中获取最佳成果。与此同时,我们借此机会学习了如何通过利用 KNIME 庞大的扩展库以及公共的 KNIME Hub 环境来进一步扩展 KNIME。最后,我们对 AutoML 的迷人领域进行了简短的探索,了解了它简化构建高性能机器学习模型过程的强大能力。
在这一章中,我们通过探索新的工具和方法,扩展了我们的工具箱,以便在日常工作中更好地进行数据分析。我的建议是把这变成一个习惯。我在许多数据从业者中看到的一个局限性是,他们认为自己熟悉的少数工具 永远 是最适合他们的,从而陷入了自给自足的局限性偏见。所以,别对我们刚刚建立的工具箱感到满足——要做好持续探索的准备:保持好奇心,因为数据分析的不断扩展世界将提供许多精彩的东西!
第十章:那么,接下来呢?
这是一次漫长的旅程,但你成功了:你刚刚完成了一段了不起的旅程!
在这九章内容中,我们亲自掌握了数据分析的潜在价值,并认识到了解锁这些价值的几种实用方法。我们已经构建了一个随时可以使用的数据应用工具箱(以 KNIME 和 Power BI 为核心),你现在可以在需要时使用它。最重要的是,你已经获得了一套广泛的工具无关的数据能力,可以在任何应用中加以利用。无论是组织、清理和转化数据;基于机器学习算法构建、验证和解读模型;设计、准备和展示基于有效可视化的数据故事……这一系列广泛的基础知识和数据能力将使你受益,无论你今天使用什么具体的软件,或是明天将使用什么软件。你所完成的教程让你在相关的商业需求上获得了一些现实世界的经验,比如自动化数据管道、预测消费者行为、预判价格、创建有意义的客户群体以及构建互动仪表板。恭喜你完成了所有这些——你有很多值得自豪的成就!
如果你享受了这次旅程,你可能会问:“…接下来呢?” 在我们结束这段旅程时,我想与您分享我在旅程早期得到的两条建议,这些建议在我的个人和职业生活中非常有帮助。
第一条建议是保持好奇心,永远不要停止学习。这说起来容易,但做起来难。个人发展不会自然而然地发生,它需要适当的规划。安排一些时间在你每周的日程里(为什么不在每个星期五安排几个小时?)来阅读更多关于数据分析领域的书籍,选择那些最令你感兴趣的方面。关注一些博客文章(Towards Data Science、Data Science Central、Low Code for Advanced Data Science 和 Storytelling with Data 是我最喜欢的一些),参加在线或传统课程(Coursera 和 edX 平台上有许多免费的高质量大学课程——其中一门对我影响很大的“经典”课程是 Andrew Ng 的 Machine Learning)。你需要时刻关注现在正在做的事情以及即将到来的发展。数据分析是一个多学科、流动性的领域,你需要拥抱真正的成长心态,才能全面应对它。将每一次你不知道如何做某件事的情况,转化为学习的机会。保持好奇心!
第二点是有意识地寻找机会将你所学应用到日常工作中。我建议你计划如何在未来利用你的新技能。既然你对这些都了如指掌,现在就行动起来吧:拿一张白纸,列出你可以立即实施的两三个实验。比如用团队最常用的数据制作一个简单的仪表盘?或者,用最热门的业务挑战创作一个引人注目的故事?尝试自动化繁琐的数据清理过程,或者使用你学到的机器学习算法来改善今天的决策方式。你不必追求复杂和华丽。我见过很多伟大的数据分析倡议从只有两个基本元素开始:一小群热情的人认为他们有一个好主意,以及一个简单粗糙的原型,证明了这个主意的价值并获得更多人的支持。我的建议是系统地做这件事:强迫自己选择几个要测试的想法。现在就开始吧。
如果你想不出主意或者数据不足,考虑加入 kaggle.com 并参加其中的一些分析竞赛:你将获得丰富的数据集,一些真实的任务简介,并有机会与其他专业或业余的数据从业者竞争。或者,询问当地的慈善机构是否需要帮助整理他们的数据或为他们的事业创造价值。今天你周围有很多机会可以利用数据分析:去发现它们吧。
我写这本书是为了赋予你力量,让你对数据分析充满激情。希望它能达到预期效果。无论如何,我都很乐意与你建立联系:请与我联系(你可以在下面找到我的联系方式;最简单的方法是添加我到 LinkedIn 并发送消息)。每一点反馈,每一个观点,甚至更好的是你驱动的数据分析成功案例的故事,我都会高度赞赏,并承诺以任何我能做到的方式回应。
祝愿你在不断发展中一切顺利,并希望数据分析能在你的道路上对你有所裨益!
安德烈亚·德·莫罗
联系方式:
-
书籍满意度调查:tiny.cc/dataanalyticssurvey
-
LinkedIn: linkedin.com/in/andread
-
ResearchGate: researchgate.net/profile/Andrea_De_Mauro
-
Twitter:@about_big_data
第十一章:有用的资源
第一章
-
关于数据分析职位类别和相关技能的全面回顾,你可以查看我在该主题上的一些研究论文,特别是:De Mauro, A., Greco, M., Grimaldi, M., Ritala, P. “Human resources for Big Data professions: A systematic classification of job roles and required skill sets.” Information Processing & Management 54.5 (2018): 807-817,
doi.org/10.1016/j.ipm.2017.05.004。 -
若要获得有关数据分析领域众多工具的视觉总结,你可以查看由 Matt Turck 每年更新的《数据与 AI 数据景观》:
tiny.cc/datalandscape。 -
要了解更多关于运营研究和机器学习向处方分析融合的进展,你可以阅读 Lepenioti, K., Bousdekis, A., Apostolou, D., & Mentzas, G. “Prescriptive analytics: Literature review and research challenges.” International Journal of Information Management 50 (2020): 57-70,
doi.org/10.1016/j.ijinfomgt.2019.04.003。
第二章
-
我建议查看 KNIME 的备忘单:它们是每个特定主题中“重要节点”的 1 页视觉摘要。可以在此处查看:
www.knime.com/cheat-sheets。 -
正则表达式可以大幅扩展你的模式匹配能力。当你需要清洗数据并检查复杂格式规则时,它们非常有用。从
regexone.com/获取正则表达式速成课程,或者使用regexr.com/直接在网页上测试你的表达式。 -
KNIME 的 YouTube 频道充满了短视频,供你探索节点和技术。你可以在这里查看:
www.youtube.com/user/KNIMETV。
第三章
-
若要了解如何构建数据清单,可以查看 IBM 提供的指南:
www.ibm.com/cloud/learn/data-catalog。 -
若要快速了解 KNIME 中的循环,可以查看以下自学模块:
www.knime.com/self-paced-course/l2-dw-knime-analytics-platform-for-data-wranglers-advanced/lesson4。 -
若要了解 KNIME 中的变量,可以通过以下附加的 KNIME 学习模块:
www.knime.com/self-paced-course/l2-ds-knime-analytics-platform-for-data-scientists-advanced/lesson2。 -
如果你需要在从 KNIME 导出数据到 Excel 时添加一些视觉格式(如字体类型和颜色),我推荐使用 Continental 社区扩展,网址是
www.knime.com/community/continental-nodes-for-knime-xls-formatter。
第四章
-
想要了解主题建模的一般介绍,请参考
monkeylearn.com/blog/introduction-to-topic-modeling。特别地,LDA 在 KNIME 中通过 Topic Extractor(并行 LDA)节点实现,该节点是 KNIME 文本处理扩展的一部分。 -
以下论文揭示了将强化学习应用于实际问题时所面临的挑战:Dulac-Arnold, G., Mankowitz, D., & Hester, T. “Challenges of real-world reinforcement learning.” arXiv 预印本 arXiv:1904.12901 (2019),
arxiv.org/pdf/1904.12901.pdf。 -
神经网络是最有前景的机器学习算法之一。它们构成了一个独立的机器学习子学科,叫做深度学习。想要开始使用 KNIME 进行深度学习,我推荐阅读 Melcher, K., Silipo, R., 《使用 KNIME 无代码深度学习:构建、训练和部署各种深度神经网络架构》。Packt Publishing Ltd, 2020 年。
-
想要了解弱人工智能与强人工智能之间的差异以及后者几乎无法实现的原因,可以阅读 Fjelland, R. “Why general artificial intelligence will not be realized.” 《人文学与社会科学通讯》 7.1 (2020): 1-9,
doi.org/10.1057/s41599-020-0494-4。 -
想了解与机器超智能到来相关的各种情景,可以阅读 Bostrom, M. 《超级智能:路径、危险与策略》。牛津大学出版社,2014 年。
-
准确率、精确度和敏感性并不是评估分类模型的唯一总结性指标。请查看 Maarit Widman 的这份演示文稿,了解在 KNIME 中可以计算的其他度量方法:
www.slideshare.net/KNIMESlides/scoring-metrics-for-classification-models,或者阅读电子书:Widmann, M., Roccato, A., “从建模到模型评估”,KNIME 出版,2021 年,www.knime.com/sites/default/files/2021-05/Book-From-Modeling-Model-Evaluation-KNIME-05052021.pdf。
第五章
-
想了解如何使用 KNIME 组件进行时间序列分析,可以查看以下内容:Tonini, D. Weisinger, C., Widmann, M. “Time Series Analysis with Components”, 低代码高级数据科学(2021),
tiny.cc/KNIMEtimeseries。 -
要了解 k 均值算法如何一步一步地运作,请查看 Naftali Harris 的这个模拟器:
www.naftaliharris.com/blog/visualizing-k-means-clustering。 -
阅读以下内容,了解更多使用 KNIME 检测异常值的方法:Widmann, M., Heine, M., 《四种异常值检测技术》,《低代码高级数据科学》(2021),
tiny.cc/outlierdetection。
第六章
-
有大量的 Power BI 示例仪表板供你更好地熟悉其功能。要了解如何访问它们,请阅读:
docs.microsoft.com/en-us/power-bi/create-reports/sample-datasets。 -
完成本书后,要进一步提升你的 Power BI 技能,可以查看这本书:Powell, B., 精通 Microsoft Power BI:高效数据分析和商业智能的专家技巧。Packt Publishing Ltd, 2018。
第七章
-
关于视觉优于其他感官,或者像 John Medina 所说的,“视觉胜过所有其他感官”,请参见:Medina, J. J., 12 条生存与发展原则,适用于工作、家庭和学校。Pear Press, 2009。
-
关于视觉在人类认知中的重要性,包括 David William 教授关于大脑皮层中与视觉相关部分的主张,访问:
www.rochester.edu/pr/Review/V74N4/0402_brainscience.html。 -
要了解更多关于前注意属性的信息,你可以阅读书籍 Few, S. “给我看数字。” 分析出版社 (2004),或者阅读 Few 的文章《变异的视觉感知》,文章链接:
www.perceptualedge.com/articles/visual_business_intelligence/the_visual_perception_of_variation.pdf。 -
1984 年,Cleveland 和 McGill 来自贝尔实验室发布了关于前注意属性的早期版本。论文展示了许多 80 年代的经典图表,值得一读:Cleveland, W. S., McGill, R. “图形感知:理论、实验与图形方法的应用。” 美国统计学会杂志 79.387 (1984): 531-554。
-
对于更广泛的图表选择,我推荐 Stephen Few 在 Perceptual Edge 网站上发布的图表选择矩阵:
www.perceptualedge.com/articles/misc/Graph_Selection_Matrix.pdf。 -
要了解 Stephen Few 对饼图的看法及其不推荐使用饼图的诸多原因,你可以阅读他的文章《把饼图留给甜点》,文章链接:
www.perceptualedge.com/articles/visual_business_intelligence/save_the_pies_for_dessert.pdf。 -
若要了解更多关于旋转文本对可读性的影响,请参考 Wigdor, D., & Balakrishnan, R. “Empirical Investigation into the Effect of Orientation on Text Readability in Tabletop Displays.” ECSCW 2005。Springer, Dordrecht, 2005。
-
若想了解色盲如何影响数据可视化以及如何使我们的图表更加易于理解,请阅读此文章:
www.tableau.com/about/blog/examining-data-viz-rules-dont-use-red-green-together。
第八章
-
如果你想了解更多关于认知心理学研究如何证实故事叙述在讲故事中的重要性,可以查看:
www.storypack.co/post/stanfordstorytelling-why-retention-is-higher-through-stories。 -
瑞典教授 Hans Rosling 是数据讲故事领域的巨人之一。可以观看他的一些启发性视频,比如 TED 演讲 “The Best Stats You’ve Ever Seen”,链接:
tiny.cc/beststats,以及 BBC 纪录片 “200 Countries, 200 Years, 4 Minutes”,tiny.cc/200countries。 -
我找到的关于数据讲故事特别有用的两本书是 Dykes, Brent. Effective Data Storytelling: How to Drive Change with Data, Narrative and Visuals。John Wiley & Sons, 2019,以及更侧重于数据可视化的:Knaflic, C. N. Storytelling with Data: A Data Visualization Guide for Business Professionals。John Wiley & Sons, 2015。
第九章
-
若要了解更多关于 Tableau 的信息,我推荐 Meier, M., Baldwin, D. Mastering Tableau 2021: Implement Advanced Business Intelligence Techniques and Analytics with Tableau。Packt Publishing Ltd, 2021 和 Loth, A. Visual Analytics with Tableau。John Wiley & Sons, 2019。
-
要开始你的 Python 学习之旅,可以参考:Matthes, E. Python Crash Course: A Hands-On, Project-Based Introduction to Programming, No Starch Press, 2019,然后深入学习机器学习应用:Raschka, S., Mirjalili, V. Python Machine Learning: Machine Learning and Deep Learning with Python, scikit-learn, and TensorFlow 2。Packt Publishing Ltd, 2019。
-
一个很好的集成 KNIME、Python 和 Tableau 的例子是 Ganzaroli, D., “Data Science With KNIME, Jupyter, and Tableau Using COVID-19 Projections as an Example”,Low Code for Advanced Data Science (2021),
tiny.cc/knimefusion。 -
若要了解如何将 H2O Driverless AI 与 KNIME 集成,请参考此指南:
docs.knime.com/2020-07/h2o_driverless_ai_guide/h2o_driverless_ai_guide.pdf。
1839



被折叠的 条评论
为什么被折叠?



