跳至正文

【Tableau】详细级别表达式LOD_语法与逻辑 (2)

喜乐君
Tableau Visionary Hall of Fame

致力于航空、生产制造、零售等多行业产品方案与服务

  • 🎓 文科背景、法学学士|教育学硕士
  • 📊 业务数据分析「专家」· 敏捷 BI 布道师
  • 📚 《数据可视化分析》《业务可视化分析》图书作者
  • 🎓 中国地质大学(武汉)经管学院 MBA 校外导师
  • 🤝 以 Tableau 会友,致力于构建业务分析通识框架
喜乐君
XILEJUN
喜乐君 Tableau Visionary ✦ 5
📊 业务数据分析「专家」· 敏捷 BI 布道师
📚 《数据可视化分析》《业务可视化分析》多本书作者
🎓 中国地质大学(武汉)经管学院 MBA 校外导师
🤝 以 Tableau 会友,致力于构建业务分析通识框架

📚 本文配套课程 · 数据可视化分析系列

🎬 B 站课程:数据可视化分析:Tableau/SQL 原理与实践  —  https://www.bilibili.com/cheese/play/ss8093


详细级别表达式(LOD)是学习Tableau的难点,起初感觉容易,但是随着越来越多的高级分析应用到LOD表达式,你会发现它有各种变化无穷的用法,又容易受外部筛选器、计算影响。上一篇我们介绍了LOD的基础概念、背景知识以及常见用法,这一篇更深一层介绍语法和逻辑——特别是Fixed LOD的三种情形。

理解LOD的关键有三个:

  • 什么是LOD?(详细级别)区分 行级别与视图级别;
  • 理解LOD表达式的功能,与维度、度量的关系;
  • 理解不同类型LOD表达式语法的应用场景

一、LOD表达式与视图详细级别

1、何为详细级别(LOD)

首先回顾一下上一篇的重点,什么是LOD?LOD=level of detail,代表数据的详细级别,不同的详细级别,对应不同的数据聚合度和颗粒度。最高的数据颗粒度就是行级别的数据,最低的颗粒度则对应着一个完全聚合的数值;中间的数据颗粒度就是常用的视图可视化详细级别(Viz LOD)。

一般来说,在Tableau中,一个视图对应着一个视图详细级别,比如我们把year、area、profits三个字段加入视图,year和area(维度)决定了详细级别的层次,profits即详细级别上的内容。在主视图详细级别(year*area)之外,我们可以使用LOD表达式,引入另一个详细级别的数据。

关键词:详细级别……增加维度……标记数量增加

在 Tableau 中,我们将主可视化聚合级别称为其“详细级别”……向视图中添加维度来增加标记数量的过程称为设置详细级别。……某些情况下,向视图中添加度量可能会增加视图中标记的数量。但这与更改视图的详细级别不同。

说到这里,我们说一下官方文档中的一句话:“放在(下图方框中)任何位置中的维度和集字段组成视图详细级别。”因为维度和集字段会形成可视化聚合视图。

1 calculations_lod_shelves

更改详细级别,需要增加维度(维度或集字段);而不是度量。

2、LOD的意义与语法逻辑

理解LOD,就要深刻理解官方的介绍,借助详细级别表达式,无需实际将这些维度拖入可视化内容中, 您即可确定在计算中使用的详细级别(即维度)。 您可以独立于可视化详细级别, 定义应以什么详细级别来执行计算。”——不拖拽字段影响视图,又通过LOD表达式背后引用数据。视图是用户看的见的,计算则是隐藏其后的逻辑。

具体而言,三个LOD表达式的使用场景和语法分别如下:

{ [FIXED | INCLUDE | EXCLUDE]  <维度声明>   <聚合表达式>}

  • FIXED | INCLUDE | EXCLUDE 是定界关键字,制定了LOD的范围;
  • <维度声明>,指定聚合表达式要联接到的一个或多个维度。使用逗号分隔各个维度。
  • : 冒号用于分隔维度声明与聚合表达式。
  • <聚合表达式>,聚合表达式是所执行的计算,用于定义目标维度。

在分析中,大括号通常代表数组(表示多个数据),冒号通常用于保存键值对。如果有一定的技术背景,可以把 lod 结果理解为 python 中的字典类型(dictionary) 

需要特别强调的是,需要特别强调的是,需要特别强调的是

LOD表达式最后包含的,其实是数组概念中的多个数据,而不是一个结果,比如说,

{ fixed ……: ……}这个表达式,结果是 {1,2,35,499,99}这样的一组数据,而不是我们以为的一个静态结果,比如5.

明白了这一点,你就明白了为什么经常报错:无法将聚合和非聚合混合。

LOD 表达式

LOD的大括号
  • 所有的include和exclude表达式在置入视图中都会用作度量,或聚合度量。
  • fixed表达式在视图中可以用作度量,或者维度(如上图),根据数量类型而定。

既然LOD表达式最后的结果是一个数组,而不是一个数字,那么LOD参与的所有计算,都要服从公式或者函数的需求。

比如,聚合类计算,加减乘除,都要先把LOD数组聚合,所以下面的公式是对的:

SUM([商品总额])/SUM({FIXED [商品中类 (组)]]:sum([商品总额]])})

二、LOD的语法逻辑

理解 LOD 需要先理解几个关键:

  • 所有的聚合都必须指定分组依据,即“详细级别”;如同 SQL 中的 sum 要对应 group by
  • 视图中默认聚合的详细级别是“视图详细级别”,简称 viz LOD
  • LOD 表达式是指定于视图详细级别不同的 另一个详细级别,fixed another LOD to aggregate
  • INCLUDE 和 Exclude 是相对指定,fixed LOD 是绝对指定

1、include与exclude LOD:参照视图维度指定聚合的详细级别

include和exclude LOD,是在当前视图的维度基础上,增加一个新维度include把不在视图中的维度引用到OD 计算中,但不改变视图已有的详细级别和聚合,或者排除一个已有的视图维度exclude把视图中的维度排除后确定聚合对应的详细级别,但不改变视图本身的维度引用

因此Include和exclude LOD是依赖于视图详细级别的增减。我们用下面的图形形象地表示可以看见,从当前视图出发(深绿色箭头),最终的结果又返回到视图显示出来(红色箭头)。

屏幕快照 2019-05-01 上午10.39.44.png

!【增补】最新的图片上,增加了两个词:复制和聚合。使用exclude LOD,我们获得的结果标记数量明显会少于视图的颗粒度,因此同一个数据会在多个地方“重复出现”,我们称之为“复制”;而使用 include LOD,我们获得数据标记数量会高于视图颗粒度,也就是视图中只有三行,include LOD可能返回一个10个数据的数组,此时结果默认会聚合,按照视图的详细级别分组、聚合。

2、fixed LOD 完全指定聚合对应的详细级别

Fixed LOD稍微复杂一些,fixed是按照语法中指定的维度(如果不指定维度,则为表范围所有数据,比如{ MIN([profits])}  ),在可视化之前执行数据的聚合,而不引用视图中的任何其他维度。因此,它又分为两种情况,一种是指定的维度生成的详细级别比当前视图详细级别聚合度更高,另一种则是更低。

比如说,我们要看超市中每个细分下各类别的利润,同时希望对比相对于每个细分的差异,这就涉及到两个详细级别:细分*类别,和细分。确定好视图详细级别的维度后,另外的一个详细级别就要用LOD来提供。我们可以使用fixed 指定细分来返回数据,在没有筛选器情况下,它的结果和exclude排除类别是相同的,计算比率也一样,我们可以用上面的图解释原理,下图看效果:

Screen Shot 2019-04-16 at 7.51.41 AM.png

具体来说,fixed的具体场景有几种:

比如说上面的 {fixed [细分]: sum[利润]} ,由于视图的详细级别是 “细分 * 类别”,因此“ fixed 细分 ” 确定的详细级别的聚合度就高于视图详细级别;而如果在视图两个维度的基础上,增加指定新的维度,则聚合对应的详细级别级别要比视图详细级别要低,比如 {fixed [细分], [分类],[商品] : sum[利润]}  。

还有一种常见的情况,比如我要在上面的基础上,增加每个细分中每个客户贡献利润的平均值,我就需要引用在视图中没有的新维度:客户名称。客户层面的详细级别,与视图维度的详细级别(细分*分类)其实是没有关系的。

上面的三种情况,如果要用一个图来表示,可以参考如下图:

Screen Shot 2019-04-16 at 5.06.59 PM

【增补】这里的“复制”和“聚合”含义与include/exclude LOD一致,不过这里需要注意fixed LOD的第三种情形,比如在没有客户的视图中引用了客户字段——一个与视图完全无关的新的详细级别出现了。fixed LOD返回的数组颗粒度,一般都会高于视图详细级别,结果最后会被默认聚合,以便恰当地出现在视图的详细级别上。

 

3、LOD的区别

其一,与视图详细级别的关系

结果就是,fixed LOD返回的聚合结果,聚合度可以比当前视图高,也可以低;而exclude返回的结果聚合度必然比当前视图的详细级别高,include则相反。

详细级别与LOD

LOD表达式并不是一种详细级别,而是在当前视图详细级别增加另外的详细级别聚合的计算语法。它和表计算不同的是,LOD计算是基于数据源的,因此每一个LOD表达式都会从数据源引用一次并计算;而且LOD计算的优先级比表计算要高。

其二,与筛选器的顺序

在之前的数据中,我们都没有做筛选器,下面,我们看一下筛选器对LOD计算的影响。

初学者不能充分的领会LOD表达式,特别是fixed 和 include/ exclude的区别,一个重要的原因是没有清楚它们在整个操作顺序中的位置( the Order of Operations)。关于操作顺序,不妨看一下下图,我用浅色代表筛选器,深色表示维度和表达式等。

筛选器和操作顺序.png


这个筛选器和操作顺序里,关键是LOD表达式的相对位置——Fixed LOD表达式在维度筛选器之前,而include /exclude LOD在维度筛选器之后。

其三,结果作为维度还是度量

Fixed因为不依赖于视图的维度,因此可以作为维度使用,也可以被二次聚合作为度量使用;而include和exclude只能作为度量使用——因为它们依赖于视图详细级别,不能成为维度破坏视图详细级别,否则就是循环引用。

 

三、如何更好的辨别使用场景

1、筛选器影响LOD计算结果,所以要考虑筛选器影响。

  • 如果使用了维度筛选器,又不想让筛选影响LOD的结果,那就必须使用fixed表达式;
  • 如果希望LOD结果随着维度筛选器而变化,只计算当前可见视图的数据,那么就用include/exclude表达式;

2、视图的聚合度与期待的结果

  • 如果想要的聚合结果比当前视图级别更加精细(聚合度要低、细度要高),那么推荐使用include表达式,执行计算前,指定的维度会先添加到可视化详细级别中(虽然这个维度在视图中不可见);
  • 如果想要的的结果比当前视图级别更加粗(聚合度更高、细度更低),那么就要排除掉一些维度,就用exclude表达式;Tableau exclude表达式会先从可视化详细级别中删除排除的维度并执行计算,假设该维度完全不存在——虽然在视图中显示了这个维度,然后展现结果。赤裸裸的视而不见的粗糙聚合
  • 如果想要指定维度,不管这个维度在不在可视化视图中,那就用fixed表达式吧,但要注意它的优先级别高于维度筛选器,会自动排除维度筛选器的影响。

四、案例和参考

最好的练习方法是案例,其中零售是最佳的起点,可以参考这篇文章和其中的视频(视频车已经更新三年三遍)

【Tableau高级分析系列】零售分析应用·视频

为了理解 LOD,还可以参考 SQL 的“通用表表达式”,可以参考 使用 SQL CTE表表达式理解 Tableau LOD 表达式

产品分析高级专题:购物篮分析的多个角度 (上)

 

2017年8月21日 修改V2.0
2017年8月23日 修改V2.2
8 May 2018 小修小补 V2.3
21 Oct 2018 修订
May 1, 2019 修改include/exclude/fixed图片
2024/10/06 更新

 

《【Tableau】详细级别表达式LOD_语法与逻辑 (2)》有19个想法

  1. Pingback: 【Tableau】详细级别表达式LOD_方法论与学习资源(3) – 喜乐君Healee

  2. Pingback: 「Tableau」“平民数据科学家”的崛起 – 喜乐君

  3. Pingback: Tableau| LOD 核心要点回顾(4) – 喜乐君

  4. Pingback: 【Tableau】详细级别表达式LOD_详尽入门(1) – 喜乐君

  5. Pingback: 【Tableau】15大详细级别表达式-思路解读版 (5) – 喜乐君

  6. 看完概念清晰很多,不过系列文章有一个问题,就是好多重复性的东西…如果没有办法把之前的内容删掉,只能增加的话,不如把相关的几篇文章全部删掉,重写写一篇整合好的。这样阅读体验会更好点

    1. 你说的对,随学随写,前后有一些重复。后面偏向于总结。一直想重新写一篇,一直没有腾出来时间。。。 最近太忙了。期待明年我的书出版吧

评论已关闭。