Tableau技巧——快速计算同比和环比(及其衍生)

浏览: 2817

同比和环比是统计分析中常见的功能,在Tableau中,通过表计算,我们不用写一行代码,就可以快速实现同比和环比。

环比

根据百度得到,环比增长率=(本期数-上期数)/上期数×100%。

以2016年10月销售额为例,环比增长率=(2016年10月销售额-2016年9月销售额)/2016年9月销售额*100。那么在Tableau中,怎么才能不写代码就得到环比增长率呢?不写代码?我书读的少,不要忽悠我哦!

以10.2版本为例,数据源使用自带的《示例 - 超市》,读取数据源后,将订单日期拖到行功能区,右键选择下面的“月”格式,并设置为离散,效果如下:

image.png

然后复制度量窗格的“销售额”,将“度量名称”拖到列功能区,按住ctrl键将“度量名称”从列功能区拖到筛选器区,并选择“销售额”、“销售额(复制)”两个度量字段:

image.png

将“度量”窗格的“度量值”拖到“标记”——“文本”:

image.png

这样我们就得到了一个按年月升序排列的销售额数据,接下来右键“标记”区的“总计(销售额(复制))”字段,选择“快速表计算”——“百分比差异”,就得到了我们想要的环比数据啦:

image.png

image.png

设置下字体格式,编辑下字段别名:

image.png

你没有看错,就是辣么简单!就是不写一行代码!就是辣么任性!环比就搞定了!!!

先不要高兴的太早,老话说,知其然,还要知其所以然。为什么Tableau计算环比这么简单,我们来看看原因在哪里。

在前面的操作中,我们使用了Tableau一个强大的功能,表计算。这里的表,并不是数据源对应的那个表,而是一个虚拟表,是在工作表开发界面由选择的维度和度量构成的一张虚拟表。在环比这个例子中,虚拟表是由“订单日期”按照年月格式显示的一个维度字段,和“销售额”、“销售额(复制)”两个度量字段,按照“订单日期”升序排列而创建。升序排列让Tableau知道该如何选择“本期”和“上期”,两个度量字段用于实际计算环比,但是最关键一步,还是在于选择的表计算类型“百分比差异“。让我们右键“总计(销售额(复制))”字段,选择“编辑表计算”,一探“百分比差异”的神奇之处:

image.png

这里有几个关键之处,首先我们看到“计算依据”选择了“表(向下)”,由于虚拟表是按照订单日期升序排列,因此“表(向下)”告诉了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月销售额计算完毕,整个表计算也就结束。

有同学会问,如果不是升序排列,而是降序呢?那么只要在“相对于”这里,选择“下一”就可以了:

image.png

再提高一点,除了通过可视化了解环比,还可以通过Tableau自动生成的代码来学习环比计算,我们可以双击“标记”区的“总计(销售额(复制))”字段,将里面的代码拷贝出来,贴到一个文本文件:

image.png

是不是看了有点晕,没关系,我们先解释下几个函数:

ZN函数是指如果括号里的表达式结果不为NULL,则返回它,否则返回0。用这个函数主要是处理NULL值。

ABS函数是取括号里表达式的绝对值。

重点来了,赶紧记赶紧记,LOOKUP函数是这段代码的灵魂,括号内分两部分,逗号前面是当前值,后面的-1表示上一个值,翻译成人话就是根据当前值,找它的上一个值。

三个函数明白了以后,这段代码的含义就可以理解为:

(当前值 - 根据当前值找到它的上一个值)/根据当前值找到它的上一个值的绝对值。虽然有点绕口,但这就是“表计算——百分比差异”在Tableau中的语法。

掌握了这个公式,其实我们就可以直接用代码来快速实现同比了。

同比

根据百度得到,同比增长率=(本期数-同期数)/同期数×100%。

以2016年10月销售额为例,环比增长率=(2016年10月销售额-2015年10月销售额)/2015年10月销售额*100。下面我们看下如何快速实现同比。我们复制刚才的“环比”工作表,重命名为“同比”:

image.png

然后我们双击“标记”——“总计(销售额(复制))”,将公式修改如下:

(ZN(SUM([销售额 (复制)])) - LOOKUP(ZN(SUM([销售额 (复制)])), -12)) / ABS(LOOKUP(ZN(SUM([销售额 (复制)])), -12))

想一下,为什么这里不是-1,而是-12了?





因为同比,只要日期中间没有中断,那么上一个值就应该是去年同月,自然等于当前年月-12了。

我们来看下结果:

image.png

2013年的12个月份,由于没有对应的2012年数据,因此同比也没有数据,第一个应该是从2014年1月开始。有兴趣同学可以逐一核对。

如果日期按降序排列,那么代码中只需要将-12替换成12就可以了,是不是非常的简单方便!

掌握了这个计算公式后,不论同比、环比,还是当前值与之前、之后的任一值进行比较,我们都可以快速通过修改代码,迅速得到正确结果,就是辣么爽!

注意事项:

1.日期序列中间不能有缺失,比如2016年12个月,如果没有5月份,那就变成6月-4月,这是不对的。因此需要对数据源做出处理,人为添加5月份,值为0即可。

2.由于这个方法与日期字段的排序有紧密关系,因此当用户修改了排序顺序后,原来的计算公式就失效了,聪明的你,是否有更好的解决方案呢?

3.有关表计算的更多内容,请参考课程:Tableau数据分析可视化高手进阶(新)

推荐 5
本文由 gogodiy 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册