【Tableau】詳細級別表達式LOD_詳盡入門指南(1)

blank

【Tableau】詳細級別表達式LOD_詳盡入門指南(1)

注:持續修改中
致力成為面向數據小白的、易懂又全面的、非官方Tableau-LOD華文手冊。

【2019年中秋】很多人聯繫我說"LOD部落格説明很大","是最清晰的LOD部落格",但有感覺多有贅繞。 畢竟是分多次所寫,近半年一直沒有重大更新,實在抱歉。 中秋三天,我終於把最難的LOD表達式的核心原理視頻錄製完成了,可以作為問本部落格的修訂版本。

很多人希望我修改部落格,但是我知道過去的思維已經很難打破,困難重重。 錄製視頻的好處是,強迫自己閉關三天開發了一套全新的分析視角,錄製過程"製作PPT——錄製1080P視頻"一氣呵成,完全超過我自己的想像。 在視頻中,我把行級別、視圖級別、表計算、LODs整合在一起,分為了三類六種的Lod運算式,然後由淺入深層層分析。 會比此前的部落格更加容易接受,特別適合於沒有IT基礎的業務使用者。

視頻剛剛發佈位址:Tableau廣義LOD表達式高級分析 知識無價,廣結善緣 12.99$。

瞭解此次課程的緣起和框架說明,可以閱讀:

blank

編者按:在我學習Tableau過程中,詳細級別表達式是最大的攔路虎,我前後花了一個多月時間瞭解了它的概念,半年多時間才明白它的具體用法和技巧。 這篇部落格,最早寫於2018年8月,一年時間做了幾次重大修改,並增加了續篇。 (Sep 2018)

LOD表達式是Tableau學習過程中特別重要的一關,邁過去,Tableau的可視化可以變化無窮,根據需要產生非常多的變化。 近期重新梳理自己的學習過程,把幾個重點的節點做分析,希望幫到更多的Tableau學習者。

注:本文及續篇,非特別說明,"詳細級別表達式"、"LOD表達式"均指Fixed、include和exclude三種LOD表達式。

  • LOD="詳細級別"(level of detail),"詳細級別"在Tableau中的含義,及與"詳細級別表達式"(Fixed、Include、Exclude,LOD expression)的關係與區別;
  • Tableau中不同的詳細級別,及其對應的表達式;
  • LOD表達式對視圖詳細級別的影響;
  • LOD運算式與表計算的區別與關係。

一、詳細級別與詳細級別運算式(NEW)

理解詳細級別表達式(LOD expression),首先要理解什麼是詳細級別(LOD=level of detail)。 詳細級別是數據聚合度/顆粒度的層次,英文簡單易懂,Level of Detail;不同的Level,代表不同的數據聚合度、不同的顆粒度。

詳細級別表達式,並不是獨佔LOD這個詞彙! "詳細級別表達式",只是用來更清晰地處理有關詳細級別問題的一種運算式。 處理什麼問題? 處理在一個可視化視圖中包含多個數據詳細級別的問題(多個詳細級別=》多個聚合度=》多個顆粒度)。

LOD Expressions represent an elegant and powerful way to answer questions involving multiple levels of granularity in a single visualization.
LOD表達式是回答有關單一視圖中包含多個數據顆粒度級別問題的,簡潔而強大的方法。

1、Level of dtail詳細級別

在說LOD表達式之前,我們先看看Tableau有哪些重要的「詳細級別」,

  • Table Calc Level of Detail(表計算詳細級別)
  • Viz Level of Detail (視圖詳細級別,viz=visualization視圖)
  • Row Level of Detail(行級別詳細級別)

這些詳細級別和數據的聚合度、顆粒度對應;越往上,對應的聚合度越高、顆粒度越低。

blank

這裡有一個關鍵的問題:為什麼是三種,而不是包含「詳細級別表達式」的四種詳細級別?

!! "LOD表達式"本身不是y詳細級別,而是一種關於LOD的語法表達式;通過它,在原有的"視圖詳細級別"基礎上,增加新的詳細級別。 理解了這一點,是理解LOD Expression在可視化分析中位置的關鍵要點。

接下來的一個問題是,LOD表達式,如何通過影響數據的顆粒度和聚合度,參與到當前視圖中?

2、 詳細級別、聚合度、顆粒度

不同的詳細級別代表不同的數據聚合度和顆粒度。 Tableau通過把維度字段、系統自定義的表達式加入到視圖,從而決定視圖數據的詳細級別,之後通過預設的視圖表達出來。

  • 維度、系統預設的表達式(比如表計算)、使用者自定義的表達式(比如自定義的集合欄位、LOD運算式)本質上返回的都是一個數據集合,這些數據集合的詳細級別,通過不同的檢視表達出來。

如何理解上述的過程? 為此,我們先要瞭解何為聚合度和顆粒度。 不同於面向行數據的Excel,Tableau面向大數據的數據分析和展現,因此我們所看見的數據絕大多數都是聚合的,這就需要我們非常熟悉每個視圖代表的數據的聚合程度。 這個聚合程度在Tableau中用聚合度Aggregation或者顆粒度Granularity表示。

在Excel中,看數據明細;在Tableau中,看數據的聚合程度。

Tableau的不同的LOD詳細級別,對應的是不同數據的聚合度和顆粒度。

我們換一個形象的說法來表達什麼是"詳細級別"、聚合、顆粒度。

假定全公司的HR薪酬數據是一座冰山,上面是尖尖的數據之巔,下面是沉沒在海平面之下的詳細到每個人、每天、每項工作的薪酬計算的龐雜數據。 通過下面的圖,我們可以形象地設想,冰山之巔,就是聚合度最高、顆粒度最低的數據,也是詳細級別最低的數據,比如總公司、全年度的薪酬發放金額——可能僅僅是一個絕對值數位而已(數值完全聚合,不能再進一步聚合)。 而越往下,數據的聚合度越低,顆粒度最高,數據的詳細級別也就最高,最高顆粒度的數據可能是員工的考勤數據和發放明細(數值完全解聚)。

數據可視化和分析的過程,伴隨著數據不斷的聚合和解聚,以及數據詳細級別的變化。 這就是可視化分析的魅力之一。

blank

在Tableau中,每增加一個維度,就意味著數據的詳細級別在向下移動,在視圖中的標記就會增加,比如說,我們在部門、實發金額的基礎上增加其他維度到視圖中,視圖中的標記就會越來越多,數據顆粒度、詳細程度越來越高。 比如下面的圖片,每增加一個維度或者度量字段,數據的詳細級別就會從上向下移動,數據的顆粒度就會增加一層。

維度度量說明部門實發金額各部門實發金額的對比部門、薪酬分類實發金額各部門、各個薪酬分類的實發金額聚合部門、薪酬分類實發金額、實付金額各部門、各個薪酬分類中實發金額和實付金額的聚合部門、員工、薪酬分類實發金額、實付金額各部門、各個員工,各個薪酬分類中實發、實付金額聚合分月、部門、員工、薪酬分類實發金額、實付金額各個月份中,各部門、各個員工,各個薪酬分類中實發、實付金額聚合

在Tableau中,如何判斷操作能引起「視圖詳細級別」(Viz Level of Detail)的變化? 最簡單的方法就是看視圖中標記的數量。

通常,只要把維度欄位或者集字段拖入到視圖,Tableau會根據「可視化詳細級別」(viz lod)對數據進行聚合,從而引起詳細級別的變化。 (PS:維度欄位拖入到篩選器、工具提示中,可視化的數據範圍等會發生變化,但是不會引起詳細級別變化。 )

blank

3、冰山之喻與LOD expression

在理解了LOD和聚合度、顆粒度之後,我們看一下LOD expression的必要性。

針對上面數據,我們問的每個問題,都對應著一個或者多個 Level of Detail。

簡單的問題,比如"看一下各部門年度薪酬總額的對比",這是一個level的數據,用柱狀圖可視化,每個柱代表一個部門,通過看高矮對比金額的差異。

如果問題難一點,比如說,「看一下各部門中員工平均薪酬的對比」,繼續使用柱狀圖,柱子依然代表部門,高度代表什麼呢? 代表員工平均薪酬。 可是平均薪酬需要依賴於每個員工的薪酬總額取平均,這個問題的詳細級別level of detail和部門薪酬不在一個級別level上。 因此,這個可視化包含了兩個不同顆粒度的數據:每個員工的薪酬總額、部門的薪酬平均。 這就以為著,我們不能通過一次操作來完成,而需要使用額外的方法增加另一個數據級別。 一個視圖預設是一個詳細級別(level of detail),當我們需要展現兩個level of detail時,就需要用到LOD expression。 LOD表達式幫助我們解決一個視圖中包含多個詳細級別的問題。 (具體在應用上如何思考這個問題,建議看後面的一篇LOD- 【Tableau】詳細級別表達式LOD_終極實踐指南與資源大全(3),官方提供了一個思考的框架。 )

LOD表達式的作用是什麼? 借用上面的冰山的比喻,抽象地說明什麼是LOD expression。 數據是整座冰山,冰山中有我們能看到的各種要素(比如部門、員工、日期等),可視化的部分是在海平面之上的部分。 最簡單的可視化方式就是把冰山下的要素直接「拖拽」到上面,不管加入多少要素,最終Tableau會確定性的返回對應的一個詳細級別。 而遇到上面的複雜問題,我們需要在Tableau返回的確定性的詳細級別之外,引用另一個詳細級別的數據,同時不想讓這個詳細級別的要素(維度)出現在可視化的層面,應該如何? 也就是,我們需要引用一個字段,但是不希望它出現。

這時Tableau LOD提供了一個上升或者下降的通道,實現了"引用但不可見"(比如include),或者"可見但局部不引用"(exclude),甚至可以不受視圖和維度篩選影響,直接使用fixed指定引用。 "引用但不可見",就是使用LOD表達式,可以(在目前的維度基礎上)引用冰山一下的字段,讓它間接地直接的出現在可視化中,同時不影響可視化原有的框架表達。 同樣,也就出現一個下降的通道,可以把部分不需要的欄位,通過exclude排除掉,同時又不影響冰上可見的部分。

blank

剛剛修改了上面的圖,這裏特別說明一點,藍色的線條》》

LOD表達式因為不是因為不一種詳細級別,只是在視圖詳細級別上,增加了新的資料詳細級別的數據,因此,任何一個LOD運算式,都是在生成新的詳細級別計算結果后,把這個結果返回到當前的可視化詳細級別。 因此,兩個藍色的線條,都是回到當前的可視化視圖,也就是返回一個聚合結果。

4、LOD詳細級別表達式的總結

"如果分析過程中需要添加一個維度,其明細程度高於或者低於已有視圖的可視化明細程度,但又不希望改變現有圖形展示內容,可採用詳細級別表達式功能。" (記住這句話,反覆琢磨)

官方如此介紹:

詳細級別表達式(LOD Expression)提供了對視圖詳細級別(Viz)之外的數據計算聚合的簡單方法,實現在可視化中以任意的方式組合這些數據。
Level of Detail Expressions provide a way to easily compute aggregations that are not at the level of detail of the visualization. You can then integrate those values within visualizations in arbitrary ways.

  • Tableau有三種主要的詳細級別,表計算詳細級別、視圖詳細級別和行詳細級別;
  • 不同的詳細級別,對應不同的數據聚合度和顆粒度;
  • LOD expression不是一種詳細級別,它只是Tableau提供給使用者的一種表達式運算。

(25 Sep 2018 / G175 RailWay)

詳細級別與對應的表達式

  • Fixed/Include/Exclude Level of Detail Expressions 超越視圖級別的詳細級別表達式
    • Table-Scoped Level of Detail Expressions 表範圍表達式 {sum([sales])},是fixed表達式的省略版;

  • Table Calc Level of Detail Expressions 表計算表達式 window_sum()
  • Viz Level of Detail視圖級別
  • Row Level of Detail Expressions 行級別表達式 [profit ratio]= [profit]/[sales]

二、行級別詳細級別與視圖詳細級別

上面我們說說了多種LOD的級別,顆粒度最高的是行級別,對應行級別的表達式計算;其次是視圖級別。 LOD表達式都是在這兩種級別上起作用,因此,我們首先要兩者這兩種的區別。

借助Tableau我們發現,在數據和現實之間,隔著一個窗戶即"可視化的圖形"(數據、現實和可視化的關係,可參加 [讀書]讀《數據之美》,學可視化設計)。 形象地說,作為連接現實和數據的"中間層",可視化的圖形可以是一台顯微鏡,看到比視圖級別顆粒度更高的數據,也可以是一台望遠鏡,看到比視圖級別聚合度更高的數據。 LOD相當於在現有顯微鏡、望遠鏡中增加了新的鏡片,它可以幫我們一次看到不同的詳細級別。

1、行級別表達式

重要的是記住一點,行級別表達式都是非聚合的;它就像Excel中的公式,是基於每一行的數據計算的。 它的語法是這樣的:

[Profit Ratio]=[Sales] / [Profit]
一般而言,有關比率的行級別表達式只有在行級別才有意義;超過行級別就會執行預設聚合,結果的含義就與行級別的意義大不相同。 比如,我們創建一個行級別表達式Row_ProfitRatio,然後把它和分類加入到視圖,結果是這樣的:

blank

對行級別比率的求和聚合,是沒有意義的。 當然,我們可以修改這個欄位的預設聚合為「平均值」,是否有效也要看問題和需求。 當我們計算品類獲利率時,我們的通行計算方式是品類的總利潤除以品類的總銷售,即sum[profit]/sum[sales],而不是對行級別獲利率的平均值。

當然,在某些簡單計算時候,行級別表達式和聚合表達式具有相同的結果,比如計算成本,行級別[cost]=[sales]-[profit] 結果在品類的層面上聚合,和在商品層面直接執行聚合計算是等價的。 這是因為減價計算中括弧位置可以隨意調整;而乘除運算則不行。

(A1-B1)+(A2-B2)+(A3-B3)=(A1+A2+A3)-(B1+B2+B3)
(A1/B1)+(A2/B2)+(A3/B3)! =(A1+A2+A3)/(B1+B2+B3)

但要記住一點,雖然等價,表達的意義截然不同。 不能因為結果一樣,而選擇錯誤的表達方式。

blank

「新增」理解行級別表達式有一個好處,就是理解了計算字段在數據源中的位置。 簡單計算是數據源層面的計算,然後返回一個數值;因此每一個計算欄位都會在數據緩存的層面,增加一個虛擬新字段,也就延長了數據源的寬度,當我們查看詳細數據時,計算欄位就體現在數據源表格的後面。 行級別層面的數據計算,是我們理解後面的基礎。

2、檢視級別表達式

視圖級別表達式是聚合表達式。 所謂檢視級別的運算式,就是在視覺化圖形介面各個維度的計算關係。 通過預設執行聚合計算,可以讓Tableau自動判斷在何時對哪個詳細級別執行聚合運算。 在視圖中,聚合表達式有一個特別明顯的標記,"聚合"(英文"AGG"),或者"屬性"(英文ATTR)

SUM(Profit) / SUM(Sales)

視圖級別的表達式,幾乎都是聚合的。 這與行級別表達式完全不同。 在學習過程中,一定要清晰地區分二者的不同,否則就會在寫計算欄位時容易進入誤區。

我們可以對比一下Excel與Tableau的相似功能。

blank

在這裡,推薦一個Tableau官方視頻,對比了上述兩種計算的差異,下面中的視頻截圖應該更清晰的表述了行級別運算和聚合運算的不同。 《Tableau-聚合、粒度與比率計算》

總結一下

  • 行級別表達式運算時不能超越行的級別,是數據源層面的計算,結果不是聚合運算,計算針對個體,不針對總體;
  • 視圖級別表達式,體現了大數據的特點,是超越個體數據差異的聚合運算,不考慮個體,只計算總體;
  • Tableau是BI工具,以視圖級別表達式為基礎,聚合運算關注總體的差異。

行級別表達式是可視化之前就計算完成的,是在數據源層面的計算;而視圖級別都需要依賴於視圖,是基於可視化中維度的計算。

三、詳細級別表示式Level of Detail Expression

在詳細介紹LOD表達式的多個語法時,我們以一個簡化版的LOD表達式入門——表範圍詳細級別表達式。

  • {MIN[profits]}
  • {Fixed [year] : MIN[profits]}
  • {Fixed [year] ,[area]: MIN[profits]}
  • {Fixed [year] ,[area],[products]: MIN[profits]}

1、 表範圍詳細級別表達式 Table-Scoped Level of Detail Expressions

表範圍詳細級別表達式「只是省略了維度限定,其實就是沒有維度聲明的fixed詳細級別表達式。 因此,我們可以把"表範圍詳細級別表達式"視為最簡單的詳細級別表達式。

例如,為了對比檢視級別運算式和詳細級別運算式,我創建了兩個計算字段:

  • Min(Profits) 非詳細表達式,min()函數計算,參數是profits字段;
  • { MIN([Profits]) }字段={ Min(Profits) } 詳細級別表達式,對min()函數 擴大範圍執行,相當於沒有維度聲明的fixed 詳細級別表達式,計算結果={FIXED : MIN([profit])} .

blank

這個數據的詳細級別是最高的顆粒度,數據只有10行,最後一行的數據,是sum([profits]),在行級別上,和min([profits])是相等的。

詳細級別表達式超越了視圖級別,相當於在維度篩選之前指定了全域profit數據,返回的是所有year,所有area,所有produts下的最小值,涉及的數值有{1,3,5,7,9,11,17,13,15},所以返回最小值1. 這裡就需要強調一下——篩選器與操作順序:fixed在維度篩選之前,否則就會受視圖影響。

下圖的{ Min(Profit) } 增加了篩選器,你發現僅保留2017年數據時,{ Min(Profit) } 結果依然是存在於2016年的最小值1. 這一點我們在第二篇重點講解。

blank

blank

關於篩選器和操作順序,我們會在續篇展開(Tableau詳細級別運算式_位置與語法)。

2、Fixed LOD表達式

上面的表範圍詳細級別表達式,是省略了維度的Fixed表達式,預設是從數據源中的所有數據讀取最小值。 如果我們指定維度,就是完整的Fixed LOD了。

Fixed適合於LOD的初學者,和include/exclude相比,fixed LOD是絕對的,優先於維度篩選器,與視圖字段也沒有關係。

詳細等級運算式具有以下結構:

{[FIXED | INCLUDE | EXCLUDE] <維度聲明>: <聚合表達式>}
{}大括弧一般都代表陣列,一個陣列可以包含多個數值,在這裡可以包括ABC區域的合計毛利。

為了更好的理解fixed的表達式,我們結合上面的表範圍做了一個對比。

blank

在最高的顆粒度明細下,我們對比了四個fixed表達式,區別在於維度數量不斷增加。

  • { MIN([Profits]) } = {fixed: MIN([Profits]) } ,就是上面說的表範圍,返回給視圖一個數值;
  • {FIXED [Year]: MIN([Profits])} 傳回每個年份下的的min(profits) 結果,返回給視圖兩個值min;
  • {FIXED [Year],[Area]:MIN([Profits])} 傳回每個年份+每個區域下min(profits)結果,表達式返回給視圖 六個min數值;

!! 注意,LOD表達式,是單獨從數據源提取一遍數據,把計算的結果返回給視圖,多個數值構成一個陣列。 表範圍,即範圍一個數值;指定year,那就每個year返回一個數值;指定year+area,那就在每year下的每個area返回一個數值,上面返回2*3=6個數值;同樣的道理,如果是fixex year+area+product,理論上返回2*3*5個,但是很多數值不存在,返回了所有10個數值。

3、Include /exclude LOD表達式

和fixed特立獨行的絕對不同,include和exclude是相對聚合,也就是說,它們如何影響視圖詳細級別,是受視圖中的維度影響的。

INCLUDE LOD,使用指定的維度和視圖維度進行計算聚合。 由於是在視圖維度中增加新維度,因此該表達式返回的結果顆粒度比視圖級別更高(聚合級別更低)。

總結

  • 在使用詳細級別表達式時,一定要明確,我要在哪個維度上支援聚合?
  • 如果聚合維度不能受維度影響,那就用fixed;如果要指定一個視圖中沒有的維度,同時還要結合視圖的維度,那就用include;如果要排除視圖的可見維度,使用exclude;更詳細語法見續篇。
  • 表範圍詳細級別表示式,可以在不使用任何定界關鍵字的情況下在表級別定義詳細級別表達式。 就是省略了維度的fixed。
  • 詳細等級表示式在除檢視等級外的其他維度上支援聚合。 利用詳細級別表達式,可以將一個或多個維度附加到任何聚合運算式。

完整的LOD學習,請按照以下順序閱讀:

  1. 【Tableau】詳細級別表達式_從0到1的入門
  2. 【Tableau】詳細級別表達式_位置與語法
  3. Tableau| LOD詳細級別表達式終極實操
  4. Tableau| LOD 核心要點回顧(4)
  5. 【Tableau】LOD15大詳細級別表達式-深度解讀 (5)NEW

第一版 2017/8/11 夜
第二版 2017/8/12 更改了幾處錯誤
修改 2017/8/23
修改 2017/10/18 ,修改附圖,之前有一些錯誤
修改 1 Sep 2018 修改了一些表述
增補 12 Sep 2018 增加"詳細級別與詳細級別運算式"、冰山的說明
增補 20 Sep 2018 增加LOD說明,增加fixed說明
增補 25 Sep 2018 G175列車,大面積增加第一部分,並修改錯誤。
修改數據 21 Oct 2018 更換數據素材

by 喜樂君 (+086 18615511300=WeChat微信)

What do you think?

Written by marketer

深度測評:BI分析工具FineBI vs Tableau

blank

使用tableau建經營看板