【2019年中秋】很多人联系我说“LOD博客帮助很大”,“是最清晰的LOD博客”,但有感觉多有赘绕。毕竟是分多次所写,近半年一直没有重大更新,实在抱歉。中秋三天,我终于把最难的LOD表达式的核心原理视频录制完成了,可以作为问本博客的修订版本。

很多人希望我修改博客,但是我知道过去的思维已经很难打破,困难重重。录制视频的好处是,强迫自己闭关三天开发了一套全新的分析视角,录制过程“制作PPT——录制1080P视频”一气呵成,完全超过我自己的想象。在视频中,我把行级别、视图级别、表计算、LODs整合在一起,分为了三类六种的Lod表达式,然后由浅入深层层分析。会比此前的博客更加容易接受,特别适合于没有IT基础的业务用户。

视频刚刚发布地址:Tableau广义LOD表达式高级分析  知识无价,广结善缘。

了解此次课程的缘起和框架说明,可以阅读:【视频】Tableau广义LOD表达式相对论

屏幕快照 2019-09-15 下午6.57.07

屏幕快照 2019-09-15 下午6.57.07

注:持续修改,致力成为全面易懂、非官方、最好的中文LOD帮助手册。

【编者再按】近期计划上线LOD讲解版本的视频版本,如果大家有需求,或者有问题,欢迎留言。——2019年仲秋节上线LOD高级分析视频,独立于官方视频的更有助于理解的思路。

【编者再注】近日在企业培训过程中,增加了对LOD的理解,更换了部分照片,特别是更加完整地阐述了fixed LOD的逻辑。Apr 26, 2019

【编者按】在学习Tableau过程中,详细级别表达式是最大的拦路虎。这篇博客,最早写于2017年8月,一年时间做了几次重大修改,并增加了续篇。(Sep 2018)近日,Tableau官方社区发布了本文的压缩精简版(下图),欢迎转发评论。

Tableau 资深用户分享 | 如何深入浅出地学习 LOD 表达式

LOD表达式是Tableau学习过程中特别重要的一关,迈过去,Tableau的可视化可以变化无穷。近期重新梳理自己的学习过程,把几个重点的节点做分析,希望帮到更多的Tableau学习者。

注:本文及续篇,非特别说明,“详细级别表达式”、“LOD表达式”均指Fixed、include和exclude三种LOD表达式。

  • LOD=“详细级别”(level of detail),“详细级别”的含义,及与“详细级别表达式”(Fixed/ Include/ Exclude LOD expression)的关系与区别;
  • Tableau中不同的详细级别,及其对应的表达式;
  • LOD表达式对视图详细级别的影响;
  • LOD表达式与表计算的区别与关系。

一、详细级别与详细级别表达式

理解详细级别表达式(LOD expression),首先要理解什么是详细级别(LOD=level of detail)。详细级别是数据聚合度/颗粒度的层次,英文简单易懂,Level of Detail;不同的Level,代表不同的数据聚合度、不同的颗粒度。

详细级别表达式,并不是独占LOD这个词汇!“详细级别表达式”,只是用来更清晰地处理有关详细级别问题的一种表达式。处理什么问题?处理在一个可视化视图中包含多个数据详细级别的问题(多个详细级别,意味着多个数据聚合度/颗粒度)。

LOD Expressions represent an elegant and powerful way to answer questions involving multiple levels of granularity in a single visualization.
LOD表达式是回答有关单一视图中包含多个数据颗粒度级别问题的,简洁而强大的方法。

1、Level of detail详细级别

在说LOD表达式之前,我们先看看Tableau有哪些重要的“详细级别”。以我目前有限的理解,Tableau有三种主要类型的数据详细级别,结合下面的图片,可以看到它们各自的位置。

  • Table Calc Level of Detail(表计算详细级别)
  • Viz Level of Detail  (视图详细级别,viz=visualization视图)
  • Row Level of Detail(行级别详细级别)

这些详细级别和数据的聚合度、颗粒度对应;越往上,对应的聚合度越高、颗粒度越低。我们最常见的是视图详细级别;表计算是在视图详细级别基础上的二次计算,因此它的聚合度高于视图级别;而视图详细级别是行级别的聚合,因此聚合度高于行级别。

屏幕快照 2019-09-16 上午7.17.31.png

我们可以通过两个散点图代表两个极端,当散点图默认只有一个点的时候,详细级别就是下图左上角的位置——数据完全聚合,最低的颗粒度,最低的详细级别;当数据解聚,所有的数据点都转化为数据点,就是右下角的位置——数据完全解聚,最高的颗粒度,最高的详细级别。(Jan 15, 2019)

LOD   简化版.jpg

这里有一个关键的问题:为什么是三种,而不是包含“详细级别表达式”的四种详细级别?

!!“LOD表达式”本身不是一种详细级别,而是一种关于LOD的语法表达式,它不会脱离当前的视图详细级别而单独构建视图;通过它,在原有的“视图详细级别”基础上,增加新的详细级别数据。理解了这一点,是理解LOD Expression在可视化分析中位置的关键要点。

为了更好的理解,我们在上图的基础上增加了LOD的示例图,这里要特别注意两条红色的线条,它的意思可以理解为,把LOD表达式生成的结果返回到视图层面,从而完成LOD表达式的使命——在一个视图中体现多个详细级别的数据。

详细级别与LOD

接下来的一个问题是,LOD表达式,如何通过影响数据的颗粒度和聚合度,参与到当前视图中?

 

2、 详细级别、聚合度、颗粒度

不同的详细级别代表不同的数据聚合度和颗粒度。Tableau通过把维度字段、系统自定义的表达式加入到视图,从而决定视图数据的详细级别,之后通过预设的视图表达出来。

维度、系统预设的表达式(比如表计算)、用户自定义的表达式(比如自定义的集合字段、LOD表达式)本质上返回的都是一个数据集合,这些数据集合的详细级别,通过不同的视图表达出来。

如何理解上述的过程?为此,我们先要了解何为聚合度和颗粒度。不同于面向行数据的Excel,Tableau面向大数据的数据分析和展现,因此我们所看见的数据绝大多数都是聚合的,这就需要我们非常熟悉每个视图代表的数据的聚合程度。这个聚合程度在Tableau中用聚合度Aggregation 或者颗粒度Granularity 表示。

在Excel中,看数据明细;在Tableau中,看数据的聚合程度。

Tableau的不同的LOD详细级别,对应的是不同数据的聚合度和颗粒度。

我们换一个形象的说法来表达什么是“详细级别”、聚合、颗粒度。

假定全公司的HR薪酬数据是一座冰山,上面是尖尖的数据之巅,下面是沉没在海平面之下的详细到每个人、每天、每项工作的薪酬计算的庞杂数据。通过下面的图,我们可以形象地设想,冰山之巅,就是聚合度最高、颗粒度最低的数据,也是详细级别最低的数据,比如总公司、全年度的薪酬发放金额——可能仅仅是一个绝对值数字而已(数值完全聚合,不能再进一步聚合,可以理解为一个散点图中的一个点)。而越往下,数据的聚合度越低,颗粒度最高,数据的详细级别也就最高,最高颗粒度的数据可能是员工的考勤数据和发放明细(数值完全解聚)。

数据可视化和分析的过程,伴随着数据不断的聚合和解聚,以及数据详细级别的变化。这就是可视化分析的魅力。

Screen Shot 2019-04-14 at 5.05.49 PM.png

Apr 14, 2019  更新图片

在Tableau中,每增加一个维度,就意味着数据的详细级别在向下移动,在视图中的标记就会增加,比如说,我们在部门、实发金额的基础上增加其他维度到视图中,视图中的标记就会越来越多,数据颗粒度、详细程度越来越高。比如下面的图片。。

维度

度量

说明

部门

实发金额

各部门实发金额的对比

部门、薪酬分类

实发金额

各部门、各个薪酬分类的实发金额聚合

部门、薪酬分类

实发金额、实付金额

各部门、各个薪酬分类中实发金额和实付金额的聚合

部门、员工、薪酬分类

实发金额、实付金额

各部门、各个员工,各个薪酬分类中实发、实付金额聚合

分月、部门、员工、薪酬分类

实发金额、实付金额

各个月份中,各部门、各个员工,各个薪酬分类中实发、实付金额聚合

在Tableau中,如何判断操作能引起“视图详细级别”(Viz Level of Detail)的变化?最简单的方法就是看视图中标记的数量。

通常,只要把维度字段或者集字段拖入到视图,Tableau会根据“可视化详细级别”(viz lod)对数据进行聚合,从而引起视图详细级别的变化。(PS:维度字段拖入到筛选器、页面中,可视化的数据范围会发生变化,但是不会引起详细级别变化;加入工具提示只会修改附注的说明。)

屏幕快照 2019-09-15 上午6.49.09.png

3、冰山之喻与LOD expression

在理解了LOD和聚合度、颗粒度之后,我们看一下LOD expression的必要性。

针对某个公司的某年度的员工出勤明细和薪酬明细,当我们问一个问题时,我们大多是看某一个特定的数据层面的问题,比如“看一下各部门年度薪酬总额的对比”,这是一个level的数据,用条形图的每个长条可以代表一个部门及其薪酬总额,通过长度就可以直观对比差异。

如果问题难一点,比如说“看一下各部门中员工平均薪酬的差异”,继续使用条形图,条形依然代表部门,长度代表什么呢?代表员工平均薪酬。可是平均薪酬需要依赖于每个员工的薪酬总额取平均,这个问题的详细级别和之前的部门薪酬不在一个级别上。因此,这个可视化包含了两个不同颗粒度的数据:每个员工的薪酬总额(比如1000人)、各部门的总薪酬(比如10个部门)。这就意味着,我们不能通过一次操作来完成,而需要使用额外的方法增加另一个数据级别。一个视图默认是一个详细级别(level of detail),当我们需要展现两个level of detail时,就需要用到LOD expression。LOD表达式帮助我们解决一个视图中包含多个详细级别的问题。(具体在应用上如何思考这个问题,建议看后面的一篇LOD- 【Tableau】详细级别表达式LOD_终极实践指南与资源大全(3),官方提供了一个思考的框架。)比如下面的问题:

  • 公司每个会员的销售频次分布(即消费1次,2次,N次的会员分别多少)
  • 每个区域中,各个销售员的最大一笔订单的平均值是多少?(极值分析)
  • 每年的销售中,各年度新增会员的消费占比分别是多少?
  • 每个区域的销售金额占总公司的占比是多少?

 

LOD表达式的作用是什么?借用冰山之喻,数据是整座冰山,冰山中有我们能看到的各种要素(比如部门、员工、日期等),可视化的部分是在海平面之上的部分。最简单的可视化方式就是把冰山下的要素直接“拖拽”到上面,不管加入多少要素,最终Tableau会确定性地返回对应的一个详细级别。而遇到上面的复杂问题,我们需要在Tableau返回的确定性的详细级别之外,引用冰山之下的另一个详细级别的数据,同时不想让这个详细级别的要素(维度)出现在可视化的层面,应该如何?——引用但不能出现。

 

Screen Shot 2019-04-14 at 5.05.49 PM.png

这时Tableau LOD提供了一个上升或者下降的通道,实现了“引用但不可见”(比如include),或者“可见但局部不引用”(exclude),甚至可以不受视图和维度筛选影响,直接使用fixed指定引用。“引用但不可见”,就是使用LOD表达式,可以(在目前的维度基础上)引用冰山一下的字段,让它间接出现在可视化中,同时不影响可视化原有的框架表达。同样,也就出现一个下降的通道,可以把部分不需要的字段,通过exclude排除掉,同时又不影响冰上可见的部分。

屏幕快照 2019-08-07 下午12.46.59

include/exclude详细级别

4、LOD详细级别表达式的总结

如果用一句话,通俗的讲解LOD表达式,大概是这句——

“如果分析过程中需要添加一个维度,其明细程度高于或者低于已有视图的可视化明细程度,但又不希望改变现有图形展示内容,可采用详细级别表达式功能。”

官方如此介绍:

详细级别表达式(LOD Expression)提供了对视图详细级别(Viz)之外的数据计算聚合的简单方法,实现在可视化中以任意的方式组合这些数据。
Level of Detail Expressions provide a way to easily compute aggregations that are not at the level of detail of the visualization. You can then integrate those values within visualizations in arbitrary ways.

  • Tableau有三种主要的详细级别,表计算详细级别、视图详细级别和行详细级别;
  • 不同的详细级别,对应不同的数据聚合度和颗粒度;
  • LOD expression不是一种详细级别,它只是Tableau提供给用户的一种表达式运算。
  • LOD expression实现了在视图层面增加另一个详细级别的数据聚合(即多个详细级别)。

 

5、详细级别与对应的表达式

  • Fixed/Include/Exclude Level of Detail Expressions 超越视图级别的详细级别表达式
    • Table-Scoped Level of Detail Expressions  表范围表达式 {sum([sales])},是fixed表达式的省略版;
  • Table Calc Level of Detail Expressions 表计算详细级别表达式   window_sum()
  • Viz Level of Detail 视图级别 (视图详细级别的表达式,即聚合计算)
  • Row Level of Detail Expressions  行级别表达式   [profit ratio]= [profit]/[sales]

在最新的视频中,我按照全新的思路整理了广义的LOD表达式,然后依次介绍:

屏幕快照 2019-09-15 下午6.57.07

 

二、行级别详细级别与视图详细级别

上面我们说了多种LOD的级别,颗粒度最高的是行级别,对应行级别的表达式计算;其次是视图级别。LOD表达式都是在这两种级别上起作用,因此,我们首先要两者这两种的区别。

  • [saesl] / {avg[sales] }   视图行级别销售除以所有商品平均销售
  • sum( [saesl] ) / sum( {avg[sales] } ) 视图聚合销售 除以 所有商品的总和

借助Tableau我们发现,在数据和现实之间,隔着一个窗户即“可视化的图形”(数据、现实和可视化的关系,可参加 [读书]读《数据之美》,学可视化设计)。形象地说,作为连接现实和数据的“中间层”,可视化的图形可以是一台显微镜,看到比视图级别颗粒度更高的数据,也可以是一台望远镜,看到比视图级别聚合度更高的数据。LOD相当于在显微镜、望远镜中增加了新的镜片,它可以帮我们一次看到不同的详细级别。

1、行级别表达式

重要的是记住一点,行级别表达式都是非聚合的;它就像Excel中的公式,是基于每一行的数据计算的。它的语法是这样的:

[Profit Ratio]=[Sales] / [Profit]

一般而言,有关比率的行级别表达式在视图级别会默认聚合,结果的含义就与行级别的意义大不相同。比如,我们创建一个行级别表达式Row_ProfitRatio,然后把它和分类加入到视图,结果是这样的:

LOD 行级别

我们可以修改这个字段的默认聚合为「平均值」,是否有效也要看问题和需求。当我们计算品类利润率时,通行计算方式是品类的总利润除以品类的总销售,即sum[profit]/sum[sales]。

当然,在某些简单计算时候,行级别表达式和聚合表达式具有相同的结果,比如计算成本,行级别[cost]=[sales]-[profit] 结果在品类的层面上聚合,和在商品层面直接执行聚合计算是等价的。这是因为减价计算中括号位置可以随意调整;而乘除运算则不行。

(A1-B1)+(A2-B2)+(A3-B3)=(A1+A2+A3)-(B1+B2+B3)
(A1/B1)+(A2/B2)+(A3/B3)!=(A1+A2+A3)/(B1+B2+B3)

但要记住一点,虽然等价,表达的意义截然不同。不能因为结果一样,而选择错误的表达方式。

Screen Shot 2018-09-29 at 09.43.13.png

「新增」理解行级别表达式有一个好处,就是理解了计算字段在数据源中的位置。简单计算是数据源层面的计算,然后返回一个数值;因此每一个计算字段都会在数据缓存的层面,增加一个虚拟新字段,也就延长了数据源的宽度,当我们查看详细数据时,计算字段就体现在数据源表格的后面。行级别层面的数据计算,是我们理解后面的基础。

 

2、视图级别表达式

视图级别表达式是聚合表达式。所谓视图级别的表达式,就是在可视化图形界面各个维度的计算关系。通过默认执行聚合计算,可以让Tableau自动判断在何时对哪个详细级别执行聚合运算。在视图中,聚合表达式有一个特别明显的标记,“聚合”(英文“AGG”).

 SUM(Profit) / SUM(Sales)

视图级别的表达式,几乎都是聚合,这与行级别表达式完全不同。在学习过程中,一定要清晰地区分二者的不同。我们可以对比一下Excel与Tableau的相似功能。

Excel Tableau
1

行级别

工作表 公式,
eg.  E2=D2/C2
结果是增加了一列字段。
行级别表达式Row Level Expressions
eg. pos= [Profit] / [Sales]
结果是在数据源中增加了一列,与Excel类似。
2

都是在可视化级别

数据透视图 “计算字段”
eg. 利润率=E列 profit/ C列sales
(透视图中的利润执行的是聚合计算)
视图级别表达式——聚合计算
Viz Level of detail Expressions
eg. pos_2= SUM(Profit) / SUM(Sales)
(视图级别是对聚合的运算)
3 数据透视图,通过字段的“汇总方式”和“数据显示方式”,可以做汇总及差异、差异百分比、占列的百分比等; 表计算
Table Calc level of detail Expression
差异、百分比差异、总额百分比、百分位、移动平均、年同比增长率、复合增长率、YTD合计
4 [无]
需要添加辅助字段
表范围 详细级别表达式1
{ sum[profit]},省略了维度的fixed-LOD
 [无]直接用计算公式,Excel视图无关详细级别 “超越视图级别” 详细级别表达式
{fixed/include/exclude  []…:[…]}

在这里,推荐一个Tableau官方视频,对比了上述两种计算的差异,下面中的视频截图应该更清晰的表述了行级别运算和聚合运算的不同。《Tableau-聚合、粒度与比率计算》

小结

  • 行级别表达式运算时不能超越行的级别,是数据源层面的计算,计算针对个体,不针对总体;
  • 视图级别表达式,体现了大数据的特点,是超越个体数据差异的聚合运算,不考虑个体,只计算总体;
  • Tableau是BI工具,以视图级别表达式为基础,聚合运算关注总体的差异。

行级别表达式是可视化之前就计算完成的,是在数据源层面的计算;而视图级别都需要依赖于视图,是基于可视化中维度的计算。

三、详细级别表达式Level of Detail Expression

  • 理解行级别表达式(Row Level Expressions)和视图级别表达式(View Level Expressions)是理解详细级别表达式(LOD=Level of Detail Expression)的基础;
  • 而理解详细级别表达式与维度、度量的关系,以及LOD与操作顺序,则是深入理解LOD语法的关键——我在续篇中有详细介绍(【数据分析】Tableau详细级别表达式_位置与语法)。

在详细介绍LOD表达式的多个语法时,我们以一个简化版的LOD表达式入门——表范围详细级别表达式。

  • {MIN[profits]}
  • {Fixed [year]MIN[profits]}
  • {Fixed [year] ,[area]MIN[profits]}
  • {Fixed [year] ,[area],[products]MIN[profits]}

1、 表范围详细级别表达式 Table-Scoped Level of Detail Expressions

“表范围详细级别表达式”只是省略了维度限定,其实就是没有维度声明的fixed详细级别表达式。因此,我们可以把“表范围详细级别表达式”视为最简单的详细级别表达式。

例如,为了对比视图级别表达式和详细级别表达式,我创建了两个计算字段:

  • MIN(Profits)   非详细表达式,MIN()函数计算,参数是profits字段;
  • { MIN([Profits]) }字段={ MIN(Profits) } 详细级别表达式,对min()函数 扩大范围执行,相当于没有维度声明的fixed 详细级别表达式,计算结果={FIXED : MIN([profit])} .

Screen Shot 2018-10-21 at 17.01.39.png

这个数据只有10行,最后一行的数据,是sum([profits]),在行级别上,和min([profits])是相等的。

这里的fixed详细级别表达式超越了视图级别,相当于在维度筛选之前指定了全局profit数据,返回的是所有year,所有area,所有products下的最小值,涉及的数值有{1,3,5,7,9,11,17,13,15},所以返回最小值1. 这里就需要强调一下——筛选器与操作顺序:fixed在维度筛选之前,否则就会受视图影响。

下图的{ Min(Profit) } 增加了筛选器,你发现仅保留2017年数据时,{ Min(Profit) } 结果依然是存在于2016年的最小值1. 这一点我们在第二篇重点讲解。

屏幕快照 2018-09-20 下午2.01.44.png

LOD位置

关于筛选器和操作顺序,我们会在续篇展开(Tableau详细级别表达式_位置与语法)。

2、Fixed LOD表达式

上面的表范围详细级别表达式,是省略了维度的Fixed表达式,默认是从数据源中的所有数据读取最小值。如果我们指定维度,就是完整的Fixed LOD了。

Fixed适合于LOD的初学者,和include/exclude相比,fixed LOD是绝对的,优先于维度筛选器,它的计算与视图字段也没有关系

详细级别表达式具有以下结构:

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

{}大括号一般都代表数组,一个数组可以包含多个数值,在这里可以包括ABC区域的合计毛利。

为了更好的理解fixed的表达式,我们结合上面的表范围做了一个对比。

Screen Shot 2018-10-21 at 17.13.51.png

在最高的颗粒度明细下,我们对比了四个fixed表达式,区别在于维度数量不断增加。

  • { MIN([Profits]) } = {fixed: MIN([Profits]) } ,就是上面说的表范围,返回给视图一个数值;
  • {FIXED [Year]: MIN([Profits])} 返回每个年份下的的min(profits) 结果,返回给视图两个值min;
  • {FIXED [Year],[Area]:MIN([Profits])} 返回每个年份+每个区域下min(profits)结果,表达式返回给视图 六个min数值;

!! 注意,LOD表达式,是单独从数据源提取一遍数据,把计算的结果返回给视图,多个数值构成一个数组。表范围,即返回一个数值;指定year,那就每个year返回一个数值;指定year+area,那就在每year下的每个area返回一个数值,上面返回23=6个数值;同样的道理,如果是fixex year+area+product,理论上返回23*5个,但是很多数值不存在,返回了所有10个数值。

3、Include /exclude LOD表达式

和fixed特立独行的绝对不同,include和exclude是相对聚合,也就是说,它们如何影响视图详细级别,是受视图中的维度影响的。两者的具体语法,我们在后面再讲述。

INCLUDE LOD,使用指定的维度和视图维度进行计算聚合。由于是在视图维度中增加新维度,因此该表达式返回的结果颗粒度比视图级别更高(聚合级别更低)。

EXCLUDE LOD,在现有视图维度基础上,排除指定的维度进行聚合计算。由于晒视图维度排除指定维度,因此返回的结果颗粒度比视图级别更低。

 

总结

  • 在使用详细级别表达式时,一定要明确,我要在哪个维度上支持聚合?
  • 如果聚合维度不能受维度影响,那就用fixed;如果要指定一个视图中没有的维度,同时还要结合视图的维度,那就用include;如果要排除视图的可见维度,使用exclude;更详细语法见续篇。
  • 表范围详细级别表达式,可以在不使用任何定界关键字的情况下在表级别定义详细级别表达式。就是省略了维度的fixed。
  • 详细级别表达式在除视图级别外的其他维度上支持聚合。利用详细级别表达式,可以将一个或多个维度附加到任何聚合表达式。

 

完整的LOD学习,请按照以下顺序阅读:

  1. 【Tableau】详细级别表达式_从0到1的入门
  2. 【Tableau】详细级别表达式_语法与逻辑  新修改
  3. Tableau|LOD详细级别表达式——方法论与学习资源
  4. Tableau| LOD 核心要点回顾(4)
  5. 【Tableau】LOD15大详细级别表达式-深度解读 (5) NEW 

 

第一版  2017/8/11 夜
第二版 2017/8/12   更改了几处错误
修改  2017/8/23
修改 2017/10/18  ,修改附图,之前有一些错误
修改 1 Sep 2018  修改了一些表述
增补 12 Sep 2018  增加“详细级别与详细级别表达式”、冰山的说明
增补 20 Sep 2018 增加LOD说明,增加fixed说明
增补 25 Sep 2018 G175列车,大面积增加第一部分,并修改错误。
修改 数据 21 Oct 2018 更换数据素材
修改 Jan 15, 2019 调整部分细节文字,修改了图片。
Aug 7,2019 修改一张图片
Sep 16, 2019 更新视频

喜乐君  Tableau dual QA
+086 18615511300 =WeChat微信
yupengw@126.com
——————————————————