时间序列可视化最佳实践

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

我们将探讨在两个不同时间段之间比较指标的不同策略,例如将本周与上周进行比较,或者将去年与前年进行比较。我们将使用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”。如果Created At日期落在2019年的范围,则写入“2019”。否则,留空。接下来,我们需要筛选出我们创建的“年份”列不为空的所有记录。

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年与2019年的对比

Two time series on the same chart.

您也可以将其可视化为柱状图

The same series, but as bar chart.

现在,如果您想比较相对于当前日期的日期,您可以在case语句中使用interval函数,但接下来我们将介绍interval的另一种用例。

使用自定义表达式比较上周与前一周

我们已经在之前关于时间序列比较的文章中介绍了一种时间段比较方法,使用了CountIf聚合和between函数。这次我们将使用interval函数,它允许我们指定相对于当前日期的持续时间。

示例数据库只有2020年之前的数据(不确定这家公司发生了什么),所以您需要用您自己的数据来尝试此功能,但操作方法如下:

Orders表作为起始数据,我们将添加两个汇总(指标)。在汇总部分,我们将使用自定义表达式定义一个汇总,并将其命名为“上周”

CountIf(interval([Created At], -1, "week"))

在区间表达中,0表示当前周,所以我们写入-1,仅当该行的Created At日期是上周的日期时才计算订单。我们也可以将“周”更改为“天”、“月”、“年”或其他时间间隔;请查阅您的数据库文档以了解其支持的间隔。

接下来,我们将定义第二个汇总,名为“前一周”。

CountIf(interval([Created At], -2, "week") AND NOT interval([Created At], -1, "week"))

这里我们指的是只计算前两周的所有订单,但不包括(AND NOT)上周的订单。

最后,我们需要对汇总进行分组。由于我们想了解上一个星期一与再上一个星期一(以及一周中的其他每一天)的表现对比,因此我们需要按星期几Created At进行分组。

延伸阅读

© . All rights reserved.