1. 程式人生 > >29、RFM客戶價值分析(有圖有案例)

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
                })