一道燒腦的Tableau面試題

blank

一道燒腦的Tableau面試題

近年來我經常受邀給一些公司作短期培訓,也常有機會為公司進行后幾輪的Tableau職位面試提供説明。 幾年下來,經我面試的Tableau從業者已不下百人。 我的面試評分原則是,懂多少Tableau的知識不太重要,重要的是看應聘者是否有較強的邏輯思維能力、接受新知識的能力以及將新學知識立即應用到實際工作中的能力。 知識是可以學的,不會沒關係,沒有人是全才,我教給你,你接受以後能否舉一反三,靈活運用,這才是我面試時重點考察的關鍵所在。 在眾多的題庫里,我經常用一道「橫向取總和,縱向取平均,角落取總值」的面試題來測試應聘者這方面的能力。

在Tableau的Grand Total設置中,我們既可以取兩個方向所有值的總和,也可以取所有值的平均,但無法一個取總和,一個取平均。

blank

blank

怎麼辦? 一般情況下,我會給面試者15-20分鐘左右的時間思考,然後要求他們告訴我解決此問題的思路。 大多數情況都沒有好的解法。 沒關係,這並非我關注的重點。 由此,正式拉開從提示到解答再到應用的漸進式考察之旅!

首先,我要求面試者做下面的視圖:

blank

很明顯這兒的總和是平均值,那是因為在分析 - 合計 - 全部匯總依據功能表下,設置的是取平均值。 但假如我要求此處設置成取總和,但顯示的還是平均值,怎麼辦?

blank

首先我作如下兩個提示:

(1) 區分兩個區域:

圖中,A區域是原來的值,無需作任何變動,但B區域要通過計算欄位來算出平均值。 所以如何區分這兩個區域是第一步,這兒有三種方法可以做到。

第一種方法,用表計算法:

A區域:FIRST() 不等於LAST(),因為按字母排列,FIRST() 是"First Class", LAST() 是"Standard Class",所以不等。

B區域:FIRST() 等於LAST(),因為只有一行,所以FIRST()就是LAST()。

第二種方法,用MIN([Ship Mode]) 和MAX([Ship Mode])聚合計算:

A區域:MIN([Ship Mode]) 等於MAX([Ship Mode]),因為對A區域的每一行來說,MIN([Ship Mode]) 和 MAX([Ship Mode]) 是一樣的,都只有一個值。

B區域:MIN([Ship Mode])不等於MAX([Ship Mode]),因為此區域的MIN([Ship Mode])是"First Class" ,而 MAX([Ship Mode])是"Standard Class",所以不等。

第三種方法,用COUNTD([Ship Mode]) 聚合計算:

A區域:COUNTD([Ship Mode])等於1,因為對A區域的每一行來說,Distinct Count都只有一個值,就是那一行的ship Mode。

B區域:COUNTD([Ship Mode])不等於1,或者說,COUNTD([Ship Mode])=4因為此區域有四個不同Ship Mode。

(2) 通過LOD建一個計算欄位來算出四個Ship Mode的平均值:

這兒需要考察面試者對LOD的掌握程度。 這對進入後幾輪的人來說,應該沒有很大的難度:

AVG({ INCLUDE:SUM([Sales])})

此處通過一個AVG的聚合計算和Include的LOD計算,強制性的求出了基於視圖中所存在維度層面的Sales平均值,而與功能表下"全部匯總依據"設置總和或平均值無關。

綜上所述,通過下面三種計算的任意一種都能算出四個Ship Mode的平均值:

(i) IF FIRST()!=LAST() THEN SUM([Sales]) ELSE AVG({ INCLUDE:SUM([Sales])}) END

(ii) IF MIN([Ship Mode])=MAX([Ship Mode]) THEN SUM([Sales]) ELSE AVG({ INCLUDE:SUM([Sales])}) END

(iii) IF COUNTD([Ship Mode])=1 THEN SUM([Sales]) ELSE AVG({ INCLUDE:SUM([Sales])}) END

blank

也許你會質疑,為什麼要用一個IF的邏輯計算? 不用它,直接用

AVG({ INCLUDE:SUM([Sales])})

一樣可以得到相同的值。

blank

沒錯,假如只想得到縱向的平均值,用不用IF的邏輯計算以區分A、B區域都一樣。 但別忘了,我們需要橫向得到總值而非平均值,這時二者就顯示出區別了。 將Region拖到列中,儘管將"全部匯總依據"設置為"總和",沒有IF的計算橫向也只能得到平均值。 因為 A、B 區域不分,AVG 的計算對橫向和縱向都起作用。

blank

而有IF的計算橫向就得到了總值。 這就是有沒有區別A和B區域的差別所在!

blank

之所以得到了我們想要的結果,是因為一方面設置了"全部匯總依據"為"總和",確保橫向(A區域IF條件成立的狀況)得到總和,另一方面通過AVG的聚合計算和LOD計算,強制性的求出了基於列的視圖層面上的Sales平均值(B區域IF條件不成立的狀況)。 請注意,此處的Include LOD計算值是隨著每一列Region的不同而變化的。

到此為止,面試者在我的提示和説明下一步一步走了過來。 關鍵的時刻到了,接下來我要求面試者所做的才是我要考察的關鍵之處! 在橫向和縱向總和交叉處有一個格子,我要求面試者根據上面解題的思路,在不改變橫向總和、縱向平均值的前提下,改變此交叉點的值。 呈現出所有記錄的Sales總和,其值為2,297,101。

blank

要解決此問題,必須先搞清楚,現在的值143,575是怎麼來的? 代表了什麼? 仔細分析一下,不難發現,此值非常特別,雖然與A,B,C,D同屬最右一列,但它並非E,F,G,H四值的總和。 雖然與E,F,G,H同屬最下一行,但它也並非A,B,C,D四值的平均值。 事實上,它是大方框中12個數位的平均值! 這可從下圖中的計算欄位得到證明。 因為E,F,G,H四值是每列四個數位的平均值,所以此值從大小來說也等於E,F,G,H四值的平均值。

blank

正因為下圖中B1和B2區域行為不同,那麼如何將剛才學到的區分A、B區域的技巧用來區分B1和B2區域,就是我考察面試者是否具備快速將新學知識消化吸收並立即應用到實際工作中的能力的試金石!

blank

很多面試者在此處敗下陣來,一團漿糊,生生不會做!

在這兒,要點是必須從一維思考轉為二維思考,B1和B2區域的COUNTD([Ship Mode])都不等於1,這是兩者共同點,也是縱向區分A和B區域的方法。 而橫向區分B1和B2的關鍵是,必須能想到拿另一維的Region來說事,用COUNTD([Region])是否等於1來將兩者區分。 想到這一層,問題就迎刃而解了,多加一個條件而已!

IF COUNTD([Ship Mode])!=1 AND COUNTD([Region])=1 THEN AVG({ INCLUDE:SUM([Sales])})

ELSEIF COUNTD([Ship Mode])!=1 AND COUNTD([Region])!=1 THEN SUM({SUM([Sales])})

ELSE SUM([Sales])

END

blank

是的,就這麼簡單!

台灣有句古話,授人以魚不如授人以漁。 教會了你如何打魚之後,就要看你能否融會貫通,舉一反三,發現更多更好的捕魚之法。 提高Tableau水準的最佳路徑,就是琢磨。 每次遇到難題,不要輕易求教,應付了事。 一定要自己下功夫、找資料,深入研究、鑽研,經過這樣的努力之後,才能很好地掌握各類技巧,提高水準。 當然,網上看教程、看部落格也不失為好方法,但關鍵是不要看看了事,一定要親自動手、反覆實踐,只有這樣才能將這些技巧真正地據為己有,積累到足夠數量之後,一定能發生從Tableau菜鳥到高手的飛躍!

What do you think?

Written by marketer

blank

某公司銷售數據分析報告(Excel、Tableau)

blank

Tableau下載、安裝、註冊、試用、啟動、秘鑰管理、學生賬號申請全攻略