有伙伴说一段时间没有更新文章,这一次顶十次。明明能拆成十期的文章,非要一次写完,没办法,厚道。
客观地讲,PowerBI 作为快速发展的BI产品,在很多方面仍然需要打磨,以前我们似乎更多来说 PowerBI 有多厉害,但这并不影响我们客户地向更加优秀的伙伴学习,例如:在 Tableau 确实有太多的优点,PowerBI 需要去学习,期待希望微软的产品经理们。(也只能期待了...)
在数据分析中,除了简单汇总或简单变换以外,很多需求是需要有额外的辅助才能实现的,在 PowerBI 中,这些全部以 DAX函数 给出,来构建模型的语义层;而在 Tableau 中,自有她的一套巧妙设计,我们不妨来对比研究一下对于同样的略微复杂的功能是如何在不同的产品中实现的。由于我们这里主要是研究 PowerBI,故给出 Tableau 的实现效果,对其涉及公式不再详细讨论,而将这些精力留给对 PowerBI 的描述。
本文全部是案例,案例来自于实际,Tableau举例了十个案例,为了处于学习目的,这里将变换下案例,但保持本质不变,来达到花费最小精力学习最多收益的效果。
参考文章《10大Tableau表计算》:https://www.tableau.com/zh-cn/about/blog/2017/2/top-10-tableau-table-calculations-65417
推荐实践方式:
- 打开 10大Tableau表计算 文章,对照每个案例,理解业务需求。
- 用 Excel120 通用案例数据逐个自行实现,以达到锻炼自己 PowerBI 能力。
- 对照本文查看你的实现逻辑与这里的异同以进一步探讨。
以下详细对比每个案例并给出在 PowerBI 中的实现。
自参考日期开始的百分比变化
在 Tableau 中,利用表计算,可以计算从任意值开始的百分比变化。假设您对某个股票组合感兴趣,并且想评估它们从某个时间点开始的相对表现。为此,需要设置一个“投资日期”,并将这些股票标准化到同一个时间点,用线条显示百分比变化。可使用滑块调整参考日期。效果如下:
Tableau 表达式:
以及:
在 PowerBI 中,模拟类似的需求,实现选定任意时间点,显示不同时间相对于该时间的销售额的增长率。效果如下:
Power BI DAX表达式:
以及:
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
- PowerBI 可视化层无法显示用户鼠标点击点位。
公共基准
您可能想参照一个公共基准点查看数据,而不是查看一段绝对时间范围的数据。例如,这里有三部《玩具总动员》电影的票房收入。如果按星期看一下自首映日开始的总收入,比较起来就容易多了:
Tableau 表达式:
在 PowerBI 中,模拟类似的需求,实现按照首次销售计算不同类别的销售额趋势。效果如下:
首先构造了一个坐标轴,然后根据当前坐标轴位置来计算,PowerBI DAX 表达式为:
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
随时间变化的销售总额百分比
希望一次执行两遍表计算的情况很常见。例如,查看某个细分市场随时间变化的增长或收缩对公司的重要性可能很有意义。为此,必须先按细分市场计算随时间变化的销售额汇总,然后将其作为随时间变化的销售总额百分比来查看。这也称为多遍聚合,在 Tableau 中不写公式也可以完成这种聚合。
在 Tableau 中仅需要设置就可以完成:
以及:
在 PowerBI 中,模拟类似的需求,实现按照不同类别显示其当年积累销售额占整体销售额的比例。效果如下:
Power BI DAX 表达式:
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
- Tableau 有更加丰富的报告层计算功能,可以通过设置完成。
- PowerBI 无法设置同一可视化对象的分组也自然无法在报告层完成复杂计算。
- PowerBI 报告层幸好有 PowerBI DAX 可以依赖。
整理时保持排序
这里我们需要了解产品在一个月和一年内的排名,然后显示排名随时间的变化。为此,我们创建一个凹凸图,其中以折线图形式显示随时间的变化。可在左侧看到复印机和传真机已经从销售不佳的产品变成目前的销售前 3 甲。还可以看到,传真机和复印机的购买量波动很大。
Tableau中这样计算:
在 PowerBI 中,模拟类似的需求,实现按照不同类别显示其不同时间段的排名。效果如下:
在 PowerBI 中,在报告层面可以实现传达同样信息的效果,但从报告层的细节来说,仍无法做到 Tableau 的融合性,例如:
无法做到最少可视化元素的完备性以及整体性,PowerBI 产品经理有的玩了。
当然 PowerBI DAX 表达式:
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
- PowerBI 报表层无法做到最少可视化元素的完备性以及整体性。
- PowerBI 报表层可实现传达信息以及勉强的可视化效果。
递归效果的汇总
现在需要监视呼叫中心未结支持案例的数量,或者有货的库存数量。但是系统未记录未结案例的滚动合计,您需要推算出来。这等于开案日的案例数 + 新开案例数 + 重开案例数 – 已结案例数。
表面看来,这是简单计算。但是,每日开案数量是根据上一个结案日推算的,后者又是根据当日开案数量推算的。这形成了计算的循环引用。
效果如下:
在 Tableau 中的大致实现方式:
以及:
以及:
充分看出在 Tableau 中的报表层提供了很多控制以实现计算。
在 PowerBI 中,模拟类似的需求,实现计算每天的累计未发货量,未发货量由昨日累计订单量 - 昨天累计发货量得到,效果如下:
PowerBI DAX 表达式:
这看似一种递归的效果,但其实可以转化为非递归实现,在 Tableau 和 PowerBI 两者中都并非真正的递归,在 PowerBI DAX 中是不支持真正递归的,当然在这种案例中也不用使用真正的递归。
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
加权平均
对于考试分数或订单优先级等数据,适合采用加权平均分析。也许您想查看各种产品类型所有订单的平均优先级,并且想按订购量加权该优先级,这样订购量大的产品就会得到更高的优先级分数。可以使用加权平均优先级分数来优化订购量大、优先级高的产品的供应链。这里,我们使用 Superstore 销售数据进行加权平均:
在 PowerBI 中,模拟类似的需求,实现按子类别销售额利润率加权来计算类别的平均销售额,效果如下:
PowerBI DAX 表达式可以直接由快速度量值给出:
生成的 PowerBI DAX 表达式如下:
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
按计算分组
如果您管理公司的配送运营,可能会对哪些产品的运输成本高于平均值感兴趣。在 Tableau 6 中,可以计算整个时间窗口的平均值,并在计算中使用该值对各值进行分组和配色。
Tableau 中的主要计算如下:
在 PowerBI 中,模拟类似的需求,效果如下:
首先构建一个用来分组的辅助表作为图例,然后编写 PowerBI DAX 表达式如下:
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
- PowerBI 中为了报表层效果有时候需要建立辅助报表层的辅助表,这是不符合设计常识的,PowerBI 有独立的模型层,里面的表反应了实际的业务,而不应该将辅助表与之混合,这完全违背了设计学上的常识,而目前没有在这方面得到改良。
移动范围的事件数
对于零售、智能或边界控制等不同的场景,通常需要了解在一个时间窗口内发生某一事件的次数。例如,一次可疑事件可能是一次意外,但是如果在 x 天里发生次数超过 n 次,那就值得调查一下。
这里 Tableau 用到了参数和计算的结合,主要的计算如下:
在 PowerBI 中,模拟类似的需求,实现 X 天内小于上月日平均销售额的次数达到指定阈值,效果如下:
如果在连续的X天内次数超过了阈值次数则显示,否则不显示。
PowerBI DAX 表达式如下:
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
可变时段的移动平均
您已使用 Tableau 中的快速表计算功能,计算了所有月份的销售额移动平均,但现在希望进行扩展,以便选择要计算多少个时段的平均值。
淡蓝色线条显示所有月份的销售额总和,而橙色线条显示 15 个时段的销售额移动平均。
在 Tableau 中的设置和计算如下:
在 PowerBI 中,模拟类似的需求,效果如下:
PowerBI DAX 表达式如下:
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
各时段与平均值的差异
您可能更想看到季度销售额与当年平均值(而不是绝对数)的差异。此处显示了与当年平均值和绝对订单数之间的差异。
在 Tableau 中的主要设置和计算如下:
在 PowerBI 中,模拟类似的需求,效果如下:
PowerBI DAX 表达式如下:
虽然是达到同样的效果,在 PowerBI DAX 中却要理解上下文转换以及取消外部筛选等高级的 DAX 知识才能快速而准确地写出度量值。
小结:
- PowerBI DAX 计算可以非常容易地实现效果。
- 对该效果的实现,虽然 DAX 公式并不复杂,但背后涉及需要透彻理解 DAX 计算原理,该复杂度远远超越了写出同样表达式的 Tableau 的程度。
总结
通过对比用 Tableau 和 PowerBI 实现同样的 10 种非默认效果的计算,可以对两种软件在某方面的设计有了一个局部的认知,可以总结为:
- Tableau 具有高度精细的可视化引擎及完备的可视化组件系统。
- Tableau 具有一套完备的报表级计算公式系统。
- PowerBI 可视化组件系统并不完备,典型的缺失如:可视化对象的分组整体显示。
- PowerBI 没有报表级计算公式系统。
- PowerBI 报表级计算完全依赖于模型级的计算,全部由 DAX 给出。
- PowerBI 为了实现某些报表计算效果,必须在模型级构建没有任何模型意义的辅助表结合 DAX 实现报表级的计算。
因此,我们可以对 PowerBI 的报表计算能力有一个更准确的把握:
- PowerBI 报表层没有完备的组件系统,表现在:很多设置是无法在报表上进行的,例如:无法按某度量值设置图中恒线,无法统一分组可视化元素并按整体显示等。
- PowerBI 报表层没有独立的计算系统,表现在:PowerBI 没有提供基于模型的计算结果的轻量级二次计算能力,所有的计算全部依赖于模型级的 DAX 表达式进行。
- PowerBI DAX 表达式着实强大和灵活,它不仅肩负着完成模型级的大规模聚合运算,也肩负着完成报表级的任何精细化运算。
更多的思考:
从本文的 10 个典型案例可以部分看出 Tableau 作为完成报表层计算和展示时有良好和完备的能力,这也许得益于其初期就明确的精准定位,尤其看到在 Tableau 6 时代就已经达到了完备的计算。在这方面,由于 PowerBI 将数据准备,数据建模,数据可视化,报表制作融为一体,尤其是 模型层计算 和 报表层计算 并没有从系统化的角度做严格区分,导致任何报表需求的本质都是一个DAX查询,而报表层又没能做到:
- 基于 DAX查询结果 后,没有充分枚举各种变化可能性的组件化(非编程)实现。
- 基于 DAX查询结果 后,没有提供二次轻量级报表层计算能力。
这两点导致:
PowerBI 的报表制作严重依赖于添加众多没有模型意义的辅助表以及过度复杂的相对重量级 DAX计算,虽然能证明 DAX 的强大,但明显可以感受到在很多方面,这并不得心应手。
相信 PowerBI 在报表层必然有更大的提升,至少完成两点:
- 要么充分枚举各种变化可能性,并提供相应的组件化(非编程)实现,类似:Power Query。
- 要么提供一种报表层的计算能力,也许是另一套轻量级的函数或DAX本身的大幅优化,并补充轻量级的报表层计算能力。
最后,致敬 Tableau,没有这么优秀的对手,这么可能让 PowerBI 变得更强大呢,通过对 Tableau 的体会和理解,可以更多加深对 BI体系 的思考,也更清楚 PowerBI 的软肋,对于应对实际问题,如何基于现有的 PowerBI 特点做出合理的设计也就给出了更多的方法。