同比和環比是統計分析中常見的功能,在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數據分析可視化高手進階(新)。