中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python pandas RFM模型應用實例詳解

發布時間:2020-09-02 15:41:19 來源:腳本之家 閱讀:194 作者:閑魚!!! 欄目:開發技術

本文實例講述了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大類:

Python pandas RFM模型應用實例詳解

本文采取的方法是將三個指標進行標準化,然后按照分為數劃分為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值選擇:

Python pandas RFM模型應用實例詳解

聚類結果:

Python pandas RFM模型應用實例詳解

#聚類
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層次分析法(專家打分法)

Python pandas RFM模型應用實例詳解

總結

上述客戶分類其實比較粗曠,真正在面對千萬級客戶量時,如此劃分為四大類是難以滿足運營需求的。運營中,還需要綜合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面向對象程序設計入門與進階教程》、《Python數據結構與算法教程》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》

希望本文所述對大家Python程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

花莲市| 获嘉县| 新乡市| 鄂温| 山西省| 溧水县| 乌海市| 青浦区| 东城区| 基隆市| 株洲市| 高碑店市| 亚东县| 巨野县| 绥中县| 安宁市| 章丘市| 六盘水市| 汝南县| 汽车| 乐清市| 丰城市| 绵阳市| 酉阳| 临漳县| 辽阳县| 富裕县| 繁昌县| 嵊泗县| 丹东市| 巫山县| 应城市| 亳州市| 紫云| 海南省| 新野县| 太湖县| 玉溪市| 凤凰县| 桃园市| 仁化县|