火星撞地球,【实现分组】对比Tableau和PowerBI产品设计思路
- 2019 年 10 月 6 日
- 筆記

介绍一位PowerBI战友联盟大咖:叶云。
本文来自叶云。
本文案例有多重背景,其一便是上海VIP培训活动中,小伙伴当场拿出实际业务来希望实现作图,从开始到超预期的完美实现,共计20分钟。小伙伴可亲自见证在完全精通 PowerBI DAX 下,可以直接驱动作图实现原来无法完成的效果。
以下内容全部来自 叶云 老师,感谢分享。
前言
2019年的Gartner又发布了最新的分析及BI平台的魔力象限报告,可以看出其中Tableau和PowerBI遥遥领先,把对手远远的甩在了后面。

正如西门吹雪和叶孤城,谁是天下第一,谁能称霸武林,武林人士都想窥得真相。本文想从一个简单的分组直方图的需求出发,来聊聊谁是天下第一。
需求解析
分组分析是最常见的分析需求,直方图又是分组分析中最常见的数据可视化形式。今天我们就从如何完成以下这张直方图来聊聊谁是天下第一。

该直方图按照如下序列分组,同时包含了一个区间筛选,要求在筛选区间控件内筛选的图为绿色,筛选外的图为红色。
区间标签 |
最小值 |
最大值 |
---|---|---|
<-24 |
-∞ |
-24 |
[-24,-12) |
-24 |
-12 |
[-12,-6) |
-12 |
-6 |
[-6,0) |
-6 |
0 |
[0,6) |
0 |
6 |
[6,12) |
6 |
12 |
[12,24) |
12 |
24 |
>=24 |
24 |
∞ |
为此我们按需准备了源数据,源数据结构如下,事实表为订单运输时间表,我们需要分组的就是其中的“计划-实际”列,源数据包含1000条数据。
订单编号 |
运输距离(km) |
计划时间(h) |
实际时间(h) |
计划-实际 |
---|---|---|---|---|
#0001 |
6894 |
230 |
121.9 |
108.1 |
#0002 |
9484 |
317 |
332.85 |
-15.85 |
#0003 |
9498 |
317 |
171.18 |
145.82 |
#0004 |
8353 |
279 |
267.84 |
11.16 |
#0005 |
2406 |
81 |
59.94 |
21.06 |
#0006 |
554 |
19 |
14.82 |
4.18 |
#0007 |
2813 |
94 |
140.06 |
-46.06 |
#0008 |
1302 |
44 |
50.16 |
-6.16 |
…… |
…… |
…… |
…… |
…… |
Tableau实现
1. 绘制直方图
观察分组要求得知,这是一个不均匀分组,同时种类众多,所以无法使用Tableau内置的数据桶工具,只能使用在数据源处增加计算列的方式实现,公式如下:
if [计划-实际] <-24 then '<-24' elseif [计划-实际] >= -24 and [计划-实际] <-12 then '[-24,-12)' elseif [计划-实际] >= -12 and [计划-实际] <-6 then '[-12,-6)' elseif [计划-实际] >= -6 and [计划-实际] <0 then '[-6,0)' elseif [计划-实际] >= 0 and [计划-实际] <6 then '[0,6)' elseif [计划-实际] >= 6 and [计划-实际] <12 then '[6,12)' elseif [计划-实际] >= 12 and [计划-实际] <24 then '[12,24)' else '>=24' END
以此增加一个分组列,用于分组。再将分组列拖入列,记录数拖入行,即可得到下图

2. 增加颜色标注
由于Tableau中没有表示范围选择的控件,所以增加两个参数,分别表示区间的最大值和最小值。详见如下设置。

反思一下我们的需求,我们的需求是对于轴的最大最小值进行筛选,那么就必须在源数据中增加最大最小值的数据。所以返回需要订单数据和分组数据做链接,此处的联接键使用之前的计算列,为了减少冗余列,我在此处使用了联接计算,计算公式同之前使用的计算列公式。完成联接后即得到以下数据。

现在万事具备,我们仅需写个计算字段用于标记哪些X轴上的选项在区间之内即可,在此一共创建了两个公式,一个是协助判断轴区间的,一个是用于判断轴区间是否在选择区间之内的。
辅助的计算字段公式如下:
if MIN([最小值])<0 then MIN([最大值]) ELSE MAX([最小值]) END
着色的计算字段公式如下:
IF [辅助] > [区间最小值] and [辅助] <=[区间最大值] then 'y' ELSE 'n' END
将计算字段着色拖入颜色标记中,即可实现要求的效果,滑动滑块也能产生相应的变化。

Power BI实现
1. 绘制直方图
传统方式
传统方式类似与Tableau的模式类型,都是通过计算列做出的,此处不做冗余介绍,仅给出计算列的公式:
分组列_方法1 = SWITCH ( TRUE (), [计划-实际] < -24, "<-24", [计划-实际] >= -24 && [计划-实际] < -12, "[-24,-12)", [计划-实际] >= -12 && [计划-实际] < -6, "[-12,-6)", [计划-实际] >= -6 && [计划-实际] < 0, "[-6,0)", [计划-实际] >= 0 && [计划-实际] < 6, "[0,6)", [计划-实际] >= 6 && [计划-实际] < 12, "[6,12)", [计划-实际] >= 12 && [计划-实际] < 24, "[12,24)", [计划-实际] >= 24, ">=24" )
相信对于PowerBI熟悉的朋友是小菜一碟。将分组列拖入X轴中即可得到需要的直方图。
进阶方式
当然这种方式的缺点显而易见,即区间变化时,公式就需要重写。所以更加推荐以下的写法,即先创建一张如下所示的分组表。 | Label | 最小值 | 最大值 | | ————- | ————— | ————- | | <-24 | -999999999 | -24 | | [-24,-12) | -24 | -12 | | [-12,-6) | -12 | -6 | | [-6,0) | -6 | 0 | | [0,6) | 0 | 6 | | [6,12) | 6 | 12 | | [12,24) | 12 | 24 | | >=24 | 24 | 999999999 |
然后创建一个计算列,公式如下
分组列_方法2 = CALCULATE ( VALUES ( '分组方式'[Label] ), FILTER ( ALL ( '分组方式' ), '分组方式'[最大值] > '订单明细'[计划-实际] && '分组方式'[最小值] <= '订单明细'[计划-实际] ) )
这种做法的好处是,需要更改分组方式时,无需修改公式,直接修改分组表即可。
宗师级方式
很多小伙伴以为以上就是最好的方式了?No,最好的方式是度量值,原则上计算列消耗的资源比度量值高得多,尤其是在大数据量时,所以能用度量值解决的,绝不用计算列。以下就给出宗师级的解决方案。详细的度量值公式如下:
分组方法3 = //确定所选轴标签 VAR CurrentItem = SELECTEDVALUE ( '分组方式'[Label] ) //确定分组的左值 VAR LeftValue = CALCULATE ( MIN ( '分组方式'[最小值] ), '分组方式'[Label] = CurrentItem ) //确定分组的右值 VAR RightValue = CALCULATE ( MAX ( '分组方式'[最大值] ), '分组方式'[Label] = CurrentItem ) //筛选出符合分组的数据表 VAR ItemRange = FILTER ( ALLSELECTED ( '订单明细' ), '订单明细'[计划-实际] >= LeftValue && '订单明细'[计划-实际] < RightValue ) //计算分组的数值 RETURN CALCULATE ( [OrderQty], ItemRange )
是不是有点看晕了,其实很简单,就是一步一步从订单明细中筛选出符合分组原则的子集,然后进行计算即可。
2. 增加颜色标注
至此我们已经介绍了如何进行分组,距离成功还差一部,那就是涂色,得益于最近发布的Power BI Desktop(针对Power BI Service,本地部署暂不支持该功能)已经可以使用度量值控制颜色,那么我们仅需创建进行控制度量值即可。我们可以创建如下度量值:
颜色方案1 = VAR LeftX = MIN ( '区间参数'[区间参数] ) VAR RightX = MAX ( '区间参数'[区间参数] ) VAR RangeItem = IF ( MIN ( '分组方式'[最小值] ) < 0, MIN ( '分组方式'[最大值] ), MAX ( '分组方式'[最小值] ) ) RETURN IF ( RangeItem > LeftX && RangeItem <= RightX, "#61AC85", "#EE3F4D" )
之后打开直方图的高级设置。使用度量值“颜色方案1”控制颜色即可,最终就得到我们想要的效果啦。其实这部分的实现方式和Tableau中的实现方式算是如出一辙,只是通途异路而已。

3. 终极绝招
最最最终极的绝招来了!该方法的原创来自于BI佐罗,完美贯彻了非侵入式设计(不因可视化和分析的需求,增加任何多余的关系),显示了其深厚的DAX模型运用功底。用一个度量值,直接解决了颜色和分组的双重问题,详细的度量值如下:
颜色方案2 = VAR CurrntItem = SELECTEDVALUE ( '分组方式'[Label] ) VAR CurrentValue = [分组方法3] VAR CurrentX = IF ( MIN ( '分组方式'[最小值] ) < 0, MIN ( '分组方式'[最大值] ), MAX ( '分组方式'[最小值] ) ) VAR XLeftValue = MIN ( '区间参数'[区间参数] ) VAR XRightValue = MAX ( '区间参数'[区间参数] ) VAR CurrentLegend = SELECTEDVALUE ( RedGreenLegend[Item] ) RETURN SWITCH ( TRUE (), CurrentLegend = "Green" && CurrentX > XLeftValue && CurrentX <= XRightValue, CurrentValue, CurrentLegend = "Red" && ( CurrentX <= XLeftValue || CurrentX > XRightValue ), CurrentValue, BLANK () )
同时这张直方图并非是簇状直方图,而是堆积直方图,其原理就是如果满足区间条件,则绿色部分显示计算值,红色部分显示空值(blank),其中奥妙无穷。

总结
本文从一个简单的需求出发,深入讲解了其在Tableau和Power BI中的应用技巧,足见以下这些结论:
- Tableau中在数据可视化的强大能力,其完善的可视化功能足以控制到可视化中的每一个元素,在数据可视化的多样性和便利性,无人能出其右;
- Power BI在DAX语言的强大能力,微软将其强大运用与Power BI的每一个角落,从可视化,到建模,到分析,无所不能。也正是如此,Power BI充满了无限的可能性。也正是微软在Tabular模型的多年深度耕耘,造就了Power BI今天的厚积薄发;
- 其实没有真正的天下第一,只是思路不同。Tableau在BI的数据可视化部分深入探索,不停给用户带来了便利多样的数据可视化实现方式,而Power BI贯彻着自己将DAX部署到每一个角落的宏远,不受任何外界任何影响,它还是沿着自己的道路在前进。