从《 Extracting Top-K Insights from Multi-dimensional Data 》看前端可视化

2,879 阅读13分钟

导读:

  • 本文以论文结构为主线,站在阅读完成者的角度梳理各个概念、部分之间的联系,调整讲解顺序以便讲解易懂,并在文中给出恰当的说明。
  • 论文先提出了众多概念,把握这些概念极为重要,在阅读本文前,可以先了解维度、度量、立方体的概念。关于概念的定义,是抽象且严谨的,为了便于读者理解,本文对每个概念用无序列表来说明和讲解定义。只有理解了这些概念,才便于进行后续的研究,在理解概念上花再多时间都不为过。
  • 此外本文会用具体的例子贯穿全文,也是起到对概念、算法解释的作用。如果不能理解概念的定义,借助例子观看全文也能有所收获!
  • 最后本文会阐明作者对前端可视化的理解,以及我们的产品中DMS数据分析对前端可视化的现有实现。

一、论文讲解

摘要

OLAP得到广泛的使用,但需要专家操作,操作前知道自己想要什么。本文尝试自动从多维(度)数据中提取top-k insights。提出了insight(洞察力)这个概念,它是经过多个步骤(例如按维度排名,按维度计算度量百分比) 的聚合结果中获得的令人感兴趣(interesting)的结果。这对非专业的数据分析师很有用,也能减轻专家的负担。
举一个insight的例子:就销售额的增长值而言,B品牌的排名(在各品牌中)逐年下降。这就是自动分析出来的结果。
既然要计算“top-k”,我们自然要借助一个评分函数对各个insight进行打分。我们面临两个挑战:结果有效性和计算的效率(effectiveness、efficiency)。
论文先提出有意义的评分函数,之后提供自动计算top-k insight的计算框架,并提出各种优化算法,最后借助真实数据和合成数据进行实验研究,验证算法的有效性和高效性。

1. 介绍

下面的例子贯穿全文

1659320303046-65e0a2fe-f12d-4a28-ac45-422e4c9485ff.png

有汽车销售数据集(Year,Brand,Sales)(Year,Brand,Sales)。我们可以借助OLAP工具按照年份和品牌聚合销售额,可以看图(a),有表格和折线图。但仅仅一次聚合揭示不了太多信息(例如我们在折线图上看不到清晰的趋势)。
在摘要里我们也说了,insight是多次聚合获得的结果,现在看图(b),我们根据年份,计算年销售额增长。可以看到品牌H 年销售额增长 是逐年增加的(-5 -> 1 -> 7 -> 15)。这就是我们聚合两步获得的一个insight。
看图(c),我们在图(b)的基础上,计算品牌年销售额增长的排名。观察品牌B可以发现,品牌B的年销售额增长排名逐年下降。这是我们聚合3步获得的一个insight。

如果使用OLAP,数据分析师需要不断手动操作和评估insight的重要性,工作量巨大且过程乏味。且非专家难以使用,或者他们自己都不知道确切的需要。我们也因此提出了top-k insights问题。
这个问题有两方面挑战,结果有效性计算的效率。结果有效性,我们设计评分函数,评分函数也面临两个个挑战,即通用性和可比性。计算的效率,涉及三方面挑战,即巨大的搜索空间、昂贵的insight计算、洞察力得分的非单调性(例如上图二次聚合H有insight,而T、F、B没有)。
论文原文各部分介绍如下:

  • 2阐述了的问题
  • 3提供有意义的评分函数,便于我们深入了解
  • 4给出系统体系结构
  • 5给出计算框架
  • 6、7给出性能优化技术
  • 8、9展示有效性和效率
  • 10讨论相关工作,11给结论

2. 问题陈述

本节将正式定义多维数据模型复合萃取器洞察得分函数。最后描述了我们的洞察力提取问题,并分析了它的搜索空间。

2.1 数据模型和子空间

多维数据集(multi-dimensional dataset):R(Ɗ,M)R(Ɗ,M)

  • 其中Ɗ=<D1,,Dd>Ɗ=<D_1,…,D_d>是维度列表,MM是度量
  • dom(Di)dom(D_i)表示维度DiD_i的域
  • 我们假设每一个DiD_idom(Di)>12|dom(D_i)|>1^2

子空间(subspace):S=<S[1],,S[d]>S=<S[1],…,S[d]>

  • 其中S[i]S[i]可取dom(Di)dom(D_i)中的一个值或*(表示取所有值)
  • S.MS.M表示子空间的度量,是SS确定的子空间上的聚集值
  • 注意,<>隐藏了里面元素是有序的这一特点!

兄弟群(sibling group):SG(S,Di)={S  S[i]  ji,S[j]=S[j]}SG(S,D_i)=\left\{S'\space| \space S'[i]\ne*\space∧ \space ∀j \ne i,S'[j] = S[j]\right\}

  • 兄弟群是一个集合,除DiD_i的所有维度对应的值保持不变,DiD_i取所有的非*值组成集合

下面我们举例子加深对这些概念的印象。还是一开始的例子,汽车销售数据集(Year,Brand,Sales)(Year,Brand,Sales)

1659080492196-d648419d-b40d-4c51-8211-77bd98a5b348.png

  • 现在我们可以写成多维数据集:R(<year,brand>,sales)R(<year,brand>,sales)
  • 其中dom(Year)={2010,2011,2012,2013,2014}dom(Year)=\left\{2010,2011,2012,2013,2014\right\}dom(Brand)={F,B,H,T}dom(Brand)=\left\{F,B,H,T\right\}dom(Year)=5|dom(Year)|=5dom(Brand)=4|dom(Brand)|=4
  • 子空间<2010,F><2010,F><2010,F>.M=13<2010,F>.M=13
  • <2010,>.M=<2010,F>.M++<2010,T>.M=40+38+13+20=111<2010,*>.M=<2010,F>.M+…+<2010,T>.M=40+38+13+20=111
  • SG(<2010,>,Brand)=SG(<2010,T>,Brand)={<2010,F>,<2010,B>,<2010,H>,<2010,T>}SG(<2010,*>,Brand)=SG(<2010,T>,Brand)=\left\{<2010,F>,<2010,B>,<2010,H>,<2010,T>\right\}

1659081169622-aedb045e-3e77-4fcf-a8b5-3a851eb87339.png

2.2 复合萃取器

引入兄弟群的概念后,结合在第一部分举的例子,可以说我们就是在多维数据集的所有兄弟群中寻找insight。兄弟群是我们处理数据的基本单位。而在兄弟群上的基本分析操作,是由萃取器来实现的。

萃取器(extractor):ξξ /ksi/

  • 输入一个兄弟群SG(S,Dx)SG(S,D_x),计算每一个子空间ScSG(S,Dx)S_c∈SG(S,D_x)的派生度量Sc.MS_c.M'
  • 计算Sc.MS_c.M'依靠
    • Sc.MS_c.M
    • {(Sc,Sc.M)  ScSG(S,Dx)}\left\{(S_{c'},S_{c'}.M)\space| \space S_{c'}∈SG(S,D_x)\right\},即兄弟群SG(S,Dx)SG(S,D_x)中的所有子空间的度量

四个萃取器实例

1659083409249-9eaa6deb-cd7f-4e23-97db-425d55e02ccb.png

其中ΔprevΔ_{prev}要求DxD_x的值有序

举个例子:输入SG(<,F>,year)SG(<*,F>,year)

1659084167267-efcee1db-ff8c-4074-a9e4-372b8b1fa457.png

复合萃取器(composite extractor):CeC_e

  • ξξ是一步分析操作,而CeC_e是多步分析操作,步骤深度为ττ
  • CeC_e是一个长度为ττ的数组,数组元素为(Ce[i].ξ,Ce[i].Dx)(C_e[i].ξ,C_e[i].D_x)
  • 其中数组第一项特殊,(SUM,M)(SUM,M),元组第一项是聚集函数,第二项是度量
  • 翻译成复合,可以联想复合函数。输入输出关系

举个例子,Ce=<(SUM,Sales),(Δprev,Year),(Rank,Brand)>C_e=<(SUM,Sales),( Δ_{prev},Year),(Rank,Brand)>。这就是贯穿全文的例子

全文最难的概念来了

复合萃取器的结果集(result set of composite extractor):ΦΦ

  • 有复合萃取器ΦΦ,输入兄弟群SG(S,Da)SG(S,D_a),输出Φ={(S,S.Mτ)  SSG(S,Da)}Φ=\left\{(S',S'.M_τ)\space| \space S'∈SG(S,D_a)\right\}
  • S.MiS'.M_i表示子空间SS'经过Ce[i]C_e[i]计算的派生度量,重点是S.MiS'.M_i怎么计算:
    • 当i=1,S.M1S'.M_1就是在度量MM上聚合的结果
    • 当i>1,我们获得S.MiS'.M_i可以借助Ce[i]C_e[i]输入结果集{(Sc,Sc.Mτ1)  ScSG(S,Ce[i].Dx)}\left\{(S_c,S_c.M_{τ-1})\space| \space S_c∈SG(S', \textcolor{red}{C_e[i].D_x} )\right\}
  • 注意红色的地方,不是DaD_a。不理解没关系,后面会有例子。也能看到复合萃取器比萃取器多了一个维度的参数

举个例子。Ce=<(SUM,Sales),(%,Year)>C_e=<(SUM,Sales),( \%,Year)>输入SG(<,F>,year)SG(<*,F>,year)

1659326759606-0f0f8ff4-7fb3-459e-87a9-525fdff26816.png

值得庆幸的是,这个例子中Ce[2].DxC_e[2].D_xSG(S,Da)SG(S,D_a)中的DaD_a都是年份

2.3 问题定义

我们先给出两种有代表性的insight:

  • 点洞察力(outstanding):一个子空间的Sc.MτS_c.M_τ与其他子空间的派生度量相比格外显眼
  • 形状洞察力(trend):当DxD_x有序时,随着DxD_x增加,Sc.MτS_c.M_τ呈上升或下降趋势

洞察力实例(SG(S,Di),Ce,T)(SG(S,D_i),C_e,T),其中TT是insight类型,就是我们上面所述的两个之一
评分函数𝐒(SG(S,Di),Ce,T)𝐒(SG(S,D_i),C_e,T),第3节详细说明

现在我们可以说明我们的insight问题是什么了:
给定数据集R(Ɗ,M)R(Ɗ,M)和复合萃取器深度ττ,在兄弟群、复合萃取器和insight类型的所有可能组合中找到得分最高的top-k insights:{(SG(S,Di),Ce,T)}\left\{(SG(S,D_i),C_e,T)\right\}

时间复杂度:随着维度的个数dd和复合萃取器的深度ττ增大呈指数级增大。证明略

3. 有意义的评分函数

为什么这里是“有意义的”评分函数呢?首先我们的评分函数需要具有通用性(即适用于不同类型的insight)和可比性(即不同类型的insight之间的公平性)。而现有的各种文献提出的评分函数均不适用我们的问题,所以我们自己给出适合我们问题的评分函数,即“有意义的”评分函数。

3.1 insight评分函数

𝐒(SG(S,Di),Ce,T)=Imp(SG(S,Di))SigT(Φ)𝐒(SG(S,D_i),C_e,T) = Imp(SG(S,D_i))·Sig_T(Φ)

这就是我们的评分函数,其中ImpImp衡量SG(S,Di)SG(S,D_i)的作用、影响(impact)的范围。SigTSig_T衡量从ΦΦ观察到的TT型insight的重要性(significance)

Imp(SG(S,Di))=SSG(S,Di)SUM(S)/SUM(<,,>)Imp(SG(S,D_i))=\sum_{S'∈SG(S,D_i)}SUM(S')/SUM(<*,…,*>)

  • 说白了,就是兄弟群占总立方的多少
  • 归一化处理,值[0,1]∈[0,1]

SigTSig_T:基于pvaluep-value来制定SigTSig_T,它本质上衡量了事件的极端程度。当用户为每种TT适当地设置常见情况(即无效假设)时,它还允许在不同类型的洞察之间进行公平的比较

3.2 Sig

p-value:在虚无假设为真的前提下,出现该样本或比该样本更极端的结果的概率和。数值越小,表示事件越罕见

一个求SigoutstandingSig_{outstanding}的例子

X={x1,x2,,xn}X = \left\{x_1,x_2,…,x_n\right\}ΦΦ中的数值集合,在商业领域产品的销售额往往服从幂律分布。我们给出虚无假设:H0H_0XX服从带有高斯噪声的幂率分布(XX服从幂率分布,残差服从正态分布)

接下来就是把X={x1,x2,,xn}X = \left\{x_1,x_2,…,x_n\right\}按降序排序,将X{xmax}X - \left\{x_{max}\right\}拟合为幂律分布,并估计xmax^\hat{x_{max}}。预测误差xmax^xmax\hat{x_{max}}-x_{max}服从高斯分布,结合概率密度求出pvaluep-value。我们定义:

Sigoutstanding(Φ)=1pSig_{outstanding} (Φ) = 1-p

1659426539482-3f9cbfbf-bed1-4325-b41c-f3fa38b7c9f9.png

一个求SigtrendSig_{trend}的例子

1659426809840-1f30090b-f2c6-4801-ad1d-a341b4946d87.png


我们定义:
Sigtrend(Φ)=r2(1p)Sig_{trend} (Φ) = r^2·(1-p)
其中r2r^2是拟合度

3.3 休息一下

看了这么多休息一下吧,可以回顾一下之前的概念:多维数据集、子空间、兄弟群、萃取器、复合萃取器、符合萃取器的结果集、洞察力两种类型(outstanding、trend)、洞察力实例、评分函数。
熟悉了这些概念,我们就可以向本文的核心,系统架构(第4节)和insight萃取(第5节)出发啦!

4. 系统架构

4.1 架构概述

1659427003187-f5b551a6-38d6-45c4-9688-3f1685c61e3e.png

  • 三层
  • 系统配置层。允许用户配置系统设置。例如,指定新的insight type、自定义虚无假设
  • insight萃取层。枚举所有复合萃取器和兄弟群,交给计算引擎计算结果集,再交评分函数
  • 用户接口层。前端展示top-k insight

4.2 可扩展性

这里不再赘述,简单的说就是我们系统可扩展。例如不只局限于一个度量,用户可以自己选择兄弟群,可以自定义评分函数,可以添加新的萃取器……

5. insight萃取器

5.1 计算框架

1659428356721-8b726508-435a-4d95-982c-24344a5ff87b.png

  • 如果你对之前的概念非常熟悉了,相信这个算法不成问题
  • 9行判断有效本文不再赘述,只需要知道一些复合萃取器里面可能存在相邻两个萃取器无意义
  • 注意两个enumerate SG出现的地方,知道怎么枚举全部的兄弟群
  • 现在算法1中我们不知道怎么求结果集ΦΦ

5.2 计算引擎

1659429306934-ea281ca3-b4b8-4eda-9fac-3e4a1f7c47e3-1.png

  • 阅读前不妨回顾一下复合萃取器的概念(概念红色的地方体现出来了)
  • 整个过程是递归的,自顶向下构建,数据自底向上流动
  • 不妨照着算法,把本文的例子写一下

1659430062691-31fcee16-8fc5-4aba-be6e-96e7443062a9.png

Ce=<(SUM,Sales),(Δprev,Year)>C_e=<(SUM,Sales),( Δ_{prev},Year)>SG(<2013,>,Brand)SG(<2013,*>,Brand)

这个例子可能由于兄弟群表述里BrandBrand和深度为2的萃取器里YearYear不一样而难以理解,我们可以先看下面的简单例子。

例1:

1659430884047-e5b6c420-8c64-48f3-b2c9-c97f2f8d5e4b.png

例2:

1659431250805-71a0d550-dc82-483d-b1d9-8b2c6d568c5b.png

最后我们来尝试最开始的例子,即兄弟群的变量和复合萃取器变量不同的例子(不妨回顾下复合萃取器及结果集的定义):

1659431932286-266b443a-a142-4d49-9691-e1ca4f41e51c.png

实际上如果理解了前面的各种概念,算法就很好理解,看到这,我们的核心算法就结束了。

5.3 时间复杂度分析

之前也说过,算法时间复杂度随着维度的个数dd和复合萃取器的深度ττ增大呈指数级增大,这里给出详细的式子:

1659432191117-fd30c481-337b-47f9-8906-b031de667f66.png


其中很像D的字母表示各维度域长度的最大值
不再证明

6. 论文其他

论文后续就是一些算法优化,以及真实的例子说明我们一开始的挑战——有效性和高效性。总之论文对top-k insight的研究是颇有成就的。此外,本文核心就是insight,相信你也对insight有了自己的理解。论文最后也再次点明了什么是insight,不妨看看是否与自己心里的理解一致:
Insight can be considered as interesting observations derived from aggregation results in multiple steps.

二、前端可视化

1. 可视化现状

看完了insight,我们再来聊聊可视化吧。目前可视化有两个主要分支。其中一个是用户知道自己需要什么,针对特定的情况设计,简化用户处理数据的过程。第二个分支就是自动化方向,但实际上研究人员也是针对特定的情况来实现自动化,例如论文中的例子都是销售额方面,评分函数的制定也是提前确定好虚无假设。
第一种分支就是早期的可视化,通常会实现用户拖拽字段生成图表这一效果。现在可视化则流行从数据出发,进行统计,和寻找有趣(interesting)的地方,这一过程是自动化的,即第二个分支。
在自动化方面,研究人员也是各显神通。除了本文介绍关于insight的论文,还有研究人员将可视化与NLG(自然语言生成)结合在一起,除了最后将数据展现成图表外,会自动添加对图表描述的话,建立起人机沟通的桥梁;还有研究人员把注意力放在了如何自动化推荐出更好的整体展示,例如数据选择什么图表展示比较好?多个图表怎么布局、各个图表大小如何设置?

2. DMS数据分析

我们产品中的数据分析(新版的可视化)也在可视化方面交出了自己的答卷。

1661221723362-3813b232-2716-4759-880e-b90e529ecb05.png

在可视化的第一个分支上,我们提供了各种图表,用户创建数据集后可选择图表,并选择字段进行配置,将图表展现出来。第一个分支比较侧重用户体验,我们创建的图表可以调整大小、更改布局。字段也是支持拖拽添加。自己封装的图表视觉上也能给用户舒适的体验。

1661221800063-6112065e-d8ce-4ff7-8045-f299a9b411b1.png


关于第二个分支,我们产品也是在自动化层面给出了自己的成果。在数据集和SQL窗口中,我们有一键可视化(图表推荐)按钮。点击后我们会从数据集出发,首先实现数据类型和可视化类型的自动推断,之后再自动推荐用户可能想要的图表。

总结

近年来数据可视化主流是从自动化方向发展,本文介绍了其中一个方向,即寻找top-k insight。感兴趣的同学不妨用代码简单实现一下,之后也可以阅读论文原文,看看后面关于性能优化的部分。实现的过程中也可以自己构思评分函数,归一化是实现可比性的良好办法。我们的DMS产品也在前端可视化方面做出了自己的成果,在不断提升用户体验的同时,也不断优化、新增一键可视化的推荐算法,也欢迎大家前来使用我们的产品的这部分功能。