火星撞地球,【實現分組】對比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中的應用技巧,足見以下這些結論:

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