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不会懂得。
添加一个散点图,再分别添加两条均值线:
说白了,就是在散点图中添加两条均值线来分类数据。
位于右上角的商品,关联度占比高,同时购买金额数高,相关系数远远高于其他三个区域。
这个时候说明我们的营销活动(或者促销活动、赠品、摆放)中处于右上角的商品是有价值的,也就是没有白折腾。
再调整一下布局,添加动态配色,添加时间切片器,其最终效果如下:
怎么样,是不是格调满满?用来升值加薪最好不过了。
(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的初学者。