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

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

我们将研究两种不同的策略来比较某个指标在两个不同时期(例如本周与上周,或去年与前一年)之间的表现。我们将使用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

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

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

我们将使用每个过滤器的“Between”(之间)选项设置默认日期范围(您可以直接输入日期,而无需点击日历)。

  • 日期1范围:2018/01/012018/12/31
  • 日期2范围:2019/01/012019/12/31

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。在仪表板编辑模式下,您可以将鼠标悬停在文本卡片上,然后点击调色板图标来编辑卡片的可视化设置。例如,对于带有## 日期 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")

这个表达式表示,对于结果中的每一条记录(行),添加一个新列。如果创建时间字段在2018年1月1日到2018年12月31日之间,则在该记录的“年份”列中填入“2018”。如果创建时间日期落在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.

现在,如果您想比较相对于当前日期的日期,可以使用interval函数在一个case语句中,但我们接下来将介绍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)上周的订单。

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

延伸阅读

这有帮助吗?

感谢您的反馈!
分析师每周技巧
获取可行的见解
关于 AI 和数据的资讯,直接发送到您的收件箱
© . This site is unofficial and not affiliated with Metabase, Inc.