Power BI帕累托分析,为什么累计占比是错误的?

关于帕累托分析,大家用的比较多,有个小问题被很多人问过,就是计算出的累计占比结果是错误的,这里专门写篇文章说明一下。

正常的帕累托分析是这样的,以前的文章中曾经举了个简单的例子,

占比 = DIVIDE([利润额],CALCULATE([利润额],ALL('数据表')))
累计占比 =
var  cur_rate=[占比]
return  CALCULATE([占比],FILTER(ALL('数据表'),[占比]>=cur_rate))
如果你分析的数据表只有一个表,并且还有重复值,比如表是这样的:

按上面的写法计算的结果将是错误的,比如第一个值没有数据,后面的也有错误,为什么会这样呢?

在计算占比的时候,会自动汇总,A1的占比是48%,但按上述累计占比度量值的计算逻辑,FILTER的第一个参数是使用整个数据表作为行上下文,在每一行中计算占比,不会按类别自动汇总,所以会出现上面的情况。

如果你还不理解,可以在数据表中添加一个计算列:

每行占比 = DIVIDE([利润],SUM('数据表'[利润]))

来模拟看看每一行的占比情况:

因为没有任何一行的占比,高于48%,所以A1对应的累计占比是空值,A2的占比是22%,只有43%大于等于22%,所以A2对应的的累计占比是43%,其它的结果都是这个逻辑,你是不是清楚了?

所以只要有重复值,上述写法得到的就是错误的结果,那么应该如何修改呢?下面提供两个方法:

方法一、修改累计占比度量值

依然是利用这一个表,将累计占比的度量值修改为:

它的逻辑是先在度量值内部构建一个中间表,也就是上面度量值中VAR定义的 table_,它利用ADDCOLUMNS和SUMMARIZE函数构造了一个两列的表,一列是不重复的产品类别,另一列是每个类别对应的占比。

然后再计算大于等于当前产品类别占比的累计值,就不会出错了:

方法二、建立维度表,完善数据模型

还有一种方式是建立维度表,如果你的源数据里没有这张表,可以直接通过DAX新建表:

维度表肯定是不重复的,然后将维度表与事实表建立关系。

度量值的逻辑可以与最初的一样,只是其中的字段都改成维度表的字段:

占比 = DIVIDE([利润额],CALCULATE([利润额],ALL('产品维度表')))

累计占比 =

var  cur_rate=[占比]

return  CALCULATE([占比],FILTER(ALL('产品维度表'),[占比]>=cur_rate))

并用维度表的字段作为上下文,就可以正确的计算了:

是不是更简单。

第二种才是PowerBI的自然做法,建立维度表,完善模型,用维度表的字段作为上下文,每一个学习者都应该把这些操作,作为使用PowerBI的常识。

这也是数据模型的好处,建立一个规范的、良好的模型,可以用很简单的DAX就能解决问题,相反,模型没有建好,或者压根没有模型,导入一张大表就直接着手分析,很可能事倍功半。


我的新书已上市,帮你从0到1,轻松上手PowerBI

(0)

相关推荐