火星撞地球,【實現分組】對比Tableau和PowerBI產品設計思路
- 2019 年 10 月 6 日
- 筆記

介紹一位PowerBI戰友聯盟大咖:葉雲。
本文來自葉雲。
本文案例有多重背景,其一便是上海VIP培訓活動中,小夥伴當場拿出實際業務來希望實現作圖,從開始到超預期的完美實現,共計20分鐘。小夥伴可親自見證在完全精通 PowerBI DAX 下,可以直接驅動作圖實現原來無法完成的效果。
以下內容全部來自 葉雲 老師,感謝分享。
前言
2019年的Gartner又發布了最新的分析及BI平台的魔力象限報告,可以看出其中Tableau和PowerBI遙遙領先,把對手遠遠的甩在了後面。

正如西門吹雪和葉孤城,誰是天下第一,誰能稱霸武林,武林人士都想窺得真相。本文想從一個簡單的分組直方圖的需求出發,來聊聊誰是天下第一。
需求解析
分組分析是最常見的分析需求,直方圖又是分組分析中最常見的數據可視化形式。今天我們就從如何完成以下這張直方圖來聊聊誰是天下第一。

該直方圖按照如下序列分組,同時包含了一個區間篩選,要求在篩選區間控制項內篩選的圖為綠色,篩選外的圖為紅色。
區間標籤 |
最小值 |
最大值 |
---|---|---|
<-24 |
-∞ |
-24 |
[-24,-12) |
-24 |
-12 |
[-12,-6) |
-12 |
-6 |
[-6,0) |
-6 |
0 |
[0,6) |
0 |
6 |
[6,12) |
6 |
12 |
[12,24) |
12 |
24 |
>=24 |
24 |
∞ |
為此我們按需準備了源數據,源數據結構如下,事實表為訂單運輸時間表,我們需要分組的就是其中的「計劃-實際」列,源數據包含1000條數據。
訂單編號 |
運輸距離(km) |
計劃時間(h) |
實際時間(h) |
計劃-實際 |
---|---|---|---|---|
#0001 |
6894 |
230 |
121.9 |
108.1 |
#0002 |
9484 |
317 |
332.85 |
-15.85 |
#0003 |
9498 |
317 |
171.18 |
145.82 |
#0004 |
8353 |
279 |
267.84 |
11.16 |
#0005 |
2406 |
81 |
59.94 |
21.06 |
#0006 |
554 |
19 |
14.82 |
4.18 |
#0007 |
2813 |
94 |
140.06 |
-46.06 |
#0008 |
1302 |
44 |
50.16 |
-6.16 |
…… |
…… |
…… |
…… |
…… |
Tableau實現
1. 繪製直方圖
觀察分組要求得知,這是一個不均勻分組,同時種類眾多,所以無法使用Tableau內置的數據桶工具,只能使用在數據源處增加計算列的方式實現,公式如下:
if [計劃-實際] <-24 then '<-24' elseif [計劃-實際] >= -24 and [計劃-實際] <-12 then '[-24,-12)' elseif [計劃-實際] >= -12 and [計劃-實際] <-6 then '[-12,-6)' elseif [計劃-實際] >= -6 and [計劃-實際] <0 then '[-6,0)' elseif [計劃-實際] >= 0 and [計劃-實際] <6 then '[0,6)' elseif [計劃-實際] >= 6 and [計劃-實際] <12 then '[6,12)' elseif [計劃-實際] >= 12 and [計劃-實際] <24 then '[12,24)' else '>=24' END
以此增加一個分組列,用於分組。再將分組列拖入列,記錄數拖入行,即可得到下圖

2. 增加顏色標註
由於Tableau中沒有表示範圍選擇的控制項,所以增加兩個參數,分別表示區間的最大值和最小值。詳見如下設置。

反思一下我們的需求,我們的需求是對於軸的最大最小值進行篩選,那麼就必須在源數據中增加最大最小值的數據。所以返回需要訂單數據和分組數據做鏈接,此處的聯接鍵使用之前的計算列,為了減少冗餘列,我在此處使用了聯接計算,計算公式同之前使用的計算列公式。完成聯接後即得到以下數據。

現在萬事具備,我們僅需寫個計算欄位用於標記哪些X軸上的選項在區間之內即可,在此一共創建了兩個公式,一個是協助判斷軸區間的,一個是用於判斷軸區間是否在選擇區間之內的。
輔助的計算欄位公式如下:
if MIN([最小值])<0 then MIN([最大值]) ELSE MAX([最小值]) END
著色的計算欄位公式如下:
IF [輔助] > [區間最小值] and [輔助] <=[區間最大值] then 'y' ELSE 'n' END
將計算欄位著色拖入顏色標記中,即可實現要求的效果,滑動滑塊也能產生相應的變化。

Power BI實現
1. 繪製直方圖
傳統方式
傳統方式類似與Tableau的模式類型,都是通過計算列做出的,此處不做冗餘介紹,僅給出計算列的公式:
分組列_方法1 = SWITCH ( TRUE (), [計劃-實際] < -24, "<-24", [計劃-實際] >= -24 && [計劃-實際] < -12, "[-24,-12)", [計劃-實際] >= -12 && [計劃-實際] < -6, "[-12,-6)", [計劃-實際] >= -6 && [計劃-實際] < 0, "[-6,0)", [計劃-實際] >= 0 && [計劃-實際] < 6, "[0,6)", [計劃-實際] >= 6 && [計劃-實際] < 12, "[6,12)", [計劃-實際] >= 12 && [計劃-實際] < 24, "[12,24)", [計劃-實際] >= 24, ">=24" )
相信對於PowerBI熟悉的朋友是小菜一碟。將分組列拖入X軸中即可得到需要的直方圖。
進階方式
當然這種方式的缺點顯而易見,即區間變化時,公式就需要重寫。所以更加推薦以下的寫法,即先創建一張如下所示的分組表。 | Label | 最小值 | 最大值 | | ————- | ————— | ————- | | <-24 | -999999999 | -24 | | [-24,-12) | -24 | -12 | | [-12,-6) | -12 | -6 | | [-6,0) | -6 | 0 | | [0,6) | 0 | 6 | | [6,12) | 6 | 12 | | [12,24) | 12 | 24 | | >=24 | 24 | 999999999 |
然後創建一個計算列,公式如下
分組列_方法2 = CALCULATE ( VALUES ( '分組方式'[Label] ), FILTER ( ALL ( '分組方式' ), '分組方式'[最大值] > '訂單明細'[計劃-實際] && '分組方式'[最小值] <= '訂單明細'[計劃-實際] ) )
這種做法的好處是,需要更改分組方式時,無需修改公式,直接修改分組表即可。
宗師級方式
很多小夥伴以為以上就是最好的方式了?No,最好的方式是度量值,原則上計算列消耗的資源比度量值高得多,尤其是在大數據量時,所以能用度量值解決的,絕不用計算列。以下就給出宗師級的解決方案。詳細的度量值公式如下:
分組方法3 = //確定所選軸標籤 VAR CurrentItem = SELECTEDVALUE ( '分組方式'[Label] ) //確定分組的左值 VAR LeftValue = CALCULATE ( MIN ( '分組方式'[最小值] ), '分組方式'[Label] = CurrentItem ) //確定分組的右值 VAR RightValue = CALCULATE ( MAX ( '分組方式'[最大值] ), '分組方式'[Label] = CurrentItem ) //篩選出符合分組的數據表 VAR ItemRange = FILTER ( ALLSELECTED ( '訂單明細' ), '訂單明細'[計劃-實際] >= LeftValue && '訂單明細'[計劃-實際] < RightValue ) //計算分組的數值 RETURN CALCULATE ( [OrderQty], ItemRange )
是不是有點看暈了,其實很簡單,就是一步一步從訂單明細中篩選出符合分組原則的子集,然後進行計算即可。
2. 增加顏色標註
至此我們已經介紹了如何進行分組,距離成功還差一部,那就是塗色,得益於最近發布的Power BI Desktop(針對Power BI Service,本地部署暫不支援該功能)已經可以使用度量值控制顏色,那麼我們僅需創建進行控制度量值即可。我們可以創建如下度量值:
顏色方案1 = VAR LeftX = MIN ( '區間參數'[區間參數] ) VAR RightX = MAX ( '區間參數'[區間參數] ) VAR RangeItem = IF ( MIN ( '分組方式'[最小值] ) < 0, MIN ( '分組方式'[最大值] ), MAX ( '分組方式'[最小值] ) ) RETURN IF ( RangeItem > LeftX && RangeItem <= RightX, "#61AC85", "#EE3F4D" )
之後打開直方圖的高級設置。使用度量值「顏色方案1」控制顏色即可,最終就得到我們想要的效果啦。其實這部分的實現方式和Tableau中的實現方式算是如出一轍,只是通途異路而已。

3. 終極絕招
最最最終極的絕招來了!該方法的原創來自於BI佐羅,完美貫徹了非侵入式設計(不因可視化和分析的需求,增加任何多餘的關係),顯示了其深厚的DAX模型運用功底。用一個度量值,直接解決了顏色和分組的雙重問題,詳細的度量值如下:
顏色方案2 = VAR CurrntItem = SELECTEDVALUE ( '分組方式'[Label] ) VAR CurrentValue = [分組方法3] VAR CurrentX = IF ( MIN ( '分組方式'[最小值] ) < 0, MIN ( '分組方式'[最大值] ), MAX ( '分組方式'[最小值] ) ) VAR XLeftValue = MIN ( '區間參數'[區間參數] ) VAR XRightValue = MAX ( '區間參數'[區間參數] ) VAR CurrentLegend = SELECTEDVALUE ( RedGreenLegend[Item] ) RETURN SWITCH ( TRUE (), CurrentLegend = "Green" && CurrentX > XLeftValue && CurrentX <= XRightValue, CurrentValue, CurrentLegend = "Red" && ( CurrentX <= XLeftValue || CurrentX > XRightValue ), CurrentValue, BLANK () )
同時這張直方圖並非是簇狀直方圖,而是堆積直方圖,其原理就是如果滿足區間條件,則綠色部分顯示計算值,紅色部分顯示空值(blank),其中奧妙無窮。

總結
本文從一個簡單的需求出發,深入講解了其在Tableau和Power BI中的應用技巧,足見以下這些結論:
- Tableau中在數據可視化的強大能力,其完善的可視化功能足以控制到可視化中的每一個元素,在數據可視化的多樣性和便利性,無人能出其右;
- Power BI在DAX語言的強大能力,微軟將其強大運用與Power BI的每一個角落,從可視化,到建模,到分析,無所不能。也正是如此,Power BI充滿了無限的可能性。也正是微軟在Tabular模型的多年深度耕耘,造就了Power BI今天的厚積薄發;
- 其實沒有真正的天下第一,只是思路不同。Tableau在BI的數據可視化部分深入探索,不停給用戶帶來了便利多樣的數據可視化實現方式,而Power BI貫徹著自己將DAX部署到每一個角落的宏遠,不受任何外界任何影響,它還是沿著自己的道路在前進。