zoukankan      html  css  js  c++  java
  • 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

    调用函数处理后:

  • 相关阅读:
    锚点定位跳转的各种实现方法
    css 布局之定位 相对/绝对/成比例缩放
    闭包,jQuery插件的写法:图片预加载
    mui 常见的效果
    根据浏览器内核判断是web/iOS/android/ipad/iphone 来打开不同的网站或页面
    有字库API方法使用一二
    tab 切换实现方法
    在线图片上传、预览、裁切、放大、缩小之 cropbox.js 的应用
    html + css3 demo
    jsfiddle 使用教程
  • 原文地址:https://www.cnblogs.com/mschen/p/11628394.html
Copyright © 2011-2022 走看看