介绍一下PowerBI同志联盟的大佬:叶云。
本文来自叶云。
本文中的案例有多重背景。 其中之一是在上海VIP培训活动中,合作伙伴现场拿出实际业务实现绘图。 从开始到超出预期的完美实现,一共花了20分钟。 小伙伴们可以亲眼见证,完全熟练掌握PowerBI DAX,就可以直接驱动绘图,达到以前不可能的效果。
以下内容全部来自叶云老师,谢谢分享。
前言
2019年,Gartner发布了最新的BI平台分析和魔力象限报告。 可以看到Tableau和PowerBI遥遥领先,将对手远远抛在了后面。
就像西门吹雪和叶孤城谁是天下第一,谁能称霸武林一样,武林之人都想知道真相。 本文想从一个简单的分组直方图的需求出发,谈谈谁是世界上最好的。
需求分析
分组分析是最常见的分析需求,而直方图是分组分析中最常见的数据可视化形式。 今天我们将通过如何完成下面的直方图来讨论谁是世界上最好的。
直方图按照以下顺序进行分组,并且还包含区间滤波器。 要求过滤区间控件内过滤后的图形为绿色,过滤器外的图形为红色。
区间标签 最小值 最大值
-∞
-24
[-24,-12)
-24
-12
[-12,-6)
-12
-6
[-6,0)
-6
[0,6)
[6,12)
12
[12,24)
12
24
>=24
24
无穷大
为此,我们按需准备了源数据。 源数据结构如下。 事实表是订单运输时间表。 我们需要分组的是“计划-实际”列。 源数据包含1000条数据。
订单号 运输距离(公里) 计划时间(小时) 实际时间(小时) 计划-实际
#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中没有对范围选择的控制,所以增加了两个参数来表示区间的最大值和最小值。 详细信息请参阅下面的设置。
反思我们的需求,我们的需求是过滤轴的最大值和最小值,所以我们必须将最大值和最小值数据添加到源数据中。 因此,退货时需要将订单数据和分组数据进行联动。 这里的连接键使用之前计算的列。 为了减少冗余列,我这里使用了join计算。 计算公式与之前使用的计算列公式相同。 连接完成后,您将得到以下数据。
现在一切都准备好了,我们只需要编写一个计算字段来标记区间是否在所选区间内的哪些选项即可。
辅助计算场公式如下:
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 轴以获得所需的直方图。
进阶方式
当然,这种方法的缺点也很明显,就是当区间发生变化时,需要重写公式。 因此,更推荐下面的写法,即先创建如下所示的分组表。
| 标签| 最小值| 最大值|
| ———— | —————— | —————— |
| | [-24,-12) | -24 | -24 -12 |
| [-12,-6) | -12 | -6 |
| [-6,0) | -6 | 0 |
| [0,6) | 0 | 6 |
| [6,12) | 6 | 12 | 12
| [12,24) | 12 | 12 24 |
| >=24 | 24 | 999999999 |
然后使用以下公式创建计算列
分组列_方法2=
CALCULATE(
VALUES('分组方式'[Label]),
FILTER(
ALL('分组方式'),
'分组方式'[最大值]>'订单明细'[计划-实际]
&&'分组方式'[最小值]<='订单明细'[计划-实际]
)
)
这种方式的优点是,当需要改变分组方式时,不需要修改公式,直接修改分组表即可。
宗师法
很多朋友认为以上是最好的方法吗? 不,最好的方法是使用度量值。 原则上,计算列比指标值消耗的资源要高得多,尤其是数据量很大的时候,所以如果能用指标值解决,就不要使用计算列。 下面是大师级的解决方案。 详细测量公式如下:
分组方法3=
//确定所选轴标签
VARCurrentItem=
SELECTEDVALUE('分组方式'[Label])//确定分组的左值
VARLeftValue=
CALCULATE(
MIN('分组方式'[最小值]),
'分组方式'[Label]=CurrentItem
)//确定分组的右值
VARRightValue=
CALCULATE(
MAX('分组方式'[最大值]),
'分组方式'[Label]=CurrentItem
)//筛选出符合分组的数据表
VARItemRange=
FILTER(
ALLSELECTED('订单明细'),
'订单明细'[计划-实际]>=LeftValue
&&'订单明细'[计划-实际]<RightValue
)//计算分组的数值
RETURN
CALCULATE(
[OrderQty],
ItemRange
)
你是不是有点困惑? 其实很简单。 您只需从订单明细中逐步筛选出符合分组原则的子集,然后进行计算即可。
2.添加颜色标记
到目前为止我们已经介绍了如何分组,但是想要成功还差一步,那就是着色。 感谢最近发布的Power BI Desktop(对于Power BI Service,本地部署尚不支持此功能),度量值控制可以使用颜色,那么我们只需要创建一个控制指标即可。 我们可以创建这样的措施:
颜色方案1=
VARLeftX=
MIN('区间参数'[区间参数])
VARRightX=
MAX('区间参数'[区间参数])
VARRangeItem=
IF(
MIN('分组方式'[最小值])<0,
MIN('分组方式'[最大值]),
MAX('分组方式'[最小值])
)
RETURN
IF(
RangeItem>LeftX
&&RangeItem<=RightX,
"#61AC85",
"#EE3F4D"
)
然后打开直方图的高级设置。 使用公制“配色方案1”来控制颜色,最终得到我们想要的效果。 其实这部分的实现和Tableau中的实现是一模一样的,只是方式不同。
3.终极绝招
终极绝招就在这里! 该方法的独创性来自BI Zorro,它完美地实现了非侵入式设计(没有因可视化和分析的需要而添加任何不必要的关系),显示了其在使用DAX模型方面的深厚功底。 使用度量值直接解决了颜色和分组的双重问题。 详细指标值如下:
颜色方案2=
VARCurrntItem=
SELECTEDVALUE('分组方式'[Label])
VARCurrentValue=[分组方法3]
VARCurrentX=
IF(
MIN('分组方式'[最小值])<0,
MIN('分组方式'[最大值]),
MAX('分组方式'[最小值])
)
VARXLeftValue=
MIN('区间参数'[区间参数])
VARXRightValue=
MAX('区间参数'[区间参数])
VARCurrentLegend=
SELECTEDVALUE(RedGreenLegend[Item])
RETURN
SWITCH(
TRUE(),
CurrentLegend="Green"
&&CurrentX>XLeftValue
&&CurrentX<=XRightValue,CurrentValue,
CurrentLegend="Red"
&&(CurrentX<=XLeftValue
||CurrentX>XRightValue),CurrentValue,
BLANK()
)
同时,这个直方图并不是聚类直方图,而是堆叠直方图。 原理是,如果满足区间条件,绿色部分显示计算值,红色部分显示空白值。 谜底无穷无尽。
总结
本文从一个简单的需求出发,深入讲解了其在Tableau和Power BI中的应用技巧,得出以下结论:
Tableau在数据可视化方面拥有强大的能力。 其完整的可视化功能足以控制可视化中的每一个元素。 数据可视化的多样性和便利性无人能及;
Power BI在DAX语言上的强大能力,微软将其力量运用到了Power BI的每一个角落,从可视化到建模到分析,它无所不能。 也确实Power BI充满了无限的可能性。 也正是微软多年来对Tabular模型的深耕,造就了Power BI今天的积累;
其实世界上没有真正的第一,只是思维方式不同而已。 Tableau对BI的数据可视化部分进行了深入探索,不断为用户带来便捷多样的数据可视化实现方式,而Power BI则实现了将DAX部署到每个角落的雄心,不受外界的任何影响。 依然在自己的道路上前行。