可视化时间序列的最佳实践
通过在同一仪表盘上组织时间序列图表来讲故事。
我们将研究在两个不同时间段之间比较指标的不同策略,例如将本周与上周或去年与前一年进行比较。我们将使用 Metabase 附带的示例数据库,以便您可以跟随操作。此示例数据库包含一家完全真实、并非虚构的公司从 2015 年到 2020 年的订单信息。为了展示我们的查询构建器技能,我们对 2018 年的订单与 2019 年的订单进行比较感兴趣。
本文建立在之前一篇关于 时间序列比较 的文章之上,但在这里我们介绍了两种不同的策略
在仪表盘上并排比较时间段
这种模式易于维护且易于扩展(可以通过修改卡片或添加新卡片),并且当您想要比较多个指标时尤其有用。
这里的第一步是提出问题。对于我们的数据,我们将选择 Orders
表。我们将汇总订单计数,并按月份分组。然后我们将问题另存为“每月订单数”。
接下来,我们将“每月订单数”问题添加到新的仪表盘中,并将该仪表盘称为“并排比较”或其他名称。然后,我们将相同的“每月订单数”问题再次添加到仪表盘(即,作为第二张卡片),我们将其放在原始问题的右侧。
我们在这里所做的是在我们的仪表盘中创建两列:左列将有一个日期范围,右列将有第二个日期范围。我们将附加过滤器来控制左列卡片的日期范围,以及另一个过滤器来控制右列卡片的日期范围。
我们将为每个过滤器使用“介于”选项设置默认日期范围(您可以键入日期而不是单击日历)。
- 日期 1 范围:
01/01/2018
至12/31/2018
- 日期 2 范围:
01/01/2019
至12/31/2019
保存更改,并刷新页面以更新结果。我们还可以将其他过滤器附加到仪表盘,我们可以将其连接到两列中的卡片,例如,如果我们想按特定类别过滤订单。
您可以添加带有时间序列的其他卡片,并将它们连接到该列的相应过滤器。
并排比较的技巧
请记住,当在手机上查看时,此模式会崩溃,因为 Metabase 会将每张卡片折叠成单列。您仍然可以理解仪表盘,但这需要您仔细查看每张卡片的日期。
每列使用相同的问题
这样,如果您想修改问题,您只需要更新一个问题,并且两列都将获得更新。
确保两张卡片之间的轴相同
Metabase 默认自动调整 y 轴以考虑值,但如果一张卡片的最大值为 500,而另一张卡片的最大值为 1000,则很难看到两张卡片之间的差异。在仪表盘编辑模式下,将鼠标悬停在卡片上,然后单击调色板图标以编辑可视化设置。单击 轴 选项卡,关闭 自动 y 轴范围 并设置 y 轴最大值(您应该将最小值保留为 0)。
使用目标线和/或趋势线
添加线条可以使人们更容易区分图表之间的指标性能。很明显,2019 年的订单超过目标的次数多于 2018 年。
添加文本卡片以对相关卡片进行分组
为了让人们更容易理解拆分设置,我们可以添加文本卡片,以指示每列对应于其中一个过滤器:左列对应于日期 1,右列对应于日期 2。在仪表盘编辑模式下,您可以通过将鼠标悬停在卡片上并单击 调色板图标 来编辑文本卡片的可视化设置。例如,对于带有 ## Date 1
的卡片,我们将 垂直对齐 设置为“顶部”,将 水平对齐 设置为“居中”,并关闭 显示背景 设置。
使用颜色来区分列
您可以使用不同的颜色来区分每列中的卡片。将鼠标悬停在卡片上,然后单击 调色板图标 以更新卡片的可视化设置。
有关仪表盘的更多提示,请查看 BI 仪表盘最佳实践。
在同一图表上叠加两个时间序列
现在转向一种完全不同的方法。在这里,我们将介绍两种模式
使用自定义列对静态日期范围进行分组
在这里,我们将使用 case
语句来创建自定义列。我们可以使用 between 表达式。在这里,我们将使用自定义表达式创建一个新列。
case(between([Created At], "2018-01-01", "2018-12-31"), "2018", between([Created At], "2019-01-01", "2019-12-31"), "2019")
此表达式的意思是,对于结果中的每个记录(行),添加一个新列。如果 Created At
字段介于 2018 年 1 月 1 日和 2018 年 12 月 31 日之间,则将值“2018”放在该记录的“Year”列中。如果 Created At
日期介于 2019 年范围之间,则改为放置“2019”。否则,将其留空。接下来,我们要过滤所有我们创建的“Year”列不为空的记录。
这里我们在同一图表上有两个时间序列,2018 年 vs 2019 年
您也可以将其可视化为条形图
现在,如果您想比较相对于当前日期的日期,您可以使用 interval
函数在 case
语句中,但我们将在接下来介绍 interval
的不同用例。
使用自定义表达式将上周与前一周进行比较
我们在之前一篇关于 时间序列比较 CountIf
聚合和 between
函数的文章中介绍了一种比较时间段的方法。这次我们将使用 interval
函数,该函数允许我们指定相对于当前日期的持续时间。
示例数据库只有 2020 年之前的数据(不确定公司发生了什么),因此您需要尝试使用您自己的数据,但这是它的工作原理
以 Orders
表作为我们的起始数据,我们将添加两个摘要(指标)。在 摘要 部分中,我们将使用自定义表达式定义一个摘要,我们将其命名为“上周”
CountIf(interval([Created At], -1, "week"))
在 interval 语言中,0 表示当前周,因此我们写 -1 仅在 Created At
行的日期是上周的日期时才计算订单。我们也可以将“week”更改为“day”、“month”、“year”或其他间隔;查看数据库的文档以查看它支持哪些间隔。
接下来,我们将为“前一周”定义第二个摘要。
CountIf(interval([Created At], -2, "week") AND NOT interval([Created At], -1, "week"))
这里我们说只计算前两周的所有订单,除了 (AND NOT
) 上周的订单。
最后,我们需要对摘要进行分组。由于我们想查看上周一与前一周一的表现(以及一周中的每一天),因此我们需要按 星期几 对 Created At
进行分组。