python基礎教程:Python pandas RFM模型應用實例詳解

這篇文章主要介紹了Python pandas RFM模型應用,結合實例形式詳細分析了pandas RFM模型的概念、原理、應用及相關操作注意事項,需要的朋友可以參考下


本文實例講述了Python pandas RFM模型應用。分享給大家供大家參考,具體如下:

什麼是RFM模型

根據美國數據庫營銷研究所Arthur Hughes的研究,客戶數據庫中有3個神奇的要素,這3個要素構成了數據分析最好的指標:

最近一次消費 (Recency): 客戶最近一次交易時間的間隔。R值越大,表示客戶交易距今越久,反之則越近;
消費頻率 (Frequency): 客戶在最近一段時間內交易的次數。F值越大,表示客戶交易越頻繁,反之則不夠活躍;
消費金額 (Monetary): 客戶在最近一段時間內交易的金額。M值越大,表示客戶價值越高,反之則越低

RFM實踐應用

1、前提假設驗證

RFM模型的應用是有前提假設的,即R、F、M值越大價值越大,客戶未來的爲企業帶來的價值越大。這個前提假

設其實已經經過大量的研究和實證,假設是成立的。不過爲了更加嚴謹,確保RFM模型對於特殊案例是有效的,

本文還進行了前提假設驗證:

ps:Frequency、Monetary均爲近6個月內的數據,即1-6月數據;

利用相關性檢驗,驗證假設:

最近購買產品的用戶更容易產生下一次消費行爲
消費頻次高的用戶,用戶滿意度高,忠誠度高,更容易產生下一次消費行爲
消費金額高的用戶更容易帶來高消費行爲

2、RFM分級

簡單的做法,RFM三個指標以均值來劃分,高於均值的爲高價值、低於均值的爲低價值,如此可以將客戶劃分爲8大類:在這裏插入圖片描述
本文采取的方法是將三個指標進行標準化,然後按照分爲數劃分爲5個等級,數值越大代表價值越高;當然最終劃分的規則還是要結合業務來定。劃分爲5個等級後,客戶可以細分爲125種。

#讀取數據
rfm<-read.csv('~/desktop/rfm1_7.csv',header=TRUE)
summary(rfm)
#數據分佈
par(mfrow=c(1,3))
boxplot(rfm$rankR1) 
boxplot(rfm$rankF1) 
boxplot(rfm$rankM1)
#rfm分級
breaks1<-quantile(rfm$Recency, probs = seq(0, 1, 0.2),names = FALSE)
breaks1<-c(1,14,30,57,111,181) #以流失用戶的定義來設置分級 30天以上爲流失用戶
breaks2<-quantile(rfm$Frequency, probs = seq(0, 1, 0.2),names = FALSE)
breaks2<-c(1,2,3,6,14,164) 
breaks3<-quantile(rfm$Monetary, probs = seq(0, 1, 0.2),names = FALSE)
rfm$rankR1<- cut(rfm$Recency,breaks1, 5,labels=F)
rfm$rankR1<- 6-rfm$rankR1
rfm$rankF1<- cut(rfm$Frequency,breaks2, 5,labels=F)
rfm$rankM1<- cut(rfm$Monetary,breaks3, 5,labels=F)

3、客戶分類
本文采用K-means聚類進行分類,聚類結果結合業務劃分爲4大類:

Cluster1:價值用戶R、F、M三項指標均較高;
Cluster2,3:用戶貢獻值最低,且用戶近度(小於2)和頻度較低,爲無價值客戶;
Cluster4:發展用戶,用戶頻度和值度較低,但用戶近度較高,可做up營銷;
Cluster5:挽留客戶,用戶近度較低,但頻度和值度較高,需採用挽留手段
k值選擇:在這裏插入圖片描述
聚類結果:在這裏插入圖片描述

#聚類
df<-rfm[,c(6,7,8)]
p1<-fviz_nbclust(df, kmeans, method = "wss")
p2<-p1 + geom_vline(xintercept = 5, linetype = 2)
km_result <- kmeans(df, 5)
dd <- cbind(rfm,df, cluster = km_result$cluster)
##查看每一類的數目
table(dd$cluster)
picture<-fviz_cluster(km_result, df, geom = "point")
####聚類結果解釋####
rfm_final <- within(dd,{Custom = NA
Custom[cluster == 1] = '高價值客戶'
Custom[cluster == 2 ] = '無價值客戶'
Custom[ cluster == 3] = '無價值客戶'
Custom[cluster == 4] = '重點發展客戶' 
Custom[cluster == 5] = '重點挽留客戶'
})

4、RFM打分

步驟3,我們將客戶劃分爲四大類,其實如果一類客戶中還有大量的客戶,此時爲了精細化營銷,可以根據RFM進行加權打分,給出一個綜合價值的分。這裏,運用AHP層次分析法確定RFM各指標權重:

客戶價值RFM_SCORE= 0.25rankR + 0.20rankF+0.55*rankM

AHP層次分析法(專家打分法)在這裏插入圖片描述
總結
上述客戶分類其實比較粗曠,真正在面對千萬級客戶量時,如此劃分爲四大類是難以滿足運營需求的。運營中,還需要綜合CRM中其他指標、維度。

ps:後續作者利用RFM客戶價值得分進行潛在客戶挖掘,嘗試利用決策樹等模型挖掘平臺潛在客戶特徵。

簡單實例

import pandas as pd
import numpy as np
import time
#todo 讀取數據
data = pd.read_csv('RFM_TRAD_FLOW.csv',encoding='gbk')
# print(ret)
# todo RFM------>R(最近一次消費)
#todo 時間與字符串相互轉換
data['time'] = data['time'].map(lambda x:time.mktime(time.strptime(x,'%d%b%y:%H:%M:%S')))
# print(data)
# todo 分組
groupby_obj = data.groupby(['cumid','type'])
# for name,data in groupby_obj:
#   print(name)
#   print(data)
# todo 取值
R = groupby_obj[['time']].max()
# print(
# todo 轉爲透視表
r_trans = pd.pivot_table(R,index='cumid',columns='type',values='time')
# print(data_trans)
# todo 替換缺失值 有缺失值,替換成最遠的值
r_trans[['Special_offer','returned_goods']] = r_trans[['Special_offer','returned_goods']].apply(lambda x:x.replace(np.nan,min(x)),axis = 0)
# print(data_trans)
r_trans['r_max'] = r_trans.apply(lambda x:sum(x),axis=1)
# print(r_trans)
# todo RFM------>F(消費頻率)
# 取值
F =groupby_obj[['transID']].count()
# print(F)
#轉爲透視表
f_trans = pd.pivot_table(F,index='cumid',columns='type',values='transID')
# print(f_trans)
#替換缺失值
f_trans[['Special_offer','returned_goods']]= f_trans[['Special_offer','returned_goods']].fillna(0)
# print(f_trans)
#
f_trans['returned_goods'] = f_trans['returned_goods'].map(lambda x:-x)
# print(f_trans)
f_trans['f_total'] = f_trans.apply(lambda x:sum(x),axis=1)
# print(f_trans)
# todo RFM------>M(消費金額)
# 取值
M =groupby_obj[['amount']].sum()
# print(M)
#轉爲透視表
m_trans = pd.pivot_table(M,index='cumid',columns='type',values='amount')
# print(f_trans)
#替換缺失值
m_trans[['Special_offer','returned_goods']]= m_trans[['Special_offer','returned_goods']].fillna(0)
# print(f_trans)
#
m_trans['m_total'] = m_trans.apply(lambda x:sum(x),axis=1)
# print(m_trans)
# 合併
RFM=pd.concat([r_trans["r_max"],f_trans['f_total'],m_trans['m_total']],axis=1)
print(RFM)
r_score = pd.cut(RFM.r_max,3,labels=[0,1,2])
f_score = pd.cut(RFM.r_max,3,labels=[0,1,2])
m_score = pd.cut(RFM.r_max,3,labels=[0,1,2])

寫到這裏,給大家推薦一個資源很全的python學習聚集地,點擊進入,這裏有資深程序員分享以前學習心得,學習筆記,還有一線企業的工作經驗,且給大家精心整理一份python零基礎到項目實戰的資料,每天給大家講解python最新的技術,前景,學習需要留言的小細節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章