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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用python實(shí)現(xiàn)RFM建模

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-11-02 10:36 ? 次閱讀

今天給大家分享的是如何用python實(shí)現(xiàn)RFM建模。

RFM模型的含義

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

該模型通過一個(gè)客戶的近期購買行為(R)、購買的總體頻率(F)以及花了多少錢(M)三項(xiàng)指標(biāo)來描述該客戶的價(jià)值狀況,從而能夠更加準(zhǔn)確地將成本和精力更精確的花在用戶層次身上,實(shí)現(xiàn)針對(duì)性的營銷。

詳細(xì)來說,R指的是客戶最后一次下單時(shí)間距離今天多少天了,該指標(biāo)與客戶的復(fù)購和流失直接相關(guān)。F指標(biāo)指的是客戶的下單頻率,即客戶在某個(gè)時(shí)間段內(nèi)共消費(fèi)了多少次,該指標(biāo)用于衡量客戶消費(fèi)的活躍度。M指標(biāo)指的是客戶在該時(shí)間段內(nèi)共消費(fèi)了多少錢,該指標(biāo)用于反應(yīng)客戶對(duì)于公司的貢獻(xiàn)值。

RFM分析的前提條件:

  • 最近有過交易行為的客戶,再次發(fā)生交易行為的可能性高于最近沒有交易行為的客戶。
  • 交易頻率高的客戶,比交易頻率低的客戶,更有可能再次發(fā)生交易行為。
  • 過去所有交易總金額較大的客戶,比過去所有交易總金額較小的客戶,更有消費(fèi)積極性。

原始數(shù)據(jù)

原始數(shù)據(jù)集在這里先展示一下,讓你對(duì)這個(gè)數(shù)據(jù)有一個(gè)主觀印象。

圖片

(點(diǎn)擊放大)

數(shù)據(jù)處理

1)什么是R、F、M呢?

“R”表示最近一次消費(fèi)時(shí)間距離今天共有多少天。什么是最近一次消費(fèi)時(shí)間呢?如果同一個(gè)人在不同時(shí)間有不同多個(gè)訂單,那么該時(shí)間距離當(dāng)前時(shí)間的差值的最小值,就是最近一次消費(fèi)時(shí)間。

“F”表示某個(gè)人一段時(shí)間內(nèi)的消費(fèi)頻次。

“M”表示一段時(shí)間內(nèi)的消費(fèi)總額。

2)熟悉數(shù)據(jù)集

熟悉數(shù)據(jù)集,就是在進(jìn)行數(shù)據(jù)處理之前,應(yīng)該先熟悉數(shù)據(jù),只有對(duì)數(shù)據(jù)充分熟悉之后,才能更好的進(jìn)行分析。

熟悉數(shù)據(jù)常用的方法和屬性有shape、head()、tail()、sample()、info()、describe()。

df = pd.read_excel(r"C:Users黃偉DesktopRFM_ModelRFM.xlsx")
display(df.shape)
display(df.sample(5))

結(jié)果如下:

圖片

從上述結(jié)果中可以發(fā)現(xiàn):這筆數(shù)據(jù)總共有28833行條記錄,12列。觀察上圖,可以清楚地看到每一列數(shù)據(jù)代表什么含義。

3)保留有效數(shù)據(jù)

針對(duì)此數(shù)據(jù)集,我們先說一下什么是“有效數(shù)據(jù)”?!坝行?shù)據(jù)”指的就是有效購買,也就是說對(duì)應(yīng)的“訂單狀態(tài)”字段顯示的是“交易成功”,對(duì)于“退款”的記錄,我們就直接將這個(gè)數(shù)據(jù)剔除掉。

display("剔除之前共有:"+ str(df.shape[0]) + "條記錄")
df = df[df["訂單狀態(tài)"]=="交易成功"]
display("剔除之后共有:"+ str(df.shape[0]) + "條記錄")

結(jié)果如下:

圖片

4)選取有效字段

通過上面的分析,我們知道了“R”、“F”、“M”三個(gè)指標(biāo)的概念。鑒于此,我們只需要選取"買家昵稱",“付款時(shí)間”,"實(shí)付金額"這三個(gè)字段,用于RFM模型的構(gòu)建,其余字段用處不大,因此刪除其余字段。

df1 = df[["買家昵稱","付款時(shí)間","實(shí)付金額"]]
df1.index = np.arange(df1.shape[0])
display(df1.shape)
display(df1.head())

結(jié)果如下:

圖片

5)缺失值處理

df1.isnull().sum(axis=0)

結(jié)果如下:

圖片

從上述結(jié)果中可以發(fā)現(xiàn):各字段中沒有缺失值,因此不需要做任何處理。

RFM建模過程

1)計(jì)算RFM三個(gè)指標(biāo)

① 增加“天數(shù)”字段,用于計(jì)算“R”指標(biāo)

針對(duì)上述“R”、“F”、“M”三個(gè)指標(biāo)的概念,我們對(duì)數(shù)據(jù)做一定的處理。由于 “R”表示的是最近一次消費(fèi)時(shí)間距離今天共有多少天。但是數(shù)據(jù)集中只有每一天的“付款時(shí)間”字段。因此計(jì)算RFM指標(biāo)之前,需要事先添加一個(gè)“天數(shù)”字段,求出每個(gè)“付款時(shí)間”距今共有多少天?!疤鞌?shù)”越小,就表示最近一次的消費(fèi)時(shí)間。

然后針對(duì)上述處理后的數(shù)據(jù),做一個(gè)數(shù)據(jù)透視表。以“買家昵稱”作為分組字段,對(duì)“天數(shù)”求最小值;對(duì)“付款昵稱”計(jì)數(shù);對(duì)“實(shí)付金額”求和,就可以得到我們想要的RFM三個(gè)指標(biāo)。

df1["付款時(shí)間"] = pd.to_datetime(df1["付款時(shí)間"])
df1["天數(shù)"] = (pd.to_datetime("today")-df1["付款時(shí)間"]).dt.days
display(df1.sample(10))

結(jié)果如下:

圖片

② 計(jì)算RFM三個(gè)指標(biāo)

df2 = pd.pivot_table(df1,index="買家昵稱",
                     values=["買家昵稱","天數(shù)","實(shí)付金額"],
                     aggfunc={"買家昵稱":"count","天數(shù)":"min","實(shí)付金額":"sum"})
df2 = df2[["天數(shù)","買家昵稱","實(shí)付金額"]]
df2.columns = ["R","F","M"]
df2.reset_index()
display(df2.shape)
display(df2.head(10))

結(jié)果如下:

圖片

2)用戶分層打分

通過上述分析,我們已經(jīng)得到了每一個(gè)用戶的“R”、“F”、“M”值。接下來要做的,就是給每一個(gè)用戶進(jìn)行分層。這里我們需要建立一個(gè)評(píng)判標(biāo)準(zhǔn),由于RFM模型本身就是需要根據(jù)不同場(chǎng)景和業(yè)務(wù)需求來建立的,因此這個(gè)分層標(biāo)準(zhǔn),也是需要我們溝通業(yè)務(wù)后,得到最后的分層標(biāo)準(zhǔn)。

以R指標(biāo)為例進(jìn)行說明,根據(jù)上表我們知道,R表示每個(gè)用戶最后一次購買時(shí)間距離今天共經(jīng)歷了多少天。當(dāng)這個(gè)值越小,說明用戶近期又回購了此產(chǎn)品;當(dāng)這個(gè)值越大,說明用戶已經(jīng)好久沒有再次購買產(chǎn)品了,這個(gè)用戶很有可能流失掉了(猜測(cè))。

基于上述分析,我們采用通用的5分制打分法,對(duì)RFM進(jìn)行分類打分。

說明:由于這個(gè)數(shù)據(jù)集時(shí)間較早,因此計(jì)算出來的最近一次購買時(shí)間距離今天的天數(shù),會(huì)特別大,但是沒有關(guān)系,我們演示這個(gè)案例只是為了說明RFM模型的建模過程,實(shí)際中,肯定是過幾個(gè)月進(jìn)行一次RFM建模是比較好的,這里你只需要知道原理就好。

對(duì)于R指標(biāo)來說:我們可以求出,R指標(biāo)最小值是660天,我們以30天作為時(shí)間間隔,660-690天,打5分;690-720,打4分;720-750打3分;750-780打2分;>780,打1分。

對(duì)于F指標(biāo)來說:我們可以求出,F(xiàn)指標(biāo)最小值是1次,我們以1次作為時(shí)間間隔,0-2,打1分;2-3,打2分;3-4,打3分;4-5,打4分;>5,打5分。

對(duì)于M指標(biāo)來說:我們可以求出,M指標(biāo)最小值是0.005元,我們以500元作為時(shí)間間隔,0-50,打1分;50-100,打2分;100-150,打3分;150-200,打4分;>200,打5分。

至此,我們已經(jīng)建立好了打分標(biāo)準(zhǔn),下面我們開始對(duì)每個(gè)用戶進(jìn)行分類打分。

def func1(x):
    if x >=660and x< 690:
        return5
    elif x >=690and x< 720:
        return4
    elif x >=720and x< 750:
        return3
    elif x >=750and x< 780:
        return2
    elif x >=780:
        return1

def func2(x):
    if x >=0and x< 2:
        return1
    elif x >=2and x< 3:
        return2
    elif x >=3and x< 4:
        return3
    elif x >=4and x< 5:
        return4
    elif x >=5:
        return5

def func3(x):
    if x >=0and x< 50:
        return1
    elif x >=50and x< 100:
        return2
    elif x >=100and x< 150:
        return3
    elif x >=150and x< 200:
        return4
    elif x >=200:
        return5

df2["R-SCORE"] = df2["R"].apply(func1)
df2["F-SCORE"] = df2["F"].apply(func2)
df2["M-SCORE"] = df2["M"].apply(func3)
df2.sample(10)

結(jié)果如下:

圖片

3)用戶貼標(biāo)簽

前面的步驟中,我們已經(jīng)根據(jù)業(yè)務(wù)需求,對(duì)RFM指標(biāo)進(jìn)行了分類打分,得到了R-SCORE、F-SCORE、M-SCORE三個(gè)指標(biāo)。接下來,我們需要給每個(gè)用戶貼標(biāo)簽,這里有兩種方式可以進(jìn)行用戶貼標(biāo)簽。

第一種:根據(jù)業(yè)務(wù)場(chǎng)景和業(yè)務(wù)來分配全重,對(duì)于RFM這3個(gè)指標(biāo),你更看重哪個(gè)指標(biāo),就賦予它相應(yīng)較大一點(diǎn)的權(quán)重,比如說賦予的權(quán)重是3:1:2。

第二種:完全根據(jù)單獨(dú)的RFM標(biāo)簽來計(jì)算,比如說:R-SCORE>avg(R-SCORE)、F-SCORE>avg(F-SCORE)、M-SCORE>avg(M-SCORE),表示一個(gè)客戶近期有購買,購買頻率高于所有客戶平均購買頻率,購買金額高于所有客戶的平均購買金額,因此我們貼上一個(gè)“重要挽留客戶”的標(biāo)簽。

下面以第二種方法進(jìn)行說明。根據(jù)上述敘述,每個(gè)指標(biāo)有兩種情況,要么>avg(),要么avg(),我們記為1;當(dāng)指標(biāo)

圖片

① 第一步

avg_r = df2["R-SCORE"].mean()
avg_f = df2["F-SCORE"].mean()
avg_m = df2["M-SCORE"].mean()
display(avg_r,avg_f,avg_m)

結(jié)果如下:

圖片

② 第二步

def func1(x):
    if x >avg_r:
        return1
    else:
        return0

def func2(x):
    if x >avg_f:
        return1
    else:
        return0

def func3(x):
    if x >avg_m:
        return1
    else:
        return0

df2["R-SCORE是否大于均值"] = df2["R-SCORE"].apply(func1)
df2["F-SCORE是否大于均值"] = df2["F-SCORE"].apply(func1)
df2["M-SCORE是否大于均值"] = df2["M-SCORE"].apply(func1)
display(df2.sample(10))

結(jié)果如下:

圖片

③ 第三步

def functions(x):
    if x.iloc[0]==1and x.iloc[1]==1and x.iloc[2]==1:
        return"重要價(jià)值客戶"
    elif x.iloc[0]==1and x.iloc[1]==1and x.iloc[2]==0:
        return"潛力客戶"
    elif x.iloc[0]==1and x.iloc[1]==0and x.iloc[2]==1:
        return"重要深耕客戶"
    elif x.iloc[0]==1and x.iloc[1]==0and x.iloc[2]==0:
        return"新客戶"
    elif x.iloc[0]==0and x.iloc[1]==1and x.iloc[2]==1:
        return"重要喚回客戶"
    elif x.iloc[0]==0and x.iloc[1]==1and x.iloc[2]==0:
        return"一般客戶"
    elif x.iloc[0]==0and x.iloc[1]==0and x.iloc[2]==1:
        return"重要挽回客戶"
    elif x.iloc[0]==0and x.iloc[1]==0and x.iloc[2]==0:
        return"流失客戶"
df2["標(biāo)簽"] = df2[["R-SCORE是否大于均值","F-SCORE是否大于均值","M-SCORE是否大于均值"]].apply(functions,axis=1)
df2.sample(10)

結(jié)果如下:

圖片

4)可視化展示

① 繪制不同類型客戶的人數(shù)對(duì)比

df3 = df2.groupby("標(biāo)簽").agg({"標(biāo)簽":"count"})
df3["不同客戶的占比"] = df3["標(biāo)簽"].apply(lambda x:x/np.sum(df3["標(biāo)簽"]))
df3 = df3.sort_values(by="標(biāo)簽",ascending=True)

plt.figure(figsize=(6,4),dpi=100)
x = df3.index
y = df3["標(biāo)簽"]

plt.barh(x,height=0.5,width=y,align="center")
plt.title("不同類型客戶的人數(shù)對(duì)比")

for x,y in enumerate(y):
    plt.text(y+450,x,y,ha="center",va="center",fontsize=14)

plt.xticks(np.arange(0,10001,2000))

plt.tight_layout()
plt.savefig("不同類型客戶的人數(shù)對(duì)比",dpi=300)

結(jié)果如下:

圖片

② 繪制不同類型客戶人數(shù)占比圖

df3 = df2.groupby("標(biāo)簽").agg({"標(biāo)簽":"count"})
df3["不同客戶的占比"] = df3["標(biāo)簽"].apply(lambda x:x/np.sum(df3["標(biāo)簽"]))
df3 = df3.sort_values(by="標(biāo)簽",ascending=True)

plt.figure(figsize=(7,4),dpi=100)
x = df3["不同客戶的占比"]

labels = ['潛力客戶', '一般客戶', '重要價(jià)值客戶', '重要喚回客戶', '重要深耕客戶', '新客戶', '重要挽回客戶', '流失客戶']
colors = ['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555','deeppink','yellowgreen','lightskyblue']

explode = [0,0,0,0,0,0,0,0]

patches,l_text = plt.pie(x,labels=labels,colors=colors,
        explode=explode,startangle=90,counterclock=False)
for t in l_text:
    t.set_size(0)
plt.axis("equal")
plt.legend(loc=(0.001,0.001),frameon=False)

plt.title("不同類型客戶人數(shù)占比圖")

plt.savefig("不同類型客戶人數(shù)占比圖",dpi=300)

結(jié)果如下:

圖片

③ 繪制不同類型客戶累計(jì)消費(fèi)金額

df3 = df2.groupby("標(biāo)簽").agg({"M":"sum"})
df3["M"] = df3["M"].apply(lambda x:round(x))
df3["不同客戶的占比"] = df3["M"].apply(lambda x:x/np.sum(df3["M"]))
df3 = df3.sort_values(by="M",ascending=True)

plt.figure(figsize=(6,4),dpi=100)
x = df3.index
y = df3["M"]

plt.barh(x,height=0.5,width=y,align="center")
plt.title("不同類型客戶累計(jì)消費(fèi)金額")

for x,y in enumerate(y):
    plt.text(y+45000,x,y,ha="center",va="center",fontsize=14)

plt.xticks(np.arange(0,700001,100000))
plt.tight_layout()
plt.savefig("不同類型客戶累計(jì)消費(fèi)金額",dpi=300)

結(jié)果如下:

圖片

④ 繪制不同類型客戶金額占比圖

df3 = df2.groupby("標(biāo)簽").agg({"M":"sum"})
df3["M"] = df3["M"].apply(lambda x:round(x))
df3["不同客戶的占比"] = df3["M"].apply(lambda x:x/np.sum(df3["M"]))
df3 = df3.sort_values(by="M",ascending=True)

plt.figure(figsize=(7,4),dpi=100)
x = df3["不同客戶的占比"]

labels = ['潛力客戶', '一般客戶', '重要價(jià)值客戶', '重要喚回客戶', '重要深耕客戶', '新客戶', '重要挽回客戶', '流失客戶']
colors = ['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555','deeppink','yellowgreen','lightskyblue']

explode = [0,0,0,0,0,0,0,0]

patches,l_text= plt.pie(x,labels=labels,colors=colors,
        explode=explode,startangle=90,counterclock=False)
for t in l_text:
    t.set_size(0)

plt.axis("equal")
plt.legend(loc=(0.001,0.001),frameon=False)

plt.title("不同類型客戶金額占比圖")

plt.savefig("不同類型客戶金額占比圖",dpi=300)
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 建模
    +關(guān)注

    關(guān)注

    1

    文章

    296

    瀏覽量

    60640
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3032

    瀏覽量

    48351
  • RFM
    RFM
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    7037
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84073
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用Python爬蟲實(shí)現(xiàn)百度圖片自動(dòng)下載的方法

    何用Python爬蟲實(shí)現(xiàn)百度圖片自動(dòng)下載?
    發(fā)表于 05-23 14:55

    淺析Python建模

    《利用Python進(jìn)行數(shù)據(jù)分析》 131pandas與建模代碼的結(jié)合
    發(fā)表于 10-22 06:08

    何用UML建模開發(fā)嵌入式軟件?

    何用UML建模開發(fā)嵌入式軟件?
    發(fā)表于 04-25 07:58

    請(qǐng)問如何用Python來寫單片機(jī)?

    請(qǐng)問如何用Python來寫單片機(jī)?
    發(fā)表于 06-15 09:29

    何用樹莓派和Python實(shí)現(xiàn)nRF24L01模塊功能呢

    何用樹莓派和Python實(shí)現(xiàn)nRF24L01模塊功能呢?其相關(guān)代碼該如何去實(shí)現(xiàn)呢?
    發(fā)表于 12-16 07:47

    !RFM151 RFM 151有線電視射頻分析儀.(歐陽R/

    歡迎來電咨詢!期待顧客上門看貨!您的滿意是我們最終的追求! 場(chǎng)強(qiáng)儀RFM151/RFM150場(chǎng)強(qiáng)干擾測(cè)試儀 型號(hào):供應(yīng)場(chǎng)強(qiáng)儀 RFM151 /RFM150  品牌:美國泰
    發(fā)表于 08-02 14:30 ?820次閱讀

    RI-RFM-008B RI-RFM-008B, RI-ACC-008B

    電子發(fā)燒友網(wǎng)為你提供TI(ti)ri-rfm-008b相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有ri-rfm-008b的引腳圖、接線圖、封裝手冊(cè)、中文資料、英文資料,ri-rfm-008b真值表,ri-rf
    發(fā)表于 08-20 17:52

    RI-RFM-007B RI-RFM-007B, RI-RFM-008B, RI-ACC-008B

    電子發(fā)燒友網(wǎng)為你提供TI(ti)ri-rfm-007b相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有ri-rfm-007b的引腳圖、接線圖、封裝手冊(cè)、中文資料、英文資料,ri-rfm-007b真值表,ri-rf
    發(fā)表于 08-20 17:54

    基于Python語言的RFM模型講解

    上面步驟可以知道,我們需要有RFM三個(gè)維度,根據(jù)我們?cè)跇I(yè)務(wù)分析方法課程中學(xué)到的,業(yè)務(wù)分析模型離不開指標(biāo),而指標(biāo)是對(duì)度量的匯總。因此,在找出RFM三個(gè)維度后,需要對(duì)每個(gè)維度下度量實(shí)現(xiàn)不同匯總規(guī)則。下面講述對(duì)R、F、M三個(gè)維度下的度
    的頭像 發(fā)表于 03-15 15:38 ?1538次閱讀

    何用python爬取抖音app數(shù)據(jù)

    記錄一下如何用python爬取app數(shù)據(jù),本文以爬取抖音視頻app為例。
    的頭像 發(fā)表于 03-16 09:07 ?5021次閱讀

    USB RFM應(yīng)用程序

    電子發(fā)燒友網(wǎng)站提供《USB RFM應(yīng)用程序.zip》資料免費(fèi)下載
    發(fā)表于 07-20 17:10 ?1次下載
    USB <b class='flag-5'>RFM</b>應(yīng)用程序

    python有什么用 如何用python創(chuàng)建數(shù)據(jù)庫

    python有什么用 如何用python創(chuàng)建數(shù)據(jù)庫 Python是一種高級(jí)編程語言,可以用于開發(fā)各種類型的應(yīng)用程序和工具。它的廣泛應(yīng)用使它在編程領(lǐng)域中極為受歡迎。
    的頭像 發(fā)表于 08-28 16:41 ?1060次閱讀

    何用Python實(shí)現(xiàn)文件系統(tǒng)的操作功能

    就來介紹一下如何用 Python實(shí)現(xiàn)這些功能 輸出當(dāng)前的路徑 我們可以通過 Python 當(dāng)中的 OS 庫來獲取當(dāng)前文件所在的位置 import os os .getcwd() 路
    的頭像 發(fā)表于 10-30 14:27 ?319次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>來<b class='flag-5'>實(shí)現(xiàn)</b>文件系統(tǒng)的操作功能

    何用ADIsimADC完成ADC建模

    電子發(fā)燒友網(wǎng)站提供《如何用ADIsimADC完成ADC建模.pdf》資料免費(fèi)下載
    發(fā)表于 11-28 10:36 ?2次下載
    如<b class='flag-5'>何用</b>ADIsimADC完成ADC<b class='flag-5'>建模</b>

    Python建模算法與應(yīng)用

    Python作為一種功能強(qiáng)大、免費(fèi)、開源且面向?qū)ο蟮木幊陶Z言,在科學(xué)計(jì)算、數(shù)學(xué)建模、數(shù)據(jù)分析等領(lǐng)域展現(xiàn)出了卓越的性能。其簡(jiǎn)潔的語法、對(duì)動(dòng)態(tài)輸入的支持以及解釋性語言的本質(zhì),使得Python在多個(gè)平臺(tái)
    的頭像 發(fā)表于 07-24 10:41 ?257次閱讀