本次使用的数据为2019年客户订单数据,数据详情如下:
该数据有订单日期,用户名以及订单金额。调用.info()来查看数据的大概信息。
import pandas as pd
data = pd.read_csv('2019年用户订单数据.csv')
print(data.info())
在校对完、清理完数据后,我们就可以计算该公司客户RFM值了。
R:我们可以用2019年最后一天减去某用户最后一次订单日期获得。
F:我们可以统计用户出现的频率来获得。
M:我们可以计算某用户订单金额的总量来获得。
data['订单日期'] = pd.to_datetime(data['订单日期']) #转换日期格式
data_rfm = data.groupby('用户名').agg({
'订单日期': lambda x: (pd.to_datetime('2019-12-31')-x.max()).days, #计算R
'用户名': lambda x: len(x), #计算F
'订单金额': lambda x: x.sum() #计算M
})
在计算完客户RFM值之后,我们就需要根据RFM对客户进行评估。
| 客户类型 | R | F | M |
| 重要价值客户 | 高 | 高 | 高 |
| 重要唤回客户 | 低 | 高 | 高 |
| 重要深耕客户 | 高 | 低 | 高 |
| 重要挽留客户 | 低 | 低 | 高 |
| 潜力客户 | 高 | 高 | 低 |
| 新客户 | 高 | 低 | 低 |
| 一般维持客户 | 低 | 高 | 低 |
| 流失客户 | 低 | 低 | 低 |
我们根据分位数来对RFM进行打分,再将分数的平均值作为基准值,将大于平均值定义为高,低于平均值定义为低。继而对客户进行评价。
#计算R得分
def r_score(x):
if x<=28:
return 4
elif x<=57:
return 3
elif x<=118:
return 2
else:
return 1
#计算F得分
def f_score(x):
if x<=1:
return 1
elif x<=2:
return 2
elif x<=3:
return 3
else:
return 4
#计算M得分
def m_score(x):
if x<=204:
return 1
elif x<=606:
return 2
elif x<=1334:
return 3
else:
return 4
#客户评价
def user_type(x):
if x=='高高高':
return '重要价值客户'
elif x=='低高高':
return '重要唤回客户'
elif x=='高低高':
return '重要深耕客户'
elif x=='低低高':
return '重要挽留客户'
elif x=='高高低':
return '潜力客户'
elif x=='高低低':
return '新客户'
elif x=='低高低':
return '一般维持客户'
else:
return '流失客户'
data_rfm['R_Score'] = data_rfm['订单日期'].apply(r_score)
data_rfm['F_Score'] = data_rfm['用户名'].apply(f_score)
data_rfm['M_Score'] = data_rfm['订单金额'].apply(m_score)
data_rfm['R'] = data_rfm['R_Score'].apply(lambda x: '高' if x > data_rfm['R_Score'].mean() else '低') #根据R对用户进行评价
data_rfm['F'] = data_rfm['F_Score'].apply(lambda x: '高' if x > data_rfm['F_Score'].mean() else '低') #根据F对用户进行评价
data_rfm['M'] = data_rfm['M_Score'].apply(lambda x: '高' if x > data_rfm['M_Score'].mean() else '低') #根据M对用户进行评价
data_rfm['RFM'] = data_rfm['R']+data_rfm['F']+data_rfm['M']
data_rfm['客户类型'] = data_rfm['RFM'].apply(user_type)
我们根据RFM模型对客户进行评价后,运用Pandas对客户类型统计然后可视化表达出来。
user_type_count = data_rfm['客户类型'].value_counts().reset_index() #统计各用户类型人数
user_type_count.rename(columns = {'index':'客户类型','客户类型':'人数'},inplace = True)
#可视化处理-绘制条形图
user_type_count.plot.bar(x='客户类型')
plt.show()



