致力于航空、生产制造、零售等多行业产品方案与服务
- 🎓 文科背景、法学学士|教育学硕士
- 📊 业务数据分析「专家」· 敏捷 BI 布道师
- 📚 《数据可视化分析》《业务可视化分析》图书作者
- 🎓 中国地质大学(武汉)经管学院 MBA 校外导师
- 🤝 以 Tableau 会友,致力于构建业务分析通识框架
📚 本文配套课程 · 数据可视化分析系列
🎬 B 站课程:数据可视化分析:Tableau/SQL 原理与实践 — https://www.bilibili.com/cheese/play/ss8093
摘自《业务可视化分析:从问题到图形的 Tableau 方法》,本部分将在第二版本修订时替换
8.5 筛选与占比:展示单一类别的占比
和其他问题类型相比,占比的独特性在于它必然包含了两个详细级别:当前的个体和更高聚合的合计(TOTAL)。而当问题仅指向一部分数据,同时还要引用总体数据完成占比分析时,就要在详细级别计算基础上再叠加考虑计算的优先级问题,更容易把分析师引入歧途。
这里以Tableau的超市数据为例,具体说明筛选对占比分析的影响,并阐述多种方法。
问题是“各省份,办公用品销售额总和,以及其(在本省总销售额)占比”。问题中包含“筛选”需求(有3个类别,办公用品是其一);占比是办公用品的销售额与全部类别销售额的比值,这就包含了两个度量,默认属于两个详细级别。筛选、计算、详细级别的组合,就有了多种可能,多种方法。按照难易程度分别介绍如下。
8.5.1 方法一:使用“隐藏”功能分析单一类别占比
“隐藏”功能也许是最简单的,它不是数据的筛选,而是视图要素的“筛选显示”(在第7章7.6.2节分析同比时已经提及)。
如图8-22所示,在“各省份各类别销售额”的堆叠条形图中,在标记的标签中增加“销售额”度量,鼠标右击,在弹出的快捷菜单中选择“快速表计算→合计百分比”命令,并设置计算依据为“类别”,结果就是“各省份各类别销售额,以及其占比”。之后在右侧图例上,选择“办公用品”之外的类别右击,在弹出的快捷菜单中选择“隐藏”命令(注意不是排除),即可仅保留办公用品类别,同时不影响计算。
隐藏不等于筛选,这里问题和视图详细级别是“省/自治区*类别”(特别注意这里),隐藏没有改变问题的详细级别,没有改变计算数据的多少,只是一次性地遮挡了部分可视化元素。

图8-22 指定类别的占比:使用隐藏功能
相比后面的多种方式,这是最简单的方式,但也是缺乏扩展性的方式,隐藏不能引用参数、不能互动,常用于一次性设置。所以还是要通过计算、筛选组合的方式来实现。
8.5.2 方法二:使用“行级别计算”分析单一类别占比
使用行级别计算,是为了实现灵活性,配合参数可以自由选择“类别”。
如图8-23所示,这里先使用IIF()逻辑计算,提取了指定类别的所有交易的销售额,然后在视图详细级别(“省/自治区”)把它们聚合,再与总销售额相除。

图8-23 占比计算:使用行级别计算提取指定类别的销售额
注意,和此前的方法不同,这里视图详细级别是“省/自治区”,因此默认聚合SUM([销售额])是“各省(所有类别)的销售额”,即占比的分母。
不依赖于筛选,这里需要计算指定类别的销售额,可以假设在数据明细中增加一个辅助列——只要对应“办公用品”的交易,就等于它的销售额,否则为空。这就是最简单的逻辑函数:
IIF([类别]=[para类别],[销售额],NULL))
把参数类别的销售额和其他的空值(NULL)加起来,然后除以销售额总和,就是参数类别的占比了。
SUM(IIF([类别]=[para类别],[销售额],NULL)))
/ SUM([销售额])
和第一种“隐藏”方法一样,这里也没有使用筛选,这是共同点。差异在于,这里通过IIF()逻辑计算,在明细上增加了辅助字段,是在数据上下功夫;而隐藏没有创建辅助计算,无须计算,只是在视图上减少可视化要素,是在视图上下功夫。
以Tableau为代表的BI工具在分析方面的强大功能,是建立在计算的大厦基础上的,深入地理解行级别、聚合计算的逻辑过程与先后,是熟练使用它们完成各种分析的基础。
不过,笔者非常迫切地提醒每位读者,千万不要滥用这种借助于IIF()函数筛选数据的方法,由于通常的逻辑判断(标准是逻辑判断不包含聚合)都是行级别的判断,相比聚合计算,它们会严重地制约视图的性能。最佳的策略是通过筛选、聚合计算来替代。
8.5.3 方法三:使用“筛选和高级计算”分析单一类别占比
“样本范围”是问题分析的三大构成之一。基于筛选,如何构建占比呢?这就需要一个优先级高于筛选器的计算。
如图8-24所示,问题的详细级别是“省/自治区”,筛选器筛选了“办公用品”(使用参数以突出筛选值),因此视图中的销售额聚合就是“各省份的办公用品销售额总和”,也就是占比的分子。

图8-24 占比计算:使用高级计算返回优先于筛选器的聚合
分母应该是是各省份所有类别的销售额总和,这就要优先于筛选器完成聚合。如果使用SQL,则要单独完成两次查询右连接(join)。在Tableau中,可以通过“狭义LOD表达式”引用优先于筛选器的预先聚合。
{ FIXED [省/自治区]: SUM([销售额])}
这就是此前说的高级数据类型:字典。它的结果类似{山东:100,河北:200,河南:300,上海:500}。
最后,引用这个字段中的聚合值,就可以计算两个聚合的比例,即占比。
SUM([销售额])
/SUM({ FIXED [省/自治区]: SUM([销售额])})
在这里,分子是筛选后的各省聚合,而FIXED则实现筛选前的各省聚合,详细级别、聚合方式完全相同,唯一的差别在于前者受筛选器影响,后者不受,因此比值就是样本在总体的占比。
从性能的角度看,筛选器(类别=参数类别)也是行级别判断,不过由于布尔计算是最快的计算,它对性能的影响可以最小化;假定有34个省,那么占比计算需要计算34个聚合值和34个筛选前的聚合值,再考虑到FIXED LOD外的聚合,粗略地说,一次计算就能完成。相比之下,8.5.2节中通过行级别计算的方式更缓慢,这在企业生产环境中表现尤为明显。
行级别的计算可以理解为数据整理和数据准备,而高级计算则面向敏捷分析和业务探索,这也是之后进行结构化分析的关键。当然,关于所有计算的逻辑,欢迎阅读本书的姊妹篇《数据可视化分析(第2版)》一书第3篇。