博客:www.jiaopengzi.com

焦棚子的文章目录

请点击下载附件

1、背景

在论坛中看到朋友在提复购率(重复购买率)等相关问题,今天把结果贴出来。

问题原贴:计算订单中的老顾客复购率

感谢问题原贴主提供脱敏素材文件。

贴一个效果图看看先;

[video width="1692" height="896" mp4="https://jiaopengzi.com/wp-content/uploads/2020/03/113_1.mp4"][/video]

结果

说明:

1、复购率定义:按天去重,即一个客户一天产生多笔交易付款,则算一次购买,除非在统计周期内另外一天也有购买,则算重复购买。

2、结果中,RF和RF%中,列明细汇总大于等于总计,因为有的客户在不同的上下文中都出现了,所以会多次计算。

二、数据源:

1、data

2、参数维度表

3、calendar(日期表)

4、sku

由于数据处理过,sku变成了分类吧,实际应该是sku。

5、客户

客户维度表,在对客户维度如ABC中会用的更多,本案例中其实可以不用。有用到一个点,但数据大的话,还是需要的。

6、建立关系

7、结果图

三、上DAX

1、客户总数

客户总数:=DISTINCTCOUNT(data[客户ID])

2、复购客户

复购客户:=
VAR T1 =
FILTER (
ADDCOLUMNS ( '客户', "RQ", CALCULATE ( DISTINCTCOUNT ( DATA[下单日期] ) ) ),
[RQ] > 1
)
RETURN
CALCULATE ( 'DATA'[客户总数], T1 )

3、复购率

复购率:=DIVIDE('data'[复购客户],'data'[客户总数])

4、近3个月复购率

近3个月复购率:=
VAR D1 =
STARTOFMONTH ( 'CALENDAR'[DATE] )
VAR D2 =
DATEADD ( D1, -2, MONTH )
VAR D3 =
ENDOFMONTH ( 'CALENDAR'[DATE] )
VAR T1 =
DATESBETWEEN ( 'CALENDAR'[DATE], D2, D3 )
VAR TF =
IF (
CALCULATE ( MAX ( 'DATA'[下单日期] ), ALL ( 'CALENDAR' ) ) >= D3,
TRUE (),
FALSE ()
)
RETURN
IF ( TF, CALCULATE ( 'DATA'[复购率], T1 ), BLANK () )

5、近12个月复购率

近12个月复购率:=
VAR D1 =
STARTOFMONTH ( 'CALENDAR'[DATE] )
VAR D2 =
DATEADD ( D1, -11, MONTH )
VAR D3 =
ENDOFMONTH ( 'CALENDAR'[DATE] )
VAR T1 =
DATESBETWEEN ( 'CALENDAR'[DATE], D2, D3 )
VAR TF =
IF (
CALCULATE ( MAX ( 'DATA'[下单日期] ), ALL ( 'CALENDAR' ) ) >= D3,
TRUE (),
FALSE ()
)
RETURN
IF ( TF, CALCULATE ( 'DATA'[复购率], T1 ), BLANK () )

6、最近12月间隔购物天数

最近12月间隔购物天数:=
VAR D1 =
STARTOFMONTH ( 'CALENDAR'[DATE] )
VAR D2 =
DATEADD ( D1, -11, MONTH )
VAR D3 =
ENDOFMONTH ( 'CALENDAR'[DATE] )
VAR T1 =
DATESBETWEEN ( 'CALENDAR'[DATE], D2, D3 )
VAR T2 =
CALCULATETABLE ( VALUES ( DATA[客户ID] ), T1 )
VAR T3 =
FILTER (
ADDCOLUMNS (
T2,
"COUNT", CALCULATE ( DISTINCTCOUNT ( DATA[下单日期] ), ALL ( 'CALENDAR'[YM] ) ),
"DAY", DATEDIFF (
CALCULATE ( MIN ( DATA[下单日期] ), ALL ( 'CALENDAR'[YM] ) ),
CALCULATE ( MAX ( DATA[下单日期] ), ALL ( 'CALENDAR'[YM] ) ),
DAY
)
),
[DAY] > 0
)
VAR C =
CALCULATE ( 'DATA'[客户总数], T3, ALL ( 'CALENDAR'[YM] ) )
VAR TF =
IF (
CALCULATE ( MAX ( 'DATA'[下单日期] ), ALL ( 'CALENDAR' ) ) >= D3,
TRUE (),
FALSE ()
)
RETURN
IF ( TF, DIVIDE ( SUMX ( T3, DIVIDE ( [DAY], [COUNT] ) ), C ), BLANK () )

7、RF%

RF是recency和frequency的缩写,即最近购买时间和购买次数,RF%符合要求的客户数占比总客户数的百分比。

RF%:=
VAR N1=SUM('RECENCY'[RL])
VAR N2=SUM('RECENCY'[RR])
VAR D=MAX('DATA'[下单日期])
VAR D1=DATESINPERIOD('CALENDAR'[DATE],D,-N1,DAY)
VAR D2=DATESINPERIOD('CALENDAR'[DATE],D,-N2,DAY)
VAR T1=EXCEPT(D2,D1)
VAR I=SUM(FREQUENCY[ID])
VAR TF1=IF(ISFILTERED(RECENCY[RECENCY]),TRUE(),FALSE())
VAR TF2=IF(ISFILTERED(FREQUENCY[FREQUENCY]),TRUE(),FALSE())
VAR C=
SWITCH(TRUE(),
TF1&&TF2,
SWITCH(TRUE(),
I=1,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=1),T1),
I=2,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=2),T1),
I=3,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=3),T1),
I=4,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=4),T1),
I>=5,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]>=5),T1)),
TF1=FALSE()&&TF2=TRUE(),
SWITCH(TRUE(),
I=1,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=1)),
I=2,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=2)),
I=3,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=3)),
I=4,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=4)),
I>=5,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]>=5))),
TF1=TRUE()&&TF2=FALSE(),
CALCULATE('DATA'[客户总数],T1),
TF1=FALSE()&&TF2=FALSE(),
'DATA'[客户总数])
RETURN

DIVIDE(C,'DATA'[客户总数])

8、RF

RF是recency和frequency的缩写,即最近购买时间和购买次数,RF符合要求的客户数。

RF:=
VAR N1=SUM('RECENCY'[RL])
VAR N2=SUM('RECENCY'[RR])
VAR D=MAX('DATA'[下单日期])
VAR D1=DATESINPERIOD('CALENDAR'[DATE],D,-N1,DAY)
VAR D2=DATESINPERIOD('CALENDAR'[DATE],D,-N2,DAY)
VAR T1=EXCEPT(D2,D1)
VAR I=SUM(FREQUENCY[ID])
VAR TF1=IF(ISFILTERED(RECENCY[RECENCY]),TRUE(),FALSE())
VAR TF2=IF(ISFILTERED(FREQUENCY[FREQUENCY]),TRUE(),FALSE())
RETURN
SWITCH(TRUE(),
TF1&&TF2,
SWITCH(TRUE(),
I=1,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=1),T1),
I=2,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=2),T1),
I=3,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=3),T1),
I=4,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=4),T1),
I>=5,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]>=5),T1)),
TF1=FALSE()&&TF2=TRUE(),
SWITCH(TRUE(),
I=1,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=1)),
I=2,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=2)),
I=3,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=3)),
I=4,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]=4)),
I>=5,CALCULATE('DATA'[客户总数],FILTER(ADDCOLUMNS('客户',"RQ",CALCULATE(DISTINCTCOUNT(DATA[下单日期]))),[RQ]>=5))),
TF1=TRUE()&&TF2=FALSE(),
CALCULATE('DATA'[客户总数],T1),
TF1=FALSE()&&TF2=FALSE(),
'DATA'[客户总数])

四、总结

1、业务为导向,理解业务,把业务转换成dax上下文;

2、参数表的使用;

3、按天去重的复购率的定义,所在在模型中增加了去掉购买时间的购买日期;

4、参考模型RFM模型,做一个 RF矩阵;

5、附件中放了一个《购买次数5次及以上验证》的sheet,便于验证。

by焦棚子

焦棚子的文章目录

113_Power Pivot 销售订单之重复购买率及购买间隔天数相关的更多相关文章

  1. 112_Power Pivot 销售订单按 sku 订单类型特殊分类及占比相关

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 经过了一个双十一后,天天面对的都是订单.于是有了关于销售订单按sku类型分类的需求. 说明:(暂且不讨论这样分类 ...

  2. 114_Power Pivot 销售订单之销售额、成本、利润率相关

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 双十二回来后遇到一个比较有意思的计算销售额和利润率的需求(见下文说明). 先看下效果. 结果 说明: 1.订单表 ...

  3. VA01销售订单批导问题解决

    1业务场景 事务代码:VA01创建销售订单,VA02修改销售订单 可以通过BAPI_SALESORDER_CREATEFROMDAT2批量创建 可以通过BAPI_SALESORDER_CHANGE批量 ...

  4. iOS-微信支付(订单号重复的问题)

    1. 官方文档中说过同一笔交易不能多次提交,出现这个错误让核实商户订单号是否重复提交,但是有些情况下是需要重复提交的,比如:用户微信支付的时候没有付款,直接取消了,那么订单如果已经创建了,在订单中心就 ...

  5. [SAP ABAP开发技术总结]SD销售订单定价过程

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. sap 中怎样把非限制库存转为销售订单库存?

    把非限制库存转为销售订单库存: MB1B 移动类型413 把销售订单库存转为非限制库存: MB1B移动类型411 E 切记!

  7. Netsharp快速入门(之11) 销售管理(开发销售订单工作区)

    作者:秋时 杨昶   时间:2014-02-15  转载须说明出处 4.3     销售订单开发 4.3.1  部件工作区设置 1.创建部件工作区,建工作区向导中要注意勾选组合并系部分.具体要建立的部 ...

  8. Netsharp快速入门(之13) 销售管理(单据流转 销售订单生成发货单)

    作者:秋时 杨昶   转载须说明出处 4.5     单据流转 4.5.1  单据流转的目的 单据流转主要为了实现业务关系的流转,并记录相互之间的关系.例如从销售订单生成销货单,两张单据之间有对应的关 ...

  9. 销售订单行上行号LINE_SHIPMENT_OPTION_NUMBER

     销售订单行上行号:LINE_SHIPMENT_OPTION_NUMBER 取值: ( 1) Line块的块级触发器POST-QUERY调用: OE_LINE.Post_Query;(来自于库OE ...

随机推荐

  1. printf()函数压栈a++与++a的输出

    printf()中a++与++a的输出问题 在C语言中有个很常用的函数printf(),使用时从右向左压栈,也就是说在printf("%d %d %d %d\n",a,a++,++ ...

  2. 串联型PID,并联型PID与标准型PID简要说明

    PID广泛应用于工业生产各个环节,然而对于不同PID结构会有一些差异,导致在调参时若按照常规的经验调试,结果将会有非常大的不同. 串联型PID(Serial PID) 串联型PID的三个环节由比例,积 ...

  3. 后端渲染神器!Dust

    Dust一个适用于浏览器与node的异步模板框架. 先上实例 后端模板: {@inject api="http://api.myserver.com/get_message"} & ...

  4. 用原生js写一个"多动症"的简历

    用原生js写一个"多动症"的简历 预览地址源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js来实现. 会动的简历实现 ...

  5. python---导入模块和包

    导入模块和包 导入模块 import的过程中发生了哪些事情? 寻找模块 如果找到,开辟一块空间,执行这个模块 把这个模块中用到的名字都收录到开辟的空间中 创建一个变量来引用这个模块的空间 注意: 模块 ...

  6. Win下GCC报错 error: ‘for’ loop initial declarations are only allowed in C99 mode

    ##报错## 用GCC编译for循环会出现以下错误 error: 'for' loop initial declarations are only allowed in C99 mode 如图所示: ...

  7. (更新中)"华为杯" 武汉大学21级新生程序设计竞赛 非官方题解

    "华为杯" 武汉大学21级新生程序设计竞赛 https://ac.nowcoder.com/acm/contest/31620#question D.和谐之树 思路:披着线段树外皮 ...

  8. JQuery学习基础

    ## 今日内容     1. JQuery 基础:         1. 概念         2. 快速入门         3. JQuery对象和JS对象区别与转换         4. 选择器 ...

  9. 面试突击41:notify是随机唤醒吗?

    做 Java 开发的小伙伴,对 wait 方法和 notify 方法应该都比较熟悉,这两个方法在线程通讯中使用的频率非常高,但对于 notify 方法的唤醒顺序,有很多小伙伴的理解都是错误的,有很多人 ...

  10. 记一次 PHP 省市县三级联动 数据库取值

    /** * Notes:省市县三级联动 * Created by depressiom * Date: 2022年4月14日 */ public function getCityData(){ //获 ...