可视化时间序列的最佳实践

通过在同一仪表盘上组织时间序列图表来讲故事。

我们将研究在两个不同时间段之间比较指标的不同策略,例如将本周与上周或去年与前一年进行比较。我们将使用 Metabase 附带的示例数据库,以便您可以跟随操作。此示例数据库包含一家完全真实、并非虚构的公司从 2015 年到 2020 年的订单信息。为了展示我们的查询构建器技能,我们对 2018 年的订单与 2019 年的订单进行比较感兴趣。

本文建立在之前一篇关于 时间序列比较 的文章之上,但在这里我们介绍了两种不同的策略

在仪表盘上并排比较时间段

A dashboard with two columns, Date 1 on the left, Date 2 on the right, each with cards connected to their respective filter widget. A third widget is connected to cards in both columns to filter for product category.

这种模式易于维护且易于扩展(可以通过修改卡片或添加新卡片),并且当您想要比较多个指标时尤其有用。

这里的第一步是提出问题。对于我们的数据,我们将选择 Orders 表。我们将汇总订单计数,并按月份分组。然后我们将问题另存为“每月订单数”。

Notebook view of our question that summarizes the count of orders grouped by month

接下来,我们将“每月订单数”问题添加到新的仪表盘中,并将该仪表盘称为“并排比较”或其他名称。然后,我们将相同的“每月订单数”问题再次添加到仪表盘(即,作为第二张卡片),我们将其放在原始问题的右侧。

我们在这里所做的是在我们的仪表盘中创建两列:左列将有一个日期范围,右列将有第二个日期范围。我们将附加过滤器来控制左列卡片的日期范围,以及另一个过滤器来控制右列卡片的日期范围。

我们将为每个过滤器使用“介于”选项设置默认日期范围(您可以键入日期而不是单击日历)。

  • 日期 1 范围:01/01/201812/31/2018
  • 日期 2 范围:01/01/201912/31/2019

Attaching the Date 1 filter to each card on the left column (but not the right column).

保存更改,并刷新页面以更新结果。我们还可以将其他过滤器附加到仪表盘,我们可以将其连接到两列中的卡片,例如,如果我们想按特定类别过滤订单。

您可以添加带有时间序列的其他卡片,并将它们连接到该列的相应过滤器。

并排比较的技巧

请记住,当在手机上查看时,此模式会崩溃,因为 Metabase 会将每张卡片折叠成单列。您仍然可以理解仪表盘,但这需要您仔细查看每张卡片的日期。

每列使用相同的问题

这样,如果您想修改问题,您只需要更新一个问题,并且两列都将获得更新。

确保两张卡片之间的轴相同

Metabase 默认自动调整 y 轴以考虑值,但如果一张卡片的最大值为 500,而另一张卡片的最大值为 1000,则很难看到两张卡片之间的差异。在仪表盘编辑模式下,将鼠标悬停在卡片上,然后单击调色板图标以编辑可视化设置。单击 选项卡,关闭 自动 y 轴范围 并设置 y 轴最大值(您应该将最小值保留为 0)。

Setting the y-axis Max value to 600.

使用目标线和/或趋势线

添加线条可以使人们更容易区分图表之间的指标性能。很明显,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”列不为空的记录。

The query builder contains a custom column called year, filters out years that are empty, and counts the orders, and groups by year and Created at by month of year.

这里我们在同一图表上有两个时间序列,2018 年 vs 2019 年

Two time series on the same chart.

您也可以将其可视化为条形图

The same series, but as bar chart.

现在,如果您想比较相对于当前日期的日期,您可以使用 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 进行分组。

延伸阅读