­

火星撞地球,【实现分组】对比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中的应用技巧,足见以下这些结论:

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