同比和环比是统计分析中常见的功能,在Tableau中,通过表计算,我们不用写一行代码,就可以快速实现同比和环比。
环比
根据百度得到,环比增长率=(本期数-上期数)/上期数×100%。
以2016年10月销售额为例,环比增长率=(2016年10月销售额-2016年9月销售额)/2016年9月销售额*100。那么在Tableau中,怎么才能不写代码就得到环比增长率呢?不写代码?我书读的少,不要忽悠我哦!
以10.2版本为例,数据源使用自带的《示例 - 超市》,读取数据源后,将订单日期拖到行功能区,右键选择下面的“月”格式,并设置为离散,效果如下:
然后复制度量窗格的“销售额”,将“度量名称”拖到列功能区,按住ctrl键将“度量名称”从列功能区拖到筛选器区,并选择“销售额”、“销售额(复制)”两个度量字段:
将“度量”窗格的“度量值”拖到“标记”——“文本”:
这样我们就得到了一个按年月升序排列的销售额数据,接下来右键“标记”区的“总计(销售额(复制))”字段,选择“快速表计算”——“百分比差异”,就得到了我们想要的环比数据啦:
设置下字体格式,编辑下字段别名:
你没有看错,就是辣么简单!就是不写一行代码!就是辣么任性!环比就搞定了!!!
先不要高兴的太早,老话说,知其然,还要知其所以然。为什么Tableau计算环比这么简单,我们来看看原因在哪里。
在前面的操作中,我们使用了Tableau一个强大的功能,表计算。这里的表,并不是数据源对应的那个表,而是一个虚拟表,是在工作表开发界面由选择的维度和度量构成的一张虚拟表。在环比这个例子中,虚拟表是由“订单日期”按照年月格式显示的一个维度字段,和“销售额”、“销售额(复制)”两个度量字段,按照“订单日期”升序排列而创建。升序排列让Tableau知道该如何选择“本期”和“上期”,两个度量字段用于实际计算环比,但是最关键一步,还是在于选择的表计算类型“百分比差异“。让我们右键“总计(销售额(复制))”字段,选择“编辑表计算”,一探“百分比差异”的神奇之处:
这里有几个关键之处,首先我们看到“计算依据”选择了“表(向下)”,由于虚拟表是按照订单日期升序排列,因此“表(向下)”告诉了Tableau你计算“百分比差异”的顺序是往下,另外下面可以看到“相对于”——“上一”,这就是告诉Tableau,“上期”的位置是“当期”的上面一个数值。翻译成人话就是,从2013年1月开始计算,往下一直到2016年12月。第一个当期是2013年1月销售额,上期就是上一行,也就是2012年12月销售额,但是虚拟表中没有2012年12月销售额,因此2013年1月的环比为空。然后往下到第二行,2013年2月销售额为当期,那么上期就是上一行,也就是2013年1月销售额,这时候按照内置的计算逻辑:(2013年2月销售额-2013年1月销售额)/2013年1月销售额*100,就得到了2013年2月环比增长率,后面以此类推,直接2016年12月销售额计算完毕,整个表计算也就结束。
有同学会问,如果不是升序排列,而是降序呢?那么只要在“相对于”这里,选择“下一”就可以了:
再提高一点,除了通过可视化了解环比,还可以通过Tableau自动生成的代码来学习环比计算,我们可以双击“标记”区的“总计(销售额(复制))”字段,将里面的代码拷贝出来,贴到一个文本文件:
是不是看了有点晕,没关系,我们先解释下几个函数:
ZN函数是指如果括号里的表达式结果不为NULL,则返回它,否则返回0。用这个函数主要是处理NULL值。
ABS函数是取括号里表达式的绝对值。
重点来了,赶紧记赶紧记,LOOKUP函数是这段代码的灵魂,括号内分两部分,逗号前面是当前值,后面的-1表示上一个值,翻译成人话就是根据当前值,找它的上一个值。
三个函数明白了以后,这段代码的含义就可以理解为:
(当前值 - 根据当前值找到它的上一个值)/根据当前值找到它的上一个值的绝对值。虽然有点绕口,但这就是“表计算——百分比差异”在Tableau中的语法。
掌握了这个公式,其实我们就可以直接用代码来快速实现同比了。
同比
根据百度得到,同比增长率=(本期数-同期数)/同期数×100%。
以2016年10月销售额为例,环比增长率=(2016年10月销售额-2015年10月销售额)/2015年10月销售额*100。下面我们看下如何快速实现同比。我们复制刚才的“环比”工作表,重命名为“同比”:
然后我们双击“标记”——“总计(销售额(复制))”,将公式修改如下:
(ZN(SUM([销售额 (复制)])) - LOOKUP(ZN(SUM([销售额 (复制)])),-12)) / ABS(LOOKUP(ZN(SUM([销售额 (复制)])),-12))
想一下,为什么这里不是-1,而是-12了?
因为同比,只要日期中间没有中断,那么上一个值就应该是去年同月,自然等于当前年月-12了。
我们来看下结果:
2013年的12个月份,由于没有对应的2012年数据,因此同比也没有数据,第一个应该是从2014年1月开始。有兴趣同学可以逐一核对。
如果日期按降序排列,那么代码中只需要将-12替换成12就可以了,是不是非常的简单方便!
掌握了这个计算公式后,不论同比、环比,还是当前值与之前、之后的任一值进行比较,我们都可以快速通过修改代码,迅速得到正确结果,就是辣么爽!
注意事项:
1.日期序列中间不能有缺失,比如2016年12个月,如果没有5月份,那就变成6月-4月,这是不对的。因此需要对数据源做出处理,人为添加5月份,值为0即可。
2.由于这个方法与日期字段的排序有紧密关系,因此当用户修改了排序顺序后,原来的计算公式就失效了,聪明的你,是否有更好的解决方案呢?
3.有关表计算的更多内容,请参考课程:Tableau数据分析可视化高手进阶(新)。