四象限分析的 DAX 实现及高阶思维模式
场景描述
在 Toboyoo 分析看板中,有一个专门的模块,通过 80/20 原理,建立起 “四象限分析” 模型。该模型从【组合象限】、【80/20 数字】和【年度变化】3 个主要子页面进行分析展示。如下所示:
其中,最为基础的是:
这里的 80s 和 20s 是一种标签,反映了从大到小排列后,累计贡献达到 80% 的群体和其他 20% 的群体。这里的 80% 和 20% 并不是群体个数占总群体个数的比例,而是上述所说的标签。因此,这里是不符合 20% 的东西创造 80% 的贡献的。
问题
现在的问题是,如何找出 80s 和 20s 的群体呢?如何通过 DAX 构建计算?当数据量很大的时候怎么处理呢?如何优化呢?
基础计算
通过逐次加列的方式建立这个结构,如下:
其中,店铺和利润很容易理解。
接着,构建一个排名,如下:
test2-rank = rankx(all('DIM-Stores'[StoreKey]),[Gross Profit])
使用 RANKX
函数完成这一任务。(对 RANKX 不清楚,可以参考:RANKX。)
接着,构建积累价值计算,如下:
test3-accumulated value =
sumx(
topn([test2-rank],all('DIM-Stores'[StoreKey]),[Gross Profit]),
[Gross Profit]
)
这里的积累计算给出了一种与帕累托传统计算方法的另外模式。其中用到了 TOPN
函数和 SUMX
函数来实现累计。
接着,计算总数和帕累托积累占比,如下:
test1-ttl = CALCULATE([Gross Profit],all('DIM-Stores'[StoreKey]))
test4-pareto% = divide([test3-accumulated value],[test1-ttl])
这样就得到了整个表。
也就实现了打标签。
预计算与静态化
DAX 引擎由于其动态计算能力,这是工业界的顶级自助 BI 引擎。其动态性体现在:需求不需要事先告知实现人员。例如在 RFM 分析中,如下:
其中,R,F,M 可以不预先给定,而是根据界面的选择,动态给定。这时候,对客户群体的打标签,就是动态打标签。这种能力在传统的 BI 工具中是不具备的,也是 DAX 的强大所在。
但由于一切都会拖延到运行时决定,导致实时计算会消耗大量时间。
因此,在实际中会考虑一种平衡的方案。同时满足设计模式思想的 OCP 原则,即:对修改封闭,对扩展开放。
在本案例中,作者将每年的 80s 和 20s 分别打标后导出到 Excel 再拼合起来。
再将拼合的数据与订单数据再在 PQ 中再拼合,如下:
这样,整套数据内容就静态化了。这样对实时计算时候的性能会大幅度提升。
设计思想
第一步:对已有数据通过 DAX 计算进行打标签。利用了 DAX 的便利性。
第二步:导出数据静态化与现有数据拼接。实现了静态化和预计算,有利于大幅度性能改进。
第三步:注意静态化时候的平衡选择。
整套流程下来,不仅仅利用了 DAX 的计算能力,还继续使用手工方法复制粘贴,再利用 Power Query 做数据拼接,同时蕴含了预计算以及平衡的设计思维。
总结
当小伙伴们拿到作品案例的时候,很多人只是因为作者在 Power BI 外部计算了店铺和产品的标签,而根本不知道这里有这样的深层次考量,这就是普通用户和资深用户之间思维模式带来的差异。请大家注意,这里的技巧根本不是技巧,而是一种思维模式,这种思维模式的精华在于:优势整合。
没有完美的,只有有优势的,厉害的人绝不会抱怨什么东西不完美,因为他们深知你无法改变你无法改变的东西,他们反而会通过智慧去找到平衡,利用不同部分的优势去平衡构建。这里有一部分工作是通过手工复制粘贴完成的。这甚至告诉我们,不管工具多么先进和自动化,复制粘贴这个最初等的动作一样是要用的。
这里表面是在说四象限分析,实际在说的是一种思想模式;这是表面在讲 Power BI,实际在讲的是可以用于任何领域的通用思维模式。如果你还在学习某个函数,那么,还是在一维空间。这里是抽象的四维空间了,因此有点难度,需要反复体会。
相关文章
- 20·Python基础-单例模式四种实现方式
- 【说站】python操作文件模式的介绍
- springaop实现原理面试_springmvc模式的工作原理
- SpringCloud(六) - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)
- JS实现全屏模式
- Locust + Influxdb + Grafana性能测试(升级版)——分布式模式(Windows篇)
- Spring Cloud Security OAuth2 中实现混合模式
- redis快照模式_动力节点Java学院整理
- java设计模式之解释器模式详解架构师
- python 实现线程安全的单例模式详解编程语言
- 使用Redis实现发布/订阅模式(redis发布与订阅)
- Redis主从模式实现热备:极致数据可靠性的保障。(redis主从热备)
- 腾讯副总裁丁珂:医疗 C2B 模式的底气和逻辑
- PHP与Redis主从模式实现高可用性(phpredis主从)
- 深入探索:Oracle数据库的价格模式(oracle数据库收费么)
- Redis集群实现高可用部署模式(redis集群模式部署)
- Redis集群模式实现原理剖析(redis集群模式原理)
- 模式Redis集群与主备模式实现高可用性(redis 集群和主备)
- Redis实现强劲的消息发布模式(redis消息发布模式)
- 研究发现吸积盘发光的模式因超大质量黑洞质量的不同而不同
- MVC模式的PHP实现
- php单例模式实现(对象只被创建一次)
- PHP观察者模式的实现代码
- Javascript命名空间模式
- java实现策略模式使用示例
- PHP面向对象程序设计(oop)学习笔记(三)-单例模式和工厂模式
- C#命令模式(CommandPattern)实例教程