销售需求丨购物篮分析

BOSS:那个谁,对,就是你,你给我研究研究咱商场物品摆放是否合理?!

白茶:(Excuse me?)…BOSS,那个我就是个码字的!

BOSS:加钱!给我做个高大上的购物篮分析!

白茶:(支付宝到账####元!)好嘞!

在实际业务中,商场物品的摆放是否对营销有所影响?所策划的营销活动是否真正的起到了促销价值?活动赠品的使用效果如何?购物篮分析是啥?

这些问题,其核心点都是一个问题——关联度问题

说的通俗易懂点,就是数学概念中我们学过的交集概念的实际用法。

模拟数据:

这是基本的案例数据,导入到PowerBI中,并且添加一个日期表,其模型关系图如下:

但是问题也来了,我们想要做关联度分析,那么就需要有一个可以切换的维度,白茶在上面就已经提过,核心概念是交集。

编写如下代码:

关联度产品表 =
VALUES ( '产品表' )

复制一份产品表作为可以切换的维度,并且模型关系如下:

注意红框的位置,要做到有关系,但是关系并未激活的状态。

解释一下:

有关系是为了后面的DAX做准备,方便函数生效;

未激活是因为激活状态下,和原有的产品表效果是一样的,无法达到筛选对比的效果。

添加切片器、表格,搭建最基本的显示环境:

这是基本的筛选环境和上下文环境,DAX的编写都要在这两个环境中进行。

先对客户购买人次进行统计:

购买人次 =
COUNTROWS ( VALUES ( '销售明细'[客户流水号] ) )

结果如下:

但是数据好像不对劲。

原始数据中[腰带]的行数是1746行,但是我们写的DAX出来的结果是1613行,很明显这个数据对不上啊!咋办?优化代码如下:

A类购买人次 =
SUMX ( '销售明细', CALCULATE ( COUNTROWS ( VALUES ( '销售明细'[客户流水号] ) ) ) )

放在表中进行对比:

很明显这次代码是没问题的。

因为当前上下文环境与行上下文环境不同,造成了COUNTROWS函数上下文转换的问题,因此结果是不准确的;可以通过SUMX函数迭代整个表搭配CALCULATE函数进行上下文转换进行解决。

那么当我们筛选产品B的时候,同时购买AB的客户数量有多少呢?

编写如下代码:

同时购买A和B的客户数 =
VAR BC =
    CALCULATETABLE (
        VALUES ( '销售明细'[客户流水号] ),
        USERELATIONSHIP ( '关联度产品表'[商品名称], '销售明细'[商品名称] ),
        ALL ( '产品表' )
    )
RETURN
    SUMX (
        '产品表',
        IF (
            CALCULATE ( [A类购买人次], Bc ) = [A类购买人次],
            BLANK (),
            CALCULATE ( [A类购买人次], Bc )
        )
    )

结果如下:

这段代码的核心点在于USERELATIONSHIP函数。

此函数激活了未生效的产品关联表B的关系,利用CALCULATETABLE函数计算求得在产品表上下文情况下,有多少[客户订单号]同时符合产品表A与产品表B。

再利用CALCULATE函数进行求值,计算出AB类同时购买人次。

至于SUMX函数和IF函数是为了解决总计问题,以及无效的AB购买人次显示问题。

注:后续函数周期表会详解USERELATIONSHIP函数,这里就不赘述了。

同时购买AB客户数计算出来了,那么关联度就好解决了,占比即可。

代码:

关联度占比 =
IF ( HASONEVALUE ( '产品表'[商品名称] ), [同时购买A和B的客户数] / [A类购买人次], BLANK () )

结果如下:

添加条件格式,并且降序排列:

实际上到这里,关联度分析就已经结束了,但是想想咱中国式BOSS的习惯,肯定是想知道金额的,所以我们仍需处理一下:

A类销售额:

A类销售额 =
SUMX ( '销售明细', '销售明细'[销售数量] * RELATED ( '产品表'[销售价] ) )

B类销售额:

关联产品B的销售额 =
CALCULATE (
    [A类销售额],
    USERELATIONSHIP ( '关联度产品表'[商品名称], '销售明细'[商品名称] ),
    ALL ( '产品表' )
)

AB类销售额:

A客户购买B的金额 =
VAR Ac =
    CALCULATETABLE ( VALUES ( '销售明细'[客户流水号] ) )
VAR Bc =
    CALCULATETABLE (
        VALUES ( '销售明细'[客户流水号] ),
        USERELATIONSHIP ( '关联度产品表'[商品名称], '销售明细'[商品名称] ),
        ALL ( '产品表' )
    )
RETURN
    SUMX (
        '产品表',
        IF (
            CALCULATE ( [关联产品B的销售额], NATURALINNERJOIN ( Ac, Bc ) ) = [A类销售额],
            BLANK (),
            CALCULATE ( [关联产品B的销售额], NATURALINNERJOIN ( Ac, Bc ) )
        )
    )

放在表格中添加条件格式,结果如下:

核心难点在于USERELATIONSHIP函数激活未生效关系,以及利用NATURALINNERJOIN函数取交集进行计算。

初步效果已经达到,但是这样显得不高大上啊!

别急,添加四象限分析图!

嘿嘿,其实就是一个散点图,BOSS不会懂得。

添加一个散点图,再分别添加两条均值线:

说白了,就是在散点图中添加两条均值线来分类数据。

位于右上角的商品,关联度占比高,同时购买金额数高,相关系数远远高于其他三个区域。

这个时候说明我们的营销活动(或者促销活动、赠品、摆放)中处于右上角的商品是有价值的,也就是没有白折腾。

再调整一下布局,添加动态配色,添加时间切片器,其最终效果如下:

怎么样,是不是格调满满?用来升值加薪最好不过了。

样例链接:http://t.cn/A6AsbE1v​

(BOSS:厉害了,那个谁!)

散点图配色技巧:


1、添加两个均值代码。

代码1:

关联度均值 =
AVERAGEX ( ALL ( '产品表' ), [关联度占比] )

代码2:

A客户购买B金额均值 =
AVERAGEX ( ALL ( '产品表' ), [A客户购买B的金额] )

2、选取喜欢的颜色,利用IF+AND进行判定。

动态颜色 =
IF (
    AND ( [A客户购买B的金额] <= [A客户购买B金额均值], [关联度占比] <= [关联度均值] ),
    "#108DFE",
    IF (
        AND ( [A客户购买B的金额] <= [A客户购买B金额均值], [关联度占比] > [关联度均值] ),
        "#e6b422",
        IF (
            AND ( [A客户购买B的金额] > [A客户购买B金额均值], [关联度占比] <= [关联度均值] ),
            "#0F5C4A",
            IF ( AND ( [A客户购买B的金额] > [A客户购买B金额均值], [关联度占比] > [关联度均值] ), "#a22041" )
        )
    )
)

当然,也可以使用SWITCH函数,这里就不赘述了。

3、散点图颜色格式设置。

散点图最终效果如下:

小伙伴们❤GET了么?

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

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

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

Fabric丨白茶 文章被收录于专栏

数据分析进阶之路,带你深入了解可视化技巧。

全部评论

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务