python刚需_python案例(六): RFM在玩什么?

RFM篇的案例代码及数据集下载密码:请关注公众号书豪创投笔记并回复python数据科学即可获取关注公众号书豪创投笔记并回复python数据科学即可获取数据集

本案例来源乃是学习朋友常国珍老师的python数据科学书,内容非常实用!希望深入浅出学习机器学习的同学可学习北大博士常国珍建模实战课程系列常国珍录制的Python 数据科学机器学习教学视频,可以由浅入深的学习机器学习!

# # 第5章3 RFM

# - pandas学习参考: [十分钟搞定pandas](http://www.cnblogs.com/chaosimple/p/4153083.html)

import pandas as pd

import numpy as np

trad_flow = pd.read_csv('RFM_TRAD_FLOW.csv', encoding='gbk')

trad_flow.head()

# ### 2.计算 RFM

# In[2]:

import time

# 先将非标准字符串时间格式化为时间数组,再转换为时间戳便于计算

trad_flow['time'] = trad_flow['time'].map(lambda x: time.mktime(time.strptime(x, '%d%b%y:%H:%M:%S')))

# 查找每个购物ID每个销售类型下的最近时间

R=trad_flow.groupby(['cumid','type'])[['time']].max()

R.head()

# 转化为透视表

R_trans=pd.pivot_table(R,index='cumid',columns='type',values='time')

R_trans.head()

# 用最久远的购物时间替换缺失值

R_trans[['Special_offer','returned_goods']] = R_trans[['Special_offer','returned_goods']].apply(lambda x: x.replace(np.nan, min(x)),

axis = 0)

R_trans['R_max'] = R_trans[['Normal','Presented','Special_offer']].apply(lambda x: max(x), axis =1)

R_trans.head()

# In[3]:

# 对购物频率按照购物ID和购物类型进行汇总统计

F=trad_flow.groupby(['cumid','type'])[['transID']].count()

# 转化为透视表

F_trans=pd.pivot_table(F,index='cumid',columns='type',values='transID')

# 用0填补缺失值

F_trans[['Special_offer','returned_goods']] = F_trans[['Special_offer','returned_goods']].fillna(0)

# 将退货的频数转化为负数

F_trans['returned_goods'] = F_trans['returned_goods'].map(lambda x: -x)

# 求每个购物ID的购物总次数

F_trans["F_total"] = F_trans.apply(lambda x: sum(x), axis = 1)

F_trans.head()

# In[4]:

# 对购物金额按照购物ID和购物类型进行汇总统计

M=trad_flow.groupby(['cumid','type'])[['amount']].sum()

# 转化为透视表

M_trans=pd.pivot_table(M,index='cumid',columns='type',values='amount')

# 用0填补缺失值

M_trans[['Special_offer','returned_goods']] = M_trans[['Special_offer','returned_goods']].fillna(0)

# 求每个购物ID的购物总金额

M_trans["M_total"] = M_trans.apply(lambda x: sum(x), axis = 1)

M_trans.head()

# In[5]:

# 合并表

RFM = pd.concat([R_trans['R_max'],F_trans['F_total'],M_trans['M_total']], axis = 1)

# RFM三个维度等宽分箱打分

RFM['R_score'] = pd.cut(RFM.R_max,3,labels = [1,2,3], precision = 2)

RFM['F_score'] = pd.cut(RFM.F_total,3,labels = [1,2,3], precision = 2)

RFM['M_score'] = pd.cut(RFM.M_total,3,labels = [1,2,3], precision = 2)

# RFM各三类,总共有27种组合,为方便营销简化分类为8种

def score_label(a,b,c):

'''

a: 'R_score'

b: 'F_score'

c: 'M_score'

'''

if a == 3 and b == 3 and c == 3:

return '重要价值客户'

elif a == 3 and (b in [1,2]) and c == 3:

return '重要发展客户'

elif (a in [1,2]) and b == 3 and c == 3:

return '重要保持客户'

elif (a in [1,2]) and (b in [1,2]) and c == 3:

return '重要挽留客户'

elif a == 3 and b == 3 and (c in [1,2]):

return '一般价值客户'

elif a == 3 and (b in [1,2]) and (c in [1,2]):

return '一般发展客户'

elif (a in [1,2]) and b == 3 and (c in [1,2]):

return '一般保持客户'

elif (a in [1,2]) and (b in [1,2]) and (c in [1,2]):

return '一般挽留客户'

# 为每个购物ID贴标签

RFM['Label'] = RFM[['R_score', 'F_score', 'M_score']].apply(lambda x: score_label(x[0],x[1],x[2]), axis = 1)

RFM.head()

# - '重要价值客户':消费额度高,购物频率高,最近购物时间也较近——该类客户是重要且忠实的大客户,要细心维护。

#

#

# - '重要发展客户':消费额度高,购物频率不高,最近购物时间较近——该类客户只是购物频率不高,有巨大的挖掘潜力,可根据该客户以往购物信息,进行个性 化推荐,并发放购物优惠券刺激消费,增加客户粘性。

#

#

# - '重要保持客户':消费额度高,购物频率高,但最近购物时间较远——该类客户最近一次购物时间较久远,可能是快要流失的重要客户,可以让客户沟通了解其 是不是哪项环节不够人性化体验不好,导致购物频率过低。

#

#

# - '重要挽留客户':消费额度高,购物频率不高,最近购物时间也较远——该类客户可能是已经流失的重要客户,如果还能联系上,可跟进了解其流失原因,对有 相似客户特征的群体进行预警,针对性改进。

#

#

# - '一般价值客户':消费额度不高,购物频率高,最近购物时间也较近——该类客户对我们的产品感兴趣,很活跃,但购物金额过低,可能是价格敏感性客户,可 对其组合金融产品增加其购买力。

#

#

# - '一般发展客户':消费额度不高,购物频率不高,最近购物时间较近——该类客户可能是我们的新晋客户,对我们的服务和产品进行试探性体验,可多留意此类 客户,进行邮件短信关怀及时发送优惠信息。

#

#

# - '一般保持客户':消费额度不高,购物频率高,最近购物时间较远——该类客户可能是快要流失的一般客户,可进行一般性低成本营销。

#

#

# - '一般挽留客户':消费额度不高,购物频率不高,最近购物时间也较远——该类客户不是我们的目标客户,经费有限可忽略此类客户。

完!

往期精彩回顾

RFM模型是一种常用的客户价值分析模型,通过对客户的最近一次购买时间(Recency)、购买频率(Frequency)和购买金额(Monetary)进行评估,将客户分为不同的价值层次,从而制定不同的营销策略。 在Python中,我们可以使用Pandas和Numpy等库进行RFM模型的分析。以下是一个简单的RFM模型分析步骤: 1. 数据预处理:将原始数据导入Pandas DataFrame中,并对数据进行清洗和转换。 2. 计算RFM指标:通过对每个客户的购买时间、频率和金额进行计算,得到每个客户的RFM指标。 3. 分组划分:将客户按照RFM指标进行分组,一般采用分位数法,将客户分为高、中、低三个层次。 4. 客户价值评估:根据客户的RFM组合,对客户进行价值评估,制定相应的营销策略。 下面是一个简单的RFM模型分析代码示例: ``` import pandas as pd import numpy as np # 1. 数据预处理 df = pd.read_csv('customer_data.csv') df['date'] = pd.to_datetime(df['date']) # 2. 计算RFM指标 today = pd.to_datetime('today') df_rfm = df.groupby('customer_id').agg({ 'date': lambda x: (today - x.max()).days, 'customer_id': 'count', 'amount': 'sum' }) df_rfm.rename(columns={'date': 'recency', 'customer_id': 'frequency', 'amount': 'monetary'}, inplace=True) # 3. 分组划分 quantiles = df_rfm.quantile(q=[0.25, 0.5, 0.75]) def r_score(x): if x <= quantiles['recency'][0.25]: return 4 elif x <= quantiles['recency'][0.5]: return 3 elif x <= quantiles['recency'][0.75]: return 2 else: return 1 def fm_score(x, c): if x <= quantiles[c][0.25]: return 1 elif x <= quantiles[c][0.5]: return 2 elif x <= quantiles[c][0.75]: return 3 else: return 4 df_rfm['r_score'] = df_rfm['recency'].apply(lambda x: r_score(x)) df_rfm['f_score'] = df_rfm['frequency'].apply(lambda x: fm_score(x, 'frequency')) df_rfm['m_score'] = df_rfm['monetary'].apply(lambda x: fm_score(x, 'monetary')) df_rfm['rfm_score'] = df_rfm['r_score'] * 100 + df_rfm['f_score'] * 10 + df_rfm['m_score'] # 4. 客户价值评估 def label_customer(x): if x >= 111 and x <= 444: return '重要保持客户' elif x >= 445 and x <= 754: return '重要发展客户' elif x >= 755 and x <= 944: return '一般保持客户' else: return '一般挽留客户' df_rfm['customer_label'] = df_rfm['rfm_score'].apply(lambda x: label_customer(x)) ``` 以上代码中,我们先将原始数据读入Pandas DataFrame中,然后计算出每个客户的RFM指标,并按照分位数法进行分组划分,最后根据客户的RFM组合确定其价值层次。 通过RFM模型的分析,我们可以更好地理解客户的行为习惯和价值特征,从而制定更加精准有效的营销策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值