电商数据分析模块二(电商用户行为之RFM细分)
电商数据分析模块二(电商用户行为之RFM细分)事件_时间import pandas as pd import numpy as np import os import matplotlib.pyplot as plt import squarify2、加载数据:所以我们将把这三个属性分别定义为:Recency Frequency 和 Monetary。以下为数据分析过程,以及必要的Python代码:1、导入必要的程序包:
本数据分析以网络购物平台上每一个月的用户购物行为数据为分析基础,介绍最基本的RFM 分析:
RFM是一种分析顾客价值的方法。它通常用于数据库营销和直接营销,在零售和专业服务行业受到特别关注。
RFM代表三个维度:
新近 (Recency)– 客户最近购买了多少?
频率 (Frequency)– 他们多久购买一次?
货币(Monetary) – 他们花了多少钱?
来源:维基百科
所以我们将把这三个属性分别定义为:Recency Frequency 和 Monetary。
以下为数据分析过程,以及必要的Python代码:
1、导入必要的程序包:
import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import squarify
2、加载数据:
事件_时间 |
事件_类型 |
价格 |
用户id |
用户交互 |
2020/10/1 0:00 |
观看 |
35.79 |
541312140 |
72d76fde-8bb3-4e00-8c23-a032dfed738c |
2020/10/1 0:00 |
观看 |
33.20 |
554748717 |
9333dfbd-b87a-4708-9857-6336556b0fcc |
2020/10/1 0:00 |
观看 |
543.10 |
519107250 |
566511c2-e2e3-422b-b695-cf8e6e792ca8 |
2020/10/1 0:00 |
观看 |
251.74 |
550050854 |
7c90fc70-0e80-4590-96f3-13c02c18c713 |
3、值保留产生“购买”行为的用户数据:
其中事件_类型列中有三个独特值:'观看'、 '购买'、 '加购物车'。
data_十月=data_十月.loc[data_十月.事件_类型 == '购买']
事件_时间 |
事件_类型 |
价格 |
用户id |
用户交互 | |
162 |
2020/10/1 0:02 |
购买 |
130.76 |
543272936 |
8187d148-3c41-46d4-b0c0-9c08cd9dc564 |
308 |
2020/10/1 0:04 |
购买 |
642.69 |
551377651 |
3c80f0d6-e9ec-4181-8c5c-837a30be2d68 |
379 |
2020/10/1 0:06 |
购买 |
29.51 |
514591159 |
0e5dfc4b-2a55-43e6-8c05-97e1f07fbb56 |
442 |
2020/10/1 0:07 |
购买 |
54.42 |
555332717 |
1dea3ee2-2ded-42e8-8e7a-4e2ad6ae942f |
574 |
2020/10/1 0:09 |
购买 |
189.91 |
524601178 |
2af9b570-0942-4dcd-8f25-4d84fba82553 |
4、转变时间格式:
data['事件_时间']=pd.to_datetime(data['事件_时间'])
格式转换之后的数据集()局部:
事件_时间 |
事件_类型 |
价格 |
用户id |
用户交互 | |
0 |
2020-10-01 00:02:00 |
购买 |
130.76 |
543272936 |
8187d148-3c41-46d4-b0c0-9c08cd9dc564 |
1 |
2020-10-01 00:04:00 |
购买 |
642.69 |
551377651 |
3c80f0d6-e9ec-4181-8c5c-837a30be2d68 |
2 |
2020-10-01 00:06:00 |
购买 |
29.51 |
514591159 |
0e5dfc4b-2a55-43e6-8c05-97e1f07fbb56 |
3 |
2020-10-01 00:07:00 |
购买 |
54.42 |
555332717 |
1dea3ee2-2ded-42e8-8e7a-4e2ad6ae942f |
4 |
2020-10-01 00:09:00 |
购买 |
189.91 |
524601178 |
2af9b570-0942-4dcd-8f25-4d84fba82553 |
... |
... |
... |
... |
... |
... |
35659 |
2020-11-01 16:00:00 |
购买 |
170.40 |
564288950 |
67bb0a79-a34d-49d1-98d8-54d99468fce1 |
35660 |
2020-11-01 16:00:00 |
购买 |
1235.30 |
560088108 |
bb36b08d-f80a-412f-89c3-11761040d400 |
35661 |
2020-11-01 16:00:00 |
购买 |
179.90 |
521490616 |
dc9e4b23-0334-41e5-9360-612c6eaa0c98 |
35662 |
2020-11-01 16:00:00 |
购买 |
969.18 |
543842615 |
f965c7b4-bc1e-42f3-b06c-a81d1919fad6 |
35663 |
2020-11-01 16:00:00 |
购买 |
928.37 |
514366365 |
82a6c788-9e21-4bf9-9a8d-7f5a19c2c281 |
5、RFM分析:
data=data.groupby(by='用户交互').agg(订单_日期=('事件_时间' lambda x: x.max())
用户_id=('用户id' lambda x: x.unique())
数量=('用户交互' 'count')
货币_支出=('价格' 'sum')).reset_index(drop=True)
data
订单_日期 |
用户_id |
数量 |
货币_支出 | |
0 |
2020-10-01 06:10:00 |
541539898 |
1 |
9.76 |
1 |
2020-11-01 01:59:00 |
555970708 |
2 |
81.86 |
2 |
2020-11-01 06:37:00 |
512584068 |
1 |
22.80 |
3 |
2020-10-01 13:37:00 |
520206104 |
1 |
259.98 |
4 |
2020-10-01 14:13:00 |
516675926 |
1 |
1619.09 |
... |
... |
... |
... |
... |
30518 |
2020-11-01 04:05:00 |
529831093 |
1 |
157.53 |
30519 |
2020-11-01 08:23:00 |
515436065 |
1 |
317.64 |
30520 |
2020-11-01 08:35:00 |
563827236 |
2 |
256.84 |
30521 |
2020-10-01 04:01:00 |
548736783 |
1 |
203.35 |
30522 |
2020-11-01 06:11:00 |
562993718 |
2 |
307.60 |
data['订单_日期'].max()
Timestamp('2020-11-01 16:00:00')
数据中最后的日期是2020-11-30,所以将使用日期2019-12-1作为参考.
import datetime as dt
study_date = dt.datetime(2020 12 1)
data=pd.DataFrame(data)
data['上一次_购买']=study_date - data['订单_日期']
data['上一次_购买'].astype('timedelta64[D]')
data['上一次_购买']=data['上一次_购买'] / np.timedelta64(1 'D')
data.head()
订单_日期 |
用户_id |
数量 |
货币_支出 |
上一次_购买 | |
0 |
2020-10-01 06:10:00 |
541539898 |
1 |
9.76 |
60.743056 |
1 |
2020-11-01 01:59:00 |
555970708 |
2 |
81.86 |
29.917361 |
2 |
2020-11-01 06:37:00 |
512584068 |
1 |
22.80 |
29.724306 |
3 |
2020-10-01 13:37:00 |
520206104 |
1 |
259.98 |
60.432639 |
4 |
2020-10-01 14:13:00 |
516675926 |
1 |
1619.09 |
60.407639 |
import datetime as dt
study_date = dt.datetime(2020 12 1)
data=pd.DataFrame(data)
data['上一次_购买']=study_date - data['订单_日期']
data['上一次_购买'].astype('timedelta64[D]')
data['上一次_购买']=data['上一次_购买'] / np.timedelta64(1 'D')
data.head()
Recency |
Frequency |
Monetary | |
用户_id | |||
356520186 |
29.840972 |
1 |
33.45 |
397023870 |
29.621528 |
1 |
244.28 |
440756116 |
60.533333 |
1 |
39.64 |
451971397 |
60.599306 |
1 |
199.17 |
453705583 |
60.663194 |
1 |
141.57 |
6、RFM细分
RFM细分是一个有用的工具,用于识别客户群,这些客户群应该给予额外的关注。RFM细分使营销人员能够针对特定的客户群体,与他们的独特行为更相关的沟通,从而提高响应率,提高忠诚度,增加客户终身价值。与其他方法一样,RFM分割是一种分割数据的方法。
从RFM模型创建客户细分的最简单方法是使用四分位数。我们给新近性、频率和货币性评分从1到4。四是最佳/最高值,一是最低/最差值。一个最终的RFM分数是简单地通过合并个别的RFM分数数字来计算的。
RFM细分创建RFM= data.groupby('用户_id').agg(Recency=('上一次_购买' lambda x: x.min())
Frequency=('用户_id' lambda x: x.count())
Monetary=('货币_支出' lambda x: x.sum()))
RFM.head()
Recency |
Frequency |
Monetary | |
0.25 |
29.605556 |
1.0 |
94.78 |
0.50 |
29.863194 |
1.0 |
211.61 |
0.75 |
60.577083 |
1.0 |
485.79 |
定义RFM细分函数:
def RFM_label(data):
if data['RFM_score'] >= 10:
return '失去'
elif ((data['RFM_score'] >= 9) and (data['RFM_score'] < 10)):
return '冬眠'
elif ((data['RFM_score'] >= 8) and (data['RFM_score'] < 9)):
return '不能失去'
elif ((data['RFM_score'] >= 7) and (data['RFM_score'] < 8)):
return '即将睡去'
elif ((data['RFM_score'] >= 6) and (data['RFM_score'] < 7)):
return '有前途'
elif ((data['RFM_score'] >= 5) and (data['RFM_score'] < 6)):
return '潜在忠诚用户'
elif ((data['RFM_score'] >= 4) and (data['RFM_score'] < 5)):
return '忠诚用户'
else:
return '冠军'
#Create RFM label for customer
RFM['RFM_label'] = RFM.apply(RFM_label axis=1)
RFM.head()
Recency |
Frequency |
Monetary |
R_Quartile |
F_Quartile |
M_Quartile |
RFM_segmentation |
RFM_score | |
用户_id | ||||||||
356520186 |
29.840972 |
1 |
33.45 |
2 |
4 |
4 |
244 |
10 |
397023870 |
29.621528 |
1 |
244.28 |
2 |
4 |
2 |
242 |
8 |
440756116 |
60.533333 |
1 |
39.64 |
3 |
4 |
4 |
344 |
11 |
451971397 |
60.599306 |
1 |
199.17 |
4 |
4 |
3 |
443 |
11 |
453705583 |
60.663194 |
1 |
141.57 |
4 |
4 |
3 |
443 |
11 |
最终生成直观图:
with plt.xkcd():
plt.rcParams.update({'font.family': "SimHei"})
RFM_desc.columns = RFM_desc.columns.droplevel()
RFM_desc.columns = ['RecencyMean' 'FrequencyMean' 'MonetaryMean' 'Count']
#Create our plot and resize it.
fig = plt.gcf()
ax = fig.add_subplot()
fig.set_size_inches(16 9)
squarify.plot(sizes=RFM_desc['Count']
label=['失去'
'冬眠'
'不能失去'
'即将睡去'
'有前途'
'潜在忠诚用户'
'忠诚用户'
'冠军'] alpha=.6 )
plt.title("RFM 细分" fontsize=18 fontweight="bold")
plt.axis('off')
plt.show()
现在我们已经确定了我们的客户类别,我们可以决定如何接近或处理每个客户。
- 冠军客户:奖励。可以成为新产品的早期使用者。会提升品牌资产,最有可能发送推荐信。
- 忠诚客户:向上销售高价值产品。征求意见。
- 潜在忠诚者:提供会员/忠诚计划。让他们参与进来。提供个性化建议。
- 承诺:提供优惠券。把他们带回到站台上,让他们保持联系。提供个性化建议。
- 即将入睡:通过更新或更新产品赢回它们,不要在竞争中失去它们。必要时和他们谈谈。花时间尽可能个性化。
- 不能失去他们:在网站上提供有用的资源。发送个性化电子邮件。
- 休眠:使电子邮件的主题,非常个性化。通过特定产品的特定折扣来恢复他们的兴趣。
- 失落:通过“伸出援手”运动来恢复兴趣。否则忽略。