
R表示近度(Recency):也就是客户最近一次交易时间到现在的间隔,注意,R是最近一次交易时间到现在的间隔,而不是最近一次的交易时间,R越大,表示客户越久未发生交易,R越小,表示客户越近有交易发生。
F表示频度(Frequency):也就是客户在最近一段时间内交易的次数,F越大,表示客户交易越频繁,F越小,表示客户不够活跃。
M表示额度(Monetary):也就是客户在最近一段时间内交易的金额,M越大,表示客户价值越高,M越小,表示客户价值越低。


import pandas
data = pandas.read_csv(
'D:/RFM分析.csv',
engine='python')


# 将交易日期处理为日期数据类型
data['DealDateTime'] = pandas.to_datetime(
data.DealDateTime,
format='%Y/%m/%d'
)
# 假设2015-10-1是计算当天,求交易日期至计算当天的距离天数
data['Days'] = pandas.to_datetime('2015-10-1') - data['DealDateTime']
# 从时间距离中获取天数
data['Days'] = data['Days'].dt.days

最近消费距离R:使用CustomerID作为分组列,距离指定日期间隔天数Days作为统计列,统计函数使用最小值函数min,即可得到每个客户的最近消费距离R。
消费频率F:使用CustomerID作为分组列,OrderID作为统计列,统计函数使用计数函数count。
消费总额M:使用CustomerID作为分组列,订单金额Sales作为统计列,统计函数使用求和函数sum。
# 统计每个客户距离指定日期有多久没有消费了,即找出最小的最近消费距离
R = data.groupby(
by=['CustomerID'],
as_index=False
)['Days'].agg('min')
# 统计每个客户交易的总次数,即对订单ID计数
F = data.groupby(
by=['CustomerID'],
as_index=False
)['OrderID'].agg('count')
# 统计每个客户交易的总额,即对每次的交易金额求和
M = data.groupby(
by=['CustomerID'],
as_index=False
)['Sales'].agg('sum')

# 将R、F、M三个数据框关联,merge默认内连接,可省略,两表on条件的关联列名均为CustomerID,同样可省略
RFMData = R.merge(F).merge(M)
# 修改列名
RFMData.columns = ['CustomerID', 'R', 'F', 'M']

R分值(R_S):定义为距离指定日期越近,R_S越大,R>=平均值,R_S为1,R<平均值,R_S为2。
F分值(F_S):定义为交易频率越高,F_S越大,F<=平均值,F_S为1,F>平均值,F_S为2。
M分值(M_S):定义为交易金额越高,M_S越大,M<=平均值,M_S为1,M>平均值,M_S为2。
# 判断R列是否大于等于R列的平均值,使用loc将符合条件R_S列的值赋值为1
RFMData.loc[RFMData['R'] >= RFMData.R.mean(), 'R_S'] = 1
# 判断R列是否小于R列的平均值,使用loc将符合条件R_S列的值赋值为2
RFMData.loc[RFMData['R'] < RFMData.R.mean(), 'R_S'] = 2
#同R_S赋值方法,对F_S、M_S进行赋值,但与R相反,F、M均为越大越好
RFMData.loc[RFMData['F'] <= RFMData.F.mean(), 'F_S'] = 1
RFMData.loc[RFMData['F'] > RFMData.F.mean(), 'F_S'] = 2
RFMData.loc[RFMData['M'] <= RFMData.M.mean(), 'M_S'] = 1
RFMData.loc[RFMData['M'] > RFMData.M.mean(), 'M_S'] = 2

# 计算RFM综合分值
RFMData['RFM'] = 100*RFMData.R_S+10*RFMData.F_S+1*RFMData.M_S

# 定义RFM综合分值与客户类型的对应关系表
CustomerType = pandas.DataFrame(
data={
'RFM': [111,112,121,122,211,212,221,222]
'Type': ['潜在客户','重点挽留客户','一般保持客户','重点保持客户',
'一般发展客户','重点发展客户','一般价值客户','高价值客户']
}
)
# 将RFMData与RFM综合分值客户类型的对应关系表合并为一个数据框
# merge默认内连接,可省略,两表on条件的关联列名均为RFM,同样可省略
RFMData = RFMData.merge(CustomerType)

# 按RFM、Type进行分组统计客户数
RFMData.groupby(
by=['RFM','Type']
)['CustomerID'].agg('count')


1.回复“PY”领取1GB Python数据分析资料
2.回复“BG”领取5GB 名企数据分析报告

