(相关资料图)
一、项目背景
在本项目中,我们基于用户购买数据(Transaction Data)做用户的分群,使用的方法一次是RFM模型和K-means算法。 数据来源:
二、数据的读取
二、数据清洗
df
三、使用RFM模型
到目前为止,Recency, Frequency, MonetaryValue都是数值型的。 为了用户分群,我们需要把R,F,M的值分别需要映射到bucket中,比如Recency的值映射到1,2,3,4中的某一个数值上; Frequency映射到1,2,3,4中的某一个数值上,MonetaryValue也做同样的处理。 这里需要注意的一点是:值越大就说明用户越有价值,比如R=4的用户要比R=1的用户的价值更大。 所以当我们尝试映射的时候,也需要注意这一点。 因为Recency越大说明好久没有买了,所以这时候映射之后的数要越小; 相反,对于Frequency字段,这个值越大就说明用户购买次数越多,映射之后的值也需要越大; 所以我们需要考虑这一点。
接下来计算一下RFM_Score。这个值越大说明,说明这个用户价值越大。对于Score可以有不同的计算方式。但在这里我们使用最简单而且最经典的计算方法,其实就是把所有的值加在一起。 比如一个客户的 R=1, F=2, M=3, 则这个客户的RFM_Score为6。
data_rfm
上述通过阈值的方式来分群的操作有什么缺点? 因为Recency 和 Frequency 与MonetrayValue有不同的分布且可能彼此之间相关,通过阈值划分阈值界线来划分数据并不能反映分布上的区分性
四、基于K-means算法的分群
接下来我们通过使用k-means算法来对用户分群,使用的值仍然是Recency, Frequency, Moneytary Value. 当我们使用k-means算法的时候经常需要做预处理工作,因为算法依赖于距离的计算,而且R,F,M的值的范围差别很大。
对于预处理,我们做如下2个方面的工作:
即使针对于某一个属性,它的值差别很大,所以我们先使用log transform把值做个转换使用归一化操作把值映射到 N(0,1),使用的是
sklearn
里的
StandardScaler
。
data_rfm
基于以上的这幅图,我们通过拐点法来选出3个最好的K值。 簇内离差平方和拐点法的思想很简单,就是在不同的K值下计算簇内离差平方和,然后通过可视化的方法找到"拐点"所对应的K值; 通过可视化方法,重点关注的是斜率的变化,当斜率由大变小时,并且之后的斜率变化缓慢,则认为突然变化的点就是寻找的目标点,因为继续随着簇数K的增加,聚类效果不在有大的变化这时k应该是相对比较合理的值,所以这里可以选择K值6
km1
data_new
df
关键词: