ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RFM客户价值分类

2019-10-06 21:04:30  阅读:265  来源: 互联网

标签:rfmTable return 分类 id 客户 qi ri RFM


 

  1 # 自定义好的包,亲测可用 原数据和代码思想来自以下网址
  2 # https://github.com/joaolcorreia/RFM-analysis
  3 import datetime as dt
  4 import pandas as pd
  5 def RFM(data_,ri_qi,user_id,money,*time_):
  6     '''
  7     return:
  8         dataframe表格
  9         列有r,f,m,r_四分位分数,f_四分位分数,m_四分位分数,RFM,用户分类
 10         行为用户id,唯一,分类汇总后
 11     desc:
 12         如 : RFM(orders,'order_date','customer','grand_total',2018,1,2)
 13         返回df数据会复制到粘贴板
 14     params:
 15         data_ : 表格数据 pandas dataframe (表格中的字段名)
 16         ri_qi : 订单日期  (表格中的字段名)
 17         user_id : 用户id  (表格中的字段名)
 18         money : 消费金额  (表格中的字段名)
 19        *time_ : 不定长参数  不写默认当天
 20             
 21     '''
 22     
 23     # 设置参考时间点,无参数则默认为当天
 24     if time_ == ():
 25         NOW = dt.datetime.now()
 26     else:
 27         y,m,d = time_
 28         NOW = dt.datetime(y,m,d)
 29  
 30     # 日期列进行格式转换
 31     data_[ri_qi] = pd.to_datetime(data_[ri_qi])
 32  
 33     # 创建RFM标签
 34     rfmTable = data_.groupby(user_id).agg({ri_qi: lambda x: (NOW - x.max()).days, # Recency 顾客最近一次购买距今天数(days)
 35                                             'order_id': lambda x: len(x),      # Frequency 按顾客分组后次数,即顾客订单频次
 36                                             money: lambda x: x.sum()}) # Monetary Value 顾客消费金额总和
 37     # 日期列转换数据类型
 38     rfmTable[ri_qi] = rfmTable[ri_qi].astype(int)
 39     # 列名重命名
 40     rfmTable.rename(columns={ri_qi: 'recency', 
 41                              'order_id': 'frequency', 
 42                              money: 'monetary_value'}, inplace=True)
 43  
 44     # 确定RFM四分位数
 45     quantiles = rfmTable.quantile(q=[0.25,0.5,0.75])
 46     quantiles = quantiles.to_dict()
 47  
 48     # 创建RFM分割表
 49     rfmSegmentation = rfmTable.copy(deep=True)
 50     # Arguments (x = value, p = recency, monetary_value, frequency, k = quartiles dict)
 51     # 日期间隔越小越好
 52     def RClass(x,p,d):
 53         # p,d = args = ('recency',quantiles,)  
 54         # x即rfmSegmentation['recency'].apply(RClass) 日期间隔数据 
 55         if x <= d[p][0.25]:
 56             return 1
 57         elif x <= d[p][0.50]:
 58             return 2
 59         elif x <= d[p][0.75]: 
 60             return 3
 61         else:
 62             return 4
 63         
 64     # Arguments (x = value, p = recency, monetary_value, frequency, k = quartiles dict)
 65     # 消费频次和金额越大越好
 66     # 分数范围1-4
 67     def FMClass(x,p,d):
 68         if x <= d[p][0.25]:
 69             return 4
 70         elif x <= d[p][0.50]:
 71             return 3
 72         elif x <= d[p][0.75]: 
 73             return 2
 74         else:
 75             return 1
 76  
 77  
 78     # 评分应用 R F M
 79     rfmSegmentation['R_Quartile'] = rfmSegmentation['recency'].apply(RClass, args=('recency',quantiles,))
 80     rfmSegmentation['F_Quartile'] = rfmSegmentation['frequency'].apply(FMClass, args=('frequency',quantiles,))
 81     rfmSegmentation['M_Quartile'] = rfmSegmentation['monetary_value'].apply(FMClass, args=('monetary_value',quantiles,))
 82  
 83     # 评分应用 RFMClass 
 84     rfmSegmentation['RFMClass'] = rfmSegmentation.R_Quartile.map(str) \
 85                             + rfmSegmentation.F_Quartile.map(str) \
 86                             + rfmSegmentation.M_Quartile.map(str)
 87  
 88  
 89     def type_(x,R,F,M):
 90         '''
 91         r,f,m即每行的r,f,m分值
 92         '''
 93         r,f,m = x[R],x[F],x[M]
 94         if r > 2 and f > 2 and m > 2:
 95             return '高价值客户'
 96         elif r <= 2 and f > 2 and m > 2:
 97             return '高重点保护客户'
 98         elif r > 2 and f <= 2 and m > 2:
 99             return '重点发展客户'
100         elif r <= 2 and f <= 2 and m > 2:
101             return '重点挽留客户'
102         elif r > 2 and f > 2 and m <= 2:
103             return '一般价值客户'
104         elif r <= 2 and f > 2 and m <= 2:
105             return '一般保持客户'
106         elif r > 2 and f <= 2 and m <= 2:
107             return '一般发展客户'
108         elif r <= 2 and f <= 2 and m <= 2:
109             return '潜在客户'
110         else:
111             return 
112     
113     rfmSegmentation['type_'] = rfmSegmentation.apply(type_,args=('R_Quartile','F_Quartile','M_Quartile'),axis=1)
114     rfmSegmentation.to_clipboard() # 数据复制到  粘贴板
115     return rfmSegmentation

 

 

调用函数处理后:

标签:rfmTable,return,分类,id,客户,qi,ri,RFM
来源: https://www.cnblogs.com/mschen/p/11628394.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有