跳至正文

Tableau计算:一朝顿悟,通透如此V2

标签:

最近新书终稿过审,在等待新书路上,又在准备一家客户的高级培训,所以一直在思考如何「更好地讲解计算体系」,是的,在我的层次体系上再增加几个关键总结,就像数据准备一样彻底通透,一文说罢,再无后文。

今天终于有了大彻大悟的感觉,快速记录如下,事后补充图片。

1、理解“分析即聚合”

分析即聚合,聚合即分析,理解聚合及其多种类型是分析的要害

如果没有计算,只能借助于有限的字段完成有限的业务分析;有了计算,才能超越数据甚至业务场景的限制,自由在逻辑王国,完成“交叉购买”“客户购买力”“客户迁徙”等完全逻辑意义上的深入分析。

计算的关键是理解聚合。

聚合是从行级别的数据表明细,到问题层次的有多变少的过程(代表问题层次的维度组合是聚合的分组依据)。

理解计算有两个至关重要的部分:

1)理解行级别计算与聚合计算

行级别计算的本质是数据准备;问题层次的聚合的本质是业务分析(回答问题答案的过程)。正是在这个逻辑基础上,笔者发展了“第三字段分类”的概念——这是我2021年最重要的知识成果。

先用excel理解这两个过程。

进而总结为两个字段的分类:

新图:《业务可视化分析》最新插图版本

2)理解聚合的多种二次计算

在我的《数据可视化分析》和《业务可视化分析》两本书中,我严格区分了“高级问题”和“高级分析”的定义:包含了两个层次的问题或者分析。正因为此,我把问题分为了基本问题(与视图的类型对应)、复杂问题(与标记和基本计算对应)和高级问题(与层次、层次计算对应)。可以参考这个图:

2020:问题的三种分类——基于计算和层次的视角

基于此,我们可以从计算的角度理解问题,也可以从问题层次的角度理解计算。因此,可以把上述所有的计算分为如下渐进的类型:

  • 直接聚合,建立行级别字段或者行级别计算基础上的聚合
    • 示例: SUM(销售额) 或者 SUM([销售额]-[折扣])
  • 视图聚合的二次聚合,以表计算“合计TOTAL”为代表
    • 示例:WINDOW_SUM( SUM([销售额]))
  • 相对于视图的预先聚合,可以直接作为维度,以Fixed LOD客户特征聚合为代表
    • 示例:{FIXED [客户ID] : MIN([订单日期]) }
    • 特别注意,狭义LOD是相对于主视图层次的FIXED another LOD,因此必然是多个层次的计算(暂时不考虑筛选器的影响)
  • 预先聚合的二次聚合,以客户购买力(各地区客户最大交易的平均值)为代表
    • 示例:AVG ( {INCLUDE [客户ID] : MAX([销售额]) } ),这里在{LOD}之外,增加了二次聚合
    • 说明:狭义LOD一定是相对于主视图而言another层次的预先计算,include/exclude只是确认another lod的简化方法。
  • 预先聚合的N此聚合,以客户购买力(各地区客户最大订单的平均值)为代表
    • 示例:预先聚合可以多遍聚合,比如为了衡量不同地区的客户购买力,同时避免单一产品的简单化,以各地区,每个客户的最高订单为分析对象,就是先对订单聚合,再取最大订单,进而计算平均的过程。

AVG ( {FIXED [地区],[客户ID] : MAX(

{FIXED [地区],[客户ID],[订单ID]:SUM([销售额])}

) } )

——《数据可视化分析》10章 客户购买力分析

考虑到视图的层次,以及嵌套LOD可以继承外面的层次,因此可以简化为:

AVG ( {INCLUDE [客户ID] : MAX( {INCLUDE [订单ID]:SUM([销售额])}) } )

很多人看到这里表示已经晕了,不过我想说的是,Tableau的语法已经简化到可以称之为“极简”,问题不在于它的语法多难,而在于我们思考问题的深度,我们被业务逻辑绕晕了,以至于无法把问题映射到技术实现上。

Tableau近乎完美地为上述不同业务场景的分析提供了计算框架。我所说的“近乎完美”既包含对LOD计算的赞誉,也包含对表计算过度灵活的一丝丝担忧。

如何充分理解这个框架?

关键是层次,以及理解相对于视图层次的计算方向。

2、从层次和过程角度,可视化地理解计算的差异

理解上述多种聚合的关键,一是建立层次的可视化逻辑;二次理解逻辑上的“相对”和聚合的差异化过程。

这里用图形的方式,理解 直接聚合、二次聚合、预先聚合的概念,特别是理解它们分别的起点和终点是什么,以及终点的层次与视图的相对关系。

有四种层次之间的相对关系:

  • B层次和A层次(聚合度)相同
  • B层次比A层次(聚合度)更高
  • B层次比A层次(聚合度)更低
  • B层次相对于A层次(聚合度)独立

当然,这里还没有考虑筛选器的影响,考虑到筛选器,还要考虑聚合是否受筛选器影响。

3、“指定层次的聚合”,其本质是不同场景的数据准备过程

如果用Prep理解,所有的聚合,都可以在数据准备阶段完成,Tableau的二次聚合体系,背后都是SQL,因此都可以与特定的数据准备过程对应。它们都是充分利用了聚合AGG和连接Join完成的数据合并。

比如,早期一篇博客中,就用prep的聚合+join完成了Fixed LOD过程,而prep2020.1版本也引入了这个简化的逻辑过程,避免了合并。

参考这篇博客: Prep2020拥抱LOD:Fixed LOD

可以用prep实现上述的分类聚合方法:

1)直接聚合

在《业务可视化分析》一书中,有句话这么说“分析即聚合、聚合即分析”。简单的问题对应直接的聚合,只需要确定层次、完成聚合就好,比如“各地区的销售额总和”“各地区、各客户ID的最大销售额交易”等。

desktop可视化背后都是数据,因此可以用prep的聚合更清晰的表达它们的逻辑。如下图所示:

2)二次聚合

那什么是二次聚合呢? 二次聚合是 聚合再聚合,典型代表是excel透视表中的合计百分比、SQL中的窗口函数、Tableau中的表计算。

二次聚合的起点不是数据明细,而是聚合表。可以用下面的这个图来表示这个过程。第二个聚合建立在第一个聚合(各地区的销售额总和)基础上,可以代表聚合的二次聚合。

如果是在SQL中,就要使用窗口函数实现二次聚合,就是这样的方式:

我把这一类建立在聚合基础上的二次聚合,简称之为“(聚合的)二次聚合”。

在desktop中,二次聚合可以和直接聚合并存,但是要注意二者的层次完全不同。

3)预先聚合

预先聚合和二次聚合不同之处在于,二次聚合是以当前聚合表为起点计算更高层次的聚合;而预先聚合通常是以数据表行级别层次为起点计算特定层次的聚合,这里的特定层次是相对于问题的另一个层次(another LOD)

在Prep推出FIXED LOD函数之前,我们可以用预先聚合+连接合并的方式,完成在当前层次的预先聚合。比如在明细中,增加“每个客户的首次订单日期”(对应一个聚合节点),而后把这个预先聚合通过join合并到之前的行级别层次明细中,就在行级别中增加了预先聚合的聚合特征。它的结果可以作为之后分析的材料。

4)预先聚合的二次聚合

如果把预先聚合的结果,进一步做聚合,那么可以称之为“预先聚合的二次聚合”。这种情形是一种既高级又复杂的情形,因此较难于理解;重点是明白每次聚合的起点和终点在哪里。如下所示,预先聚合是从行级别到“地区*客户*订单id”的层次;而后以其为起点,再聚合到“地区*客户”,最后再聚合到“地区”。

用这种方式,就可能以“各地区中各个客户的最高订单金额的平均值”作为衡量地区客户购买力的指标了。

为什么不能直接一次性聚合呢?因为聚合中需要引用多个层次,比如客户、订单id,这种在聚合中引用其他层次的计算,就是高级计算的精髓。

理解了这个过程,计算的体系就算彻底通透了。

喜乐君

Aug 6, 2021 凌晨

Aug 8, 2021 补充prep部分


了解 喜乐君 的更多信息

订阅后即可通过电子邮件收到最新文章。