近期,重写《数据可视化分析:Tableau原理与实践》第二章

2.2  解析:问题的解析与层次分析方法

问题解析是分析的开始。在2.1小节的基础上进一步展开如下图2-6所示,它构成了本节的基础框架,连接了第五章的很多功能。这里依次展开深入分析维度、聚合与层次。

图2‑6  问题分析是一切的起点

基于图2-6的框架,笔者要努力诠释几个重点:何为层次(LOD),层次如何变化?又何为聚合,聚合从何而来?层次有几层,聚合分几种?它们与数据准备、计算有何关联?

2.2.1  问题解析:维度描述问题、度量回答答案

假设一个从简单的业务场景:新季度伊始,领导要求分析一下各类别、各地区的销售,客户数量并从客户数量角度探索一下市场风险。其中可能会分析以下的问题:

  • 公司的销售额总和是多少?[1]
  • 各类别的销售额总和是多少?
  • 各地区的销售额总和是多少?
  • 在技术类别中,各地区、各月的销售额总和分别是多少?
  • 在技术类别中,各地区、各月的客户数量分别有多少?

一句话必然由多个字段构成。每一个问题都必然包含两类字段:“描述问题是什么”的描述字段和“回答答案有多少”的聚合字段,分别位于“的”的前后。上面用蓝色代表问题,绿色代表答案[2],着重号代表答案中包含的聚合方式,而橙色代表样本范围。

用来“描述问题是什么”的字段,通常称之为“分类字段”,而“回答答案有多少”的聚合字段,称之为“量化字段”(比如销售额总和、客户数量)。顾名思义,“分类字段”用于描述数据彼此各不相同的,比如“红塔山、玉溪、泰山”等;而“量化字段”即以“数量”描述多少,比如10,108.88等,数字揭示问题的精准答案。

在Tableau中,“分类字段”称为“维度”(Dimension),而“量化字段”主要来自于“度量”(Measure)的默认聚合,也可来自维度字段的聚合,比如“客户数量”“最大日期”。由于维度字段的聚合可以通过计算字段生成聚合,必要时还可以保存为“度量字段”,因此本书概括如图所示:

用一句话概括:

“维度字段描述问题(是什么),度量聚合回答答案(有多少)”

很多问题还包含了“分析的样本范围”部分,如最后两个示例中的“在技术类别中”。分析样本范围,可以是基于维度字段的,也可以是基于度量字段的,通常都是“在……中”、“(时间或数字等连续范围)从……到……”、“(销售额)前……名的(客户)”、“(利润)大于……的(客户)”等表述方式。Tableau中对应筛选(Filter)、集(Set)等功能,并能通过参数(Parameter)、动作(Action)等交互方式控制样本范围。多种筛选器和数据查询动作构成了Tableau特别重要的一个主题——操作顺序(Order of Operations)。本书会在第五章、第七章及第二篇深入介绍。

按照问题的分解方法,上述多个问题可以用表2-1表示。简单的问题只有一个维度字段,复杂问题则会同时包含多个。本书中用“地区*月”表示一个问题的层次/详细级别。

图表 2-11 问题的分解

问题样本范围维度(层次)聚合方式(度量)
公司的销售额总和是多少?公司,即总体无,即最高层次SUM(销售额)
各类别的销售额总和是多少?无,即总体类别SUM(销售额)
各地区的销售额总和是多少?无,即总体地区SUM(销售额)
在技术类别中,各地区、各月的销售额总和分别是多少?技术类别——维度筛选器地区*月SUM(销售额)
在技术类别中,各地区、各月的客户数量分别有多少?技术类别——维度筛选器地区*月COUNTD(客户ID)

问题的复杂性与度量无关,都是由维度字段引起的,比如主视图中包含了另一个层次的度量。度量的聚合只是在问题对应的层次上的聚合而已。那“聚合”是如何发生的?

2.2.2  聚合解析:可视化是从行级别到视图级别的聚合过程

“维度字段描述问题是什么”,问题的层次,就是度量字段聚合的依据。

举例而言,楼下超市每天要给不同客户销售很多商品,每个客户的一次交易对应一个订单ID,一个订单ID包含一种或多种商品(类似于你的购物篮或者购物推车放上了各种产品去结算),这些字段和成交信息(如销售额、数量、利润等)一起保存在数据库中。摘要主要的字段如下:

图 2-7 超市交易对应的行级别/明细数据示例(部分字段、部分数据)

假如超市领导问:“2020年6月,各类别的销售额与订单数分别是多少?”

按照前文方法,可以快速分解问题:“2020年6月”是样本范围、“类别”是维度代表问题的层次、“销售额(总和)”和“订单数(不同计数)”是度量聚合用于回答答案。

假定只有3个类别,那就意味着答案中要有3个销售额和3个订单数数量,共计6个数字标记。它们从成千上万的交易中累加而成,把这个过程之为“聚合”。总结而言,聚合就是从数据库记录的明细级别(行级别),聚合到问题所在的层次级别(视图级别)的过程。由于Tableau用视图回答问题,因此问题对应的层次也称之为“视图层次”。如图2-X所示。

图2‑8 视图是从行级别数据到问题层次的聚合

如果此时领导又想查看“公司的总销售额”,即各类别合计的销售额,以及“各个类别、各月的销售额增长趋势”,这两个问题的层次与“各类别的销售额”明显不同。如何描述多个问题的层次之高低不同呢?既然每个问题都是从行级别数据聚合而来的,那么就可以以数据表的行级别为参考基准,使用“聚合”的高低描述问题层次的相互关系,称之为“聚合度”(Aggregation)。

如图2-X所示,由于“总公司的销售额”(1个数)可以由“各类别的销售额”(3个数)聚合而成,因此,前者的聚合度比后者更高;同理,“各类别的销售额”比“各类别、各月的销售额”聚合度更高。

图2‑9 使用聚合度描述具有相同维度的多个问题之间的层次关系

多个问题都是从相同的数据表行级别聚合而来,包含相同维度字段的问题之间就具有了层次关系,甚至可以脱离行级别彼此聚合和解聚。而“各类别的销售额”和“各客户的最早订单日期”的层次是没有关系的,因此说后者相对于前者是完全独立的层次/详细级别。

“聚合”的对立面就是“解聚”。一个聚合数值,可以解聚为多个更细的数据颗粒。和聚合度(Aggregation)相对应的是颗粒度(Granularity),聚合度越高、颗粒度越低。我们可以把每一个数据形象地比作沙滩上的沙粒,聚合度提高时,沙粒就会减少,“颗粒度”也就降低。通常IT人员更关心明细,常用颗粒度描述多个表的层次;而业务分析师更关心高层次问题,因此常用聚合度描述层次关系。本书主要使用“聚合度”一词。

因此,当我们想要表达一个问题的层次高于另一个问题层次时,可以说“这个问题的层次/详细级别(聚合度)高于另一个问题”,这也是本书的标准用法,如果一个单位的分析师统一了沟通的背景知识,“聚合度”可以省略。

聚合就是从数据库记录的明细级别(行级别),聚合到问题所在的层次级别(视图级别)的过程。“聚合度”和“颗粒度”描述不同问题的层次。

聚合的对象是行级别的数据,聚合的结果是视图级别的答案,二者对应两个数据层次。也就是说,“行级别”数据和“视图级别”问题,通过“聚合”而衔接,此乃关键。

对于任意一个数据表而言(不管是Excel文件还是数据库表),它所对应的最低聚合层次就是稳定不变的、客观存在的,比如销售表和退货表的行级别层次可以用“订单ID*商品ID”描述,而客户信息表可以“客户ID”描述。本书把这个层次称之为“行级别层次”(Row Level),或者“客观的数据表层次”,第5章介绍了理解数据表层次结构的推荐方法。行级别层次中的每一行明细,称之为“记录”(Record),所以通常用“记录数”描述明细行数。

相对应的是,所有的问题、所有的视图层次,都是主观的、随时变化的,都是从行级别层次聚合而来,本书称之为“问题层次”或者“视图层次”(Visualization Level)。问题层次对应描述问题的句义,它需要从行级别聚合获得答案。

在自序中有这样一句话:

“最后,我找到了从Excel分析到Tableau大数据分析的根本性差异,即层次。客观的数据层次用于描述数据结构和颗粒度,主观的视图层次用于描述业务问题及其相关性,并通过计算的多种分类把二者融为一体。全书都贯穿了“层次分析”的思路,并在高级计算部分得以升华——高级计算的实质就是多层次问题分析。”

理解这两种类型的层次,是深入开始商业数据分析的基础和关键,也是本书后续很多知识的基础。

– 理解每个表的“行级别层次”,是理解第4章连接Join和关系Relationship的关键;

– 理解问题的“视图层次”,是理解第5章可视化的起点,也是数据混合的基础;

– 理解复杂问题中包含的多个“视图层次”及其相互关系,是理解第二篇表计算和狭义LOD表达式的基础。

2.2.3  层次解析:两类层次与数据准备、计算的关系

前面说“聚合”是从行级别数据到视图级别问题的过程,可以说,问题、视图、聚合是统一的。描述它们的关键词是层次(或者说详细级别),这是贯穿本书的主线。笔者尝试着用下图2-X描述统一这几个核心概念,在此基础上介绍层次与数据准备、计算的关系。

图 2-10

只有两种层次,其一是行级别(Row Level),其二是是视图级别(Visualization Level)。数据查询、计算和可视化展现都必然对应某个层次。这一部分需要结合本书第三四章节、第二篇方能更好的理解。

  • 层次与数据准备

本书把数据准备分为数据合并、数据结构调整和数据处理几大类。其中数据合并包括数据并集Union、数据连接Join、数据混合Blend和数据关系Relationship几大功能。

从Tableau2020.2版本之后,Tableau把数据合并发展为包含物理层和逻辑层的准备模型。何为“物理”(physical)?即实际存在、稳定不变之意。何为“逻辑”(logical)?即根据视图需要而灵活创建,而非事先合并。物理关系如同父子关系,血亲基于血缘不可更改;逻辑关系如同夫妻,家庭因爱而来,亦可随时因怨而去。

图 2-11 物理关系与逻辑关系

并集和连接Join可以视为是行级别的数据合并,在构建视图之前预先生成稳定不变的数据源,胜在稳定、弱在性能,俗称“大宽表”;混合可以视为视图级别的数据合并,是在主数据源构建的视图(聚合)基础上增加辅助数据源对应的聚合,是基于当前视图需要构建的合并,脱离当前视图,合并就不存在了,因此称之为“逻辑关系”。

Tableau2020.2版本新推出的数据关系,相当于把此前视图阶段的数据混合,提前到了数据准备阶段,但是并没有改变“逻辑关系”实质;它通过物理层保留了并集和连接Join(行级别的合并),通过逻辑层引入了逻辑关系,可以说取长补短,可谓大成。图2-X展示了包含了并集、连接join、关系和混合多种方式的数据模型,第4章会详细介绍。

图 2-12 包含并集、连接、关系和混合的模型

既然并集和连接Join是行级别的匹配,因此就需要两个表的行级别是一致的,否则轻则重复降低性能,重则出错影响分析。比如销售明细表和销售退货表,二者均在“订单ID*产品ID”层次。

而混合和关系由于是视图级别的逻辑关系,因此支持行级别不同的数据表的匹配——聚合会自动将两侧聚合到相同的视图级别。

在阅读第4章时,务必要仔细揣摩理解其中的区别。

  • 层次与计算

不同的计算,也处于不同的层次中。理解字段所在的层次推荐方式是假想有一座“数据冰山”。分析之前,先把数据表中的所有字段想象为冰山底层的颗粒,行级别字段是视图和聚合的“原料”,而把问题所在的层次比作“海平面”。 数据分析就是找到问题所对应的层次(海平面),从行级查询字段并生成聚合的过程。而钻取分析就是不断调整海平面的高低(聚合度变化)。

图2‑13  钻取分析的模型

每个计算字段,都是在特定的层次(详细级别LOD)完成计算的过程,因此所有的计算都可以称之为“广义LOD计算”,行级别计算就是在数据库的明细级别完成的计算,而聚合计算是在视图层面完成的计算,所谓FIXED/INCLUDE/EXCLUDE三种“LOD表达式”只是在主视图层次引用另一个层次时使用的计算,类似于SQL聚合查询中的嵌套子SQL聚合查询,绝对不应该也无法脱离主视图而单独使用。这是理解计算分类的关键。

单一层次聚合非常容易,业务的复杂性在于如何处理多个层次的问题,可以分为两类,分别使用交互和高级计算完成:

  • 多个层次不同的问题之间的互动分析。比如在仪表板中组合三个问题图形:各省份的销售额与利润、各类别的销售额排名、各月份的销售额趋势;每个问题都包含完全独立的问题层次,但又可以通过仪表板交互将其中一个图形作为样本范围,比如选择东北三省,即可轻松查看东北三省对应的各类别销售额排名及各月份销售额趋势。
  • 一个问题中包含多个层次:显性的问题层次和隐形的聚合层次。比如“各年度的销售额趋势及客户矩阵[3]分析”、“各省的平均商品销售价格与各省份中每位客户最高交易的平均价格”[4]等,这类问题的共同特征是在度量聚合中又包含了维度层次,是典型的结构分析。此类问题如果分解到多个图形中难以发现背后的逻辑,只能借助于高级计算实现单一问题中包含两个层次的度量聚合。

本书第5章和第7章介绍单一视图的层次分析和使用仪表板实现多个层次之间的交互分析。而在第2篇,借助行级别计算、聚合计算、表计算和狭义LOD表达式,则可以实现在一个视图中同时包含多个层次的数据分析。表计算的灵活和狭义LOD表达式的优雅,会简化复杂问题的思考难度,更好地探究数据逻辑,从而节省心智用于决策和行动。这也是我认为Tableau能在业务分析领域胜过国内外很多BI工具的关键所在,掌握方法万变不离其宗,胜过手握一本400页的函数大词典。

层次,是本书中最重要的主线。本书的目标之一,就是帮助业务分析师沿着层次分析的主线,逐步走向高级商业分析。本小节多番修改,试图完整地介绍数据分析背后的知识框架,作为Tableau的知识基础。


[1] 此处使用默认“示例超市”的场景,没有“公司”的字段,因此公司代表总体。

[2] 在Tableau中,蓝色和绿色另有所指——蓝色代表离散,绿色代表连续。通常维度都是离散的,度量默认连续。

[3] 客户矩阵即客户首次订单的所在年度,详见第10章。

[4] 各省“平均商品价格”AVG([SALE])可以分析产品价格带差异,而客户最大交易的平均值AVG(SUM({INCLUDE [客户ID]:MAX([SALE])}))则反映各省客户购买力差异(客户层次的分析指标),见第10章

2020/9/4 非最终版本