PowerBi-RFM模型
----只是想用博客记录学习过程和结果,不提供数据,谢谢----
建关系:
数据不真实,只用于模型!!
DAX公式如下:
RFM.F =
AVERAGEX( DISTINCT( '客户表'[客户名称] ) ,
CALCULATE( COUNTROWS( '订单头' ) , TREATAS( VALUES( 'RFM日期'[Date] ) , '订单头'[订单日期] ) )
)
RFM.F MAX =
MAXX( ALL( '客户表'[客户名称] ) ,
CALCULATE( COUNTROWS( '订单头' ) , TREATAS( VALUES( 'RFM日期'[Date] ) , '订单头'[订单日期] ) )
)
RFM.F MIN =
MINX( ALL( '客户表'[客户名称] ) ,
CALCULATE( COUNTROWS( '订单头' ) , TREATAS( VALUES( 'RFM日期'[Date] ) , '订单头'[订单日期] ) )
)
RFM.F 分数 = IF( NOT ISBLANK( [RFM.F] ) , DIVIDE( [RFM.F] - [RFM.F MIN] , [RFM.F MAX] - [RFM.F MIN] ) * 100 )
RFM.F 平均 = CALCULATE( [RFM.F] , ALL( '客户表' ) )
RFM.F 分数 平均 = DIVIDE( [RFM.F 平均] - [RFM.F MIN] , [RFM.F MAX] - [RFM.F MIN] ) * 100
RFM.F 权重 = DIVIDE(MAX('参数 RFM'[参数 RFM])-min('参数 RFM'[参数 RFM]),100)
---------------------------------------------------------
RFM.M将RFM.F的COUNTROWS( '订单头' )改成SUM( '订单头'[订单金额] ),因为它是计算购买金额
RFM.M 权重 = DIVIDE(100-MAX('参数 RFM'[参数 RFM]),100),其他一样
---------------------------------------------------------------------------------------------------------------
RFM.R将RFM.F的COUNTROWS( '订单头' )改成AVERAGEX( '订单头' , DATEDIFF( [订单日期] , LASTDATE( 'RFM日期'[Date] ) , DAY ) ) ,因为它是计算客户最后一次购买距离筛选日期的时间间隔
RFM.R 权重 = DIVIDE(min('参数 RFM'[参数 RFM]),100),其他一样
-----------------------------------------------------------------------------------------------------------------
RFM 结果 分类 =
VAR R = IF( [RFM.R 分数] >= [RFM.R 分数 平均] , "R↑" , "R↓" )
VAR F = IF( [RFM.F 分数] >= [RFM.F 分数 平均] , "F↑" , "F↓" )
VAR M = IF( [RFM.M 分数] >= [RFM.M 分数 平均] , "M↑" , "M↓" )
VAR RFM = R & F & M
RETURN CALCULATE( SELECTEDVALUE( 'RFM分类'[分类名称] ) , TREATAS( { RFM } , 'RFM分类'[RFM] ) )
RFM 结果 得分 = [RFM.R 分数] * [RFM.R 权重] + [RFM.F 分数] * [RFM.F 权重] + [RFM.M 分数] * [RFM.M 权重]
RFM 结果 人数 按 分类 =
CALCULATE(
COUNTROWS( '客户表' ) ,
FILTER( ALL( '客户表'[客户名称] ) , [RFM 结果 分类] = SELECTEDVALUE( 'RFM分类'[分类名称] ) )
)
RFM 结果 M 按 分类 =
IF( SELECTEDVALUE( 'RFM分类'[分类名称] ) = [RFM 结果 分类] , [RFM.M] , BLANK() )
RFM 结果 得分 TOP N =
IF(
CONTAINS(
TOPN(
[参数 RFM TOP N 值] ,
FILTER(
ALL( '客户表'[客户名称] ) ,
IF( ISBLANK( SELECTEDVALUE( 'RFM分类'[分类名称] ) ) , TRUE() , [RFM 结果 分类] = SELECTEDVALUE( 'RFM分类'[分类名称] ) )
) , [RFM 结果 得分] , DESC ) ,
'客户表'[客户名称] , SELECTEDVALUE( '客户表'[客户名称] )
) ,
[RFM 结果 得分],
BLANK()
)