可视化时间序列的最佳实践
通过在同一个仪表板上组织时间序列图表来讲述故事。
我们将探讨比较不同时间段内指标的不同策略,例如比较本周与上周,或去年与上一年。我们将使用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。在仪表板编辑模式下,您可以通过将鼠标悬停在卡片上并单击“调色板图标”来编辑文本卡片的可视化设置。例如,对于具有## 日期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”代替。否则,留空。接下来,我们想要过滤出所有“年份”列不为空的记录。
在这里,我们有2018年与2019年的两个时间序列,在同一图表上
您也可以将其可视化为柱状图
现在,如果您想比较相对于当前日期的日期,您可以在一个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
进行分组。