LOD
参考链接
https://www.tableau.com/zh-cn/about/blog/LOD-expressions
理论
前边这两种方法的共性是,如果拖拽一个其它维度的字段到行、列或者Detail shelf,那么整个视图的形态就会立即变化,根据当前最新的Detail层级变化
而,LOD的特色是,你可以在定义Detail层级的同时,独立于视图中使用的维度
一切设置都体现在计算字段的表达式中
INCLUDE: 以较低的Detail进行计算
如果不用LOD,那么就会以给定的视图维度计算。如果用INCLUDE,那么就先根据
举例: superstore数据,每个orderID会有多行购买商品记录。如何计算平均订货量?(即每个订单ID对应的Sales SUM,再按地区求平均)
{ FIXED [Order ID] : SUM([Sales]) }
即先对每个Order ID,求 Sales总和。再参与地区求平均
在计算中使用 INCLUDE 关键字,OrderID字段就会明确包含在计算中,但置于可 视化内容中的其他所有维度(此例中为国家/地区和年份)也会如此。
INCLUDE 关键字可创建聚合度低于(即粒度较高)可视化详细级别的表达式。 执行计算前,指定维度会先添加到可视化详细级别中。
请注意,INCLUDE 表达式在视图中用作聚合度量。 实际上,所有 INCLUDE 表达 式在置于视图上时都会用作度量或聚合度量。
EXCLUDE:以较高的Detail机型计算
此类表达式很适合计算“总额百分比”或“与整体平均值之间的差值”。
视图以月为单位,查看各地区的Sales总额,但还想看到总Sales。
看tooltip:显示了Total Sales
地区虽然在视图中,但EXCLUDE将地区排除在外,创建了一个“高于”可视化Detail的LOD
15大LOD
1. 客户订单频率
Measuring Customer Loyalty
图1:每个客户ID的订单ID种类数
图2:每个订单ID种类类(1 2 3 。。。)对应的客户计数
y: Number of customers LOD 未进一步聚合
x: CNTD(Customer ID) 聚合计数
这个表:
列1:每个CutomerID
列2:对应的 OrderID种类数。
列2做y轴,对列1 countd。
2. 阵列分析
Cohort Analysis
表1:每年的sales总量
表2:每年的sales总量,颜色按客户初次订单日期分组
{FIXED [Customer ID]: MIN([Order Date])}
图1:x轴Date,y轴sum sales。color,lod。
图2:sum sales改为table calculation:percent of total。选择 table down。
计算百分比,每组内部只是Customer Acquisiton Date不同。
3. 每日利润KPI
Daily Profit KPI
表1:每天的profit ;列Sum profit,行 Order Date
表2:字段Profit per day。LOD 计算每日Profit
Profit per Day :{ FIXED [Order Date] : SUM([Profit]) }
Daily Profit KPI:根据上面字段,进行分组。高收益,收益,不收益
表3:行 年 ,月;列 Dayily Profit KPI,CNTD(order date)
每月每组profit有几天。
4. 总额百分比
Percent of Total
{SUM(Sales)} 表示把整个Data Source的SUM(Sales) 成为一个大组,在筛选器之前作用。详细级别仍和当前一致(类似于在当前表加到最后一列)。因此要提取值的时候,需要SUM或MIN,得到一个值。
比如这里只筛选了欧洲地区,但LOD显示的是全球总和。
5. 新客户争取率
New Customer Acquisition
IIF([First Order Date] = [Order Date], "New", "Existing")
First Order Date: {FIXED [Customer ID]: MIN([Order Date])}
逻辑:每一个客户第一次买单日期作为新客户新增日期。然后按日期,计数所有客户。
思路:First Order Date为客户级别LOD,然后根据这个仅保留每个客户的首次订单记录。最后使用running total,得到客户逐步增长记录。
6. 对比销售额分析
Comparative Sales
{ EXCLUDE [Category] : SUM([Selected Sales]) }
Selected Sales基于参数,指定一个category返回对应sales。
不跟据视图的Category,全部显示一样的Sales。
7.各个销售的平均最大交易
Average of Maximum
WINDOW_AVG
8.实际对比目标
每个State 平均Sales-Target值
每个State中,Sales超过Target值的产品比例 (INCLUDE product) 以产品为基数计算总
9.周期最后一天的价值
已有该月份close price的平均值。
还需要该月份最后1天的close price。
{INCLUDE : max([Date])} INCLUDE后不跟维度,即跟视觉中的detail一致,即月份。
if {INCLUDE : max([Date])} = [Date] then [Adj Close] else 0 end 返回每月最后一天的close price
10.重复购买 阵列
-
统计各顾客的第一个购买时间
{FIXED [Customer ID] : MIN([Order Date])}
或者 {EXCLUDE [Order Date]: MIN([Order Date])}
-
统计各顾客的第二次购买时间
计算字段:初次购买为空,其他购买显示购买日期
再次求初次购买日期 重复购买间隔 1和2的差值 datediff(“quarterr”,startdate,enddate)
11.平均值的百分比差异
第二行:求给定时间区间的adj close均值。注意视觉维度是每个日期,每个ticker。(Date是exact date)已经是最细颗粒度了。
{FIXED [Ticker]: AVG([Close value in reference period])} 每个ticker求平均值。
第三行:1和2求差值的百分值。
12.相对周期筛选
考虑
计算top N所占百分比
{SUM([Profit])} 为最细颗粒度计算的SUM值,只是单个的值,没有聚合。
因此这里如果单格显示,应为ATTR。
如果要和SUM(profit)进一步计算,需要自己也变成聚合形式,就在外面再包一层SUM。
计算每个类别与 average per类别的差值
{exclude [Product Sub-Category]:AVG({FIXED [Product Sub-Category]: SUM([Sales])})}
里面的LOD 计算每个类别的sum sales,级别为category。
外面的LOD计算所有类别的avg,级别高于category。
如果不加外面的,average就只会基于category计算,那么仍然等于每个类别的SUM sales。
在2011年有order的客户中,多少百分比的客户也在2012年有order?
LOD意义:每个客户,是否在2012年有order。把其所有order date进行判断,只有有一个1,那么max就可以得到1。并进行true false判定。
{FIXED [Customer ID]:
max( if year( [Order Date]) =2012 then 1 else 0 end)
}=1
filters中拖入order date,筛选2011年
购买8次或9次的顾客数目:
LOD:每位客户的购买次数
{FIXED [Customer ID]:countd([Order ID])}
将柱状图在show me里面改为histogram,然后在marks中将size改为1
计算每个区域和south区的差值
{SUM(IF [Region]="South" then [Sales] else null end)}
如果不打大括号,则detail为region级别。比如central里只计算central中的sales那么就是空。
作为LOD后,detail为所有region级别。
LOD和filter的优先级
FIXED>视图筛选器>INCLUDE>上下文筛选器
表计算
Intro
表计算是对聚合后数据的 二次运算。
当我们对汇总好的数据还是有分析的诉求。例如对汇总数据做个排名,算一下汇总数据各自的占比,根据时间的变化趋势等等。所以也就有了如下的二次计算的各种类型:
- 差异计算
- 移动计算
- 百分比计算
- 排名计算
- 汇总计算
分区字段定义范围:它们将视图分为多个分区或子视图。然后将表计算应用到每个分区内的标记。
-
寻址字段定义方向:它们定义了计算的移动“方向”(例如,在计算汇总或计算值之间的差时)。(理解,即计算时候的颗粒度)
打勾的是寻址字段。
没打勾的是分区字段
简明介绍
Percence of Total:
使用编辑表计算,指定维度。
有三个维度
如果都选中:则每年每区每个邮寄方式,放在一起算百分比
选中邮寄方式和区:则同一年的每区每个邮寄方式,放在一起算百分比。
选中维度,则是计算百分比的时候使用的detail
整个的表计算依据的确定被分成了三个部分:
- 没有打钩的维度,也就是红色框内的维度,参与了数据的划分,可以理解为现根据这些维度进行数据的第一次分组。
- 然后就是使用打钩的维度,也就是黄色框内维度,进行第二次数据划分。
- 最后,对第二次分组的数据,用已经选择好的计算类型进行计算,可以有排序,占比,差异计算等各种运算。第一次分组只是隔离,第二次分组的数据,才会参与二次运算。
第一组就是分区字段;第二组是寻址字段。
各函数介绍
LOOKUP
LOOKUP(SUM([销售额]) ,2) 计算表达式后,向下偏移。即第2行。
LOOKUP([Daily Close],-1) 向上偏移1个的Daily Close值
RUNNING_AVG
从分区第一行到当前行的所有数据,计算AVG
FIRST():当前行索引+FIRST 则为第一行索引
当前行到分区的第一行的偏移(要回到第一行,往上移动,索引需要-n)。
当前行索引为3时,FIRST()为-2
LAST():当前行索引+LAST 则为最后一行索引
当前行到分区中最后一行的行数。当前行索引为3(共7行),LAST()为-4
WINDOW
start,end:
- 如果留空,相当于FIRST和LAST,即整个分区。跟当前行无关。、
- 与当前行的偏移。0表示当前行,2表示当前行往下两行。
WINDOW_AVG(SUM([Profit]), FIRST()+1, 0)
计算从第二行到当前行的 SUM(Profit) 平均值。
WINDOW_SUM(SUM([Adj Close]),0,2) 当前行到下面两行共三行的SUM值
多度量的文本表
方法一:将Dimension字段放在Row中,第一个度量放在Text中,双击第二个变量。Tableau会自动将 Maasure Name和Measure values都添加。之后可以自行添加和删除。下面可以双击键入新的度量值(函数)
方法二:Measure Names拖到行,Measure Values拖到 文本。Measure Values Card(上面这个),拖入拖出度量值。
10大表计算
6.加权平均
TC-Weighted-Average
权重计算:Order Quantity在各类别的SUM / 总SUM
表计算方法:
sum([Order Quantity]) / window_sum(sum([Order Quantity]),First(),Last())
window_sum计算的是整个分区的SUM值。(当前表颗粒度)
LOD方法:
SUM([Order Quantity]) / MIN({SUM([Order Quantity])})
{}计算的是整个范围的SUM,但detail仍然是最细颗粒度。因此为了和前面的聚合一致,还要用MIN或者SUM做一次聚合。
7.按计算分组
TC-Grouping-by-Calc
IF ( SUM([Shipping Cost]) -
WINDOW_AVG(SUM([Shipping Cost]), First(), Last()) < 0 )
THEN '< avg'
ELSE '>= avg'
END
根据与SUM之后再求均值来比较大小,来分组。
对应的LOD如下:在Product category级别做SUM计算,再高一级做计算。
{ EXCLUDE [Product Category]: AVG({FIXED [Product Category]: SUM([Shipping Cost])})}
表计算可以在视图汇总的基础上做进一步计算。
LOD需要时刻关注视频的详细级别。
8.移动范围的事件数
incidence over a range
用Rows分组并dual axis,可看。
9.可变时段的移动平均
TC-Moving-Average
WINDOW_AVG(SUM([Sales]), -[Periods to Average:]+1, 0)
10.各时段与平均值的差异
当年平均值差异:仅选中季度维度
总体平均值差异:维度全部选中
其他问题
filter 顺序
表计算字段,可以放入筛选器中,但它不会影响计算结果。
比如,我需要根据sales来排序Category,并只显示top N。RANK(SUM(Sales))
可以放入filters中,但它会筛选显示topN,但不会影响total的计算。
方法二,建一个参数topN,然后在category的edit filter中,
横总和,纵平均值问题
grand total 是基于上面表格的维度,再进一步聚合。比如求sum,min,max等。
分区A、B有几种方法。
-
区分之后,B区
AVG({INCLUDE [Ship Mode]: SUM([Sales])})
B区在聚合计算之前,先做上述计算:增加ship mode维度,先求sum再求avg(只有一个值了)。之后再根据表格维度聚合求sum。
(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
IF COUNTD([Ship Mode]) =1 then sum([Sales]) elseif countd([Region]) =1 then AVG({include [Ship Mode]:sum([Sales])}) else sum([Sales]) end
百分比之后筛选
lookup(min([Sub-Category]),0)
此处MIN功能的目的是将Subcategory变成一个聚合计算,这是lookup所要求的,当然也可以用MAX和ATTR等。
表计算得到的 sub-category list。
放到filter里,就是最低优先级的表计算筛选器。表计算之后才会筛选。
方法二:
分母所包含的表范围LOD计算算出总体销售额,它属于Fixed详细级别计算,不受维度筛选器的影响,因此选中的所有维度都将保持原先的百分比值。
筛选后仍显示被筛选掉的value值0
方法一:不在filters中筛选,而是写在计算字段中。IF 条件1 and 条件2 then 0 else 0 end
用计算字段计数
其他
数据 discrete和continuous,会导致数据的显示和计算方式完全不同。
order date 由周1,周2变为1234,discrete变为continous
参考
https://learningtableau.com/qualified-associate-quiz-1/
https://interworks.com/blog/rcurtis/2016/03/21/tableau-deep-dive-lod-introduction-detail
地理字段(国家,城市,片区)为手动填写,导致填写错误或不规范,建议做成选择框,提供规范化的地理信息进行选择
增加机型表字段,提供标准化的机型列表供选择。目前的[产品名称]字段过于冗长,无法很好的归类。
https://www.vizwiz.com/search?q=tip+tips
https://www.storytellingwithdata.com/blog/2018/3/9/bring-on-the-bar-charts
{ INCLUDE [SN+故障代码] : count([工单链接])-1}
{ FIXED [SN+故障代码] : count([工单链接])-1}