Tableau 2020 学习指南(三)
原文:
annas-archive.org/md5/ae37fae7c02607c3183636011e94115a译者:飞龙
第十一章:动态仪表板
我们在之前的第八章《使用仪表板讲述数据故事》中已经讨论过仪表板,并考虑了如何使用各种操作使其具备交互性。现在,我们将扩展这一概念,考虑如何创建真正动态的仪表板——可以显示和隐藏对象的仪表板。这使得你可以做很多惊人的事情,例如允许用户选择查看哪种类型的可视化,或者动态隐藏或显示相关或期望的控件。
我们将考虑以下几种动态交互方式:
-
显示/隐藏按钮
-
工作表交换
-
自动显示和隐藏控件
让我们从考虑如何使用显示/隐藏按钮来在仪表板上显示和隐藏内容开始。
显示/隐藏按钮
显示/隐藏按钮允许你显示和隐藏布局容器(以及其中的所有内容!)。你可以在第十一章完整工作簿中找到几个示例。第十一章入门工作簿包含仪表板,但没有显示/隐藏按钮或容器。第二个示例中使用的图像也位于第十一章目录中。
要使用显示/隐藏按钮,先将一个布局容器添加到仪表板中,作为浮动对象,然后使用下拉菜单选择添加显示/隐藏按钮,如图 11.1所示:
图 11.1:一个包含单一地图视图和浮动布局容器的仪表板
在这个仪表板上,我们添加了一个垂直布局容器,浮动在地图上方。当我们选择添加显示/隐藏按钮时,Tableau 会向仪表板添加一个小按钮:
图 11.2:布局容器的显示/隐藏按钮
每个显示/隐藏按钮都可以应用于仪表板上的任何单个浮动布局容器。
使用**重命名仪表板项目…**选项在布局容器下拉菜单中,可以轻松识别哪个布局容器是显示/隐藏按钮的目标。
你可以通过点击按钮的下拉菜单选择**编辑按钮...**来编辑按钮的外观和动作:
图 11.3:选择“编辑按钮…”可以显示许多选项,用于更改按钮的行为和外观
在弹出的对话框中,你将有选项选择要显示或隐藏的布局容器,按钮的样式(图像或文本),以及在容器显示或隐藏时显示哪些图像或文本。
在这个示例中,显示/隐藏按钮使用了默认的图像按钮样式(如图 11.3所示),并且布局容器已经填充了一些过滤器和地图的图例。
你可以将任何仪表板对象包含在容器中,包括过滤器、图例、参数和集合控件,甚至是其他视图!
此外,容器还设置了边框和半透明背景,以便地图在容器下方稍微可见。通过选择容器并使用仪表板窗格的布局选项卡完成了这一设置,如下所示:
图 11.4:使用布局窗格调整所选仪表板对象的选项
最终结果在第十一章工作簿中展示,是一个带有显示/隐藏按钮的仪表板,使用户清楚地知道可以显示或隐藏其他选项:
图 11.5:在这里您可以看到布局容器的隐藏和显示状态以及按钮图像的变化
在设计模式下使用 Alt + Click 来触发按钮动作,或者切换到演示模式,单击即可触发按钮。
显示/隐藏按钮为您的仪表板设计提供了很大的灵活性,从优化空间到简化显示,到从打印输出中删除过滤器和其他混乱的内容。
考虑在第十一章完成工作簿中的另一个示例,该示例说明了显示和隐藏说明的可能性:
图 11.6:单击问号按钮会显示如何使用仪表板的说明
在这种情况下,默认按钮图像已被问号图标替换。这是通过编辑图像实现的,如图 11.3所示,并更改图像(questionmark.png包含在第十一章目录中。)
当用户点击按钮时,一个浮动容器出现在整个仪表板的顶部。它包括文本以及一个带注释的图像,指导用户如何使用仪表板。在这个简单的例子中,以这种方式提供说明可能有点过火,一个简单的文本标签就足够了。
然而,随着您构建更复杂的仪表板或需要解释的详细分析,这是向用户提供额外指示和细节的好方法,否则会使仪表板混乱。
还考虑使用显示/隐藏按钮来允许用户互动,这些功能不希望包含在 PDF 或仪表板的打印页面中。过滤器和参数非常有用,但并不总是希望它们显示在精美的输出中。
让我们继续考虑另一种在仪表板上动态显示、隐藏甚至切换内容的方法。
表格切换
表格切换,有时也称为表格选择,是一种动态在仪表板上显示和隐藏视图的技术,通常表现为将一个视图与另一个视图进行切换。在仪表板上动态隐藏和显示视图具有更广泛的应用。当与浮动对象和布局容器结合使用时,此技术允许您创建丰富和动态的仪表板。
让我们从一些基本的表格切换原则开始。
表格切换的基本原则
基本原则相对简单。当以下情况发生时,仪表板上的视图会折叠:
-
至少有一个字段位于行或列上
-
它位于水平或垂直的布局容器中
-
它没有固定的高度或宽度,并且布局容器未设置为等分项目
-
组合使用过滤器或隐藏功能会阻止任何标记的呈现
此外,标题和说明文字不会随视图一起折叠。然而,这些可以被隐藏,从而使视图完全折叠。
接下来,我们将探讨一个如何在实践中使用工作表交换的示例。
使用工作表交换在仪表板上更改视图
让我们考虑一个简单的示例,视图显示了 部门和类别的利润,并具有一个 部门 快速过滤器。仪表板已被格式化(从菜单中选择 Format | Dashboard),并使用灰色阴影帮助我们看到效果:
图 11.7:在仪表板中隐藏工作表的演示
观察到过滤掉所有部门后,视图会折叠。标题仍然存在,但也可以隐藏。
为了交换两个不同的工作表,我们简单地利用了折叠行为和布局容器的属性。我们将通过创建两个通过参数和计算字段过滤的不同视图来开始。参数将允许我们确定显示哪个工作表。请执行以下步骤:
-
创建一个名为
Show Sheet的整数参数,列出 String 类型的值,设置为 Bar Chart 和 Map:图 11.8:创建一个参数来控制显示哪个工作表
-
由于我们希望基于参数选择进行过滤,而参数不能直接添加到 Filters 架构中,因此我们将创建一个名为
Show Sheet Filter的计算字段来返回参数的选定值。代码很简单,直接使用[Show Sheet],即参数名称,返回当前参数的值。 -
创建一个新的工作表,命名为 Bar Chart,类似于图 11.7 中显示的 部门和类别的利润 视图。
-
显示参数控制(右键点击数据窗口中的参数,选择 Show Parameter Control)。确保选择了 Bar Chart 选项。
-
将
Show Sheet Filter字段添加到 Filters 架构,并勾选 Bar Chart 来保留该值。 -
创建另一个命名为 Map 的工作表,显示按利润划分的州填充地图:
图 11.9:地图视图
-
在该视图上显示参数,并将选择更改为 Map。请记住,参数选择是全局性的,适用于整个工作表。如果你切换回 Bar Chart 视图,它应该不再显示任何数据,因为已经应用了过滤器。
-
将
Show Sheet Filter字段添加到 Filters 架构,并勾选 Map 作为保留的值。 -
创建一个新的仪表板,命名为 Sheet Swap。
-
从左侧窗口的对象中,将一个 Horizontal 布局容器添加到仪表板中:
图 11.10:插入一个水平布局容器
在这种情况下,垂直布局容器同样有效。关键在于布局容器允许内部的每个视图在设置为适合整个视图时扩展以填充容器,或适合宽度(对于水平容器)或适合高度(对于垂直容器)。当一个视图折叠时,可见视图将扩展以填充剩余的容器。
-
将每个 Sheet 添加到仪表板中的布局容器中。由于在每个视图中都可见,参数控件应该会被自动添加。
-
在条形图视图上使用下拉菜单,确保视图设置为填充容器(适合 | 整个视图)。您不必为地图设置填充,因为地图可视化会自动填充容器。
-
隐藏每个视图的标题(右键单击标题并选择隐藏标题)。
现在您有一个仪表板,更改参数会显示一个或另一个视图。当选择地图时,过滤器导致条形图没有数据,因此它会折叠,地图填充容器:
图 11.11:地图可见,而条形图已折叠
或者,当选择条形图时,由于过滤器的作用,地图会折叠,而条形图会填充容器:
图 11.12:条形图可见,而地图已折叠
折叠视图的关键是使用一个或一组过滤器确保不显示任何数据行。您不必使用参数来控制过滤。您可以使用常规过滤器或操作过滤器来实现相同的效果。这为仪表板中的动态行为开辟了各种可能性。
Sheet 交换可以为您的仪表板带来惊人的效果。从允许用户选择可视化类型,到交换适合小数据集的视图,再到为大数据集总结的视图,考虑使用 Sheet 交换来实现动态体验。
在某些情况下,您可能会考虑替代 Sheet 交换,例如使用导航按钮在不同版本的仪表板之间导航,而不是尝试在同一仪表板中交换内容。
Sheet 交换允许您在仪表板中交换视图。如果视图更改导致某些图例、过滤器或参数不再适用,并且您希望隐藏它们,我们来考虑一些可能性。
自动显示和隐藏其他控件
当所有数据被过滤时,视图将会折叠。但是,其他控件(如快速过滤器、参数、图像、图例和文本框)不会折叠。您可以使用我们之前讨论过的显示/隐藏按钮,但通常您希望在过滤器更改时自动显示或隐藏这些控件,而无需用户采取额外的操作。
考虑前一节中的简单示例。由 Tableau 自动添加到仪表板中的颜色图例适用于地图,但当条形图显示时,图例就不再适用了。
幸运的是,我们可以扩展前一节中使用的技术,通过展开视图,将我们希望显示的项推到浮动对象下方,然后收起视图,让我们希望隐藏的项返回到浮动对象下方。
让我们扩展之前的工作表交换示例,看看如何显示和隐藏颜色图例:
-
创建一个名为显示/隐藏图例的新工作表。此视图仅用于显示和隐藏颜色图例。
-
通过双击行并输入
MIN(1)来创建临时计算。为了让视图收缩,我们必须在行或列上有一个字段,所以我们将使用这个字段来为行和列分别提供一个单一的坐标轴,并且没有其他标题。 -
在列上复制临时计算。现在你应该有一个简单的散点图,并且只有一个标记。
-
由于这是一个辅助工作表,并非我们希望用户看到的内容,因此我们不希望它显示任何标记或线条。使用格式 | 线条格式化视图,移除行和列中的网格线,以及坐标轴标尺。此外,隐藏坐标轴(右键点击每个坐标轴或字段,取消勾选显示标题)。同时,将颜色设置为完全透明以隐藏标记。
-
当选择地图选项时,我们希望显示此视图,因此显示参数控制,并确保它设置为地图,然后将显示工作表过滤器添加到过滤器中,并勾选地图:
图 11.13:应用显示工作表过滤器的显示/隐藏图例工作表
-
在工作表交换仪表板上,将显示/隐藏图例工作表添加到布局容器中,放置在显示工作表参数下拉菜单和颜色图例之间。隐藏显示/隐藏图例工作表的标题。
-
确保选中地图。颜色图例应该被推到底部。
-
将一个布局容器作为浮动对象添加。就大小和位置而言,它应完全覆盖颜色图例原先所在的区域。它应该覆盖显示/隐藏图例工作表的标题,但不覆盖参数下拉菜单。
可以通过按住Shift键拖动、将新对象选项设置为浮动,或通过在对象上使用下拉菜单将对象添加为浮动对象。你还可以在仪表板窗格中更改新对象的默认行为,从平铺更改为浮动。
-
布局容器默认是透明的,但我们希望它能够隐藏下面的内容。使用下拉菜单进行格式化,并添加白色阴影,使其与背景不可区分。
此时,您已经拥有一个动态仪表板,其中图例在地图显示并适用时显示,在条形图可见时隐藏。当选择地图时,显示/隐藏图例工作表会显示,并将图例推到底部的布局容器:
图 11.14:显示/隐藏图例将图例推到浮动对象下方
当选择条形图时,显示/隐藏图例工作表折叠,图例不再适用于该视图,掉到浮动布局容器下方/隐藏。
图 11.15:显示/隐藏图例折叠,导致图例移到浮动对象下方
您可以在仪表板上使用该技术的变体数量没有限制。您可以根据需要添加任意多的层。您甚至可以组合这些技术,在仪表板上推送或移除视图和对象。创造丰富互动用户体验的可能性是令人难以置信的。
总结
创建真正动态的仪表板为您的仪表板设计提供了极大的灵活性。显示/隐藏按钮为最终用户提供了在仪表板上显示或隐藏内容的选项。工作表切换技术允许您切换显示哪些视图,并自动显示或隐藏控件或其他内容。
本章介绍的技术将使您能够实现各种惊人的互动效果,从隐藏和显示控件、说明、业务规则和分析的解释,到允许用户确定可视化类型并切换视图。
接下来,我们将转向使用一些高级技术来探索某种类型的数据:地理空间数据!
第十二章:探索映射和高级地理空间功能
到目前为止,我们已经看过利用 Tableau 基本功能的地图和地理空间可视化示例。在本章中,我们将踏上探索 Tableau 提供的广泛映射和地理空间功能之旅。从利用内置的地理空间数据库并用额外的数据和空间文件进行补充,到使用高级地理空间功能,我们将探索 Tableau 能够实现的可能性。
正如我们之前所做的,本章将通过一些实际示例来介绍这些概念。这些示例将跨越不同行业,包括房地产、交通运输和医疗保健。与以往一样,这些示例具有广泛的适用性,您将发现许多方法来利用数据,发掘您所发现的空间模式中的答案。
在本章中,我们将讨论以下主题:
-
Tableau 地图概述
-
使用 Tableau 渲染地图
-
使用地理空间数据
-
利用空间函数
-
创建自定义区域
-
Tableau 映射:技巧与窍门
-
在背景图像上绘制数据
Tableau 地图概述
Tableau 包含一个内部地理数据库,使其能够识别常见的地理元素,并在地图上的特定纬度和经度位置渲染标记。在许多情况下,例如国家或州,Tableau 还包含内部的形状文件,使其能够在正确的位置以复杂的矢量形状渲染标记。Tableau 还可以利用您特定的地理空间数据,例如纬度和经度、形状文件以及空间对象。本章中,我们将探讨其中的一些可能性。现在,我们将带您了解 Tableau 渲染地图的一些基本知识,以及可用的自定义选项。
使用 Tableau 渲染地图
请参考以下截图(第十二章 工作簿中的 基本地图 示例),并对某些元素进行编号以便参考:
图 12.1:Tableau 中的基本地理空间渲染
数字表示 Tableau 渲染地图能力的某些重要方面:
-
数据中的地理字段会显示为一个地球图标。Tableau 默认会为它识别的字段添加此图标。您可以通过菜单为任何字段分配一个地理角色,选择 地理角色 即可。
-
视图中的地理字段(在本例中位于 详细信息)是渲染地图所必需的。
-
如果 Tableau 能够将地理字段与其内部数据库匹配,那么将 纬度(生成的) 和 经度(生成的) 字段放在 行 和 列 上,再加上地理字段(们)放在 标记 卡片上,即可渲染出一张地图。
-
与 Tableau 地理数据库不匹配的值将显示一个指示器,提醒您存在未知值。
您可以右键点击未知指示器将其隐藏,或者点击它以显示以下选项:
-
编辑位置(手动匹配位置值到已知值或经纬度)
-
过滤掉未知位置
-
在默认位置绘制(纬度和经度为 0,这个位置有时幽默地被称为“空岛”,位于非洲西海岸附近)
Tableau 在地图上呈现标记的方式与散点图类似(实际上,您可以把地图看作是一种散点图,它通过一些复杂的几何变换来投影经纬度)。这意味着您可以在地图上绘制圆形、点和自定义形状。
在标记下方,地图本身是从在线地图服务中检索到的矢量图像。接下来,我们将考虑如何自定义地图图层和选项。
自定义地图图层
地图本身——陆地和水域、地形、街道、国家和州的边界等——都是从在线地图服务中检索到的矢量图像(也提供离线选项)。
然后在该图像上绘制标记。您已经知道如何使用数据、计算和参数来调整标记的渲染方式,但 Tableau 给予您对地图渲染方式的高度控制。
使用菜单通过选择地图 | 背景地图来探索各种选项。例如,这里是一个暗色地图:
图 12.2:暗色地图是多种地图背景选项之一
这张地图包含与前一个截图完全相同的标记,只是背景不同。其他选项包括浅色、街道、卫星等。
如果您将在没有互联网的环境中使用 Tableau(或发布到没有互联网连接的 Tableau 服务器),请选择离线选项。但是,请注意,离线版本不包含在线选项中的细节或缩放级别。
通过从菜单中选择地图 | 地图图层,可以找到其他图层选项。这将打开一个看起来像这样的地图图层面板:
图 12.3:地图图层面板
地图图层面板提供了选择背景、设置洗涤效果、选择显示的特征以及设置数据图层的选项。根据缩放级别,某些选项可能会被禁用(例如,建筑物轮廓只有在缩放到足够接近地图时才会启用)。数据图层允许您基于各种人口统计数据将填充地图应用于背景。这些人口统计数据只作为图像的一部分显示,并且不具备互动性,数据不会暴露给用户交互或计算。
您还可以使用菜单选项地图 | 背景地图 | 管理地图来更改使用的地图服务,这样您就可以指定自己的 WMS 服务器、第三方服务,或者使用Mapbox地图。这使您能够以任何您喜欢的方式自定义地图可视化的背景图层。
这些功能的细节超出了本书的范围,不过,你可以在 Tableau 的官方文档中找到相关内容。
自定义地图选项
此外,你还可以自定义可供最终用户使用的地图选项。注意当你将鼠标悬停在地图上时会出现的控制项:
图 12.4:自定义地图时可用的控制项
这些控制项允许你搜索地图、放大和缩小、将地图定位到当前位置,并使用各种选择方式。
你还可以使用键盘和鼠标组合来导航地图。使用Ctrl + 鼠标滚轮或Shift + Ctrl + 鼠标点击进行缩放。点击并按住或Shift + 点击来平移。
选择 地图 | 地图选项 后会出现其他选项:
图 12.5:地图选项
这些选项让你能够设置允许最终用户执行哪些地图操作,以及是否显示比例尺。此外,你还可以设置比例尺和径向选择的显示单位。选项包括自动(基于系统配置)、公制(米和千米)和美制(英尺和英里)。
Tableau 中集成了许多其他地理空间功能,我们将在接下来的内容中揭示如何利用地理空间数据。
使用地理空间数据
我们已经看到,对于任何数据源,Tableau 会根据它与内部地理数据库匹配的字段自动提供**纬度(生成)和经度(生成)**字段。像国家、省州、邮政编码、大都市区(MSA)和国会选区等字段都包含在 Tableau 的内部地理库中。随着 Tableau 持续增加地理功能,你可能需要查阅文档,了解内部数据库具体包含的内容。
然而,你也可以在可视化中利用特定的地理空间数据。我们将考虑使用能够支持地理空间可视化的数据,包括以下内容:
-
在你的数据中包含
纬度和经度作为数值。 -
将包含
纬度和经度定义的.csv文件导入到 Tableau 的数据库中。 -
利用 Tableau 连接到支持空间对象的各种空间文件或数据库的能力。
我们将在接下来的部分中探索这些选项,然后进一步了解如何利用地理空间函数扩展数据。
在数据中包含纬度和经度
在数据中包含纬度和经度可以为你的可视化(和计算)提供极大的灵活性。例如,虽然 Tableau 内建了国家、省州和邮政编码的地理编码功能,但它并不提供地址级别的地理编码。提供纬度或经度数据能让你精确地在地图上定位标记。
你可以在使用房地产数据源的第十二章工作簿中找到以下示例:
图 12.6:按价格大小绘制的待售房屋地图
在这里,每个单独的房屋可以通过精确的位置进行映射,并根据价格调整大小。为了帮助观众更直观地理解,已经应用了街道背景。
有许多免费的和商业的工具可以地理编码地址。也就是说,给定一个地址,这些工具会添加经度和纬度信息。
如果你无法直接将字段添加到数据源中,可以考虑使用跨数据库连接或数据混合。另一种选择是直接将纬度和经度定义导入到 Tableau 中。接下来我们将考虑这种选项。
导入定义到 Tableau 的地理数据库
若要从菜单导入,选择地图 | 地理编码 | 导入自定义地理编码...。导入对话框中包含了一个链接,描述了该选项的更多细节:
图 12.7:导入自定义地理编码对话框
通过导入一组定义,你可以:
-
添加新的地理类型
-
扩展 Tableau 内建的地理类型
纬度和经度定义了一个单一的点。在某些时候,你可能需要呈现更复杂的形状和线条。在这种情况下,你可以考虑一些地理空间函数和空间对象支持,接下来我们将讨论这些内容。
利用空间对象
空间对象定义了地理区域,这些区域可以简单如一个点,也可以复杂如多边形。这使得你可以呈现从自定义商业区域到河流、道路以及县和国家的历史边界等所有内容。空间对象可以存储在空间文件中,并且被一些关系型数据库所支持。
Tableau 支持多种空间文件格式,如ESRI、MapInfo、KML、GeoJSON和TopoJSON。此外,你还可以直接连接到ESRI数据库以及具有地理空间支持的关系型数据库,如ESRI或 SQL Server。如果你创建了一个提取文件,空间对象将被包含在提取文件中。
许多应用程序,如Alteryx、Google Earth和ArcGIS,都可以用来生成空间文件。空间文件也可以从许多组织那里轻松下载。这为地理空间分析提供了极大的灵活性。
例如,这里有一张美国铁路的地图:
图 12.8:美国铁路地图
要复制此示例,请从美国人口普查局下载 shapefile:catalog.data.gov/dataset/tiger-line-shapefile-2015-nation-u-s-rails-national-shapefile。
下载并解压文件后,连接到tl_2015_us_rails.shp文件。在预览中,你将看到带有 ID 字段和铁路名称的数据记录。几何字段是定义铁路段线性形状的空间对象:
图 12.9:美国铁路地图预览
在空白工作表中,只需双击几何字段。Tableau 将把地理数据集包括在细节中,并自动引入纬度和经度字段以完成渲染。尝试将 ID 字段包含在细节中,并根据全名进行筛选。
考虑使用跨数据库连接来补充现有数据与自定义空间数据。此外,Tableau 支持空间连接,允许你将仅在空间上相关的数据汇聚在一起,即使没有其他关系存在。
接下来,我们将着眼于利用一些空间函数,甚至是空间连接来扩展你的分析。
利用空间函数
Tableau 不断增加对空间函数的本地支持。撰写本文时,Tableau 支持以下功能:
-
Makeline()返回一个由两个点确定的线状空间对象。 -
Makepoint()返回一个由两个坐标确定的点状空间对象。 -
Distance()返回两个点之间的距离,单位为所需的测量单位。 -
Buffer()在一个点周围创建一个给定距离半径的圆形区域。你可以指定测量单位。
我们将通过第十二章工作簿中的医院和病人数据集来探索一些这些功能。该数据集将房地产数据重新构想为一个被病人环绕的医院,在以下视图中通过形状、大小和颜色的差异来表示:
图 12.10:一个被病人包围的医院(由星号表示)
我们可能会提出许多分析性问题。我们将集中讨论以下几个问题:
-
每个病人距离医院有多远?
-
有多少病人位于给定半径内?
-
哪些病人位于半径之外?
为了开始回答这些问题,我们将创建一些计算字段来为我们提供构建块。为了在同一计算中使用多个点,医院的纬度和经度需要与每个病人记录一起包含。实现这一目标的一种方法是使用几个FIXED 细节级别(LOD)表达式将值返回到每一行。
我们将创建一个名为Hospital Latitude的计算,代码如下:
{FIXED : MIN(IF [Location Type] == "Hospital" THEN [Latitude] END)}
以及一个名为Hospital Longitude的相应计算,代码如下:
{FIXED : MIN(IF [Location Type] == "Hospital" THEN [Longitude] END)}
在每种情况下,医院的纬度和经度是通过IF/THEN逻辑确定的,并通过FIXED LOD 表达式作为行级结果返回。这为我们提供了几个附加计算的构建块。接下来,我们将考虑第十二章工作簿中的几个示例。
MAKELINE()和 MAKEPOINT()
在考虑这两个功能时,我们将创建一个计算字段,绘制医院和每个患者之间的线。我们将命名我们的计算为Line并编写以下代码:
MAKELINE(
MAKEPOINT([Hospital Latitude], [Hospital Longitude]),
MAKEPOINT([Latitude], [Longitude])
)
MAKELINE()需要两个点,这些点可以通过MAKEPOINT()函数创建。该函数需要纬度和经度。第一个点是医院的位置,第二个点是患者的纬度和经度。
由于该函数返回一个空间对象,你会注意到该字段有一个地理图标:
图 12.11:地理图标已添加到 Line 字段
在一个新的可视化中,如果你双击Line字段,你会立即得到一个地理可视化,因为该字段定义了一个地理空间对象。你会注意到Detail上的COLLECT(Line)字段,以及Columns和Rows上的 Tableau 的Longitude (generated)和Latitude (generated)。地理空间集合被绘制为一个单一对象,除非你通过向视图添加维度来将其拆分。
在这种情况下,每个 ID 定义了一条单独的线,因此将其添加到Marks卡片的Detail中会将地理空间对象拆分为单独的线:
图 12.12:每条线从医院起点绘制到患者
如果我们想知道每条线覆盖的距离呢?我们将在一个扩展的例子中考虑这个问题。
DISTANCE()
距离可能是我们分析数据时非常重要的概念。知道两个地理空间点之间的距离能为我们提供很多见解。计算本身非常类似于MAKELINE(),我们可以创建一个名为Distance to the Hospital的计算字段,使用以下代码:
DISTANCE(
MAKEPOINT([Hospital Latitude], [Hospital Longitude]),
MAKEPOINT([Latitude], [Longitude]),
'mi'
)
类似于MAKELINE()计算,DISTANCE()函数也需要几个点,但它还需要一个单位。这里,我们使用参数'mi'指定英里,但我们也可以使用'km'来指定公里。
我们可以将此计算放置在Tooltip上,以查看每条线所覆盖的距离:
图 12.13:工具提示现在显示从医院到患者的距离
这个简单的例子可以大大扩展。现在,我们可以知道当我们悬停在这条线时,患者 ID 5距离医院**2.954…**英里。我们可以通过将距离四舍五入到2个小数位来改进显示,或者查看患者的名字。我们还可以通过将距离作为过滤器来显著增加分析的实用性(分析距离超过或低于某个阈值的患者),或者将距离作为更复杂分析中的相关因素。
我们可以通过Buffer()在视觉上完成一些操作,接下来我们将进一步探讨!
BUFFER()
Buffer 函数与DISTANCE()类似,但方向相反。与其计算两个点之间的距离,BUFFER()函数允许你指定一个点、一个距离和一个单位,进而在该点周围绘制一个具有指定半径的圆。
例如,你可能想要可视化哪些病人在医院的 3 英里半径范围内。为此,我们将创建一个名为Hospital Radius的计算字段,代码如下:
IF [Location Type] == "Hospital"
THEN BUFFER(MAKEPOINT([Latitude], [Longitude]), 3, 'mi')
END
这段代码首先检查确保只对医院记录进行计算。BUFFER()计算本身使用经纬度来生成一个点,并指定一个 3 英里半径。
为了可视化半径以及每个病人的个体标记,我们将创建一个双轴地图。双轴地图会复制经纬度字段并放在行或列中,然后使用Marks卡片的不同部分来渲染不同的地理空间对象。例如,在这里我们将病人的位置以圆点表示,将半径以自动标记类型表示:
图 12.14:位于医院 3 英里半径范围内的病人
注意,我们使用了生成的纬度和经度字段。这些字段作为占位符,供 Tableau 可视化任何空间对象。在Marks卡片的第一个部分,我们包含了来自数据的纬度和经度字段。在第二部分,我们加入了医院半径字段。在这两种情况下,生成的字段使 Tableau 能够使用Marks卡片上的地理或空间对象来定义可视化。
我们刚刚触及空间函数的表面。例如,你可以将半径值参数化,以便让最终用户动态更改距离。你还可以将MAKEPOINT()和BUFFER()计算作为连接计算在数据源中使用,以便将空间相关的数据汇聚在一起。例如,利用这些数据,你可以通过BUFFER()与MAKEPOINT()的相交连接将医院记录与病人记录结合,专门处理包含或排除特定半径内病人的数据集。这大大提升了你的分析能力。
在充分理解了可用的地理空间函数后,我们稍微调整一下焦点,讨论另一个感兴趣的话题:创建自定义区域。
创建自定义区域
自定义区域是你创建的(或数据定义的)地理区域或范围,而非内建的区域(例如国家或区号)。Tableau 为你提供了两种创建自定义区域的选项:临时自定义区域和字段定义自定义区域。接下来我们将探讨这两者。
临时自定义区域
你可以通过选择和分组地图上的标记,以一种临时方式创建自定义区域。只需选择一个或多个标记,悬停在一个标记上,然后使用分组图标。或者,右键点击其中一个标记,找到相关选项。如果数据中包含纬度和经度,或者你正在使用 Tableau 生成的纬度和经度,你可以按任何维度进行分组,从而创建自定义区域。
在这里,我们将通过邮政编码来考虑一个例子:
图 12.15:选择填充区域并将其分组为一个新区域后,使用回形针图标创建该分组
你会注意到,在这个例子中,Tableau 创建了一个新的字段 Zip Code (group)。该字段在数据面板中显示了回形针和地球图标,表明它是一个分组字段和地理字段:
图 12.16:一个分组和地理字段
Tableau 会自动将分组字段添加到颜色上。
你可以继续选择和分组标记,直到你得到所有所需的自定义区域。由于邮政编码仍然是视图级别的详细信息,视图中将显示每个邮政编码的标记(并且任何度量值将按邮政编码切分)。然而,当你从视图中移除邮政编码,仅保留Zip Code (group)字段时,Tableau 会根据新的分组绘制标记:
图 12.17:按自定义区域分组
在这里,分组字段已重命名为 Custom Territories,并且分组名称已别名为东区、西区和中区。我们可以看到每个自定义区域内的房屋平均价格。
这些功能的详细内容超出了本书的范围,但你可以在 Tableau 的文档中找到相关信息。
使用填充地图时,Tableau 会连接所有相邻区域,并仍然将不相连的区域包含在选择和高亮显示中。使用符号地图时,Tableau 会在所有分组区域的地理中心绘制标记。
有时,数据本身就定义了区域。在这种情况下,我们无需手动创建区域。相反,我们将使用接下来描述的技术。
字段定义的自定义区域
有时你的数据包含自定义区域的定义。例如,假设你的数据中有一个名为Region的字段,已经将邮政编码分组到不同的区域中。也就是说,每个邮政编码只包含在一个区域中。在这种情况下,你可能不想花时间手动选择标记并进行分组。
相反,你可以告诉 Tableau 数据中已经存在这种关系。在这个例子中,你可以使用数据面板中Region字段的下拉菜单,选择地理角色 | 从...创建 | 邮政编码。现在,Region变成了一个地理字段,定义了自定义区域:
图 12.18:此处的自定义区域由数据中的区域字段定义
在这种情况下,区域是由数据中的区域字段定义的。如果稍后重新定义这些区域,Tableau 会显示新区域(只要数据已更新)。使用字段定义的自定义区域使我们确信不需要手动更新定义。
使用临时自定义区域进行快速分析,但考虑使用字段定义的自定义区域作为长期解决方案,因为这样你可以在数据中重新定义区域,而无需手动编辑 Tableau 数据源中的任何分组。
Tableau 地图 – 提示与技巧
在处理地理可视化时,还需考虑一些其他提示:
使用顶部菜单选择地图 | 地图图层,以查看多个可作为地图一部分显示的背景图层选项。
-
放大还可以通过使用鼠标滚轮、双击、Shift + Alt + 点击以及Shift + Alt + Ctrl + 点击来实现。
-
你可以点击并按住几秒钟来切换到平移模式。
-
你可以通过右键点击地图并选择相应选项来显示或隐藏缩放控制和/或地图搜索。
-
缩放控制可以在任何使用轴的可视化类型上显示。
-
放大控制按钮上的图钉会交替将地图恢复到适合可见数据的最佳视图,或者锁定当前的缩放和位置。
-
你可以通过复制(Ctrl + 拖动/放置)列上的经度或行上的纬度来创建双轴地图,然后使用字段的下拉菜单选择双轴。你可以使用这种技巧在单一地图上结合多种标记类型:
图 12.19:双轴地图,显示州级的利润和邮政编码级别的销售额
你可以使用双轴来显示不同级别的细节或使用不同的标记类型。在这种情况下,两个目标都已实现。该地图利用双轴在州级别显示填充地图的利润,在邮政编码级别显示圆形的销售额:
-
在使用填充地图时,考虑在地图图层窗口中将洗净设置为100%,以获得干净的地图效果。然而,只有填充的形状会显示,因此任何缺失的州(或县、国家等)将不会被绘制:
图 12.20:洗净地图
-
你可以通过菜单选择地图 | 背景地图来更改背景地图图像的来源。这样,你可以选择无、离线(在没有互联网连接时使用,但显示的细节有限)或Tableau(默认选项)。
-
此外,从同一菜单选项中,你可以指定**地图服务...**来使用
WMS 服务器或Mapbox。
-
接下来,我们将通过探讨如何将数据绘制到背景图像上,来进一步提升数据可视化和展示效果,从而结束本章内容。
将数据绘制到背景图像上
背景图像允许你在任何图像上绘制数据。想象一下这些可能性!你可以在体育场的座位图上绘制票务销售数据、在办公室楼层图上绘制房间占用情况、在网络图上绘制每个设备的错误数量,或者在月球表面绘制陨石撞击数据。
在本例中,我们将绘制每月在医院不同房间里的病人数。我们将使用医院底层和二层的两张平面图作为图像。数据源位于Chapter 12目录下,文件名为Hospital.xlsx。它包含两个标签:一个是病人数统计,另一个是基于映射到图像上的 x/y 坐标的房间位置。我们接下来将讨论它是如何工作的。你可以查看Chapter 12目录下的Complete.twbx工作簿来查看完整示例,或者从头开始使用Chapter 12目录下的Starter.twbx。
要指定背景图片,请使用顶部菜单选择地图 | 背景图片,然后点击适用该图像的数据源——在本例中为Patient Activity (Hospital)。在背景图片屏幕上,您可以添加一张或多张图片。
在这里,我们将从位于Chapter 12目录下的Hospital - Ground Floor.png开始:
图 12.21:添加背景图片窗格
你会注意到我们映射了X和Y字段(来自Locations标签),并指定了Right为800,Bottom为700。这是基于图像的像素大小。
你不必使用像素,但大多数情况下,使用像素能让映射数据位置更容易。在这个例子中,我们有一个 Excel 文件标签,里面已经将位置映射到图像上的x和y坐标(单位为像素)。通过跨数据库联接,你可以创建一个包含图片映射的简单文本或 Excel 文件,并将其连接到现有数据源。你可以手动映射点(使用图形应用程序)或使用多个免费的在线工具,快速在图片上映射坐标。
我们只想显示这一蓝图的底层平面图,因此切换到Options标签,我们将确保基于数据设置条件。我们还将确保勾选始终显示整个图像:
图 12.22:编辑背景图片窗格
接下来,重复前面的步骤,我们将把第二张图像(Hospital - 2nd Floor.png)添加到数据源中,并确保它只在2nd Floor显示。
一旦我们定义并映射了图像,就可以开始构建可视化了。基本思路是使用X和Y字段作为轴来构建散点图。但我们必须确保X和Y没有被求和,因为如果它们在多个记录中被相加,就无法正确映射到像素位置。这里有几个选项:
-
使用X和Y作为连续维度。
-
使用
MIN、MAX或AVG替代SUM,并确保 位置 被用来定义视图的细节级别。 -
此外,图像从顶部的 0 到底部的 Y 进行度量,而散点图则从底部的 0 开始,数值向上增加。因此,最初你可能会看到背景图像显示倒置。为了避免这个问题,我们将编辑 y 轴(右键点击并选择 编辑轴),然后勾选 反向 选项。
我们还需要确保 楼层 字段被用于视图中。这是为了告诉 Tableau 应该显示哪个图像。在这一点上,我们应该能够得到如下的可视化效果:
图 12.23:在楼层平面图像上绘制每个房间的患者数量
在这里,我们已根据每个房间的患者数量绘制了大小不同的圆圈。我们可以通过多种方式清理和修改可视化:
-
隐藏 x 和 y 轴(右键点击轴并取消勾选 显示标题)
-
隐藏 楼层 的标题,因为图像已经包含了标签
-
将 楼层 添加到 筛选器 架上,以便最终用户可以选择一次查看一个楼层
在背景图像上绘制标记的功能为传达复杂主题开辟了无限的可能性。想想你如何在计算机网络的图示上显示硬件错误数量,在篮球场上显示未投中的跳投次数,或者显示办公室大楼中人与人之间的距离。所有这一切,甚至更多,都是可能的!
摘要
本章我们已经覆盖了很多内容!可视化地图的基本操作很简单,但背后有很多强大的功能和可能性。从使用你自己的地理空间数据到利用地理空间对象和函数,你有很多分析选项。创建自定义区域并在背景图像上绘制数据,进一步扩展了你的可能性。
接下来,我们将重点介绍 Tableau 2020.2 的全新功能:数据模型!我们将探讨数据模型关系、连接、混合的区别,并看看如何使用它们进行各种有价值的分析!
第十三章:理解 Tableau 数据模型、连接和混合
在本章中,我们将深入了解如何使用 Tableau 建模和构建数据。我们在之前的章节中已经看到过数据源界面,并简要了解了如何通过拖放表格来建立关系。现在,我们将探索一些 Tableau 的复杂功能,以便深入了解 Tableau 如何允许你以逻辑或物理方式将多个表格关联在一起。
我们将首先对 Tableau 的新数据模型进行广泛的概述,然后详细研究不同类型的连接和混合。数据模型和混合主要适用于 Tableau Desktop(和 Server),但请特别注意连接的讨论,因为对连接类型的良好理解将对我们在第十五章《使用 Tableau Prep 整理数据》中的 Tableau 准备工作有很大帮助。
数据模型仅在 Tableau 2020.2 及更高版本中可用。如果你使用的是旧版本,连接和混合的解释将直接适用,而数据模型的解释将为你提供升级的灵感!
在本章中,我们将涵盖以下主题:
-
本章使用的示例数据解释
-
探索 Tableau 数据模型
-
使用连接
-
使用混合
-
何时使用数据模型、连接或混合
我们将首先了解本章工作簿中包含的示例数据集。这是为了让你在进行示例操作之前,建立一个良好的知识基础。
本章使用的示例数据解释
本章中,我们将使用一个包含患者就诊记录的示例数据集。数据本身存储在Hospital Visits.xlsx的 Excel 文件中,该文件位于Learning Tableau\Chapter 13目录下。Excel 文件中的标签代表数据表,就像你在任何关系型数据库中可能会看到的多个文件一样,或者仅仅是 Excel 文件中的标签!这些表格之间的关系在这里进行了说明:
图 13.1:Excel 文件的四个标签以四个具有关系的表格形式展示
Excel 并没有明确定义表之间的关系,但这里展示了它们可能在关系型数据库中通过外键查找的形式存在。下面是对这些表及其关系的简要说明:
-
医院就诊:这是记录单个患者在一次就诊中入院和诊断信息的主表。它包含诸如入院类型、地点等属性,以及**服务等待时间(分钟)**的度量。
-
患者:此表包含单个患者的附加信息,如姓名、出生日期以及其最近入院时的年龄的度量。
-
出院详情:此表提供了有关患者出院的额外信息,如 出院日期 和 处置(患者出院条件及离开医院后的去向)。它还包含一个度量 患者对护理感受如何?(1-10),其中 1 表示最低,10 表示最高。
-
患者与医生互动:此表定义了患者在就诊期间与医生之间的互动。它包括 医生姓名、备注 和衡量医生与患者共度时间的度量(与患者共度时间(分钟))。
这些表以不同的方式相互关联。以下是一些详细信息:
-
住院就诊 到 患者:每次就诊都有一个单独的患者,因此 住院就诊 将始终有一个指向 患者 表中单个记录的 患者 ID 字段。我们也会在 患者 表中找到其他没有记录就诊的患者。也许它们是来自遗留系统的历史记录,或者患者与医院的互动方式并非通过就诊。
-
住院就诊 到 出院详情:每次就诊可能只有一个出院记录,但某些患者可能仍然在医院内。在良好设计的数据结构中,我们应该能够依靠 出院详情 表中的记录来指示“仍在医院”。然而,在我们的 Excel 数据中,可能会有或没有 出院详情 ID,这意味着并不总是会有一个匹配的 出院详情 记录与每次 住院就诊 相对应。
-
患者与医生互动 到 住院就诊:在患者的就诊过程中,可能会有一个或多个医生与患者互动。也可能没有医生记录任何互动。因此,在 患者与医生互动 中,我们有时会找到多条记录参考单个 就诊 ID,有时只有一条记录,有时在 住院就诊 表中存在就诊但没有任何记录。
掌握了示例数据源后,让我们转向如何在 Tableau 中构建数据模型。
探索 Tableau 数据模型
在 Tableau 2020.2 及更高版本中,您将会发现数据模型作为一个新功能。每个数据源都将使用数据模型。在之前的版本中创建的数据源将会被更新为数据模型,但它们将被包含在一个单一的对象中,因此在功能上,它们将与之前的版本相同地运行。
Tableau 的早期版本允许您利用连接表和混合数据源,我们将在本章末尾考虑这些选项。现在,我们将专注于创建数据模型并理解这种范式。
创建数据模型
我们在第二章中简要查看了数据源屏幕,在 Tableau 中连接数据。现在,我们将深入探讨界面背后的概念。你可以随时跟随 Chapter 13 Starter.twb 工作簿中的示例,或者查看 Chapter 13 Complete.twbx 中的最终结果。
我们将首先创建与Hospital Visits.xlsx文件的连接,该文件位于Chapter 13目录中。首次连接到文件时,数据源屏幕将如下所示:
图 13.2:数据源屏幕列出了 Excel 工作簿中的标签,并邀请你开始构建数据模型。
我们将通过拖放表格到画布上来构建数据模型。我们将添加所有四个表。Tableau 会根据任何匹配的字段名称和类型为每个新添加的表建议关系。对于我们的表,我们将接受默认设置,因为指示正确关系的ID字段具有相同的名称和类型。
第一个添加的表是根表,构成数据模型的起点。在这个例子中,添加表格的顺序并不重要,尽管你可能会注意到,取决于你从哪个表开始,显示效果会略有不同。在以下截图中,我们从住院就诊(这是主要表,因此作为根表是合理的)开始,然后添加了其他所有表:
图 13.3:所有表格都已添加到数据模型中。
你会注意到编辑关系对话框已打开,用于住院就诊和患者之间的关系。Tableau 自动创建了我们的关系,因为两个表中的 ID 字段具有相同的名称和类型。如果需要,你可以手动编辑这些关系,改变哪些字段定义了关系。
关系仅定义了连接表格的字段,而没有定义表格之间的具体关系。我们将在本章后面讨论连接类型的概念(例如,左连接或内连接),但关系不限于某种连接类型。相反,Tableau 会根据你在视图中使用的字段,选择合适的连接类型以及正确的聚合方式。在大多数情况下,你无需关心 Tableau 在背后做了什么,但我们将在下一节探讨一些独特的行为。
在 2020.2 版本中,无法编写计算来定义关系,但在 2020.3 版本中这是一个功能。
此外,请注意关系编辑器中的性能选项下拉菜单,如下所示:
图 13.4:编辑关系对话框包含提高性能的选项。
这些性能选项允许 Tableau 在已知关系性质的情况下生成更高效的查询。如果你不知道关系的确切性质,最好保持默认设置,因为不正确的设置可能导致错误的结果。
性能选项涉及的两个基本概念:
-
基数:这个术语指示一个表中的多少记录可能与另一个表中的记录相关。例如,我们知道一次就诊只对应一个患者。然而,我们也知道在一次就诊中,可能有许多医生会与患者互动。
-
参照完整性:这个术语指示我们是否期望所有记录都能找到匹配项,或者是否某些记录可能无法匹配。例如,我们知道(根据前面的描述)患者表中有些患者在住院记录表中没有匹配项。我们还知道有些患者可能没有出院记录,因为他们仍然在医院里。
如果 Tableau 能够从关系型数据库中确定约束条件,它将使用这些约束。否则,Tableau 会将默认设置为多对多和某些记录匹配。对于本章中的示例,我们确实知道关系的确切性质(它们在前一节中已描述),但由于数据集足够小,修改这些设置不会带来明显的性能提升,因此我们将接受默认的性能设置。
在创建了初始数据模型后,花点时间探索数据模型范式的两层结构。
数据模型的层次
数据模型由两层组成:
-
逻辑层:由相关的逻辑表或对象组成的语义层。每个逻辑表可能由一个或多个物理表组成。
-
物理层:由来自底层数据源的物理表组成的层。这些表可以通过常规的连接或联合操作连接或联合在一起,或通过自定义 SQL 语句创建。
请查看以下包含我们四个表的画布截图:
图 13.5:数据模型的逻辑层
这个初始画布定义了数据模型的逻辑表。逻辑表是定义单一结构或对象的数据集合,这些结构或对象与其他逻辑数据结构相关。双击画布上的住院记录表,你将看到逻辑层下方的另一个层次:
图 13.6:构成住院记录的物理表的物理层
这是逻辑医院访问表的物理层。这个物理层由数据的物理表组成——可能是联合或连接在一起的。在这种情况下,我们知道医院访问由 1 个表组成。所以,在这种情况下,医院访问的逻辑层与下面的物理层是相同的。在本章的使用连接部分,我们将探讨如何通过多个表来扩展物理层的复杂性,同时仍将这些表的集合视为一个单一对象。
现在请点击右上角的X图标,关闭医院访问的物理层。然后转到本章工作簿的分析标签,我们将探索数据模型如何在实践中工作。
使用数据模型
大部分情况下,使用数据模型将会相对直观。如果你曾使用过之前版本的 Tableau,你会注意到一些细微的界面变化,并且有些数据模型的行为需要你去习惯。一旦你熟悉了这些,你的分析将超出预期!
新的数据面板界面
你可能会注意到数据面板的不同之处,它看起来大致是这样的:
图 13.7:数据面板按逻辑表格组织,并显示每个表格中的维度和度量的分隔
你会注意到,数据面板按照逻辑表格组织,每个表格中包含的字段都被列出。度量和维度通过一条细线进行分隔,而不像以前那样出现在不同的部分。这使得查找与分析相关的字段变得更加容易,也有助于你理解数据模型的预期行为。与之前的版本不同的是,每个逻辑表都有一个记录数量字段,字段名遵循表名 (Count)的命名规则。你还可以在字段列表的底部找到可以添加的计算以及度量名称/度量值。
在概览了 UI 的一些变化后,让我们来看一下你可以预期的数据模型行为。
数据模型行为
在Starter工作簿的分析标签中,尝试创建不同的可视化效果。特别注意维度、显示的值以及度量的聚合方式。我们将通过几个示例进行讲解(你可以在Starter工作簿中复制这些示例,或者在Complete工作簿中查看)。
首先,注意到将姓名从病人表拖到行中,会显示 10 个病人。结果发现,并不是所有病人都有住院记录,但当我们使用来自同一逻辑表的一个或多个维度时,我们会看到 Tableau 中的完整值域。也就是说,我们会看到所有病人,无论他们是否有过住院记录。我们可以通过添加**住院记录(数量)**字段来验证每个病人的就诊次数,得到以下视图:
图 13.8:所有病人都被显示出来,甚至是那些没有就诊的病人
但是如果我们在表格中加入初步诊断,注意到只有 10 个病人中的 6 个被显示出来:
图 13.9:只显示有就诊记录的病人;大多数病人只有一次就诊记录且诊断相同,但有一位病人做了两次同样的诊断
这突显了另一个行为:当你从两个或更多表格中包含维度时,只有匹配的值才会显示。本质上,当你添加姓名和初步诊断时,Tableau 会展示那些同时存在于病人和住院记录表中的病人。如果你只想关注曾经去过医院的病人,这是很有用的。
那么如果你真的想看到所有病人以及适用的诊断呢?为了实现这一点,只需从表格中添加你想查看完整领域的字段的度量。在这个例子中,我们可以添加最近一次住院年龄或病人(数量)度量,因为它们都来自病人表。这样做会得到如下视图:
图 13.10:所有病人再次显示出来
尽管最近一次住院年龄对那些从未住院的病人来说是NULL,但只需将该度量添加到视图中,Tableau 就会显示所有病人。这展示了第三个行为:从与维度相同的表格中包含度量将迫使 Tableau 展示该维度的完整值域。
这里还展示了数据模型行为的另一个基本原则。请注意,最近一次住院年龄显示了每个病人和每个诊断的值。然而,Tableau 不会错误地在总计或小计中重复显示该值。如果你为每个病人在最近一次住院年龄和住院记录数量列中添加小计,正如以下视图所示,你会看到 Tableau 已经计算出了正确的值:
图 13.11:即使传统的连接行为会重复显示值,Tableau 也会正确计算小计
数据模型的最终行为可以表述为:聚合是根据度量的逻辑表定义的细节层次来计算的。这类似于你使用细节级别(LOD)表达式来避免 LOD 重复的方式,但你无需编写表达式或中断思路来解决问题。Tableau 数据模型为你完成了繁重的工作!
花一些额外的时间,利用你创建的数据模型构建视图和可视化。然后复习以下行为,以便了解预期效果以及如何控制你想执行的分析:
-
当你使用来自同一逻辑表的一个或多个维度时,你将在 Tableau 中看到该维度的完整值域。
-
当你从两个或更多逻辑表中包含维度时,只有匹配的值会被显示。
-
如果将度量与同一逻辑表中的维度一起使用,Tableau 将强制显示该维度的完整值域(即使之前的行为已生效)。
-
聚合是根据度量的逻辑表定义的细节层次来计算的。
只需稍加练习,你会发现这些行为变得很自然,尤其会欣赏 Tableau 在正确的细节层次上执行聚合。
当你首次创建新数据模型时,进行几个类似前面示例的快速检查是很有帮助的。这将帮助你熟悉数据模型,并验证关系是否按预期工作。
现在,我们将重点学习如何使用连接在物理层中关联数据。
使用连接
在物理层中的连接是表之间按行逐行匹配数据的过程。我们将看看几种不同类型的连接,然后考虑如何在数据模型的物理层中利用它们。
连接类型
在物理层中,你可以指定以下几种连接类型:
-
内连接:只有在左右两表中都满足连接条件的记录才会保留。在下面的示例中,只有三行匹配的记录被保留在结果中:
图 13.12:内连接
-
左连接:左表中的所有记录都会被保留。来自右表的匹配记录会在结果表中显示其值,而不匹配的记录则会在右表的所有字段中显示
NULL值。以下示例中,左表的五行记录被保留,对于右表中未匹配的任何值显示为NULL:图 13.13:左连接
-
右连接:右表中的所有记录都会被保留。左表中匹配的记录会生成值,而未匹配的记录会在左表中显示所有字段的
NULL值。并非所有数据源都支持右连接。如果不支持,该选项将被禁用。在以下示例中,右表中的五行记录被保留,未匹配的左表字段显示NULL值:图 13.14:右连接
-
全外连接:两边表中的所有记录都会被保留。匹配的记录将具有来自左边和右边的值。没有匹配的记录将会在左边或右边的匹配记录未找到的地方显示
NULL值。并非所有数据源都支持全外连接。如果不支持,该选项将被禁用。在以下示例中,来自两边的所有行都被保留,未找到匹配的地方显示NULL值:图 13.15:全外连接
-
空间:这会根据空间对象的交集(重叠)将匹配的记录连接在一起(我们在第十二章“探索地图和高级地理空间功能”中讨论了 Tableau 的空间功能)。例如,一个基于经纬度的点可能位于由 Shapefile 定义的复杂形状内部。只要一个表中的空间对象与另一个表中指定的空间对象重叠,相关记录就会被保留:
图 13.16:空间连接
当你从左表和右表中选择空间对象时,你需要指定交集作为字段之间的操作符,以实现空间连接,如图 13.17所示:
图 13.17:假设选中的两个字段代表空间对象,"交集"选项将可用
在深入理解连接类型之后,我们来考虑如何在 Tableau 的数据模型物理层中使用它们。
连接数据表
大多数数据库有多个数据表,这些表之间以某种方式相关。此外,你还可以通过各种数据连接将不同数据源中的数据表联合起来。
对于这里的示例,我们再次考虑医院数据库中的表,并进行一些简化:
图 13.18:主医院访问表,包含患者和出院详细信息,可能存在于关系型数据库中
让我们来考虑如何在物理层中使用一些连接来构建数据源。要跟随示例,请在Chapter 13 Starter.twbx工作簿中创建一个新的 Excel 数据源,引用Chapter 13目录中的Hospital Visits (Joins).xlsx文件。你也可以在Chapter 13 Complete.twbx工作簿中查看连接。
正如我们之前所做的那样,我们将首先将住院记录表格拖到数据源画布上,以便在逻辑层中创建一个住院记录对象,像这样:
图 13.19:将表格拖到画布上后,逻辑层中创建了住院记录对象
此时,逻辑层对象仅包含一个物理表格。但接下来我们将扩展它。双击住院记录对象以展开物理层。它将看起来像这样:
图 13.20:当前仅包含一个物理表格的物理层
你可以通过添加额外的表格来扩展物理模型。我们将在这里进行扩展,添加出院详情和病人。在添加时,Tableau 会弹出对话框提示你调整连接的详细信息。它将看起来像这样:
图 13.21:在物理层中将出院详情与住院记录连接
连接对话框允许你指定连接类型(内连接、左连接、右连接或完全外连接),并指定一个或多个字段进行连接。在这些字段之间,你可以选择哪种类型的运算符来连接字段。默认是相等(=;字段必须相等),但你也可以选择不等(<>;字段必须不相等)、小于(<)、小于等于(<=)、大于(>)或大于等于(>=)。连接的类型和定义连接的字段关系将决定从连接中返回多少记录。我们将在下一节详细查看这些细节。
通常,你会希望首先将主表拖到物理层画布上。在这个例子中,住院记录包含连接额外表格的键。其他表格应在主表之后被拖放。
此时,接受 Tableau 自动检测到的在表格之间共享的字段(出院详情 ID 对应 出院详情,病人 ID 对应 病人)。将出院详情的连接改为左连接。这意味着所有住院记录都将被包括在内,即使尚未发生出院。将病人保持为内连接。这将仅返回在两个表格之间共享的记录,因此只保留有住院记录的病人。
最终,住院记录的物理层将看起来像这样:
图 13.22:物理层由三个连接在一起的表格组成
当你关闭物理层后,你将再次看到逻辑层,其中包含一个单一对象:住院记录。该对象现在包含一个连接图标,表示它是由多个物理表格连接而成。但它仍然是数据模型逻辑层中的一个单一对象,像这样:
图 13.23:逻辑层包含一个由三个物理表格组成的单一对象
所有连接会创建你可能认为的一个平面表,它可以与数据模型中的其他对象关联。这些对象反过来可能由单个物理表或多个物理表连接组成。
如果你正在跟随示例操作,请将此数据源重命名为医院就诊(连接)。我们将在本章结束时再次利用这个数据源进行一个示例。在此期间,让我们考虑一些与连接相关的其他细节。
其他连接注意事项
我们在本节的结尾总结了利用连接的进一步可能性,并提醒可能会出现的问题。
连接计算
在前面的示例中,我们提到 Tableau 基于数据中的字段逐行连接。你可能会遇到需要基于数据中没有但可以从现有数据中派生的值进行连接的情况。例如,假设有一个患者档案表,它能为你的数据集增加显著的价值。然而,它缺少患者 ID,只包含名字和姓氏字段。
要将其连接到我们的患者表,我们可以使用连接计算。这是一种仅用于连接表的计算。要创建连接计算,请在连接对话框中的字段下拉列表中选择最后一个选项,创建连接计算:
图 13.24:你可以创建一个连接计算,帮助形成正确的连接
选择此选项允许你编写可以在连接中使用的行级计算。例如,我们的连接计算可能会像 [First Name] + " " + [Last Name] 这样的代码,用于返回与姓名字段匹配的值。
尽量避免在文本字段上进行连接,尤其是在较大的数据集上,这样做会影响性能。基于整数进行连接效率更高。而且,两个不同的人可能会共享相同的名字和姓氏,因此如果一个实际数据集遵循本示例中的结构,可能会发生错误匹配和数据错误。
你还可以利用第十二章中提到的地理空间函数,探索映射和高级地理空间功能,即使其中一个或两个数据源缺少用于连接的特定空间对象,也能创建空间连接。例如,如果你有纬度和经度,你可以创建一个连接计算,使用 MAKEPOINT([Latitude], [Longitude]) 的代码,找到与另一个表中的空间对象的交集。
当你缺少用于连接的字段时,连接计算也能提供帮助。如果你想要连接的数据完全位于另一个数据库或文件中呢?在这种情况下,我们会考虑跨数据库连接。
跨数据库连接
使用 Tableau,你可以在行级别进行多个不同数据连接的连接。不同数据连接之间的连接被称为跨数据库连接。例如,你可以将 SQL Server 表与文本文件或 Excel 文件连接,或将一个数据库中的表与另一个数据库中的表连接,即使它们在不同的服务器上。这为补充数据或分析来自不同来源的数据提供了各种可能性。
考虑医院数据。尽管它不属于第十三章文件集的一部分,但账单数据通常与病人护理数据存在于不同的系统中并不罕见。假设你有一个病人账单文件,其中包含你希望包括在医院就诊分析中的数据。你可以通过将文本文件作为数据连接添加,然后将其与现有的表格进行连接,如下所示:
图 13.25:基于不同数据连接的表或文件连接
你会注意到,在数据源界面上有一个添加链接,允许你向数据源添加数据连接。点击每个连接后,你可以将该连接中的表拖放到数据源设计器中,并按需指定连接。每个数据连接都会有颜色编码,以便你可以立即识别设计器中各种表格的来源。
你也可以在逻辑层使用多个数据源。
连接时的另一个考虑因素是无意的错误,我们接下来会讨论这个问题。
数据的无意重复
最后,我们以关于连接的警告作为结尾——如果不小心,你可能会得到多几行或是比预期多很多倍的记录数。我们考虑一个理论上的例子:
假设你有一个像这样的Visit表:
| Visit ID | Patient Name | Doctor ID |
|---|---|---|
| 1 | Kirk | 1 |
| 2 | Picard | 2 |
| 3 | Sisko | 3 |
以及像这样的Doctor表:
| Doctor ID | Doctor Name |
|---|---|
| 1 | McCoy |
| 2 | Crusher |
| 3 | Bashir |
| 2 | Pulaski |
请注意,Doctor ID的值2在Doctor表中出现了两次。在Doctor ID值相等的情况下进行连接将会导致重复记录,无论使用何种连接类型。这样的连接将会得到以下数据集:
| Visit ID | Patient Name | Doctor ID | Doctor Name |
|---|---|---|---|
| 1 | Kirk | 1 | McCoy |
| 2 | Picard | 2 | Crusher |
| 3 | Sisko | 3 | Bashir |
| 2 | Picard | 2 | Pulaski |
这将大大影响你的分析。例如,如果你在计算行数来确定发生了多少次病人就诊,你会重复计数。有时候你可能故意创建重复记录以帮助分析,但通常,这会表现为无意的错误。
除了不小心重复数据并导致额外行的风险外,还有可能会丢失一些行,因为预期匹配的值没有完全匹配。养成验证使用连接的任何数据源行数的习惯。
深入理解连接不仅能帮助你在使用 Tableau Desktop 和 Tableau Server 时更得心应手,还能为我们接下来在第十五章,使用 Tableau Prep 整理数据中学习 Tableau Prep 打下坚实的基础。现在,让我们通过简要了解数据混合来结束这一章。
使用数据混合
数据混合使你能够在同一视图中使用来自多个数据源的数据。这些数据源通常可能是不同类型的。例如,你可以将来自 Oracle 的数据与 Excel 的数据混合,将 Google Analytics 的数据与空间文件混合。数据混合还允许你在不同的细节级别上比较数据。让我们了解一些基础知识并看一个简单的例子。
数据混合是在汇总级别进行的,并且涉及向每个数据源发送不同的查询,不同于连接,它是在行级别进行的(从概念上讲)并且涉及向单个数据源发出单一查询。一个简单的数据混合过程包含几个步骤,如下图所示:
图 13.26:Tableau 如何实现数据混合
从上述图示中,我们可以看到以下内容:
-
Tableau 向主数据源发出查询。
-
底层数据引擎返回汇总结果。
-
Tableau 向辅助数据源发出另一个查询。这个查询是基于来自主数据源的维度值集合进行过滤,这些维度将两个数据源连接起来。
-
底层数据引擎从辅助数据源返回汇总结果。
-
主数据源的汇总结果和辅助数据源的汇总结果将在缓存中混合在一起。
需要注意的是,数据混合不同于连接。连接是在单个查询中完成的,结果逐行匹配。数据混合是通过发出两个独立的查询,然后将汇总结果混合在一起实现的。
只能有一个主数据源,但可以有任意数量的辅助数据源。步骤 3和4将为每个辅助数据源重复执行。当所有汇总结果返回后,Tableau 会根据链接字段匹配汇总行。
当你的 Tableau 工作簿中有多个数据源时,首先在视图中使用的源将成为该视图的主数据源。
数据混合是特定于视图的。在一个视图中,你可以将一个数据源作为主数据源,而在另一个视图中,将相同的数据源作为辅助数据源。任何数据源都可以用于数据混合,但像 SQL Server Analysis Services 中的 OLAP 立方体,必须作为主数据源使用。
在许多方面,数据混合类似于创建一个包含两个或更多对象的数据模型。在许多情况下,数据模型会提供您所需的所有内容,而无需使用数据混合。然而,使用数据混合您会有更多灵活性,因为您可以在视图级别而不是对象级别更改哪些字段是相关的。
关联字段是用于匹配主数据源和次数据源之间的数据混合的维度。关联字段定义了次级数据源的详细级别。如果数据源之间的字段名称和类型匹配,则会自动分配关联字段。
否则,您可以通过从菜单中选择数据 | 编辑数据关系手动分配字段之间的关系,如下所示:
图 13.27:定义数据源之间的混合关系
关系窗口将显示不同数据源之间识别的关系。您可以从自动切换到自定义,以定义您自己的关联字段。
关联字段可以在视图中启用或禁用。视图中使用的关联字段通常默认是激活的,而其他字段则不是。然而,您可以通过点击数据窗格中关联字段旁的链接图标来更改关联字段的激活状态。
此外,使用编辑数据关系屏幕定义将用于跨数据源筛选器的字段。当您在视图中的筛选器字段的下拉菜单中使用并选择应用于工作表 | 所有使用相关数据源时,筛选器将在数据源之间生效。
让我们通过一个例子将其从概念转化为实际操作。
数据混合示例
让我们快速看一个数据混合的示例。假设您有以下表格,表示医院中各个位置在为病人服务时的服务目标:
| 位置 | 平均服务时间目标(分钟) |
|---|---|
| 住院手术 | 30 |
| 门诊手术 | 40 |
| ICU | 30 |
| 产科 | 25 |
| 实验室 | 120 |
这些数据包含在一个简单的文本文件中,名为Location Goals.txt,位于第十三章目录下。起始工作簿和完整工作簿中已经定义了该文件的数据源。
我们将首先创建一个简单的条形图,来自您之前创建的医院就诊(连接)数据源,显示如下的按位置计算的平均服务时间(分钟):
图 13.28:按位置计算的平均服务时间(分钟)
然后,在数据窗格中,我们将选择位置目标数据源。请观察此处显示的数据窗格:
图 13.29:医院就诊(连接)显示为主数据源,而位置目标数据源中的位置被指示为关联字段
医院访问(连接)数据源上的蓝色勾选标记(在图 13.29中标记为1)表示该数据源是主数据源。Tableau 将位置识别为连接字段,并通过一个连接图标(在图 13.29中标记为2)指示该字段为活动状态。它之所以为活动状态,是因为你在当前视图中使用了来自主数据源的位置。如果你没有使用,Tableau 仍然会显示链接,但默认情况下它不会处于活动状态。你可以点击该链接图标,在活动和非活动状态之间切换,进而控制在次级数据源中进行汇总时的详细级别。
现在,点击数据窗格中的服务目标的平均分钟数,然后从Show Me中选择子弹图,如图所示:
图 13.30:你可以将次级数据源的字段拖放到视图中,或者使用 Show Me
你可能需要右键单击视图中的服务的平均分钟数轴,然后选择交换参考线字段,以确保目标是参考线,条形图是实际指标。现在你的视图应该是这样的:
图 13.31:由主数据源和次级数据源创建的视图
请注意,医院访问(连接)数据源和位置目标数据源都在此视图中使用。医院访问(连接)是主数据源(由蓝色勾选标记指示),而位置目标是次级数据源(由橙色勾选标记指示)。服务目标的平均分钟数字段在Marks卡片中的Detail上是次级数据源的,并且也由橙色勾选标记的图标指示。
你可能还会注意到主医院和重症监护在视图中没有显示目标值。回想一下,主数据源用于确定视图中显示的完整值列表。主医院在主数据源中存在,但在次级数据源中没有匹配项。它会显示在视图中,但没有次级数据源的值。
重症监护也没有次级数据源的值。这是因为次级数据源中的相应值是ICU。主数据源和次级数据源中的值必须完全匹配,数据融合才能找到匹配项。不过,数据融合也会考虑别名的情况。
别名是维度值的替代值,将用于显示和数据融合。你可以通过右键单击行标题或使用视图或数据窗格中的字段菜单,并选择别名选项来更改维度的别名。
我们可以通过右键单击视图中的行标题并使用**编辑别名…**选项来更改字段的别名,如下所示:
图 13.32:使用编辑别名...选项
如果我们将别名更改为ICU,在次级数据源中找到匹配项,视图中显示的是次级数据源的值:
图 13.33:ICU 现在可以在次级数据源中找到匹配项。
位置、实验室的最终值仅出现在Location Goals.txt源中,因此在此视图中不显示。如果我们创建一个新视图并使用Location Goals作为主数据源,它将会显示。
本章中我们已经讨论了许多关于如何关联数据的选项。让我们花点时间考虑一下何时使用这些不同的技术。
何时使用数据模型、连接或混合。
从某种意义上讲,使用最新版本的 Tableau 创建的每个数据源都将使用数据模型。即使是使用一个物理表的数据源,也会在数据模型的逻辑层中有一个对应的对象。但在何时应通过数据模型关联表,何时应在物理层将其连接在一起,何时应使用混合呢?
大多数情况下,没有单一的正确或错误答案。然而,这里有一些通用的指导原则,可以帮助你思考何时适合使用某种方法。
一般来说,使用数据模型来关联表:
-
当连接会使正确的聚合变得不可能,或者需要复杂的 LOD 表达式来获得准确结果时。
-
当连接会导致数据重复时。
-
当你需要灵活性来展示维度的完整域,或仅展示在关系中匹配的值时。
-
当你对数据源不确定,且不知道使用哪种类型的连接时。
一般来说,在物理层面使用连接:
-
当你必须使用除了字段之间的等式以外的操作符时。
-
当你需要进行空间连接时。
-
当你想要特定地控制分析中使用的连接类型时。
-
当数据模型的性能比使用连接时效率低时。
一般来说,在以下情况下使用混合:
-
你需要关联无法通过数据模型连接或关联的数据源(例如 OLAP 立方体)。
-
你需要灵活性来通过别名“修复”匹配。
-
你需要灵活性来调整哪些字段在不同视图中定义关系的方式。
随着你在使用每种方法时的信心增长,你将能够更好地判断在特定情况下哪种方法更合适。
总结
当你需要将数据表关联在一起时,你现在有几种技术可以选择。数据模型是 Tableau 最新版本中的一项新功能,它为关联逻辑数据表提供了一种新的范式。它在显示维度值的完整和部分域时引入了一些新的行为,但通过考虑聚合的自然细节级别,它也大大简化了聚合。在物理层面,你可以选择将物理表连接在一起。
我们介绍了各种类型的连接,并讨论了使用连接计算和跨数据库连接的可能性,以实现最终的灵活性。我们简要讨论了数据混合的工作原理,并展示了一个实际的例子。最后,您回顾了每种方法的使用时机。现在,您已经拥有了广泛的工具集,能够处理不同表格中的数据,甚至是不同数据库或文件中的数据。
在下一章中,我们将进一步扩展这一工具集,着眼于 Tableau Prep Builder。Tableau Prep 为您提供了强大的功能和高度的复杂性,让您能够将来自各种来源的数据汇聚在一起,清洗数据,并以您喜欢的任何方式进行结构化!
第十四章:将混乱数据结构化以便与 Tableau 配合使用
到目前为止,本书中的大多数示例假设数据结构良好且相对干净。现实世界中的数据并不总是如此完美。也许它很混乱,或者没有良好的结构。它可能缺失值或有重复值,或者可能具有错误的详细程度。
如何处理这种类型的混乱数据?在上一章中,我们考虑了如何使用 Tableau 的数据模型来关联不同表中的数据。在下一章中,我们将考虑将 Tableau Prep Builder 作为清理和结构化数据的有效方法。本章中的许多信息将为你使用 Tableau Prep 提供必要的基础。
目前,让我们关注一些在 Tableau 中效果良好的基本数据结构,以及你可以使用的一些额外技术,将数据转换为这些结构。在本章中,我们将讨论 Tableau 的本地功能,但你学到的许多内容将在下一章的 Tableau Prep 中应用。到本章结束时,你将对什么构成良好的数据结构有一个坚实的基础。了解哪些数据结构与 Tableau 配合良好是解决某些问题的关键。
在本章中,我们将重点讨论一些有助于与 Tableau 配合良好的数据结构原则,以及如何解决常见数据问题的具体示例。本章将涵盖以下主题:
-
为 Tableau 结构化数据
-
四种基本的数据转换
-
数据问题的高级修复概述
我们将首先讨论哪些数据结构在 Tableau 中效果较好。
为 Tableau 结构化数据
我们已经看到,Tableau 可以连接几乎所有数据源。无论是内置的直接连接、开放数据库连接(ODBC),还是使用 Tableau 数据提取 API 生成提取,数据都没有限制。然而,某些结构使得数据在 Tableau 中更容易使用。
确保良好数据结构的两个关键要素是:
-
每个源数据连接的记录应处于有意义的详细程度
-
数据源中包含的每个度量值应与数据源的详细程度匹配,或者可能处于更高的详细程度,但绝不应处于较低的详细程度。
例如,假设你有一张记录每个班级的测试成绩的表格,每条记录代表一个学校中的一个教室。在记录中,你可能会有三个度量值:该教室的平均 GPA、班级中的学生人数以及学校的平均 GPA:
| 学校 | 教室 | 平均 GPA | 学生人数 | 学校的学生人数 |
|---|---|---|---|---|
| Pickaway 小学 | 4 年级 | 3.78 | 153 | 1,038 |
| Pickaway 小学 | 5 年级 | 3.73 | 227 | 1,038 |
| Pickaway 小学 | 6 年级 | 3.84 | 227 | 1,038 |
| McCord 小学 | 4 年级 | 3.82 | 94 | 915 |
| McCord 小学 | 5^(年级) | 3.77 | 89 | 915 |
| McCord 小学 | 6^(年级) | 3.84 | 122 | 915 |
前两个度量(平均 GPA和学生数量)与数据的单个记录处于相同的详细级别(每个班级的记录)。**学生数量(学校)**则处于更高的详细级别(每个学校)。只要你意识到这一点,你就可以进行仔细的分析。然而,如果你尝试将每个学生的 GPA 存储在班级记录中,就会遇到数据结构问题。如果数据结构尝试存储每个年级的所有学生 GPA(也许每个学生有一列,或者有一个字段包含一个以逗号分隔的学生成绩列表),那么我们需要做一些工作,以便让数据在 Tableau 中更易于使用。
理解源数据的详细级别(通常称为粒度)至关重要。每次连接到数据源时,你应该问并回答的第一个问题是:一条记录代表什么?例如,如果你将记录数量(或在 Tableau 2020.2 及更高版本中的表格(计数)字段)字段拖放到视图中并观察到 1,000 条记录,那么你应该能够完成这个陈述,我有 1,000 个 _____。它可以是 1,000 个学生、1,000 个考试成绩,或者 1,000 所学校。对数据粒度有良好的理解将帮助你避免做出错误的分析,并帮助你判断是否拥有进行分析所需的数据。
查找数据详细级别的快速方法是将记录数量(或者在 Tableau 2020.2 及更高版本中的表格(计数)字段)放到文本架上,然后尝试将不同的维度放到行架上。当所有行显示为 1,并且在左下角状态栏中显示的总数等于数据中的记录数量时,那么该维度(或维度组合)就唯一标识了一条记录,并定义了数据的最低详细级别。
理解数据粒度的整体原则后,让我们继续了解某些数据结构,这些结构可以让你在 Tableau 中无缝且高效地工作。有时,最好在源头使用Alteryx或 Tableau Prep Builder 等工具重构数据。然而,在某些情况下,重构源数据是不可能的或不可行的。例如,你可能没有数据库的写入权限,或者它可能是一个具有预定义结构的基于云的数据源。对于这种情况,我们将在 Tableau 中看一些选项。目前,让我们考虑哪些类型的数据结构与 Tableau 的兼容性较好。
Tableau 中的良好结构化数据
在上一节中提到的构建良好结构的两个关键点应该能得出一种数据结构,其中单一的度量包含在单一列中。你可能有多个不同的度量,但任何单一的度量几乎不应被分布在多个列中。通常,这种差异被描述为宽数据与高数据。
宽数据
宽数据通常不是 Tableau 中进行可视化分析的良好结构。
宽数据描述了一种结构,其中单行的度量分布在多个列中。这种数据通常更加易于阅读。宽数据往往会导致较少的行和更多的列。
下面是宽数据在表格中展示的人口数字示例:
| 国家名称 | 1960 | 1961 | 1962 | 1963 | 1964 |
|---|---|---|---|---|---|
| 阿富汗 | 8,774,440 | 8,953,544 | 9,141,783 | 9,339,507 | 9,547,131 |
| 澳大利亚 | 10,276,477 | 10,483,000 | 10,742,000 | 10,950,000 | 11,167,000 |
请注意,这个表格的详细层次是每个国家一行。然而,单一的度量(人口)并未存储在单一列中。这些数据是宽数据,因为它们有一个单一的度量(人口),但该度量被分布在多个列中(每个年份一个列)。这个宽数据表违反了构建良好结构的第二个关键点,因为度量的层次低于每条记录的层次(按国家和年份,而不是按国家)。
高数据
高数据通常是 Tableau 中进行可视化分析的良好结构。
高数据描述了一种结构,其中每个不同的度量在一行中包含在单一列中。高数据通常会导致更多的行和更少的列。
考虑以下表格,它代表了与之前相同的数据,但采用了高数据结构:
| 国家名称 | 年份 | 人口 |
|---|---|---|
| 阿富汗 | 1960 | 8,774,440 |
| 阿富汗 | 1961 | 8,953,544 |
| 阿富汗 | 1962 | 9,141,783 |
| 阿富汗 | 1963 | 9,339,507 |
| 阿富汗 | 1964 | 9,547,131 |
| 澳大利亚 | 1960 | 10,276,477 |
| 澳大利亚 | 1961 | 10,483,000 |
| 澳大利亚 | 1962 | 10,742,000 |
| 澳大利亚 | 1963 | 10,950,000 |
| 澳大利亚 | 1964 | 11,167,000 |
现在,我们有更多的行(每个国家每年一行)。单独的年份不再是分开的列,而人口测量也不再分布在这些列中。相反,一个单一的列给我们提供了年份的维度,另一个单一的列给我们提供了人口的度量。行数增加了,而列数减少了。现在,人口的度量与每一行的详细信息处于同一层次,因此在 Tableau 中进行可视化分析将变得更容易。
让我们看看这个差异在实践中的体现。
Tableau 中的宽数据与高数据
你可以在 Tableau 中轻松看到宽数据与高数据的区别。以下是宽数据表格在左侧数据窗口中的样子:
图 14.1:宽格式数据每年都有一个度量。
正如我们所期望的那样,Tableau 将表中的每一列视为一个独立的字段。数据的宽格式结构对我们不利。最终,我们为每一年都得到一个独立的度量。如果你想绘制每年的人口折线图,你可能会感到很困难。哪个维度表示日期?你可以使用哪个单一度量来表示人口?
这并不是说不能在 Tableau 中使用宽格式数据。例如,你可以使用度量名称/度量值将所有年份度量绘制在一个视图中,如下所示:
图 14.2:宽格式数据仍然可以使用,但方式复杂且有限。
你会注意到每个年份字段都被放置在度量值货架上。好消息是,即使是结构不良的数据,你也可以从中创建可视化图表。坏消息是,创建视图往往更加困难,并且某些高级功能可能无法使用。
基于宽格式数据结构,以下限制适用于图 14.2 中的视图:
-
因为 Tableau 没有日期维度或整数维度,所以无法使用预测功能。
-
因为 Tableau 在列中没有日期或连续字段,所以无法启用趋势线。
-
因为每个度量都是一个独立的字段,所以无法使用快速表计算(例如累计总和、百分比差异等)。
-
确定诸如跨年份平均人口等内容,将需要繁琐的自定义计算,而不是仅仅更改度量的聚合方式。
-
你没有日期轴(只有度量名称的系列标题),因此无法添加参考线。
相比之下,高格式数据在数据面板中的样子是这样的:
图 14.3:高格式数据具有一个年份维度和一个单独的人口度量。
这个数据源更容易处理。只有一个度量(人口)和一个年份维度来切片该度量。如果你想制作按年份划分的人口折线图,只需将人口和年份字段拖到列和行中。预测、趋势线、聚类、平均值、标准差等高级功能都能按预期工作。
你可以看到,使用仅三个活动字段创建的可视化结果,在 Tableau 中要容易得多。
图 14.4:使用高格式数据在 Tableau 中创建视图要容易得多。
接下来,我们将考虑几种其他适合与 Tableau 配合使用的数据结构。
星型模式(数据集市/数据仓库)
假设它们设计良好,星型模式数据模型与 Tableau 非常兼容,因为它们有明确的粒度、度量和维度定义。此外,如果它们实现得当,可以极为高效地查询。这使得在使用 Tableau 的实时连接时,能够提供非常顺畅的体验。
星型架构之所以得名,是因为它由一个单一的事实表和与之相关的维度表组成,从而形成了一个星形模式。事实表包含具有有意义粒度的度量,而维度表包含各种相关实体的属性。下图展示了一个简单的星型架构,其中包含一个事实表(医院就诊)和三个维度表(患者、主治医生、和出院详情):
图 14.5:一个简单的星型架构
事实表通过通常被称为替代键或外键的字段与相关的维度表连接,该外键引用单一的维度记录。事实表定义了粒度级别,并包含度量。在这种情况下,医院就诊的粒度是每次就诊一条记录。在这个简单的示例中,每次就诊都对应一个患者,患者见了一个主治医生并完成了出院。医院就诊表明确存储了就诊时长这一度量,并隐式定义了另一项度量就诊次数(即行数)。
数据建模的纯粹主义者会指出,日期值已被存储在事实表中(甚至一些维度表中)。他们会建议,应该有一个日期维度表,包含每个日期的详细属性,并且只在事实表中存储一个替代键(外键)。
日期维度非常有用。然而,Tableau 内置的日期层次结构和丰富的日期选项使得将日期存储在事实表中成为一种可行的选择。如果你需要日期的特定属性,而这些属性在 Tableau 中不可用(例如,哪些天是公司假期),或者有复杂的财政年度,或者需要支持遗留的 BI 报表工具,可以考虑使用日期维度。
设计良好的星型架构允许使用内连接,因为每个替代键都应引用单个维度记录。在维度值未知或不适用的情况下,会使用特殊的维度记录。例如,一个尚未完成的住院就诊(患者仍在医院)可能会引用出院详情表中的一个特殊记录,标记为尚未出院。
你已经在上一章中处理过类似的数据结构,在那里你体验了数据模型的逻辑层和物理层中表关系的差异。可以随时返回第十三章,理解 Tableau 数据模型、联接和合并,以复习相关概念。
实现良好的星型架构尤其适合用于实时连接,因为 Tableau 可以通过实现联接剔除来提高性能。联接剔除是 Tableau 通过将查询中的不必要联接发送到数据源引擎来消除不必要的联接。
例如,如果将医生姓名放置在行上,将访问时长的平均值放置在列上,以便获得每个医生的平均访问时长的条形图,那么可能不需要连接到治疗和病人表格。如果你使用的是简单的星型模式且只从中央事实表进行连接,并且在数据源中启用了参照完整性,或者允许 Tableau 假设参照完整性,那么 Tableau 会自动去除不必要的连接。对于物理层中连接的表格,从数据菜单中选择数据源连接,或使用数据源连接的上下文菜单,选择假设参照完整性。对于数据模型的逻辑层中的关系,使用每个适用关系的参照完整性性能选项。
在考虑了一些良好的结构示例后,让我们关注一些基本的转换,这些转换将帮助我们将结构不佳的数据集转换为结构良好的数据集,使得在 Tableau 中更容易操作。
四种基本的数据转换
在本节中,我们将为您提供一些基本转换的概述,这些转换可以从根本上改变数据的结构。我们将从概述开始,然后查看一些实际示例。
转换概述
在 Tableau(以及 Tableau Prep)中,有四种基本的数据转换。以下定义广泛适用于大多数数据库和数据转换工具,但也有一些特定于 Tableau 的细节和术语:
-
透视:这表示将列转换为行或将行转换为列。后者仅在 Tableau Prep 中可用。结果的数据集会更窄更高,列数较少,行数较多(列转行),或者会更宽更短,列数更多,行数较少(行转列)。
-
联合:这表示将一张数据表的行附加到另一张表格,匹配的列对齐在一起。结果数据结构是一个包含所有联合表格行的单一表格,以及原始表格之间匹配的列,未匹配的列则包含
NULL值。 -
连接:这表示对两个或更多表格进行逐行匹配,生成一个包含所有表格列的数据结构。行数取决于连接类型和找到的匹配数量。
-
聚合:这表示将表格汇总到更高层次的细节,以便每个用于分组的维度的唯一值集都有一行,同时包含其他聚合值(如总和、最小值、最大值或其他聚合)。
为了更全面地理解这些定义,我们将借助一些插图和实际示例。
透视(以及一些简单的数据清理)
World Population Data.xlsx 这份 Excel 工作簿,位于本书资源包中 Chapter 14 目录下,是许多 Excel 文档的典型代表。它的内容如下所示:
图 14.6:World Population Data Excel 文件
这类 Excel 文档通常更加易于阅读,但在 Tableau 中用于数据分析时往往包含多个问题。此文档中的问题包括:
-
多余的表头(标题、注释和格式)不属于数据部分
-
合并单元格
-
国家名称和代码合并在同一列中
-
可能不必要的列(指标名称 和 指标代码)
-
数据较宽,即每一年都有一列,且人口数据分布在这些列中,属于同一条记录
当我们最初连接到 Excel 文档时,连接界面将类似于 图 14.7,如下所示:
图 14.7:Tableau 数据源页面中的 World Population Data.xlsx
数据预览显示了因结构不良而导致的一些问题:
-
由于列头不在 Excel 的第一行,Tableau 默认为每一列赋予了 F1、F2 等名称
-
标题 World Population Data 和关于样本数据的注释被解读为 F1 列中的值
-
实际的列头被当作了一行数据(第三行)
幸运的是,这些问题可以在连接窗口中解决。首先,我们可以通过启用 Tableau 数据解析器 来修正许多多余的表头问题,该组件专门用于识别和解决 Excel 或 Google 表格文档中的常见结构问题。当你勾选 使用数据解析器 选项时,数据预览将呈现出更好的结果:
图 14.8:Tableau 数据解析器解决了 Excel(及类似)数据源中许多常见问题
点击勾选框下方的 查看结果... 链接,将导致 Tableau 生成一个新的 Excel 文档,并通过颜色编码来显示数据解析器如何解析该 Excel 文档。使用此功能可以验证 Tableau 是否正确解析了 Excel 文档,并保留了你预期的数据。
观察到多余的表头被去除,且列名得到了正确的显示。然而,仍然有一些附加的问题需要修正。
首先,如果我们认为 指标名称 和 指标代码 列对分析没有用处,我们可以将其隐藏。点击列头上的下拉箭头,会显示一个菜单选项。
选择 隐藏 将会从连接中移除该字段,并且防止其被存储到提取文件中:
图 14.9:你可以在数据源页面隐藏字段
其次,我们可以使用相同菜单中的选项将国家名称和代码列分成两列,以便分别处理名称和代码。在这种情况下,菜单中的拆分选项效果很好,Tableau 完美地拆分了数据,甚至去除了代码周围的括号。在拆分选项初次无法正常工作时,可以尝试自定义拆分...选项。我们还将使用重命名选项,将拆分后的字段国家名称和代码 - 拆分 1和国家名称和代码 - 拆分 2分别重命名为国家名称和国家代码。然后,我们将隐藏原始的国家名称和代码字段。
到此为止,大部分数据结构问题已经得到解决。然而,你会发现数据仍然是宽格式。我们已经看到了可能遇到的一些问题:
图 14.10:经过一些清理后,数据仍然呈现不理想的宽格式结构
我们的最后一步是透视年份列。这意味着我们将重塑数据,使得每个国家在每一年都有一行。通过点击1960列,向右滚动,按住Shift键并点击2013列,选择所有年份列。最后,在任何一个年份字段的下拉菜单中选择透视选项。
结果是用两个列(透视字段名称和透视字段值)代替了所有年份列。将这两个新列重命名为年份和人口。现在,数据集变得更加狭长,而不是宽短。
最后,注意到年份列的图标被 Tableau 识别为文本字段。点击该图标可以直接更改数据类型。在这种情况下,选择日期会得到NULL值,但将数据类型更改为**数字(整数)**则会得到适用于大多数情况的整数值:
图 14.11:你可以在数据源页面上更改字段的数据类型
另外,你也可以使用年份字段中第一个下拉菜单并选择创建计算字段...。这将允许你创建一个计算字段,命名为年份(日期),该字段将年份字符串解析为日期,代码如下:DATE(DATEPARSE("yyyy", [Year]))。此代码将解析字符串并将其转换为没有时间的简单日期。然后,你可以隐藏原始的年份字段。即使字段用于计算,只要它不用于视图,你也可以将其隐藏。这将使数据集变得非常干净。
最终清理后的透视数据集在 Tableau 中比原始数据集更容易操作:
图 14.12:清理和透视后的数据集
数据解释器、清理选项以及在 Tableau 中透视数据(列转行)的功能,使得处理许多数据集变得更加轻松。接下来,我们将了解合并。
合并
通常,你可能有多个独立的文件或表格,它们合在一起代表整个数据集。例如,你可能有一个过程,每月生成一个新的数据转储文件并保存到某个目录中。或者,你可能有一个 Excel 文件,其中包含每个部门的数据,每个部门的数据在不同的工作表中。
联合是将数据表按行拼接成一个单一表格的过程。比如,考虑以下三张数据表:
原创:
| 姓名 | 职业 | 银行账户余额 |
|---|---|---|
| Luke | 农民 | $2,000 |
| Leia | 公主 | $50,000 |
| Han | 走私犯 | -$20,000 |
前传:
| 姓名 | 职业 | 银行账户余额 |
|---|---|---|
| Watto | 垃圾商 | $9,000 |
| Darth Maul | 面部画家 | $10,000 |
| Jar Jar | 西斯领主 | -$100,000 |
续集:
| 姓名 | 职业 | 银行账户余额 |
|---|---|---|
| Rey | 拾荒者 | $600 |
| Poe | 飞行员 | $30,000 |
| Kylo | 失业 | $0 |
这些表的联合将生成一个包含每个单独表格行的单一表格:
| 姓名 | 职业 | 银行账户余额 |
|---|---|---|
| Luke | 农民 | $2,000 |
| Leia | 公主 | $50,000 |
| Han | 走私犯 | -$20,000 |
| Watto | 垃圾商 | $9,000 |
| Darth Maul | 面部画家 | $10,000 |
| Jar Jar | 西斯领主 | -$100,000 |
| Rey | 拾荒者 | $600 |
| Poe | 飞行员 | $30,000 |
| Kylo | 失业 | $0 |
Tableau 允许你将文件数据源中的表格联合起来,包括以下类型:
-
文本文件(
.csv、.txt和其他文本文件格式) -
Excel 文档中的工作表(标签)
-
Excel 表中的子表
-
多个 Excel 文档
-
Google 表格
-
关系型数据库表
使用数据解析器功能查找 Excel 或 Google 表格中的子表。它们将作为数据的附加表格出现在左侧边栏。
在 Tableau 中创建联合,请按以下步骤操作:
-
从菜单、工具栏或数据源屏幕中创建一个新的数据源,开始时选择你希望成为联合一部分的文件之一。然后,将任何其他文件拖动到画布上现有表格下方的拖动表格到联合区域,该区域位于逻辑层或物理层中(不过,技术上讲,联合存在于物理层中):
图 14.13:你可以通过将表格或文件直接拖放到画布上现有表格下方来创建联合
-
一旦你创建了联合,可以在设计器中的表格下拉菜单中配置联合选项。或者,你也可以将左侧边栏中的新建联合对象拖动到设计器中,替换现有表格。这将显示创建和配置联合的选项:
图 14.14:你可以使用这些选项编辑联合
**Specific (manual)**标签允许你将表格拖入或拖出联合操作。**Wildcard (automatic)**标签允许你指定文件名和工作表(对于 Excel 和 Google Sheets)中的通配符,这些通配符会根据匹配情况自动将文件和工作表包含在联合操作中。
如果你预见未来会添加更多文件,使用**Wildcard (automatic)**功能。例如,如果你有一个特定的目录,用于定期存储数据文件,通配符功能将确保你不必手动编辑连接。
-
一旦定义了联合操作,你可以使用结果数据源来可视化数据。此外,联合表可以与设计窗口中的其他表格进行连接,给你在数据处理上提供很大的灵活性。
当你创建联合操作时,Tableau 会在数据源中添加一个或多个新字段,帮助你识别数据来源的文件、工作表和表格。Path将包含文件路径(包括文件名),Sheet将包含工作表名称(对于 Excel 或 Google Sheets),而Table Name将包含子表或文本文件名。你可以利用这些字段帮助识别数据问题,并根据需要扩展数据集。
例如,如果你有一个按月命名的数据文件目录,文件名为2020-01.txt、2020-02.txt、2020-03.txt,依此类推,但文件中没有实际的日期字段,你可以使用如下代码通过计算字段获取日期:
DATEPARSE('yyyy-MM', [Table Name] )
在联合操作中,Tableau 会根据列名匹配不同表格之间的列。当表格或文件之间的列名不一致时会发生什么情况?如果你向数据库写查询,你可能会预期查询失败,因为列名通常需要完全匹配。然而,Tableau 允许你联合那些列名不匹配的文件或表格。
在一个文件/表格中存在但在其他文件/表格中不存在的列会作为联合表的一部分出现,但在没有该列的文件/表格中,值会显示为NULL。例如,如果某个文件包含一个名为Job的列,而不是Occupation,那么最终的联合表将包含一个名为Job的列和一个名为Occupation的列,在不存在该列的地方显示NULL值。你可以通过选择这些列并使用下拉菜单来合并不匹配的列。这将合并(保留每行数据中第一个非空值)为一个新的单列:
图 14.15:使用合并不匹配字段功能,合并因联合操作导致的字段名不匹配的列(该不匹配未包含在示例数据中)。
你不必合并不匹配的字段。有时,某些文件或表格中没有对应的匹配项,这对于你的分析可能是有用的。
联合(Unions)允许你将结构相对相同的多个文件或表格合并,并堆叠在一起,这样你就可以得到所有表格/文件中的记录。通过对旋转和联合的探索,我们已经涵盖了四种基本转换类型中的两种。接下来我们将继续演示如何使用连接来重构数据。
连接(Joins)
你会记得,我们之前在第十三章,理解 Tableau 数据模型、连接和混合中讨论了连接的概念和类型。虽然连接在将同一数据库中的表格或甚至不同数据源(不同系统和格式中的数据)合并时非常有用,但它们也可以用来解决其他数据问题,例如重塑数据,使其更容易在 Tableau 中实现你的目标。
你可以在第十四章的工作簿中通过以下示例进行操作,但服务器数据库数据源是通过文本文件(Patient Visits.txt)进行模拟的。
假设你有一个服务器数据库中的表格(例如 SQL Server 或 Oracle),该表格为每个患者包含一行数据,并将入院日期和出院日期作为单独的列:
| 患者 ID | 患者姓名 | 入院日期 | 出院日期 |
|---|---|---|---|
| 1 | David | 2018/12/1 | 2018/12/20 |
| 2 | Solomon | 2018/12/3 | 2018/12/7 |
| 3 | Asa | 2018/12/5 | 2018/12/22 |
| 4 | Jehoshaphat | 2018/12/5 | 2018/12/6 |
| 5 | Joash | 2018/12/9 | 2018/12/16 |
| 6 | Amaziah | 2018/12/10 | 2018/12/14 |
| 7 | Uzziah | 2018/12/12 | 2018/12/24 |
| 8 | Jotham | 2018/12/16 | 2018/12/29 |
| 9 | Hezekiah | 2018/12/18 | 2018/12/22 |
| 10 | Josiah | 2018/12/22 | 2018/12/23 |
尽管这种数据结构适用于某些分析类型,但如果你想要按日展示 12 月住院患者的数量,可能会觉得难以使用。
首先,你应该使用哪个日期字段作为轴?即使你将表格旋转,使得所有日期都集中在一个字段中,你也会发现数据中有缺失。稀疏数据,即某些值没有记录的数据,在一些现实世界的数据源中非常常见。具体来说,在这个例子中,你每个入院或出院日期都有一条记录,但中间的日期没有记录。
有时,可能可以选择在源头重构数据,但如果数据库被锁定,你可能无法做到这一点。你还可以利用 Tableau 填补数据空白的功能(数据密集化)来解决这个问题。然而,这种解决方案可能会很复杂,并且潜在地不稳定或难以维护。
另一种选择是使用连接来创建所有日期的行。在这种情况下,我们将利用跨数据库连接,将另一个数据源完全引入。你可能会迅速创建一个包含你想要查看的日期列表的 Excel 表格,如下所示:
图 14.16:一个仅包含日期综合列表的 Excel 文件
这个 Excel 文件包含每个日期的记录。我们的目标是将数据库表与 Excel 表中的数据进行交叉连接(将一个表的每一行与另一个表的每一行连接)。完成此操作后,您将为每个患者的每个日期生成一行记录。
将一个数据集中的每条记录与另一个数据集中的每条记录连接起来,产生的结果称为笛卡尔积。生成的数据集将包含N1 * N2行(其中N1是第一个数据集的行数,N2是第二个数据集的行数)。使用这种方法时要小心。它在较小的数据集上效果良好,但随着数据集的增大,笛卡尔积可能会变得非常庞大,以至于这个解决方案不再可行。
您通常会在各个表中找到可以用来连接数据的特定字段。然而,在这种情况下,我们没有定义连接的键。日期也没有给我们提供一种连接所有数据的方法,以便获得我们想要的结构。为了实现交叉连接,我们将使用连接计算。连接计算允许您编写一个专门用于连接的特殊计算字段。
在这种情况下,我们将为两个表选择**创建连接计算...**并为左右两侧都输入单一的硬编码值,也就是1:
图 14.17:正如我们所见,连接是在数据模型的物理层创建的
由于左侧每行的1与右侧每行的1匹配,我们得到了每一行与每一行的匹配——这就是一个真正的交叉连接。
作为替代方案,对于许多其他基于服务器的数据源,您可以使用自定义 SQL作为数据源。在数据源屏幕上,使用设计器中的患者访问表,您可以使用顶部菜单选择数据 | 转换为自定义 SQL来编辑 Tableau 用于源的 SQL 脚本。或者,您也可以在左侧边栏使用新建自定义 SQL对象编写自己的自定义 SQL。
在这个替代示例中的脚本已被修改,加入了1 AS Join来创建一个名为Join的字段,字段值为每行1(尽管如果您没有在脚本中这样做,您也可以简单地使用连接计算)。在自定义 SQL 中定义的字段也可以用于连接:
图 14.18:一个可以用来创建连接值的示例脚本
基于连接计算,我们新的交叉连接数据集包含了每个患者每个日期的记录,现在我们可以创建一个快速计算,查看某个患者是否应被计入特定日期的医院人口。名为医院中的患者的计算字段包含以下代码:
IF [Admit Date] <= [Date] AND [Discharge Date] >= [Date]
THEN 1
ELSE 0
END
这使我们能够轻松可视化患者流动,甚至可能基于平均值、趋势,甚至预测进行高级分析:
图 14.19:经过数据重构后的每日医院人口可视化图表,使得分析变得简单。
最终,对于长期解决方案,你可能希望考虑开发一个基于服务器的数据源,以提供所需分析的结构。然而,这里的连接允许我们在不等待长时间开发周期的情况下实现分析。
在考虑了枢轴、联合和连接的例子之后,让我们将焦点转向最终主要的转换类型之一:聚合。
聚合
请记住,良好数据结构的两个关键要素如下:
-
拥有有意义的细节级别
-
拥有与细节级别相匹配的度量,或者可能处于更高细节级别的度量
处于较低细节级别的度量往往导致数据变得很宽,可能会使某些分析变得困难,甚至不可能。而较高细节级别的度量,有时也可能是有用的。只要我们了解如何正确处理它们,就可以避免一些陷阱。
举例来说,考虑以下数据(该数据以Apartment Rent.xlsx文件形式包含在Chapter 14目录中),该数据为每个公寓每个月提供一个记录:
图 14.20:公寓租金数据,由于每个月的平方英尺(Square Feet)度量值被重复记录,结构较差。
这两个度量值实际上位于不同的细节级别:
-
**收取的租金(Rent Collected)**与数据的细节级别相匹配,其中记录了每月每个公寓的租金收入。
-
另一方面,平方英尺(Square Feet)每个月并不变化。相反,它处于较高的细节级别,仅限于公寓。
如果数据被包含在两个表格中,且细节级别正确,Tableau 的数据模型会使得这些数据非常容易处理。如果数据存储在关系型数据库中,我们可以使用自定义 SQL 语句创建几个具有正确细节级别的表格,那么我们可能会考虑这种方法。在下一章中,我们将讨论如何使用 Tableau Prep 来轻松解决这个问题。现在,请逐步分析这些细节,以便理解如何应对类似的结构问题(这样你会对 Tableau Prep 和 Tableau 数据模型能做的事情有深刻的认识!)。
细节级别的差异可以通过移除视图中的日期,并查看所有数据的公寓级别来观察:
图 14.21:展示了不同聚合方式在不同细节级别下是否正确的插图。
注意,SUM(收取的租金) 是完全合理的。你可以将每个月收取的租金加总起来,并得出每个公寓的有意义的结果。然而,你不能对**平方英尺(Square Feet)**进行求和并得到每个公寓的有意义结果。其他聚合方法,如平均值、最小值和最大值,确实能给出每个公寓的正确结果。
然而,假设您被要求计算每个公寓的租金与平方英尺的比率。您知道这将是一个聚合计算,因为您需要先将收取的租金求和再进行除法。但以下哪个是正确的计算方法呢?
-
SUM([收取租金])/SUM([平方英尺]) -
SUM([收取租金])/AVG([平方英尺]) -
SUM([收取租金])/MIN([平方英尺]) -
SUM([收取租金])/MAX([平方英尺])
第一个显然是错误的。我们已经看到每个月不应该添加平方英尺。只要确保公寓继续定义视图的详细级别,最后三个中的任何一个都是正确的。
然而,一旦我们查看具有不同详细级别的视图(例如,所有公寓的总计或多个公寓的每月总计),这些计算就不起作用了。要理解原因,请考虑当我们打开列总计(从菜单中选择分析 | 总计 | 显示列总计,或者从分析选项卡中拖放总计)时会发生什么:
图 14.22:没有一种聚合方式可以给我们提供总计
这里的问题在于总计行位于所有公寓(所有月份)的详细级别。实际上,我们真正想要的总计平方英尺是 900 + 750 = 1,650。然而,在这里,平方英尺的总和是所有公寓所有月份的平方英尺相加。平均值不适用。最小值找到 750 作为数据中所有公寓的最小度量。同样地,最大值选择 900 作为单个最大值。因此,任何提议的计算方法在不包括单个公寓的详细级别时都不会起作用。
您可以通过点击单个值并使用下拉菜单选择总计方式来调整子总计和总计的计算方式。或者,右键单击活动度量字段并选择使用总计。您可以从菜单中选择分析 | 总计 | 全部使用总计来一次性更改所有度量的总计方式。使用这种两遍总计技术可以在先前的视图中得到正确的结果,但不能普遍解决问题。例如,如果您想显示每月每平方英尺的价格,您将面临同样的问题。
幸运的是,Tableau 允许我们在视图中处理不同的详细级别。使用我们在第五章,利用详细级别计算中遇到的详细级别(LOD)计算,我们可以计算每个公寓的平方英尺。
在这里,我们将使用固定的 LOD 计算来保持公寓级别的详细信息不变。我们将创建一个名为每个公寓的平方英尺的计算字段,其代码如下:
{ INCLUDE [Apartment] : MIN([Square Feet]) }
大括号包围了一个 LOD 计算,关键字INCLUDE表示我们希望将公寓包含为计算的详细级别的一部分,即使它不包含在视图详细级别中。在前述代码中使用了MIN,但也可以使用MAX或AVG,因为所有这些都会得到每个公寓相同的结果。
正如你所看到的,计算返回了视图级别和总计级别的正确结果,在这里 Tableau 包括公寓以找到900(A的最小值)和750(B的最小值),然后将它们求和得到1,650:
图 14.23:LOD 计算为我们提供了所有详细级别上的正确结果
现在,我们可以在另一个计算中使用 LOD 计算字段来确定所需的结果。我们将创建一个名为每平方英尺收集的租金的计算字段,并使用以下代码:
SUM([Rent Collected])/SUM([Square Feet per Apartment])
当该字段添加到视图并格式化以显示小数时,最终结果是正确的:
图 14.24:LOD 表达式为我们提供了更复杂的基础,例如计算每个区域的租金
或者,我们可以使用FIXED级别的详细信息,而不是使用INCLUDE。这总是在遵循FIXED关键字后的维度级别上执行,而不管视图中定义的详细级别是什么。这将告诉 Tableau 始终计算每个公寓的最小平方英尺,而不管定义视图级别的维度是什么。虽然非常有用,请注意,FIXED LOD 计算是针对整个上下文(整个数据集或由上下文筛选器定义的子集)计算的。如果不理解这一点,使用它们可能会产生意想不到的结果。
目前,我们已经学会了如何处理一些聚合问题;然而,在下一章中,我们将探讨如何通过聚合来真正转换数据,使类似前面练习的问题变得更加容易。与此同时,让我们考虑一些数据问题的替代修复方法。
数据问题的高级修复概述
除了本章早些时候提到的技术之外,还有一些额外的方法来处理数据结构问题。本书不涵盖完全发展这些概念。然而,通过一些对这些方法的熟悉,你可以扩展自己解决挑战的能力:
-
自定义 SQL:它可以用于数据连接以解决一些数据问题。除了为跨数据库连接提供字段,如我们之前看到的,自定义 SQL 还可以用于根本重塑从源中检索的数据。自定义 SQL 并非适用于所有数据源,但适用于许多关系型数据库。考虑一个自定义 SQL 脚本,将我们之前在本章中提到的国家人口的宽表重构为高表:
SELECT [Country Name],[1960] AS Population, 1960 AS Year FROM Countries UNION ALL SELECT [Country Name],[1961] AS Population, 1961 AS Year FROM Countries UNION ALL SELECT [Country Name],[1962] AS Population, 1962 AS Year FROM Countries ... ...等等。虽然设置起来可能有些繁琐,但这将使得在 Tableau 中处理数据变得更加容易!然而,许多使用复杂自定义 SQL 的数据源出于性能考虑需要进行提取。
-
表格计算:表格计算可以用于解决许多数据挑战,从查找和消除重复记录到处理多个细节级别。由于表格计算可以在更高细节级别的分区内工作,你可以将多个表格计算与聚合计算结合使用,在一个视图中混合不同的细节级别。一个简单的例子是总百分比表格计算,它将视图中细节级别的聚合计算与更高细节级别的总计进行比较。
-
数据混合:数据混合可以用来解决许多数据结构问题。由于你可以定义所使用的连接字段,你可以控制混合的细节级别。
-
数据支架:数据支架扩展了数据混合的概念。在这种方法中,你构建一个由各种维度值组成的支架,作为主要数据源,然后将它们与一个或多个次要数据源进行混合。通过这种方式,你可以控制主要数据源的结构和粒度,同时仍然能够利用次要数据源中的数据。
-
数据模型:数据混合在你需要控制每个视图的关系级别时非常有用。如果关系定义得更好,数据模型将为你提供强大的能力,将不同细节级别的表格关联起来,并确保聚合计算能够正确执行。
总结
到目前为止,我们已经查看了大多数结构良好且易于使用的数据。在这一章中,我们考虑了什么构成良好的结构以及如何处理不良的数据结构。一个良好的结构由具有有意义细节级别的数据组成,并且具有与该细节级别相匹配的度量。当度量分布在多个列中时,我们得到的是宽数据而非高数据。
我们还花了一些时间理解了基本的转换类型:数据透视、联合、连接和聚合。理解这些对于解决数据结构问题至关重要。
你还获得了一些实际经验,应用各种技术来处理具有错误形状或度量级别不匹配的数据。Tableau 赋予我们处理一些结构性问题的能力和灵活性,但最好在源头上修复数据结构。
在下一章,我们将暂时停下来不看 Tableau Desktop,转而考虑 Tableau Prep,另一个解决复杂数据问题的替代工具!
第十五章:使用 Tableau Prep 整理数据
在前一章中,我们考虑了在 Tableau Desktop 中构建数据结构的几种选项。有关结构良好的数据的许多概念将在此处应用,因为我们现在将注意力转向 Tableau 的另一款产品:Tableau Prep。Tableau Prep 扩展了 Tableau 平台,提供了强大的数据清理和结构化选项,便于在 Tableau 中进行分析。正如 Tableau Desktop 为数据可视化和分析提供了一个直观、交互的体验,Tableau Prep 则为数据清理和整形提供了一个直观、交互的体验。
Tableau Prep 处于加速的每月发布周期中,虽然该平台不断增长和扩展,但其背后有一个基本的范式,为数据清理和整形奠定了基础。我们将在本章中覆盖大量内容,但我们的目标不是覆盖每一个可能的功能——实际上,我们不会。相反,我们将寻求理解那个基础范式和思考流程,这将帮助您在 Tableau Prep 中应对多种数据挑战。
在本章中,我们将通过几个实际的示例来探讨 Tableau Prep 的范式,理解基本的转换操作,并了解 Tableau Prep 的许多功能和特性。
本章将涵盖多个主题,包括以下内容:
-
准备好探索 Tableau Prep
-
了解 Tableau Prep Builder 界面
-
按照基本范式进行数据流动
-
连接数据
-
清理数据
-
Tableau Prep 中的计算和聚合
-
在 Tableau Prep 中过滤数据
-
为分析转化数据
-
-
自动化数据流的选项
在本章中,我们将广泛使用“Tableau Prep”这一术语,指代 Tableau 为数据准备开发的整个平台,有时也作为 Tableau Prep Builder 的简称,后者是用于连接数据、创建数据流和定义输出的客户端应用程序。在需要明确时,我们将使用这些具体名称:
-
Tableau Prep Builder:用于设计数据流、在本地运行它们并发布的客户端应用程序
-
Tableau Prep Conductor:这是 Tableau Server 的一个附加组件,允许对已发布的数据流进行调度和自动化处理。
让我们从了解如何开始使用 Tableau Prep 开始。
准备好开始探索 Tableau Prep
Tableau Prep Builder 适用于 Windows 和 Mac。如果您当前没有在机器上安装 Tableau Prep Builder,请花点时间从www.tableau.com/products/prep/download下载该应用程序。Tableau Prep Builder 的许可证包含在 Tableau Creator 许可中。如果您当前没有许可证,您可以免费试用该应用程序 14 天。请与您的 Tableau 代表联系,以确认许可和试用期。
本章中的示例使用的文件位于 \Learning Tableau\Chapter 15 目录下。具体说明将指导你何时以及如何使用这些文件。
一旦你下载并安装了 Tableau Prep Builder,你将能够启动应用程序。启动后,你将看到一个欢迎屏幕,我们将在下一节中详细介绍该界面。
理解 Tableau Prep Builder 界面
你会发现 Tableau Prep Builder 和 Tableau Desktop 的界面有很多相似之处。Tableau Prep Builder 的主屏幕看起来将类似于以下内容:
图 15.1:Tableau Prep Builder 欢迎屏幕,数字标注用以识别界面中的关键组件
以下组件在图 15.1中已被编号:
-
菜单包括打开文件、编辑和运行流、登录 Tableau Server 以及各种帮助功能的选项。还可以注意到左侧紧挨着文件菜单的连接面板。初始时它是折叠的,但随着你创建数据连接,它将包含一个数据连接列表。
-
屏幕顶部的两个大按钮为你提供了打开一个流的选项,用于打开一个现有的 Tableau Prep 流文件,或连接数据,用于通过初始数据连接开始一个新流。在下一节中我们会定义什么是流。现在,你可以把流看作是 Tableau Prep 相当于 Tableau Desktop 工作簿的东西。
-
最近的流显示了你最近保存的 Tableau Prep 数据流。你可以点击其中一个打开流并进行编辑或运行。右侧的切换按钮允许你在缩略图和列表视图之间切换。
-
示例流允许你打开一些预构建的示例。
-
发现面板为你提供了在学习 Tableau Prep 时的培训和资源选项。如果有新版本可用,通知升级也会出现在此。
一旦你打开或开始一个新流,主屏幕将被一个新界面替代,这将有助于流的设计和运行:
图 15.2:在设计流时,你会看到类似于此的界面。主要组件已按数字标注,具体描述如下:
这个界面由以下部分组成,这些部分在前面的截图中已编号:
-
流面板,你将在其中逻辑地构建数据流,步骤包括从清洗到计算,再到转换和重塑。选择任何一个单独的步骤,将在屏幕下半部分显示相应的界面。这个界面会有所不同,具体取决于你选择的步骤类型。
-
设置面板或更改面板列出了该步骤的设置,还包括该步骤中所做的所有更改,从计算、重命名或删除字段,到更改数据类型或分组值。你可以点击单个更改进行编辑,或者查看这些更改如何影响数据。
-
配置面板显示了所选步骤中每个字段的配置情况。你可以看到每个字段的类型和数值分布。点击某个字段将突出显示流程面板中的数据流,点击字段的一个或多个数值将突出显示与之相关的其他字段值。
-
数据网格显示了该步骤中存在的每条数据记录。选择变化网格中的某个变化,将显示根据该变化(包括该变化)后的数据。选择配置面板中某个字段的值,将筛选数据网格,仅显示包含该值的记录。例如,选择配置面板中
订单日期字段的第一行,将使数据网格仅显示由该条记录表示的数据。这允许你浏览数据,但在你执行某个会产生变化的操作之前,数据不会被更改。
你还会注意到工具栏,它允许你撤销或重做操作、刷新数据或运行流程。此外,还会根据所选步骤或字段的类型显示其他选项或控件。我们将在深入探讨 Tableau Prep 的工作原理及本章稍后的实际示例时,详细说明这些内容。
跟随基本理念的流动
Tableau Prep 的整体理念是通过一个流程,以实践和可视化的方式发现、清理和塑造数据。一个流程(有时也叫做数据流程)是应用于数据的逻辑步骤和变化的系列,从输入(或多个输入)到输出(或多个输出)。
下面是 Tableau Prep 中流程面板中的一个流程示例:
图 15.3:Tableau Prep 中的流程示例
每个流程的独立组件称为步骤,这些步骤通过连接线相互连接,表示数据从左到右的逻辑流动。连接线有时也被称为流程的连接器或分支。请注意,聚合步骤这里有一条从左边进入的线和三条向右延伸的分支。任何步骤都可以有多个输出分支,表示流程中该点的数据逻辑副本。
需要注意的一个重要点是,四种步骤类型代表了我们在第十四章《将凌乱数据结构化以便在 Tableau 中顺利工作》中讨论的四大数据转换。这些步骤类型分别是透视、联合、连接和聚合,它们与这些转换完全对应,而清理步骤则允许进行各种清理和计算操作。你可能希望回顾一下上一章中提到的基本数据转换。
在本章我们通过一个流程示例进行讲解时,将更详细地考察每种类型的步骤。现在,先考虑一下 Tableau Prep 中主要步骤的初步定义:
-
输入:输入步骤通过数据源(例如文件、表格、视图或自定义 SQL)开始流程。它提供了定义文件分隔符、多个表或文件的联合以及如何抽样数据量(对于较大的记录集)的选项。
-
清理步骤:清理步骤允许你对数据执行各种功能,包括计算、过滤、调整数据类型、移除和合并字段、分组和清理等。
-
聚合步骤:聚合步骤允许你在指定的详细级别上聚合值(例如,获取
MIN、MAX、SUM、AVG等)。 -
连接步骤:连接步骤允许你将流程中的两个分支汇聚在一起,并基于你选择的字段以及连接类型逐行匹配数据。
-
联合步骤:联合步骤允许你将两个或更多代表数据集的分支合并在一起。你将有选项合并或移除不匹配的字段。
这个示例中的联合步骤和连接步骤都有一个错误图标,表示流程中某些配置不正确。将鼠标悬停在图标上会显示错误的工具提示描述。在这种情况下,错误是由于只有一个输入连接,而联合和连接都需要至少两个输入。通常,选择带有错误图标的步骤可能会在更改窗格或配置步骤的其他地方显示错误的详细信息。
-
透视步骤:透视步骤允许你将数据列转换为行,或将数据行转换为列。你将有选项选择透视类型以及字段本身。有时也会使用术语转置来描述此操作。
-
输出:输出步骤定义了清理和转换后的数据的最终目的地。这可以是文本文件(
.csv)、提取文件(.hyper或.tde),或发布到 Tableau Server 的提取数据源。虽然输出到数据库的功能已经宣布,但在撰写时尚不可用。你将有选项选择输出类型、路径和文件名,或选择 Tableau Server 和项目。
右键单击步骤或连接器会显示各种选项。你也可以将步骤拖放到其他步骤上,以显示连接或联合步骤的选项。如果你想替换流程的早期部分并交换输入步骤,可以右键单击连接器并选择删除,然后将新的输入步骤拖动到流程中所需的下一个步骤上,以将其添加为新的输入。
除了使用术语流程来指代定义数据逻辑流程和转换的步骤与连接,我们还会使用流程一词来指代 Tableau Prep 用于存储步骤定义和流程更改的文件。Tableau Prep 流程文件的扩展名为 .tfl(未打包流程)或 .tflx(打包流程)。
Tableau Prep 的范式远远超出了任何单一步骤的功能和特点。当你构建和修改数据流时,你会立即收到反馈,这样你就能看到每个步骤和变化的影响。这使得你可以相对轻松(而且有趣!)地逐步发现数据,并进行必要的更改。
当你构建数据流、添加步骤、做出更改并与数据互动时,你处于 设计模式。Tableau Prep 结合了 Hyper 引擎的缓存和直接查询数据库的方式,在你做出更改时提供近乎即时的反馈。当你运行数据流时,你使用的是 批处理模式 或 执行模式。Tableau Prep 将运行优化过的查询和操作,这些查询与设计模式下运行的查询可能略有不同。
在本章的其余部分,我们将通过一个示例来帮助讨论 Tableau Prep 的范式,并突出一些重要的功能和注意事项。这个示例将自然展开,使我们能够看到 Tableau Prep 如何提供令人难以置信的灵活性,以应对数据挑战并随着你发现数据的新方面进行更改。
我们将把你置于一个分析师的角色,任务是分析员工的航空旅行。这将包括票价、航空公司,甚至对旅行本身进行一些地理空间分析。数据需要从多个系统中整合,并且需要清洗和整理才能进行分析。
为了跟随操作,打开 Tableau Prep Builder,它会直接显示在主屏幕(本章没有启动数据流)。示例数据位于 Chapter 15 目录中,如果你想检查你的工作,可以找到 Complete 流程。Complete (clean) 流程包含了一个自我记录数据流的示例——它不会精确匹配截图。
当你打开 Complete 流程文件时,你可能会收到错误和警告,提示输入路径和输出路径无效。这是预期中的情况,因为你的计算机几乎肯定会有不同的驱动器和目录结构,和准备示例时所用的系统不同。当你与他人共享数据流文件时,也会遇到这种情况。要解决这些问题,只需在左侧的 连接 窗格(在 图 15.4 中展开)中处理连接,重新连接文件并将输出步骤设置为适合你计算机的目录。
我们将从连接数据开始!
连接数据
在 Tableau Prep 中连接数据非常类似于在 Tableau Desktop 中连接数据。从主屏幕上,你可以点击“连接到数据”或在展开的“连接”窗格中点击 + 按钮:
图 15.4:你可以通过点击 + 按钮或“连接到数据”按钮来创建新的数据连接。
无论哪种 UI 元素都会弹出一个数据源类型的选择列表。
与 Tableau Desktop 类似,对于基于文件的数据源,你可以将文件从Windows 资源管理器或Finder拖动到 Tableau Prep 窗口,以快速创建连接。
Tableau Prep 支持多种文件类型和数据库,且支持的类型仍在不断增加。你会识别出许多与 Tableau Desktop 相同的连接类型。不过,在撰写本书时,Tableau Prep 尚不支持 Tableau Desktop 中所有可用的连接类型。
你可以创建任意数量的连接,连接窗格会分别列出每个连接,并显示相关的文件、表、视图、存储过程或适用于该数据源的其他选项。你可以在流中使用任何组合的数据源。
现在,我们从以下步骤开始示例:
-
从图 15.4 所示的窗口开始,点击连接数据。
-
从出现的扩展连接列表中,选择Microsoft Excel。
-
你将看到一个名为员工航班的主表和一个名为员工航班表 1的子表。将员工航班表拖动到流画布中,将创建一个输入步骤,并显示数据预览和其他选项。输入预览窗格最初会像这样:
图 15.5:输入预览允许你选择要包含在流中的输入字段,重命名字段,并更改数据类型。
输入步骤显示字段网格和这些字段的选项。你会注意到,员工航班表中的许多字段被命名为
F2、F3、F4,依此类推。这是由于 Excel 文件的格式问题,其中包含合并单元格和汇总子表。请继续按照以下步骤进行操作: -
在连接窗格中选中使用数据解释器选项,Tableau Prep 将正确解析文件,如下所示:
图 15.6:数据解释器解析文件,以修复常见问题,例如合并单元格、空标题和小计行。
当你选择一个输入步骤时,Tableau Prep 会显示数据字段的网格。你可以使用该网格取消勾选不想包含的字段,点击相关符号编辑数据的类型(例如,将字符串改为日期),并通过双击字段名值来编辑字段名称。
如果 Tableau Prep Builder 检测到数据源包含大量记录,它可能会启用数据采样。数据采样使用较小的记录子集来提供快速反馈和设计模式下的分析。然而,在你以批处理模式运行整个流程时,它将使用完整的数据集。你可以通过点击输入窗格中的数据样本来控制数据采样选项。虽然你可以为源设置样本大小,但后续步骤(如联接)如果生成大量记录,可能会启用无法禁用的采样。如果在流程中发生数据采样,你会收到数据采样的指示。
-
现在,我们将继续探索数据并在过程中解决一些问题。点击鼠标悬停在员工航班输入步骤上时出现的**+按钮。这将允许你通过添加额外的步骤类型来扩展流程。在这种情况下,我们将添加一个清理步骤**。这将通过添加名为Clean 1的清理步骤来扩展流程:
图 15.7:添加一个步骤扩展了流程。在这里,添加一个清理步骤会添加 Clean 1
-
选择Clean 1步骤后,花一点时间使用配置文件窗格来探索数据。观察在配置文件窗格中选择字段的单个值时,如何突出显示与其他字段相关的部分值。这能让你深入了解数据,比如根据
机票类型看到不同的价格区间:图 15.8:在配置文件窗格中选择字段值时,会突出显示与所选值相关的值(以及这些值的比例)
在配置文件窗格中突出显示字段间的条形图段,通常是通过选择字段值实现的,这叫做“刷选”。你还可以通过配置文件窗格顶部的工具栏或右键点击字段值来对选中的值采取操作。这些操作包括过滤、编辑值或用 NULL 替换。然而,在对数据进行任何更改或清理之前,让我们连接一些额外的数据。
事实证明,大部分航空公司机票预订数据存储在一个由 Excel 文件表示的数据库中,但另一家航空公司的预订数据存储在定期添加到目录中的文件中。这些文件位于 \Learning Tableau\Chapter 15\ 目录中。文件名遵循 Southwest YYYY.csv 的命名规范(其中 YYYY 代表 年份)。
我们将连接所有现有文件,并确保为未来可能添加的文件做好准备:
-
点击连接窗格中的**+图标,添加一个新的文本文件**连接。
-
导航到
\Learning Tableau\Chapter 15\目录并选择任何一个Southwest YYYY.csv文件来开始连接。查看输入设置,你应该会看到 Tableau Prep 正确识别了字段分隔符、字段名称和类型:图 15.9:一个文本文件包含了头部、字段分隔符、文本限定符、字符集等选项。还可以注意到诸如“多个文件”和“数据示例”等标签,提供了其他文本输入的选项。
-
在输入面板中,选择多个文件标签,并从单一表格切换到通配符联合。将匹配模式设置为
Southwest*,然后点击应用。这告诉 Tableau Prep 将目录中所有以Southwest开头的文本文件联合起来:
图 15.10:使用匹配模式告诉 Tableau Prep 应该将哪些文件联合在一起。这样,当Southwest 2020.txt和未来的文件被放入目录时,它们将自动被包括在内。
- 使用流程面板中西南输入步骤上的**+图标来添加一个新的清理步骤。这个步骤默认命名为清理 2**。再次检查数据,但在将两个数据源在流程中结合之前,不要采取任何操作。你可能会注意到在清理 2步骤中有一个名为文件路径的新字段,表示联合中每条记录对应的文件。
在定义了输入步骤之后,接下来我们考虑如何清理一些数据,为分析做好准备。
数据清理
构建流程的过程是相当迭代的,你会经常发现有关数据的新信息,这有助于你清理和转换数据。为了方便参考,我们将此示例分成几个部分,但不要因此忽视构建流程本应是一种思维流的想法。这个示例旨在做到无缝衔接!
在本节中,我们将探讨一些数据预处理的可能性,包括合并和分组。让我们从查看如何在流程中联合各个分支开始。
联合、合并不匹配的字段并删除不必要的字段
我们知道我们想要将所有航空公司的预订数据合并在一起,因此我们将在流程中联合这两个路径:
-
将清理 2步骤拖到清理 1步骤上,并将其放到出现的联合框中。这将创建一个新的联合步骤,输入连接来自两个清理步骤:
图 15.11:在流程中将一个步骤拖到另一个步骤上,显示出将数据集合并到流程中的选项。例如,这里有创建联合或连接的选项。
-
当选择联合步骤时,出现的联合面板会显示不匹配的字段,指示相关输入,并提供删除或合并字段的选项。例如,
Fare、Type和Ticket Type在 Excel 文件和文本文件中的命名不同,但实际上代表的是相同的数据。按住Ctrl键并选择两个字段,然后从面板顶部的工具栏或右键菜单中选择合并字段:图 15.12:当你选择单一字段时,Tableau Prep 会高亮显示可能为相同数据的字段。选择这两个字段后会显示“合并字段”选项。
-
同样,合并
Row``ID和Row_ID。 -
文件路径仅适用于
Southwest文件,这些文件在输入步骤中被联合在一起。虽然这个自动生成的字段在某些情况下非常有用,但在这个例子中并没有为数据增加任何价值。选择该字段,然后点击省略号菜单按钮,选择移除字段。 -
类似地,
Travel``Insurance?和Passenger``ID仅适用于一个输入字段,在我们的分析中用处不大。也请移除这些字段。 -
唯一剩下的字段
Airline是有用的。暂时保留它,然后点击流面板中Union 1步骤的**+图标,选择清理步骤**来扩展流程。此时,您的流程应该如下所示:图 15.13:你的流程应该类似于这个。你可能会注意到步骤的确切位置或颜色有所不同(你可以通过右键点击步骤来更改步骤的颜色)。
在流中的Union 1步骤上方有一个图标,表示在此步骤内做出的更改。在这种情况下,更改是移除了几个字段。每个有更改的步骤都会有类似的图标,鼠标悬停时会显示工具提示的详细信息,还可以与更改进行交互。你可以通过点击步骤并打开更改面板,查看更改的完整列表,编辑它们、重新排序或移除它们。根据步骤类型,可以通过展开步骤或选择“更改”选项卡来查看此内容。
接下来,我们将继续构建流程并考虑一些分组与清理的选项。
分组与清理
现在,我们将花些时间清理来自两个输入源的数据。选中Clean 3步骤后,使用配置面板检查数据并继续我们的流程。前两个字段显示了一些需要处理的问题:
图 15.14:所有Airline字段中的空值来自于 Southwest 文件。幸运的是,在这个案例中,数据源明确指示了航空公司。
Table``Names字段是由 Tableau Prep 在Union 1步骤中生成的,用以指示记录的来源。Airline字段仅来自 Excel 文件(你可以通过在配置面板中选择它并观察流面板中该字段的高亮路径来确认这一点)。点击Airline字段的空值,并观察数据刷选:这是证明Airline中的空值全部来自 Southwest 文件的证据,因为这些文件没有包含用来指示航空公司的字段。我们将处理这些空值并进行一些额外的清理:
-
双击null值,然后输入
Southwest,将NULL替换为你知道代表正确航空公司的值。Tableau Prep 将通过一个回形针图标指示发生了分组和替换操作。 -
我们将进行额外的分组,以清理American的变体。使用
Airline字段上的选项按钮,选择分组值 | 按发音分组:图 15.15:字段上的省略号按钮将显示大量选项,从清理到过滤,再到分组和创建计算。
几乎所有变体都被分组到American值中。只有AA还剩下。
-
在弹出的按发音分组值窗格中,选择American Airlines组,并通过选中右侧列表中的AA手动添加它:
图 15.16:当按发音分组时,你会注意到一个滑块,允许你控制分组的灵敏度。你也可以通过选择一个字段手动调整分组。
-
在按发音分组值窗格中点击完成。
-
接下来,选择不再需要的
Table``Names字段。使用工具栏选项、字段右键菜单或选项按钮,选择删除字段。 -
在资料窗格中的一些字段上,有一个建议图标(类似灯泡的图标)位于右上角。点击
Passenger``Email字段上的此图标,然后点击应用建议,为其分配Email数据角色:图 15.17:当 Tableau Prep 有清理字段的建议时,建议将会显示。
数据角色允许你根据预期的模式或值域快速识别有效或无效的值。一旦分配了数据角色,你可能会收到额外的建议,提示你过滤或替换无效值。
应用建议后,你会看到资料窗格中标记无效值的指示。当你继续跟随示例时,我们将考虑一些快速处理无效值的选项。
-
再次点击
Passenger``Email字段上的建议按钮。你将看到呈现出两个新的选项。应用该选项以分组并将无效值替换为null:图 15.18:在这里,Tableau Prep 建议要么过滤掉具有无效值的记录,要么将无效值替换为 null。在这种情况下,我们不想过滤掉整个记录,但无效值本身没有意义,最好用 null 来表示。
-
除了
Fare``Type(或者可能是Ticket``Type,具体取决于之前合并字段时保留了哪个名称)之外,大部分剩余字段看起来都没问题。这个字段包含了1st Class和First Class的值。按住Ctrl键点击这两个值,然后将它们与First Class值一起分组。这里有两种分组值的界面选项:
图 15.19:选择两个或多个值后,可以通过工具栏选项或右键菜单将它们分组
-
到目前为止,我们已经有了一个干净的数据集,包含了所有的主要数据。事实上,我们已经可以进行很多分析了。不如现在先预览一下数据。右键点击Clean 3步骤并选择在 Tableau Desktop 中预览:
图 15.20:你可以通过右键菜单选项在 Tableau Desktop 中预览任何步骤表示的数据
将建立一个新的数据连接,并在 Tableau Desktop 中打开。你可以预览流中任何步骤的数据。花些时间在 Tableau Desktop 中探索数据,然后返回 Tableau Prep。现在,我们将把注意力转向通过一些计算、补充数据和小范围重构来扩展数据集。
Tableau Prep 中的计算和聚合
让我们看看如何在 Tableau Prep 中创建计算和聚合选项。
行级计算
Tableau Prep 中的计算语法几乎与 Tableau Desktop 相同。不过,你会注意到,只有行级和FIXED详细级别的函数是可用的。这是因为 Tableau Prep 中的所有计算都将应用于行级别。聚合操作则通过聚合****步骤来执行,我们稍后会讨论这一点。
计算和聚合可以大大扩展我们的分析能力。在当前的示例中,我们有机会分析从购票到实际旅行之间的时间间隔。我们还可能希望为每条记录标注一个乘客的整体旅行频率指标。接下来,跟随以下步骤深入了解这些计算:
-
我们将从一个计算开始,确定从购票到旅行的时间间隔。选择Clean 3步骤,然后点击创建计算字段。将计算命名为从购买到旅行的天数,并输入
DATEDIFF('day', [Purchase Date], [Travel Date])。 -
检查个人资料面板中的结果。新字段应该如下所示:
图 15.21:计算字段显示在个人资料面板中
这里的默认视图(与许多数值字段的情况一样)是一个汇总的分箱直方图。你可以通过选择字段右上角的省略号按钮并切换到详细信息视图,查看字段的每一个值:
图 15.22:数值和日期字段可以在摘要或详细信息中查看。
默认汇总直方图显示的数据形态接近我们预期的,大多数人会在靠近(但不是立即)出行日期时购买票。提前购买可能会有更好的优惠,所以识别这一模式(并在 Tableau Desktop 中进一步探索)对于此类分析至关重要。
细节级别计算
我们可能希望进行其他几种类型的分析。让我们考虑如何根据乘客的旅行频率创建乘客细分。
我们将使用 FIXED 细节级别(LOD)表达式来完成这一任务。我们可以从头开始创建计算,匹配我们在 Tableau Desktop 中学习的语法,像这样编写计算:
{FIXED [Person] : COUNTD([Row_ID])}
上述计算会对每个人进行不同的行计数。考虑到每一行代表一次旅行,我们也可以使用代码 {FIXED [Person] : SUM(1)},根据具体的数据源,这可能会具有更好的性能。
然而,在这个例子中,我们将利用界面来可视化地创建计算:
-
点击
Person字段上的省略号按钮,并选择创建计算字段 | 固定 LOD:图 15.23:要创建固定 LOD 计算,请使用菜单选择“创建计算字段” | “固定 LOD”。
还可以注意到创建 自定义计算(编写代码)和 排名(计算选定字段的排名)的选项。
-
这将弹出一个 固定 LOD 面板,允许我们配置 LOD 表达式。按组计算字段已设置为
Person(因为我们从该字段开始计算),但我们需要配置 按...计算 以执行行的不同计数,并将字段重命名为Trips``per``Person,如图所示:图 15.24:固定 LOD 面板允许您可视化地配置 LOD 表达式,并即时获得关于结果的可视化反馈。
-
配置完 固定 LOD 后,点击完成。
-
我们将使用
Trips per Person字段来创建客户细分。我们将通过另一个计算字段来实现此目的,因此点击**创建计算字段...**以打开代码编辑器。命名该字段为Frequency Segment,并输入以下代码:IF [Trips per Person] <= 2 THEN "Rarely" ELSEIF [Trips per Person] <= 5 THEN "Occasionally" ELSE "Frequently" END
该代码使用 Trips per Person 字段在 If Then Else 结构中创建三个细分。您可以在预览面板中直观地看到字段之间的对应关系:
图 15.25:您可以轻松地通过概况面板可视化计算与其他字段之间的关系。
Frequency``Segment 字段可用于完成各种有用的分析。例如,您可能想了解频繁旅行者是否通常能获得更好的票价。
我们已经了解了行级别和 FIXED LOD 计算,并注意到了排名选项。现在让我们将注意力转向聚合。
聚合
在 Tableau Prep 中,聚合是通过聚合步骤实现的。我们将继续我们的流程,假设我们希望更好地理解我们的旅行频率分段:
- 点击Clean 3上的**+符号并添加一个聚合步骤。默认情况下,新步骤将被命名为聚合 1**:
图 15.26:使用 + 符号将聚合步骤添加到流程中
-
双击新步骤下的文本聚合 1,这样你就可以编辑名称。将名称从聚合 1更改为频率 分段。
给步骤起有意义的名字,以便自我记录流程。这将大大帮助你和其他人在将来返回编辑流程时。此外,当你编辑步骤的名称时,添加描述的文本会出现在名称下方,如图 15.27所示。
图 15.27:在编辑步骤名称时,你还可以添加更详细的描述,帮助记录步骤的目的。
选择聚合步骤会显示一个面板,提供在流程中对字段进行分组和聚合的选项:
图 15.28:使用 + 符号将聚合步骤添加到流程中
你可以将左侧的字段拖放到分组字段或聚合字段部分,并且你可以通过点击聚合文本(图 15.28中的箭头指示的示例:
SUM位于每人旅行旁,或者AVG位于票价上方)并从下拉菜单中选择不同的聚合类型来更改聚合方式。在图 15.28中,注意我们将频率 分段添加到分组中,并将
票价字段作为AVG添加到聚合字段中。还注意到,行数**(聚合)**出现在左侧字段列表的底部。这是一个在聚合步骤中可用的特殊字段。 -
通过点击当你悬停在频率分段聚合步骤上时出现的**+图标,添加一个输出**步骤来结束本示例:
图 15.29 使用 + 符号将输出步骤添加到流程中
-
当你选择输出步骤时,输出面板会显示保存输出的选项,并预览输出将是什么样子。在这种情况下,我们已配置输出将保存到名为频率分段的**逗号分隔值(.csv)**文件中:
图 15.30:此输出将包含确切的三行数据
- 输出面板还提供了设置输出类型、执行数据完全刷新或将数据追加到现有数据中以及运行流程的选项。
在接下来的几个部分,我们将扩展我们的流程,额外输出详细数据。详细数据以及聚合数据的输出文件为我们提供了一些很好的选项,可以在 Tableau Desktop 中利用 Tableau 的数据模型进行复杂分析。
让我们继续思考如何在 Tableau Prep 中过滤数据。
在 Tableau Prep 中过滤数据
在 Tableau Prep 中有几种方法可以过滤数据:
-
过滤输入
-
流程中的过滤
过滤输入可以提高效率,因为发送到数据源的查询将返回更少的记录。要过滤输入,选择输入步骤,然后点击输入面板上的**过滤值...**按钮:
图 15.31:**过滤值...**选项允许你在输入步骤中过滤值。这可能会提高在大数据集或关系型数据库上的性能。
弹出的添加过滤器对话框允许你写出一个Boolean(布尔值,真/假)结果的计算式。只有为真值的记录将被保留。
过滤操作也可以在流程中的清洗步骤内进行。有多种方式可以应用过滤器:
-
选择一个或多个给定字段的值,然后使用仅保留或排除选项。
-
使用字段上的选项按钮,根据字段类型显示多个过滤选项。例如,日期可以通过计算...、日期范围、相对日期或空值来过滤:
图 15.32:字段的过滤选项包括按计算、日期范围、相对日期进行过滤,以及保留或排除空值
-
选择一个字段,然后从工具栏中选择过滤值。与输入面板中的过滤器工作方式类似,你将被提示编写代码,以返回你希望保留的记录的真值。例如,如果你希望保留 2016 年 1 月 1 日之后的旅行记录,可以编写如下代码:
[Travel Date] > MAKEDATE(2016, 1, 1)
虽然在我们示例中的数据集无需过滤,但你可能希望尝试不同的过滤技巧。
到此为止,你的流程应该像这样:
图 15.33:你的流程应该看起来像这样(步骤的具体位置和颜色可能有所不同)
让我们通过一些最终的转换来结束 Tableau Prep 流程,使数据在 Tableau 中更容易使用。
转换数据以进行分析
让我们在流程中创建一个新的分支,再次处理详细数据。点击清洗 3步骤并检查预览面板。特别是,考虑一下Route字段:
图 15.34:Route 字段使用机场代码表示起点和终点,用破折号分隔
Tableau Desktop(和 Server)内置了机场代码的地理编码功能。但为了实现我们的具体分析目标(并为 Tableau Desktop 中的其他地理空间功能开辟新的可能性),我们将通过自己的地理编码来补充数据。我们还需要考虑数据的形态。将起点和终点拆分成单独的字段最为有用,如果我们想要将它们在视觉上连接,我们还需要考虑将它们拆分成单独的行(一个用于起点,另一个用于终点)。
有很多种可视化数据的方法。例如,我们可以将起点和终点保留在同一行,并使用双轴图。如果我们想通过线条将起点和终点连接起来,我们可以将它们保留在同一数据行中,并使用 Tableau 的 MAKELINE() 函数。这里你将跟随的示例将指导你将数据拆分成单独的行。
如果你在跟随本教程,以下是我们将采取的步骤:
-
使用当你悬停在 Clean 3 步骤时出现的 + 按钮。点击该按钮添加一个新的清理步骤,自动命名为 Clean 4:
图 15.35:向已有输出的步骤中添加内容会在流程中添加一个新的分支
-
在 Clean 4 步骤中,点击
Route字段的省略号按钮,选择 拆分值 | 自动拆分:图 15.36:拆分值允许你将分隔的字符串拆分成单独的字段。自动拆分会尝试确定分隔符,而自定义拆分...则提供更多选项和灵活性
现在你会看到两个新的字段已添加到该步骤:
图 15.37:拆分结果将在流程中生成新的字段
-
Route - Split 1 是起点,Route - Split 2 是终点。在配置面板中双击字段名(或使用省略号按钮的选项)将字段重命名为
Origin和Destination。 -
在
Chapter 15目录下找到US Airports.hyper文件。该文件包含每个AirportCode,以及AirportName、Latitude和Longitude:图 15.38:超提取文件包含了我们需要补充流程的地理空间数据
-
在 Tableau Prep 中连接此文件。你可以选择将文件拖放到 Tableau Prep 画布上,或使用界面上的 添加连接 按钮。Tableau 会自动插入一个名为 Extract (Extract.Extract) 的输入步骤。你可以自由地将输入步骤的名称更改为 机场代码:
图 15.39:机场代码文件的输入面板
-
我们希望将机场代码加入我们的流程中,以便查找
纬度和经度,但在执行之前,我们需要考虑到Clean 4中的起点和终点目前都在同一行数据中。一种选择是透视数据。使用Clean 4步骤中的**+按钮添加一个透视**步骤:图 15.40:从 Clean 4 添加透视步骤
-
透视窗格提供了将行转换为列或将列转换为行的选项。我们将保留默认选项列转行。将
起点和终点字段拖入窗格中的Pivot1 值区域:图 15.41:Pivot1 名称保持原始列名的值,而 Pivot1 值则包含来自起点和终点的实际值
-
作为快捷方式,代替步骤 6和步骤 7,你可以在Clean 4步骤中选择
起点和终点字段,并选择透视列转行:
图 15.42:透视列转行的快捷方式
按照以下步骤继续操作:
-
双击Pivot1 值的文本并将字段重命名为
机场代码。该字段将包含起点和终点记录的所有机场代码。 -
双击Pivot1 名称的文本并将字段重命名为
路线点。该字段将标记每条记录为起点或终点。此时,我们拥有一个数据集,其中包含每个旅行终点(无论是起点还是终点)的单条记录。
注意,透视操作导致了重复数据。曾经是一行(起点和终点合并在一起)的数据现在变成了两行。记录数已翻倍,因此我们不能再通过记录数来确定旅行的数量。我们也不能对票价使用
SUM,因为它会重复计算票价。我们需要使用MIN/MAX/AVG或某种详细级别的表达式或筛选器,以便仅查看起点或终点。虽然许多转换可以帮助我们实现特定目标,但我们必须意识到它们可能引入其他复杂情况。我们当前在主流程中所拥有的唯一位置信息是机场代码。然而,我们已经与
Airports.hyper建立了连接,并将输入步骤重命名为机场代码。 -
定位到机场代码输入步骤,并将其拖到透视步骤上。将其放置到连接区域:
图 15.43:将机场代码拖到透视步骤的连接区域
在将机场代码输入步骤拖到连接区域后,将创建一个新的连接步骤,命名为连接 1。稍作停顿,查看连接窗格:
图 15.44:连接窗格提供了大量信息和选项,用于配置连接和理解结果。界面中的重要部分已编号,并附有说明
你会在图 15.44中注意到以下特征:
-
应用的连接子句:在此,您可以选择向连接子句添加条件,决定哪些字段应作为关键字来定义连接。您可以根据需要添加任意数量的子句。
-
连接类型:在此,您可以定义连接的类型(内部连接、左连接、左内部连接、右连接、右内部连接、外连接)。通过单击 Venn 图的各个部分来完成此操作。
-
连接结果摘要:这里的条形图显示了来自每个输入的记录数量,以及匹配或未匹配的记录数量。您可以单击条形图的某个部分来查看数据网格中的过滤结果。
-
连接子句建议:如果适用,Tableau Prep 将显示可能的连接子句,您可以通过单击轻松添加。
-
连接子句:在此,Tableau Prep 显示了用于连接子句的字段及其对应的值。任何未匹配的值将以红色字体显示。您可以通过双击它们来编辑值。这使您能够根据需要修复个别不匹配的值。
在这个例子中,我们不需要配置任何内容。Airport Code字段上的内部连接默认设置非常有效。我们可以确认来自Pivot步骤的所有9,158条记录都被保留。只有32条来自Airport Codes超文件的记录是实际匹配的(1,301条记录未匹配)。这不需要担心。这仅仅意味着我们有很多多余的代码,这些代码本来可能为数据提供补充,但实际上并不需要。现在,继续我们之前的例子:
-
从连接 1开始,添加一个最终输出步骤,并将其配置为输出到名为
Airline Travel.csv的.csv文件。 -
使用工具栏顶部的运行按钮或点击输出步骤中的运行按钮来运行流程。
图 15.45:工具栏允许您运行所有输出的流程或单个输出,而输出步骤上的按钮将仅运行该输出的流程
您的最终流程看起来大致如下:
图 15.46:您的最终流程将类似于此,但外观可能略有不同
Chapter 15 Complete (clean).tfl文件经过了一些清理,添加了适当的步骤标签和描述。作为一种良好的做法,请尝试重命名您的步骤并添加描述,以便使流程更易于理解。以下是清理后的版本:
图 15.47:此流程已被清理并包含“自我文档化”
一旦流程执行完毕,打开Airline Travel.twb工作簿,该文件位于\Learning Tableau\Chapter 15目录中,以查看数据如何使用并自行探索:
图 15.48:在Airline Travel.twb工作簿中探索数据
与 .tde 或 .hyper 文件不同,.csv 文件可以被写入,即使它们作为数据源在 Tableau Desktop 中打开。如果你运行一个流程试图覆盖正在使用中的 .tde 或 .hyper 文件,你将收到错误提示。此外,你可以通过将字段拖放到清洁步骤的配置文件面板中来重新排列 .csv 文件的字段顺序,然后再输出。
随着我们的示例结束,让我们通过考虑一些自动化 Tableau Prep 流程的选项来总结。
自动化流程的选项
Tableau Prep Builder 允许你使用该应用程序设计和运行流程。有时,数据清洗和准备是一次性的操作,用于支持临时分析。然而,你通常希望随后运行流程,以捕获新数据或更改后的数据,并根据相同的模式清洗和调整它。在这些情况下,你需要考虑一些自动化流程的选项:
-
Tableau Prep Builder 可以通过命令行运行。你可以提供 JSON 文件来定义输入或输出数据连接的凭证。这使你能够使用脚本和调度工具运行流程,而无需手动打开并运行 Tableau Prep 界面。有关此选项的详细信息,请参阅 Tableau 帮助:
onlinehelp.tableau.com/current/prep/en-us/prep_save_share.htm#refresh-output-files-from-the-command-line。 -
Tableau Prep Conductor 是 Tableau Server 的附加组件,允许你将整个流程从 Tableau Prep Builder 发布到 Tableau Server,然后根据需求或自定义时间表运行这些流程。它还提供了监控和故障排除功能。
总结
Tableau Prep 通过即时反馈的动手数据清洗和调整的创新范式,极大地扩展了 Tableau 平台,并使你对数据拥有了令人难以置信的控制力。在本章中,我们考虑了整体界面以及它如何使你能够迭代和快速构建一个逻辑流程,用于清洗和调整数据,以便进行所需的分析或可视化。
通过本章中贯穿始终的详细而实用的示例,我们探索了 Tableau Prep 中的每个主要转换,从输入到联合、连接、聚合和透视,再到输出。在此过程中,我们还考察了其他转换和功能,包括计算、拆分、合并以及值的分组。这为你提供了在任何需要的方式下塑造和调整数据的基础。
在下一章中,我们将总结一些关于如何利用 Tableau 平台分享你的分析和数据故事的最终思考!
第十六章:分享您的数据故事
本书的重点是 Tableau Desktop,我们学习了如何通过可视化和仪表板来深入探索和传达数据。一旦您做出了发现,设计了具有洞察力的可视化,并构建了令人惊叹的仪表板,您就准备好分享您的数据故事了。
Tableau 使您能够通过多种方式共享您的工作。在本章中,我们将查看各种共享可视化和仪表板的方法,以及在决定如何共享项目时需要考虑的事项。
具体来说,我们将探讨以下主题:
-
展示、打印和导出
-
与 Tableau Desktop 和 Tableau Reader 的用户共享
-
与 Tableau Server、Tableau Online 和 Tableau Public 的用户共享
本章没有需要跟随的示例,但强烈建议您通读材料,以便深入了解共享洞察和发现的各种选项。
让我们从展示、打印和导出过程的概述开始。
展示、打印和导出
Tableau 主要用于构建丰富互动的可视化和仪表板,以便在屏幕上进行查看。通常,您会期望用户与您的仪表板和可视化进行互动。然而,提供多种格式的展示、打印和导出选项也是非常不错的选择。
展示
Tableau 为您提供了多种个人展示数据故事的选项。您可以带领观众浏览单个仪表板或视图的展示,或者您可以创建一个完整的演示文稿。虽然有多种方式可以构建演示文稿,但请考虑以下选项:
-
导出到 PowerPoint
-
演示模式
Tableau Desktop 和 Tableau Server 允许您直接导出到 PowerPoint。在 Tableau Desktop 中,选择 文件 | 导出为 PowerPoint...。选择位置和文件名后,Tableau 将生成一个 PowerPoint 文件(.pptx),将 Tableau 工作簿中的每个标签页转换为 PowerPoint 中的单个幻灯片。每个幻灯片将包含导出时视图和仪表板的静态图像。由于每个幻灯片只是一个截图,因此导出后将不再具备动态互动功能。
如果您更喜欢更具动态性的演示体验,请考虑使用演示模式。此模式会将所有仪表板和视图显示为全屏模式,隐藏所有工具栏、窗格和创作对象。要激活演示模式,选择顶部菜单中的窗口,或者按F7或顶部工具栏中的选项。按F7或Esc键退出演示模式。在演示模式下,您仍然可以通过操作、突出显示、筛选和其他选项与仪表板和视图进行交互。这可以丰富演示内容,并让您能够快速回答问题。在配合引人注目的仪表板和故事使用时,演示模式是一种有效的方式,能够带领观众深入了解数据故事。
如果在演示模式下按Ctrl + S保存工作簿,工作簿将在默认情况下以演示模式打开。
打印
Tableau 支持单独的可视化、仪表板和故事的打印。通过文件菜单,您可以选择打印将当前活动的工作表发送到打印机,或选择打印为 PDF选项导出为 PDF。无论哪种方式,您都可以将活动工作表、选定的工作表或整个工作簿导出为 PDF。要选择多个工作表,按住Ctrl键并点击单个标签。
打印时,您还可以选择显示选择项。选中此选项时,在视图或仪表板上交互式选择或高亮的标记将作为已选项进行打印。否则,标记将像没有选择项一样打印。以下仪表板中的地图已选择美国西部的标记:
图 16.1:您可以在此截图中看到已选择的州和圆圈。您可以选择打印包含选择项的视图
以下是一些关于打印的考虑事项、提示和建议:
-
如果仪表板是为打印设计的,请选择预定义的纸张大小作为仪表板的固定大小,或使用与相同纵横比匹配的自定义大小。
-
使用页面设置界面(可从文件菜单访问)来定义特定的打印选项,例如将包含哪些元素(图例、标题、说明文字)、布局(包括边距和居中)以及视图或仪表板如何缩放以匹配纸张大小。页面设置选项是针对每个视图的。复制或复制一个工作表时,会包含任何对页面设置的更改:
如果您要设计多个工作表或仪表板用于打印,请考虑将其中一个工作表作为模板,设置所有所需的打印设置,然后为每个新工作表进行复制。
图 16.2:页面设置对话框包含布局和打印缩放选项
-
在页面架构上使用的字段将定义打印中的分页(适用于单个工作表,但不适用于仪表板或故事)。页面架构定义的页面数量不一定等于打印的页数。这是因为一个由页面架构定义的单一页面可能需要多于一页的打印页。
-
故事中的每个故事点将被打印在新的一页上。
-
打印整个工作簿是生成单一 PDF 文档并分发的一种有效方式。每个可见的工作表将按标签顺序(从左到右)包含在 PDF 中。你可以隐藏工作表以防止它们出现在 PDF 中,或重新排序工作表以调整结果文档的顺序。还可以考虑创建包含图像和文本的仪表板,用于封面、目录、页码和评论。你也可以尝试使用上一章中的完整工作簿,查看不同的视觉元素在 PDF 转换中的保留或变化。
-
避免在仪表板中使用滚动条,因为它们会作为滚动条打印,并且可视窗口外的内容将不会被打印。
-
你还可以在工作簿中选择多个工作表(按住
Ctrl键同时点击每个标签),然后仅打印所选工作表。如果工作表是用于一个或多个仪表板或工具提示的视图,或者是用于一个或多个故事的仪表板,则可以隐藏工作表。要隐藏视图,右键点击底部条带或仪表板或故事工作区左侧面板中的标签或缩略图,然后选择隐藏工作表。要显示工作表,在仪表板或故事工作区的左侧面板中找到它,右键点击并取消选中隐藏工作表。你还可以右键点击仪表板或故事标签,隐藏或显示所有使用的工作表。
如果你没有看到隐藏工作表选项,这意味着该工作表没有在任何仪表板中使用,因此可以删除。
除了打印或输出为 PDF,我们还可以导出视图和仪表板中的数据和图像。让我们来看看吧!
导出
Tableau 还使得导出视图、仪表板和故事的图像变得非常简单,适用于文档、文献甚至像本书这样的书籍!图像可以导出为.png、.emf、.jpg或.bmp格式。你还可以将图像复制到剪贴板,然后粘贴到其他应用程序中。你还可以将数据导出为交叉表(Excel)、.csv文件或 Microsoft Access 数据库(适用于 PC)。
要复制图像或导出图像或数据,请使用工作表、仪表板或故事的菜单选项。
我们将很快详细讨论如何使用 Tableau Server、Tableau Online 和 Tableau Public。现在,让我们先了解这些平台上可用的导出功能。当在 Tableau Server、Online 或 Public 上与视图交互时,除非你没有所需的权限,或者管理员特意禁用了工具栏,否则你将看到一个工具栏:
图 16.3:从工具栏导出提供了与 Server、Online 和 Public 相似的体验
工具栏中的下载选项允许你下载图像、数据、交叉表(Excel)、PDF、PowerPoint或Tableau 工作簿。图像以.png格式导出,并呈现当前状态下的仪表板。导出.pdf文档时,用户可以选择多种选项,包括布局、缩放、是否打印当前仪表板、工作簿中的所有工作表,或当前仪表板中的所有工作表。
导出数据或交叉表时,会导出仪表板中活动视图的数据;也就是说,如果你点击仪表板中的一个视图,它将变为活动视图,你可以导出该视图的数据显示或交叉表。
Tableau Server 上还存在其他导出选项:
-
带有导出按钮的仪表板你可能还记得,导出按钮是可以添加到仪表板中的对象之一。这些按钮可以配置为将整个仪表板导出为 PDF、PowerPoint 或图像,并且是工具栏选项的不错替代方案。这也便于从 Tableau Desktop 导出。
-
Tabcmd 让你能够通过命令行或脚本以多种格式导出数据、图像或文档。
-
REST API 让你能够以编程方式导出数据、图像或文档,支持多种格式。
-
你可以将扩展名附加到托管在 Tableau Server 或 Tableau Online 上的视图的 URL,以查看或下载链接定义的格式。例如,附加
.pdf后,URL 可能会变成https://tableauserver/#/views/Dashboard/View.pdf,这样视图就会在浏览器中作为 PDF 文档呈现。
除了共享图像或文档导出外,你通常会想与他人共享完全互动的仪表板。让我们考虑一下如何实现这一点。
与 Tableau Desktop 和 Tableau Reader 用户共享
你可以与其他 Tableau Desktop 和 Tableau Reader 用户共享工作簿。我们将在接下来的章节中考虑选项,并注意一些差异。
与 Tableau Desktop 用户共享
与其他 Tableau Desktop 用户共享工作簿相当简单,但有一些事项需要考虑。
主要的考虑因素之一是你将共享打包的工作簿(.twbx)还是未打包的工作簿(.twb)。打包工作簿是一个包含工作簿(.twb)、提取文件(.hyper)、未提取的基于文件的数据源(如.xls、.xlsx、.txt、.cub、.mdb等)、自定义图像及其他相关文件的单一文件。
要与 Tableau Desktop 用户共享,你有多种选择:
-
你可以通过简单地将文件与其他拥有相同或更新版本的 Tableau Desktop 用户共享,来共享打包(
.twbx)或未打包(.twb)工作簿。当在更新版本的 Tableau Desktop 中保存工作簿文件时,工作簿文件将会更新。在旧版本的 Tableau 中打开工作簿时可能会收到错误或警告。首次打开工作簿时会提示更新,保存时再次提示。您可以选择从文件菜单将工作簿导出为之前的版本。
-
如果您分享一个未打包的(
.twb)工作簿,则使用它的其他任何人必须能够访问任何数据源,并且任何引用的图像必须在与原始文件引用的相同目录中对用户可用。例如,如果工作簿在网络路径上使用对 Excel(.xlsx)文件的实时连接,并在位于C:\Images的仪表板上包含图像,则所有用户必须能够访问网络路径上的 Excel 文件,并在本地具有包含相同名称图像文件的C:\Images目录。如果使用此方法,请考虑使用 UNC 路径(例如
\\servername\directory\file.xlsx)来共享常用文件。
类似地,如果您分享一个使用实时连接的打包工作簿(.twbx),那么使用该工作簿的任何人必须能够访问实时连接的数据源,并具有适当的权限。
与 Tableau Reader 用户分享
Tableau Reader是 Tableau Software 提供的免费应用程序,允许用户与在 Tableau Desktop 中创建的可视化、仪表板和故事进行交互。与 Tableau Desktop 不同,它不允许创建可视化或仪表板。但是,所有互动功能(如过滤、下钻、操作和突出显示)对最终用户均可用。
将 Tableau Reader 视为许多 PDF 阅读器的类似物,允许您阅读和导航文档,但不允许创建或保存更改。
要与 Tableau Reader 用户分享,请考虑以下事项:
-
Reader 仅打开打包的(
.twbx)工作簿。 -
打包的工作簿可能不包含与服务器或基于云的数据源的实时连接。这些连接必须是提取的。
在分享打包的工作簿(
.twbx)时,请务必考虑安全性和机密性问题。由于打包的工作簿通常包含数据,因此必须确保数据不敏感。即使数据未显示在任何视图或仪表板上,如果它是与工作簿一起打包的提取或文件的一部分,仍然可以访问它。
Reader 和 Desktop 是不错的选择,但确实需要其他用户安装该应用程序。您还可以考虑使用 Tableau Server、Online 或 Public 与更广泛的受众分享和协作。
与 Tableau Server、Tableau Online 和 Tableau Public 用户分享
Tableau Server、Tableau Online和Tableau Public都是相同概念的变体:在服务器上托管可视化和仪表板,并允许用户通过 Web 浏览器访问它们。
以下表格提供了产品之间的一些相似性和差异,但由于细节可能会变化,请在做出购买决策前咨询 Tableau 代表:
| Tableau Server | Tableau Online | Tableau Public | |
|---|---|---|---|
| 描述 | 安装在一台或多台服务器上的服务器应用程序,托管通过 Tableau Desktop 创建的视图和仪表板。 | 一个由 Tableau 软件维护的基于云的服务,托管通过 Tableau Desktop 创建的视图和仪表板。 | 一个由 Tableau 软件维护的基于云的服务,托管通过 Tableau Desktop 或免费的 Tableau Public 客户端创建的视图和仪表板。 |
| 授权费用 | 是 | 是 | 免费 |
| 管理 | 完全由购买许可证的个人或组织进行维护、管理和操作。 | 由 Tableau 软件进行管理和维护,用户可以选择进行项目和用户管理。 | 由 Tableau 软件进行管理和维护。 |
| 创作和发布 | Tableau Desktop 的用户可以创作并将工作簿发布到 Tableau Server。Web 创作功能允许 Tableau Server 用户在 Web 浏览器中编辑和创建可视化和仪表板。 | Tableau Desktop 的用户可以创作并将工作簿发布到 Tableau Online。Web 创作功能允许 Tableau Online 用户在 Web 浏览器中编辑和创建可视化和仪表板。 | Tableau Desktop 用户或免费的 Tableau Public 客户端用户可以将工作簿发布到 Tableau Public。未来将发布支持在线创作的功能。 |
| 交互 | 已授权的 Tableau Server 用户可以与托管的视图进行交互。视图也可以嵌入到内联网网站、SharePoint 和自定义门户中。 | 已授权的 Tableau Online 用户可以与托管的视图进行交互。视图也可以嵌入到内联网网站、SharePoint 和自定义门户中。 | 一切都公开。任何人都可以与托管的视图进行交互。视图可以嵌入到公共网站和博客中。 |
| Tableau Server | Tableau Online | Tableau Public | |
| 限制 | 无 | 大多数数据源必须在工作簿发布之前进行提取。大多数非云数据源必须通过本地计算机上的Tableau Desktop或通过Tableau Online Sync Client刷新提取数据。 | 所有数据必须提取,每个数据源的行数限制为 1500 万行。 |
| 安全性 | Tableau Server 管理员可以创建站点、项目和用户,并为每个用户调整权限。可以限制对基础数据的访问,并且可以限制工作簿或数据的下载。 | Tableau Server 管理员可以创建项目和用户,并为每个用户调整权限。可以限制对基础数据的访问,并且可以限制工作簿或数据的下载。 | 默认情况下,任何人都可以下载和查看数据;不过,作者可以限制这些选项的访问权限。 |
| 良好用途 | 内部仪表板和分析,或通过多租户站点跨部门/部门/客户使用。 | 内部仪表板和分析,特别是大多数数据源都是基于云的情况。与远程用户分享和协作。 | 在面向公众的网站或博客上使用嵌入视图分享可视化和仪表板。 |
发布到 Tableau Public
您可以使用 Tableau Desktop 或免费的 Tableau Public 客户端应用程序打开工作簿并保存到 Tableau Public。请记住以下几点:
-
要使用 Tableau Public,您需要注册一个帐户。
-
使用 Tableau Desktop 和适当的权限,您可以使用服务器菜单并在 Tableau Public 下选择选项来保存和打开工作簿。
-
使用免费的 Tableau Public 客户端,您只能将工作簿保存到网络并从网络中打开。
使用这些选项时,请注意全世界任何人都可以查看您发布的内容。
-
选择管理工作簿选项将打开一个浏览器,以便您可以登录到您的 Tableau Public 帐户并在线管理所有工作簿。
-
保存到 Tableau Public 的工作簿可能包含任意数量的数据源连接,但它们必须全部被提取,每个提取的数据不能超过 1500 万行。
当您想与世界分享您的数据故事时,请考虑使用 Tableau Public!
发布到 Tableau Server 和 Tableau Online
发布到 Tableau Server 和 Tableau Online 是类似的体验。要发布到 Tableau Server 或 Tableau Online,请从菜单中选择服务器 | 发布工作簿。如果您尚未登录到服务器,则将提示您登录:
图 16.4:Tableau Online 的登录界面
您必须拥有一个具有发布权限的用户帐户,用于一个或多个项目。输入 Tableau Server 的 URL 或 IP 地址,您的用户名和密码。登录后,如果您有多个访问权限,则会提示您选择一个站点。最后,您将看到发布屏幕:
图 16.5:发布到 Tableau Online
发布时您有多个选项:
-
选择要发布到的项目并为您的工作簿命名。如果已经使用与所选项目相同的名称发布了工作簿,则将提示您覆盖它。
-
您可以为工作簿添加描述并使用添加标签使搜索和查找工作簿更容易。
-
您还可以指定要在发布的工作簿中包含哪些工作表。您勾选的任何工作表都将被包含;您取消勾选的则不会。
-
您可以编辑用户和组权限以定义谁有权查看、交互和更改您的工作簿。默认情况下,使用项目设置。这是一个带有个人用户和权限的示例工作簿:
图 16.6:Tableau Server 允许进行强大的权限设置。您可以调整个人和组的权限,以进行查看、过滤、评论、编辑、保存等操作。
-
您可以编辑数据源的属性。下一节将详细描述这些选项。
-
您还可以选择显示工作表作为标签。选中此选项后,Tableau Server 上的用户将能够像在 Tableau Desktop 底部那样使用标签在工作表之间进行导航。如果您计划设置在视图之间导航的操作,必须选中此选项。
-
显示选择表示您希望任何活动的标记选择在发布的视图中保留。
编辑数据源时,您可以选择身份验证和调度选项:
-
对于工作簿中使用的每个数据连接,您可以确定如何验证数据库连接的身份。可选项将根据数据源以及 Tableau Server 的配置而有所不同。不同的选项包括嵌入密码、模拟用户或提示 Tableau Server 用户输入凭据。
-
您可以为 Tableau Server 设置调度,以运行任何数据提取的刷新。
任何需要在服务器上刷新实时连接或提取连接的,都必须定义可从服务器使用的连接。这意味着所有相关的数据库驱动程序必须安装在服务器上;所有访问数据库服务器和基于云的数据所需的网络、互联网连接及端口必须是开放的。
此外,任何由工作簿引用的外部文件(例如图像文件和未提取的基于文件的数据源)如果在工作簿发布时未包含,必须使用 Tableau Server 可访问的位置进行引用(例如,具有允许 Tableau Server 进程读取权限的网络路径)。
一旦仪表板和视图发布到 Tableau Server,您和其他有权限的用户将能够与其进行交互。接下来我们将详细讨论这些内容。
与 Tableau Server 交互
在工作簿发布到 Tableau Server 后,其他用户将能够使用网页浏览器查看和与可视化和仪表板交互。登录 Tableau Server 后,他们将能够浏览其有权限访问的内容。这些用户可以使用仪表板中内置的任何功能,如快速过滤器、参数、操作或钻取。所有内容都以HTML5格式呈现,因此用户查看和与视图及仪表板交互的唯一要求是兼容HTML5的网页浏览器。
Tableau 移动版应用程序,适用于 iOS 和 Android 设备,可以增强移动用户的体验。使用 Tableau 的设备设计器为特定设备调整布局。
大多数情况下,在 Server 或 Online 上与工作簿互动非常类似于在 Tableau Desktop 或 Reader 中与工作簿互动。快速筛选器、参数、操作和工具提示的外观和行为都非常相似。
你还会找到一些额外的功能:
-
侧边菜单为你提供了与管理和导航 Tableau Server 相关的各种选项。
-
在下面,你会看到一个面包屑导航,告诉你当前正在查看哪个工作簿和视图。
-
在下方,你会看到一个包含多个功能的工具栏:
图 16.7:Tableau Server 工具栏
-
撤销和重做使你能够在交互过程中前后移动。
-
恢复使你能够撤销所有更改并恢复到原始仪表板。
-
刷新重新加载仪表板并刷新数据。然而,这不会刷新任何数据的提取。
-
暂停允许你暂停仪表板基于操作、筛选选择或参数值变化的刷新,直到你完成所有想要的更改。
-
视图允许你根据选择、筛选器和参数值保存仪表板的当前状态,以便你稍后能够快速返回到该状态。你也可以在这里找到已保存的视图。
-
警报允许你设置条件警报。当视图中的标记达到你定义的阈值时,你将通过电子邮件收到警报。例如,你可能有一个盈利能力的折线图,并希望在达到组织目标的那天收到警报,或者你可以设置一个警报,当数据中指示的错误数量超过
0时,收到通知。 -
订阅允许你安排定期发送仪表板截图的电子邮件。管理员还可以为其他用户订阅。你可能希望考虑这个选项来分发每日绩效报告、销售更新、库存数量或任何你想要推送的其他信息!
-
编辑允许你编辑仪表板。界面与 Tableau Desktop 非常相似。Tableau 管理员可以根据用户或用户组启用或禁用网页编辑,并控制保存编辑视图的权限。
-
共享为你提供了共享工作簿的选项。这些选项包括一个你可以分发给其他授权用户的 URL,以及用于将仪表板嵌入网页的代码。
-
下载按钮允许你下载数据、仪表板图像、
.pdf文件或工作簿,如前所述。 -
评论使你能够通过在视图上发表评论并回复其他人评论的方式与其他 Tableau Server 用户进行协作。
-
全屏允许你查看仪表板或以全屏模式查看。
-
指标(未在图 16.7中显示)使你能够定义你希望跟踪的关键数字或指标。
现在我们已经探索了 Tableau Server 的一些互动功能,让我们进一步考虑 Tableau Server 和 Tableau Online 的一些分发选项。
使用 Tableau Server 或 Tableau Online 的其他分发选项
Tableau Server 和 Tableau Online 提供了几种其他选项,用于共享您的视图、仪表板和数据。在允许用户登录 Tableau Server 的同时,您还可以考虑以下选项:
-
仪表板、视图和故事点可以嵌入到网站、门户和 SharePoint 中。单点登录选项可实现您的网站身份验证与 Tableau Server 的无缝集成。
-
Tableau Server 允许用户订阅视图和仪表板并安排电子邮件发送。电子邮件将包含视图的最新图像以及 Tableau Server 上仪表板的链接。
-
tabcmd 工具与 Tableau Server 一起提供,并可以安装在其他机器上。该工具提供了自动化 Tableau Server 多种功能的能力,包括导出功能、发布功能以及用户和安全管理功能。这为自动化交付打开了许多可能性。
-
REST API 允许与 Tableau Server 进行程序化交互。这为您提供了广泛的选项,用于导出数据、图像和文档并分发给用户,以及访问使用统计信息、用户、权限等更多内容!
所有这些选项极大地扩展了将数据和可视化内容分发给组织中最需要它们的人所提供的灵活性!
摘要
Tableau 是一个令人惊叹的平台,适用于探索、准备和清理数据,同时创建有用且有意义的可视化和仪表板,以便理解和传达关键洞察。 在本书中,我们考虑了如何连接数据——无论是基于文件的、在本地数据库中的,还是在云中的。您已经通过示例了解了如何探索和准备数据,以便清理它并将其结构化以进行分析。我们已涵盖了多种可视化类型,以及它们如何揭示深入的分析洞察。四种主要计算类型已被深入探讨,为您提供了扩展数据、分析和用户互动的工具。您已经构建了仪表板并讲述了数据故事。在本章中,我们考虑了如何与他人共享您所有工作的结果。
您现在已经打下了坚实的基础。从本质上讲,Tableau 平台直观且易于使用。当您深入探索时,简洁性变得愈加美丽。随着您发现理解数据的新方式,解决复杂问题,提出新问题,并在数据集中找到新的答案,您的新 Tableau 技能将帮助您发掘、解读并共享数据中隐藏的新洞察。