差不多花了十几天的时间,一直在想Tableau表计算的逻辑,我想我应该找到了完整地理解表计算的究竟方法,思路和脉络先整理如下,然后通过视频完整表达,并完善其中的逻辑框架。

关于表计算的逻辑部分,视频已经开始更新(声音最近有点哑,见谅),感觉本文过于抽象的新手,推荐视频学习:

一、什么是表计算的独特性和差异性?

完整的说,“表计算是在本地对视图数据的二次聚合”,不过这句话是站到全局角度的概括,对于新人而言,反而徒增压力,不知其所以然。那如何更简单的介绍表计算?也许我们可以尝试用下面的几句话:

“表计算是对视图中数值的计算。” (英文版)
“表计算是 单一聚合度量,在维度间的行内计算。”(拆解版,适合新手)
“表计算是在本地对聚合数据的二次聚合计算。”(功能版本)

截屏2019-10-10上午8.09.57

理解这句话是完整理解表计算的基础,而理解这句话的最好方式,是把它与行级别计算、视图计算做一个简单的比较。

  • 行级别计算是在数据库对多个度量字段直接计算,比如profit/sales,类似于Excel的计算公式;
  • 视图级别的计算(聚合计算),是在数据库对多个度量字段聚合再计算,而后呈现在视图中,比如sum[profit]/sum[sales],类似于Excel中数据透视图中的计算;
  • 表计算,是在视图中对单一度量字段(聚合)内,不同行的相互计算,比如sum[profit],计算2014年和2015年的差异。在不更改数据结构的前提下,聚合计算无法完成这种行内计算(多行之间的计算)。

截屏2019-10-10上午8.11.07

典型代表是:差异计算。不建议大家刚上来用index来理解。

这是表计算的独特性和差异性,是行级别计算、聚合计算、狭义LOD计算都无法完成的。

Table Calculation—— computation on values in a table

总结三句话:

  • 表计算是做行内计算;
  • 表计算只针对单一度量值计算。
  • 维度参与计算过程!(要害)

 

二、表计算的关键——理解分区与依据

表计算是单一度量字段内的行内计算,而其关键,或者是独特性是维度参与计算过程。所以理解表计算的关键,是理解维度在表计算中的作用。

截屏2019-10-10上午8.16.33.png

既然是单一度量字段内的计算,就有先后和边界。比如计算差异,当前值和前一个数值计算差异,还是和后一个数值计算差异?如果度量字段被年和类别两个字段分类,跨越类别的差异没有意义,因此就需要设定一个边界,让每个类别都能重新开始,而非连续计算差异。

所以,使用表计算的关键是:根据需要设置你的计算依据和边界(分区),这一切的开关是:维度。

而这里的关键提示是,暂时放下lod的思路,放下此前的冰山模型和四步骤逻辑,完全用方向和边界的思路去理解表计算的内部逻辑

1、表计算的关键是维度参与计算过程

2、表计算的逻辑(下图)

具有表计算的视图中,维度可以分为 方向维度和范围维度,非此即彼。

截屏2019-10-15下午7.11.34

因为方向和范围是非此即彼的关系,方向的终点就是范围,所以理解的关键是方向字段。

3、单一方向字段

方向字段决定了表计算的核心逻辑。–范例:

  • –沿着 年, 计算 (各年)销售额的同比差异;
  • –沿着 订单日期month,计算(各日期)销售额的移动汇总;
  • –沿着 类别,计算(各类别)销售额的排名;
  • –沿着 省/自治区,计算  全国 销售额的汇总
  • –沿着 省/自治区,计算  全国 销售额的总体平均值
  • 沿着 订单日期month,计算(各日期)销售额的7天移动平均

4、多个方向字段的情形

表计算中最难的,在于多个方向维度时的设置,特别是还需要把表计算结果转化为可视化图形的时候(参见10大表计算的案例 )​。按照我多年的使用经验,最佳的实践​经验如下:

  • 永远都要使用“编辑表计算”来设置方向,不要使用表/区​;
  • 把方向维度和范围维度,分别放在列和行上,而非混在一起;
  • 多个方向维度的走向,使用“长城凹凸图”来表示,列中先后顺序,要和“编辑表计算”中的​顺序一致。

2 表计算方向 5

  • 先做完计算,然后转化图形。

5、相对方向和分区,是上述问题的简化形式

但是不推荐使用。

 

三、表计算的应用建议

1、不要从可视化开始,从交叉表开始,严格按照上面的最佳实践

2、一次性加入所有方向字段,分区字段可以逐步增加

3、尽可能不用相对方向和范围,除非是因为题目太容易

4、务必考虑筛选器的影响

 

四、相对和绝对设置

Tableau中有两种依据和分区的方法,分别称之为相对依据与分区、绝对依据与分区,前者更基本,后者更高级,适合于多维度下的表计算设定。

1、相对direction and scope

table ——pane ——cell

Tableau把每个度量在多个维度下的组合称之为表、区、和单元格三个层次,分别代表最大的范围、中等范围和最小范围。按照这个分类设置的计算依据和分区,就可以指引表计算的方向和边界。在有区的情况下,所有的依据和方向就是下面的组合,总共三种边界划分方法,内部又按照方向而不同:

截屏2019-10-19上午9.06.54

这个有助于学习的理解,但是这个设置有一个重大的安全风险——当我们调整维度的位置时,分区就会变化,表计算结果就会随着变化,可能会在意料之外。

2、绝对 addressing and  partition

安全的方法是使用表、区和单元格的理念,把范围指定到具体的维度,这样即便维度位置更改,也不会影响每个单元格下的计算结果,相当于锁定了表计算的依据和分区。

指定某个维度作为分区字段,也就是仅在指定的维度内运算。

这里理解的关键是:所有勾选的是依据,没有勾选的是分区。

table_calculations11.png

总结:

在数据准备阶段可以使用相对依据和分区,确定之后改为绝对依据和分区,然后调整数据为可视化视图。

 

四、表计算函数和分类

经典的表计算是差异。

还有一些复杂一些的表计算,汇总(移动求和)、移动平均、排序。

移动计算,就是按照指定的方向,指定行内计算的数量,计算聚合结果。比如股票常用的7天移动平均收盘价,就是每天都去看过去7天的累计平均值,从而减少波动查看长时间的变化趋势。

排序,则是没有方向,只是在指定分区内把所有度量值做一个先后排名。

我们可以表表计算分为两大类:

  • 不需要计算方向的表计算
    • 分区所有数值求和 total
    • 指定范围聚合 window_sum  window_avg
    • 指定范围统计 window_stdev/stdep…
    • size 表计算
  • 需指定计算方向的表计算
    • 汇总 running_total
    • 查找数值 lookup  (延伸 差异、差异%、同比、同比%)
    • 上一个数值 previous_value
    • 指定范围排序  rank
    • 特别函数 first、last、index

六、什么是快速表计算?

快速表计算只是常见表计算及其与聚合计算的组合方法。

不要上来就按照快速表计算去理解整个框架。

 

七、表计算与狭义LOD表达式

在部分情形下,表计算可以用LOD表达式来等价完成,一般具备以下几个条件:

  • 不需要指定方向的计算;
  • 计算边界为从始至终,即整个维度指定的范围;

比如指定分区的求和,常见的合计百分比背后的逻辑是指定分区的聚合求和total和视图的二次计算。

 

Oct 6, 2019 草图
Oct 8, 2019 框架更新
Oct 15, 2019