29、RFM客户价值分析(有图有案例)

RFM分析:是根据用户活跃程度和交易金额贡献,进行客户价值细分的一种方法

一、分析指标

指标 解释 意义
R(Recency)近度 客户最近一次交易时间的间隔  R越小,表示客户越近有交易发生
F(Frequency)频度 客户最近一段时间内交易的次数 F越大,表示交易越频繁
M(Monetary)额度 客户最近一段时间内交易的金额 M越大,表示客户价值越高

二、客户分类

更多见图

三、RFM分析步骤

1 计算RFM各项分值

R_S, 距离当前日期越近,得分越高,最高5份,最低1份

F_S,交易频率越高,得分越高, 最高5份,最低1份

M_S,交易金额越高,得分越高, 最高5份,最低1份

2  汇总RFM分值
RFM=100*R_S+10*F_S+1*M_S

3 根据RFM分值对客户分类

RFM分析前提

1 最近有过交易行为的客户,再次发生交易的可能性高高于最近没有交易行为的客户

2 交易频率较高的客户比交易频率较低的客户,更有可能再次发生交易行为;

3 过去所有交易总金额较多的客户,比交易总金额较少的客户,更有消费积极性

四、分析实例

import pandas

data=pandas.read_csv(
        'D:\\DATA\\pycase\\5.7\\data.csv'       
           )

# 进行时间格式的转化

data['DealDateTime']=pandas.to_datetime(
        data.DealDateTime,
        format='%Y/%m/%d'
        )

## 计算距离当前日期的时间

data['DateDiff']=pandas.to_datetime(
        'today'
     )-data['DealDateTime']  

# 第一、计RFM各项分值

# 拆取时间天数

data['DateDiff']=data['DateDiff'].dt.days

# 根据分组项ID负统计列DateDiff进行分组

import numpy

R_Agg=data.groupby(
        by=['CustomerID']
        )['DateDiff'].agg({
                'recenyAgg':numpy.min
                })
# 同上求取用户的消费频次

F_Agg=data.groupby(
        by=['CustomerID']
        )['OrderID'].agg({
                'FrequencyAgg':numpy.size
                })

# 同上求取用户的消费总额

M_Agg=data.groupby(
        by=['CustomerID']
        )['Sales'].agg({
                'MoneyaryAgg':numpy.sum
                })
第二、汇总RFM分值

# 对数据列进行整合

aggData=R_Agg.join(F_Agg).join(M_Agg)

# 进行数组的划分,对最近日期区间划分
# 利用分位数方法进行分组,分为5组,为6分法
# quantile 分位数查找对应的数值,没有的话查找最近的位数

bins=aggData.recenyAgg.quantile(
        q=[0,0.2,0.4,0.6,0.8,1],
        interpolation='nearest'
        )
# 将分组最小值初始化为0
# 为了避免最小值不闭合,输出最小值为空的错误
#  cut分组,默认左开右闭

bins[0]=0

# 自定义标签,分别为1到5分

labels=[5,4,3,2,1]

R_S=pandas.cut(
        aggData.recenyAgg,
        bins,
        labels=labels
        )
# 进行数组的划分,对最近频次
# 利用分位数方法进行分组,分为5组,为6分法


bins=aggData.FrequencyAgg.quantile(
        q=[0,0.2,0.4,0.6,0.8,1],
        interpolation='nearest'
        )
bins[0]=0

# 自定义标签,分别为1到5分

labels=[1,2,3,4,5]

F_S=pandas.cut(
        aggData.FrequencyAgg,
        bins,
        labels=labels
        )


# 进行数组的划分,对最大消费进行划分
# 利用分位数方法进行分组,分为5组,为6分法

bins=aggData.MoneyaryAgg.quantile(
        q=[0,0.2,0.4,0.6,0.8,1],
        interpolation='nearest'
        )


bins[0]=0

# 自定义标签,分别为1到5分

labels=[1,2,3,4,5]

M_S=pandas.cut(
        aggData.MoneyaryAgg,
        bins,
        labels=labels
        )


# 最后将计算得变量赋值会数据框里边
aggData['R_S']=R_S

aggData['F_S']=F_S

aggData['M_S']=M_S

# 第三、客户分类
## RFM公式计算,需要将字符窜转换为int数据格式

aggData['RFM']=100*R_S.astype(int)+10*F_S.astype(int)+1*M_S.astype(int)

# 对得分进行分组处理
## 根据类型分为8种客户类型

bins=aggData.RFM.quantile(
        q=[0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1],
        interpolation='nearest'
        )

bins[0]=0

labels=[1,2,3,4,5,6,7,8]

aggData['Level']=pandas.cut(
        aggData.RFM,
        bins,
        labels=labels
        )


## 

aggData=aggData.reset_index()

### 对得分进行排序,需要用sort_value 属性

aggData_sort=aggData.sort_values(
        ['Level','RFM'],
        ascending=[1,1]
        )



## 对分组进行个数统计

aggData.groupby(
        by=['Level']
        )['CustomerID'].agg({
                'size':numpy.size
                })



















猜你喜欢

转载自blog.csdn.net/qq_36327687/article/details/84791579