91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于Python語言的RFM模型講解

數(shù)據(jù)分析與開發(fā) ? 來源:CDA數(shù)據(jù)分析師 ? 作者:CDA數(shù)據(jù)分析師 ? 2022-03-15 15:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

背景

RFM(Recency Frequency Monetary)模型是衡量客戶價值和客戶創(chuàng)利能力的重要工具和手段。在眾多的客戶關系管理(CRM)的分析模式中,RFM模型是被廣泛提到的。

RFM模型是屬于業(yè)務分析方法與模型中的部分。它的本質是用戶分類。本文將用現(xiàn)代最流行的編程語言---Python語言來實踐課堂上講解的RFM模型,將用戶進行分類。

本文采用Anaconda進行Python編譯,主要涉及的Python模塊:

  • pandas

  • matplotlib

  • seaborn

  • datetime

本章分為三部分講解:

1.RFM模型原理與步驟

2.Python分布實現(xiàn)RFM

3.總結

RFM模型原理與步驟

RFM模型的思路是:該模型是根據(jù)用戶歷史行為數(shù)據(jù),結合業(yè)務理解選擇劃分維度,實現(xiàn)用戶分類,助力用戶精準營銷。此外,還學習了構建RFM模型的步驟:

  • 獲取R、F、M三個維度下的原始數(shù)據(jù)

  • 定義R、F、M的評估模型與判斷閾值

  • 進行數(shù)據(jù)處理,獲取R、F、M的值

  • 參照評估模型與閾值,對用戶進行分層

  • 針對不同層級用戶制定運營策略

上面步驟可以知道,我們需要有RFM三個維度,根據(jù)我們在業(yè)務分析方法課程中學到的,業(yè)務分析模型離不開指標,而指標是對度量的匯總。因此,在找出RFM三個維度后,需要對每個維度下度量實現(xiàn)不同匯總規(guī)則。下面講述對R、F、M三個維度下的度量如何進行匯總。

1.R代表最近一次消費,是計算最近一次消費時間點和當前時間點的時間差。因此,這里需要用到多維數(shù)據(jù)透視分析中的基本透視規(guī)則---最小值MIN求出最小的時間差。

2.F代表消費頻次,是在指定區(qū)間內統(tǒng)計用戶的購買次數(shù)。因此,這里需要用到多維數(shù)據(jù)透視分析中的基本透視規(guī)則---技術類COUNT(技術類不去重指標)統(tǒng)計用戶的購買次數(shù)。

3.M代表消費金額,是指在指定區(qū)間內統(tǒng)計用戶的消費總金額,因此,這里需要用到求和類指標,也即基本透視規(guī)則中的合計規(guī)則---SUM。

在對得到RFM模型中的指標值后最重要的一步就是分層,根據(jù)我們在課堂上學到的內容,大部分的用戶分層是根據(jù)經(jīng)驗來分層的,本文在追求數(shù)據(jù)的客觀性下采取統(tǒng)計學中的等距分箱方法來進行分層,對R、F、M三個維度分成兩類。

綜上,我們大致了解了如何構建RFM模型,下面以Python實現(xiàn)RFM模型,并對每一步進行詳細的講解。

03 Python實現(xiàn)RFM模型

數(shù)據(jù)準備

本文所需的數(shù)據(jù)是一家公司對2021年10月底至今的客戶購買行為數(shù)據(jù),(前十二行)如圖下:

abd337c8-91e2-11ec-952b-dac502259ad0.png

其中,uid代表客戶的id,是存在重復情況的。prince維度代表客戶每發(fā)生一次交易行為所花費的金額。time為客戶發(fā)生交易行為的時間。

數(shù)據(jù)讀取與理解

在得到一份數(shù)據(jù)之后,我們第一步就是要理解數(shù)據(jù)的業(yè)務意義,以及對數(shù)據(jù)表的EDA(探索性分析),這里通過如下代碼,發(fā)現(xiàn)以下特征:

abeab51a-91e2-11ec-952b-dac502259ad0.png

具體代碼(包含Python導入包部分)如下:

#導入相關包
importpandasaspd
importtime
importnumpyasnp
importseabornassns
importmatplotlib.pyplotasplt
plt.rcParams['font.sans-serif']=["SimHei"]
plt.rcParams["axes.unicode_minus"]=Falsesns.set(style="darkgrid")

#數(shù)據(jù)讀取與查看
data=pd.read_excel('data.xlsx')
data.head()
data.isnull().sum()#查看缺失值
data.duplicated().sum()#重復值,但是不刪
data.dtypes#查看數(shù)據(jù)類型
data.describe()

#創(chuàng)建dataframe,存放RFM各值
data_rfm=pd.DataFrame()

接下來進行R、F、M指標值構建。

時間維度處理

從上文可以知道time維度,即每筆交易行為發(fā)生的時間是字符串object的格式,而在Python中我們對時間作差需要的是datetime格式,因此利用pandas庫中的pd.to_datetime函數(shù)將時間格式進行轉換,代碼如下:

data['time']=pd.to_datetime(data['time'])

得到的前五行數(shù)據(jù)如圖下,可以看到數(shù)據(jù)類型變成了datetime64[ns]

abffd4f4-91e2-11ec-952b-dac502259ad0.png

統(tǒng)計每筆訂單產生時間與當前時間的差(這里的當前時間是2021年12月11日),得到的差是timedelta64[ns]類型

ac1717fe-91e2-11ec-952b-dac502259ad0.png

可以看到時間差中包含了day、時、分、秒4個維度,但是這里我們僅需要day維度,因此我們用astype()函數(shù)將類型轉為僅含有day維度的timedelta64[D]類型。具體代碼如下:

#統(tǒng)計沒條數(shù)據(jù)與當前日期的時間差
##計算相差天數(shù)
data['R']=(pd.datetime.now()-data['time'])
##將時間差timedelta格式轉化為需要的日格式
data['R']=data['R'].astype('timedelta64[D]').astype('int')

tips:這里可能會報警告:FutureWarning: The pandas.datetime class is deprecated and will be removed from pandas in a future version. Import from datetime module instead.讀者無需理會,這是由于我們所用的pd.datetime.now()是一個比較舊的函數(shù),以后將會廢棄。

統(tǒng)計R值

在上面我們已經(jīng)創(chuàng)建了名為data_rfm的表結構的數(shù)據(jù)框,因此,將下面統(tǒng)計的R值放入其中。R值得統(tǒng)計是找客戶最近發(fā)生交易行為日期與當前日期的差。換一種思路就是找所有時間差中的最小值。

因此利用pandas中的groupby函數(shù)對每個用戶以上一步統(tǒng)計的R值作為分組依據(jù)進行分組,并求出最小值。具體代碼如下:

data_rfm=pd.merge(data_rfm,data.groupby('uid')['R'].min(),
left_on='user_id',right_on='uid')

統(tǒng)計F值

F值得統(tǒng)計就是統(tǒng)計指定區(qū)間內的消費頻次,而指定區(qū)間一般為人為設定,這里我們取全部數(shù)據(jù),即2021年10月底至今作為指定區(qū)間。

本文利用value_counts()函數(shù)對uid進行統(tǒng)計即為每個用戶得消費頻次,同時將結果合并到data_rfm數(shù)據(jù)框中。

#統(tǒng)計指定區(qū)間內的消費頻次
data_rfm['user_id']=data['uid'].value_counts().index
data_rfm['F']=data['uid'].value_counts().values

統(tǒng)計M值

本文以uid作為分組依據(jù)對price字段進行求和,得到求和類指標M值。此外,將結果合并到data_rfm數(shù)據(jù)框中。

data_rfm=pd.merge(data_rfm,data.groupby('uid')['price'].sum(),
left_on='user_id',right_on='uid')
data_rfm.rename(columns={'price':'M'},inplace=True)

上述代碼中出現(xiàn)了pandas庫中得合并語法merge(),merge()函數(shù)采取的是橫向合并,不同于MYSQL,不需要指定左表還是右表為主表,只需要提供左表與右表的公共字段在各表中的名稱即可。

由于data_rfm數(shù)據(jù)表中的user_id是去重的,因此將其作為主鍵。而data.groupby('uid')['price'].sum()得到的表格也是去重的,因此我們可以采取多維數(shù)據(jù)模型中的連接對應關系---一對一對兩表進行合并。公共字段為:左表的uid,右表的user_id

最終表格結果如下,展現(xiàn)前18行:

ac2cd22e-91e2-11ec-952b-dac502259ad0.png

數(shù)據(jù)分箱

在得到R、F、M三個指標值后,我們需要對這三個指標進行分類,并將每個用戶進行分層。

本文不采取人為主觀性的經(jīng)驗法則劃分,而是采取等距分箱的方式劃分,等距分箱的原理較簡單,這里寫出步驟:

  • 從最小值到最大值之間,均分為$N$等份(這里$N$取為2)。

  • 如果 $A$,$B$ 為最小最大值, 則每個區(qū)間的長度為 $W=(B?A)/N$ ,.

  • 則區(qū)間邊界值為$A+W$,$A+2W$,….$A+(N?1)W$ 。這里只考慮邊界,采用左閉右開的方式,即每個等份的實例數(shù)量不等。

在Python中可以利用pandas庫中的cut()函數(shù)輕松實現(xiàn)上述等距分箱,同時將結果R_labelF_label,M_label合并到data_rfm數(shù)據(jù)框中具體代碼如下:

#分箱客觀左閉右開
cut_R=pd.cut(data_rfm['R'],bins=2,right=False,labels=range(1,3)).astype('int')
data_rfm['R_label']=cut_R

cut_F=pd.cut(data_rfm['F'],bins=2,right=False,labels=range(1,3)).astype('int')
data_rfm['F_label']=cut_F

cut_M=pd.cut(data_rfm['M'],bins=2,right=False,labels=range(1,3)).astype('int')
data_rfm['M_label']=cut_M

由于利用cut()函數(shù)得到的是區(qū)間形式的值,因此需要賦予label值進行虛擬變量引用。label值使用1和2,對應的區(qū)間為從小到大。具體代表意思如下表:

ac4e7226-91e2-11ec-952b-dac502259ad0.jpg

得到最終的表格形式如下:

ac628266-91e2-11ec-952b-dac502259ad0.png

用戶分類

在得到每個用戶的R、F、M三個維度的label值后,最后就是需要對用戶進行分類,分類的原則如圖下:

ac8f2e7e-91e2-11ec-952b-dac502259ad0.png

利用pandas庫中的·terrows()函數(shù)循環(huán)遍歷每個用戶行為記錄,將符合上述條件的劃分對應的類,具體代碼如下:

fori,jindata_rfm.iterrows():
ifj['R_label']==2andj['F_label']==2andj['M_label']==2:
data_rfm.loc[i,'用戶類別']='重要價值用戶'
ifj['R_label']==2andj['F_label']==1andj['M_label']==2:
data_rfm.loc[i,'用戶類別']='重要發(fā)展用戶'
ifj['R_label']==1andj['F_label']==2andj['M_label']==2:
data_rfm.loc[i,'用戶類別']='重要保持用戶'
ifj['R_label']==1andj['F_label']==1andj['M_label']==2:
data_rfm.loc[i,'用戶類別']='重要挽留用戶'
ifj['R_label']==2andj['F_label']==2andj['M_label']==1:
data_rfm.loc[i,'用戶類別']='一般價值用戶'
ifj['R_label']==2andj['F_label']==1andj['M_label']==1:
data_rfm.loc[i,'用戶類別']='一般發(fā)展用戶'
ifj['R_label']==1andj['F_label']==2andj['M_label']==1:
data_rfm.loc[i,'用戶類別']='一般保持用戶'
ifj['R_label']==1andj['F_label']==1andj['M_label']==1:
data_rfm.loc[i,'用戶類別']='一般挽留用戶'

條形圖可視化用戶類別

利用seaborn畫圖庫對已劃分類別的用戶進行技術統(tǒng)計與可視化,得到如下圖表

acabd60a-91e2-11ec-952b-dac502259ad0.png

可以看出,大部分的用戶屬于一般發(fā)展用戶與一般挽留用戶。而對于一般發(fā)展用戶而言采取的策略為挖掘需求,后者則是放棄治療。因此,可以看出該公司在10月底至今的時間段內,用戶流失較多,但是可發(fā)展的用戶同樣是非常多的,想要提高收入,對一般發(fā)展用戶入手是成本少,效率高的選擇。

總結

RFM模型同時還利用了多維數(shù)據(jù)透視分析和業(yè)務分析方法兩個模塊的內容。所以說實踐是檢驗和鞏固學到的東西的最好方法。

例如一級的常考題上,我們常碰到一個模擬題,包含RFM模型劃分規(guī)則和一張帕累托圖,問題是在公司有限成本下提高公司收入,需要針對哪種用戶營銷最好,答案是一般發(fā)展用戶。相信大家一開始都很疑惑為什么選這個,這時候如果像本文一樣對一份數(shù)據(jù)進行實踐,這樣你就會更加理解為什么是這個答案。

審核編輯:郭婷


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

    90051

原文標題:基于客觀事實的 RFM 模型(Python 代碼)

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    什么是大模型,智能體...?大模型100問,快速全面了解!

    一、概念篇1.什么是大模型?大模型是指參數(shù)規(guī)模巨大(通常達到數(shù)十億甚至萬億級別)、使用海量數(shù)據(jù)訓練而成的人工智能模型。2.什么是大語言模型
    的頭像 發(fā)表于 02-02 16:36 ?903次閱讀
    什么是大<b class='flag-5'>模型</b>,智能體...?大<b class='flag-5'>模型</b>100問,快速全面了解!

    講解C語言代碼的實現(xiàn)過程

    重點講解C語言代碼的實現(xiàn)過程,算法的C語言實現(xiàn)過程具有一般性,通過PID算法的C語言實現(xiàn),可以以此類推,設計其它算法的C語言實現(xiàn)。 第一步:
    發(fā)表于 01-21 07:58

    一文了解Mojo編程語言

    Mojo 是一種由 Modular AI 公司開發(fā)的編程語言,旨在將 Python 的易用性與 C 語言的高性能相結合,特別適合人工智能(AI)、高性能計算(HPC)和系統(tǒng)級編程場景。以下是關于
    發(fā)表于 11-07 05:59

    3萬字長文!深度解析大語言模型LLM原理

    我們正在參加全球電子成就獎的評選,歡迎大家?guī)臀覀兺镀薄x謝支持本文轉自:騰訊技術工程作者:royceshao大語言模型LLM的精妙之處在于很好地利用數(shù)學解決了工業(yè)場景的問題,筆者基于過往工程經(jīng)驗
    的頭像 發(fā)表于 09-02 13:34 ?3462次閱讀
    3萬字長文!深度解析大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>LLM原理

    利用自壓縮實現(xiàn)大型語言模型高效縮減

    隨著語言模型規(guī)模日益龐大,設備端推理變得越來越緩慢且耗能巨大。一個直接且效果出人意料的解決方案是剪除那些對任務貢獻甚微的完整通道(channel)。我們早期的研究提出了一種訓練階段的方法——自壓
    的頭像 發(fā)表于 07-28 09:36 ?563次閱讀
    利用自壓縮實現(xiàn)大型<b class='flag-5'>語言</b><b class='flag-5'>模型</b>高效縮減

    C++ 與 Python:樹莓派上哪種語言更優(yōu)?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富
    的頭像 發(fā)表于 07-24 15:32 ?952次閱讀
    C++ 與 <b class='flag-5'>Python</b>:樹莓派上哪種<b class='flag-5'>語言</b>更優(yōu)?

    【教程】使用NS1串口服務器對接智普清言免費AI大語言模型

    AI大語言模型可以幫助我們解決各種問題,如翻譯、寫文案、創(chuàng)作詩歌、解決數(shù)學問題、情感陪伴等等。今天教大家如何使用NS1串口服務器模塊實現(xiàn)對接智普清言AI大語言模型,實現(xiàn)與大
    的頭像 發(fā)表于 06-12 19:33 ?800次閱讀
    【教程】使用NS1串口服務器對接智普清言免費AI大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>

    歐洲借助NVIDIA Nemotron優(yōu)化主權大語言模型

    NVIDIA 正攜手歐洲和中東的模型構建商與云提供商,共同優(yōu)化主權大語言模型 (LLM),加速該地區(qū)各行業(yè)采用企業(yè)級 AI。
    的頭像 發(fā)表于 06-12 15:42 ?1192次閱讀

    跟老齊學Python:從入門到精通

    礎的學習者介紹一門時下比較流行、并且用途比較廣泛的編程語言,所以,本書讀起來不晦澀,并且在其中穿插了很多貌似與Python 編程無關,但與學習者未來程序員職業(yè)生涯有關的內容。 獲取完整文檔資料可下載附件哦?。。?! 如果內容有幫助可以關注、點贊、評論支持一下哦~
    發(fā)表于 06-03 16:10

    小白學大模型:從零實現(xiàn) LLM語言模型

    在當今人工智能領域,大型語言模型(LLM)的開發(fā)已經(jīng)成為一個熱門話題。這些模型通過學習大量的文本數(shù)據(jù),能夠生成自然語言文本,完成各種復雜的任務,如寫作、翻譯、問答等。https
    的頭像 發(fā)表于 04-30 18:34 ?1317次閱讀
    小白學大<b class='flag-5'>模型</b>:從零實現(xiàn) LLM<b class='flag-5'>語言</b><b class='flag-5'>模型</b>

    如何借助大語言模型打造人工智能生態(tài)系統(tǒng)

    語言模型(LLMs)正以革命性的姿態(tài)重塑我們與科技的互動模式。然而,由于其龐大的規(guī)模,它們往往屬于資源密集型范疇,不僅大幅推高了成本,還造成了能源消耗的激增。本文深入剖析了大語言模型
    的頭像 發(fā)表于 04-27 09:19 ?1091次閱讀
    如何借助大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>打造人工智能生態(tài)系統(tǒng)

    python入門圣經(jīng)-高清電子書(建議下載)

    和Pygal 等強大的Python 庫和工具介紹,以及列表、字典、if 語句、類、文件與異常、代碼測試等內容; 第二部分將理論付諸實踐,講解如何開發(fā)三個項目,包括簡單的Python 2D 游戲開發(fā)如何利用數(shù)據(jù)
    發(fā)表于 04-10 16:53

    零基礎入門:如何在樹莓派上編寫和運行Python程序?

    是一種非常有用的編程語言,其語法易于閱讀,允許程序員使用比匯編、C或Java等語言更少的代碼行。Python編程語言最初實際上是作為Linux的腳本
    的頭像 發(fā)表于 03-25 09:27 ?2046次閱讀
    零基礎入門:如何在樹莓派上編寫和運行<b class='flag-5'>Python</b>程序?

    用PaddleNLP為GPT-2模型制作FineWeb二進制預訓練數(shù)據(jù)集

    作者:算力魔方創(chuàng)始人/英特爾創(chuàng)新大使劉力 《用PaddleNLP在4060單卡上實踐大模型預訓練技術》發(fā)布后收到讀者熱烈反響,很多讀者要求進一步講解更多的技術細節(jié)。本文主要針對大語言模型
    的頭像 發(fā)表于 03-21 18:24 ?4317次閱讀
    用PaddleNLP為GPT-2<b class='flag-5'>模型</b>制作FineWeb二進制預訓練數(shù)據(jù)集

    ?VLM(視覺語言模型)?詳細解析

    視覺語言模型(Visual Language Model, VLM)是一種結合視覺(圖像/視頻)和語言(文本)處理能力的多模態(tài)人工智能模型,能夠理解并生成與視覺內容相關的自然
    的頭像 發(fā)表于 03-17 15:32 ?8857次閱讀
    ?VLM(視覺<b class='flag-5'>語言</b><b class='flag-5'>模型</b>)?詳細解析