学习CALCULATE函数(七)丨帕累托分析法的BUG
之前,白茶研究了一下帕累托中的关键性DAX代码——累计求和。明白了累计求和的原理,就可以动手在PowerBI中进行制作帕累托图了。
数据如下图:
编写如下代码,求出每个客户销售额的占比:
客户占比 =
DIVIDE ( SUM ( '示例'[总金额] ), CALCULATE ( SUM ( '示例'[总金额] ), ALL ( '示例' ) ) )
结果如图:
接下来就是利用之前提到过累计求和的代码,求累计占比,可是这里就存在疑问了,这里用什么来进行筛选呢?没有时间维度,该如何进行?
这里有两种方法:
一、上期提到过的参数索引:
在PQ编辑界面选择添加参数。
之后编写如下代码:
参数占比 =
CALCULATE([客户占比],FILTER(ALL('示例'),'示例'[索引]<=MAX('示例'[索引])))
结果如图:
二、使用VAR定义常量,再用MAX筛选。代码如下:
VAR累计求和 =
VAR HQ = [客户占比]
RETURN
CALCULATE ( [客户占比], FILTER ( ALL ( '示例' ), [客户占比] >= HQ ) )
结果如图:
可以看得出来,两种办法求得的数值有很明显的区别,而且,细心观察,不难发现第二种方法有点小问题:
就是在实际情况中,不可能没有相同项的数据,这样的话虽然实际效果差别不是特别多,但是特别不严谨。这个问题我们稍后再说,先继续对比两种方法:
在PowerBI中并没有专门的帕累托图,但是我们回想一下,不就是折线图与柱形图的组合么?
选择这俩个中的任意一个都可以。
我们将[客户]共享轴,[总金额]作为列值,分别将[参数占比]与[VAR累计求和]放入行值中进行对比。
很清楚的就发现了,方法一做的图不符合帕累托曲线图,这是因为什么呢?因为[参数占比]是根据白茶添加的参数索引计算的,不是按照纯累计帕累托的思想进行的。
而方法二,是按照对比[占比]情况进行聚合的,所以第二种办法更符合帕累托的思路。
可是记得白茶在上面说过的么?就是实际情况中,肯定有数据是相同的,虽然不影响我们的分析结果,但是会显得不严谨。而且,@韭菜大神说的一句话,白茶深有感触,两个数据都是一样的,你凭啥判定这个是1,那个是2呢?
这句话让我无以言对。确实,岂能尽如人意,但求无愧于心吧。
这里可以补充一下,就是第二种的方法,可以对两个数据进行判定,代码如下:
优化VAR累计 =
VAR HQ = [客户占比]
VAR NA =
SELECTEDVALUE ( '示例'[客户] )
RETURN
CALCULATE (
[客户占比],
FILTER (
ALL ( '示例' ),
IF ( [客户占比] <> HQ, [客户占比] >= HQ, [客户占比] >= HQ && '示例'[客户] <= NA )
)
)
结果如图:
能看的出来,对两个相同的数据进行了排序。各位小伙伴,请自行判断,根据实际需求选择适合自己的代码。
解释一下代码含义:
VAR HQ=[客户占比]—这里是将客户占比定义为常量
VAR NA=SELECTEDVALUE(‘示例’[客户])—同上,只不过定义的是客户
RETURN—结果输出
CALCULATE([客户占比],—这里是根据后面的筛选,然后进行聚合
FILTER(ALL(‘示例’),—选择整个表,清除外部筛选
IF( [客户占比]<>HQ,—假如两个客户占比不同
[客户占比]>=HQ,—结果1,按照大于等于的顺序筛选
[客户占比]>=HQ&&‘示例’[客户]<=NA)))—否则2,按照客户名的排序方法进行大于等于的顺序筛选。
小伙伴们,看懂了没,相对于上面,这个结果看似严谨了很多,但实际上也是有问题的,你凭啥根据相同的数值给他俩排序?这就是白茶说的,帕累托分析法的BUG,两难啊。
小伙伴们❤GET了么?
白茶会不定期的分享一些函数卡片
(文件在知识星球[PowerBI丨需求圈])
这里是白茶,一个PowerBI的初学者。
下面这个知识星球是针对有实际需求的小伙伴,有需要的请加入下面的知识星球。
数据分析进阶之路,带你深入了解可视化技巧。