多维度帕累托丨最终话

2021-09-04 09:21:13 浏览数 (3)

最近事情比较多,学习的速度也慢了下来,惭愧。

白茶对近一个月所学的DAX进行了一次梳理,做出了一个动态多维度的帕累托图,效果如下。

这个动图包含了最近所学的相关DAX函数,那么是如何实现的呢?

这是本次,白茶所使用的一份示例数据,可以说是白茶使用频率最高的一份样例了。导入PowerBI中,系统会自动匹配模型关系,如下图:

这是前期的准备工作,接下来开始对近期所学的相关知识进行梳理。

一、编写基本的销售金额、成本、利润代码,如下:

销售金额代码:

代码语言:txt复制
销售金额 =
SUMX ( '销售明细', '销售明细'[销售数量] * RELATED ( '产品表'[销售价] ) )

成本代码:

代码语言:txt复制
销售成本 =
SUMX ( '销售明细', '销售明细'[销售数量] * RELATED ( '产品表'[成本] ) )

利润代码:

代码语言:txt复制
利润 =
[销售金额] - [销售成本]

结果如图:

这里面涉及到的知识点是:

当相关数据没在一个表格里面时,我们不能使用SUM进行聚合,需要使用迭代循环SUNX以及RELATED函数。

二、确立维度

通常情况下一组数据我们需要观测的维度大概也就是三方面:时间、财务、具体内容切换。

①、时间维度好说,可以看得出来事实表中自带销售日期,选取年份字样放入切片器中即可,结果如下:

具体的样式可以去点击右上角调整。

也可以去设置中调整。

这样就得到了符合我们心里预期的大致效果,具体的细节根据个人喜好去调整,这里就不赘述了。如果对销售日期不满意,也可以利用相关函数生成自己的日期表。后面的财务、观测维度设置方法也是一样的,不赘述。

②、财务维度。财务维度说白了,就是利用切片器,可以动态的切换数据。

点击输入数据,确定自己的表名,在列值中分别输入销售金额,利润,结果如下:

接下来,输入代码,将没有关系的维度与度量值建立关系。

代码语言:txt复制
SWITCH写法 =
SWITCH (
    TRUE (),
    SELECTEDVALUE ( '财务维度'[财务维度] ) = "利润", [利润],
    SELECTEDVALUE ( '财务维度'[财务维度] ) = "销售金额", [销售金额],
    BLANK ()
)

这里涉及到的是SWITCH函数与SELECTEDVALUE函数,当然也可以用IF进行判断,这里就不赘述了,结果如下:

③、坐标维度。所谓的观测维度,其实也就是坐标维度,其根本原理,是将原本不在一个表中的数据,利用DAX建立在一个表格中,使其同处于一个维度之下,再利用虚拟关系,将原本没有联系的表格强行建立关系。

建立维度表,输入如下代码:

代码语言:txt复制
名称与分店维度 =
VAR BC1 =
    SELECTCOLUMNS (
        ADDCOLUMNS ( DISTINCT ( '分店表'[分店名] ), "名称与分店", "分店" ),
        "名称与分店", [名称与分店],
        "具体内容", [分店名]
    )
VAR BC2 =
    SELECTCOLUMNS (
        ADDCOLUMNS ( DISTINCT ( '产品表'[商品名称] ), "名称与分店", "商品名称" ),
        "名称与分店", [名称与分店],
        "具体内容", [商品名称]
    )
RETURN
    UNION ( BC1, BC2 )

结果如图:

在建模卡片下选择新表,输入DAX函数,得到我们需要的统一坐标维度表。

再输入如下代码将原本没有联系的数据建立关系:

代码语言:txt复制
分析数据 =
VAR BC3 =
    TREATAS ( VALUES ( '名称与分店维度'[具体内容] ), '产品表'[商品名称] )
VAR BC4 =
    TREATAS ( VALUES ( '名称与分店维度'[具体内容] ), '分店表'[分店名] )
RETURN
    SWITCH (
        TRUE (),
        SELECTEDVALUE ( '名称与分店维度'[名称与分店] ) = "商品名称", CALCULATE ( [SWITCH写法], BC3 ),
        SELECTEDVALUE ( '名称与分店维度'[名称与分店] ) = "分店", CALCULATE ( [SWITCH写法], BC4 ),
        BLANK ()
    )

选择柱型折线图,将具体内容作为共享坐标轴,将分析数据放入列值中,结果如下:

这样的话我们就得到一个动态数据与动态坐标结合在一起的动态图,可以随意的切换三种维度。涉及到的一些相关函数,在这里就不赘述了。

三、帕累托累计占比

三种维度我们得到了,接下来就是来编写累计、占比、以及累计占比的代码。

累计代码:

代码语言:txt复制
累计 =
SWITCH (
    TRUE (),
    SELECTEDVALUE ( '财务维度'[财务维度] ) = "利润", CALCULATE ( [利润], ALLSELECTED ( '销售明细'[销售数量] ) ),
    SELECTEDVALUE ( '财务维度'[财务维度] ) = "销售金额", CALCULATE ( [销售金额], ALLSELECTED ( '销售明细'[销售数量] ) )
)

占比代码:

代码语言:txt复制
占比 =
DIVIDE( [分析数据], [累计] )

累计占比代码:

代码语言:txt复制
累计占比 =
VAR SQ = [占比]
RETURN
    CALCULATE ( [占比], FILTER ( ALL ( '名称与分店维度'[具体内容] ), [占比] >= SQ ) )

将累计占比的代码放入刚才的可视化插件,放在行值位置。结果如下:

我们会发现似乎有些地方不对劲啊,有一些商品在2017年这个维度上是没有消费的啊,不应该进行累计的啊!简单,记得白茶之前提到过的筛选空值么?优化我们的代码。

代码语言:txt复制
累计占比 =
VAR SQ = [占比]
RETURN
    IF (
        [分析数据] <> 0,
        CALCULATE (
            [占比],
            FILTER ( ALL ( '名称与分店维度'[具体内容] ), [占比] >= SQ && [分析数据] <> 0 )
        )
    )

结果如图:

这次是不是很完美?

四、参数分类

那么动态的帕累托图到这里告一段落了,但是我们并没有对数据优先级进行判定啊?这里需要我们添加参数值。

在建模窗格下,选择添加参数,分别添加三个参数,ABC。

参数A:

代码语言:txt复制
DAX=
GENERATESERIES( 1, 100, 1 )

参数B:

代码语言:txt复制
DAX=
GENERATESERIES( 0, 100, 1 )

参数C:

代码语言:txt复制
DAX=
GENERATESERIES( 0, 100, 1 )

这里说一下,问什么参数A的初始值是1,这是为了防止后面的计算出现问题。

将三个参数值放入环形图中,添加切片器,这是为了方便我们在实际使用中能随时对ABC三类划分权重。

添加ABC三类的比例权重。

总体:

代码语言:txt复制
参数总体 =
[参数A 值]   [参数B 值]   [参数C 值]

A类:

代码语言:txt复制
A类比例 =
DIVIDE([参数A 值],[参数总体])

B类:

代码语言:txt复制
B类比例 =
DIVIDE([参数B 值],[参数总体])

C类:

代码语言:txt复制
C类比例 =
DIVIDE([参数C 值],[参数总体])

接下来,对数据进行判定分类,划分出三种结果。输入如下代码:

代码语言:txt复制
优先级 =
VAR BC = [累计占比]
RETURN
    SWITCH ( TRUE (), BC <= [A类比例], "优先", BC <= [A类比例]   [B类比例], "其次", "最后" )

将其放入矩阵中查看,结果如图:

会发现又出现之前的毛病了,咋办,优化代码呗:

代码语言:txt复制
优先级 =
VAR BC = [累计占比]
RETURN
    IF (
        [分析数据] <> 0,
        SWITCH ( TRUE (), BC <= [A类比例], "优先", BC <= [A类比例]   [B类比例], "其次", "最后" )
    )

结果如下:

是不是结果看起来舒服了很多?

五、优化

剩下最后的步骤,就是对各个可视化插件进行细节上的优化处理了,这里就不过多的赘述了。

颜色配置,大小什么的,可以按照个人喜好的来。

当然,也可以添加一个关于ABC三类计数的表格,以及一个销售趋势图,让你的报表看起来格调更高。

样例链接:http://t.cn/A67zSEUM

小彩蛋:

1、ABC三类该如何计数呢?

2、帕累托该如何动态配色?


小伙伴们❤GET了么?

白茶会不定期的分享一些函数卡片

(文件在知识星球PowerBI丨需求圈)

这里是白茶,一个PowerBI的初学者。

0 人点赞