rfm模型及python實現的簡單介紹

本文目錄一覽:

數據蛙-Python進階

這是漫長的一周,本周完成了Python的進階模塊,主要是pandas、numpy、matplotlib、seaborn、pyecharts這些模塊的學習以及一個實際的案例:商品銷售情況分析,之前一直覺得課程難度不夠,但到這一周難度就大大提高了。尤其是案例練習中的RFM模型和用戶生命周期建立,看懂不難但是自己寫一直出錯,在不斷出錯不斷嘗試中知識得到了積累,另外可視化部分沒有什麼練習題,希望後面可以加上一些這方面的練習,接下來分模塊來總結一下學習的內容。

重新設置索引:df.set_index()

Series格式轉換為DataFrame:df.to_frame()

文件讀取:pd.read_csv(filepath, header = 0,skiprows=[1,2]) 

使用位置做索引:df.loc[0]        使用列表做索引:df.loc[[0,1,2]]

使用切片做索引:df.loc[0:4]        使用bool類型索引:df[df[‘年齡’]30]

loc 是基於索引值的,切片是左閉右閉的

iloc 是基於位置的,切片是左閉右開的

修改列索引:df.rename(columns={‘姓名’:’name’, ‘年齡’:’age’},inplace=True)

替換一個值:df.replace({‘name’:{‘小明’:’xiaoming’}},inplace=True)

對數據進行排序:df.sort_values(‘age’)

累加求和:df.cumsum(0)

刪除列:del df[‘player’]         刪除行:df.drop(labels=0) labels 是行列的名字

數據拼接:pd.concat([left,right],axis=1)

# 指定列進行關聯,默認是 inner join     result = pd.merge(left,right,on=’key’)

#多個關聯條件:result = pd.merge(left, right, on=[‘key1’, ‘key2’])

#左連接:result = pd.merge(left, right, how=’left’, on=[‘key1’, ‘key2’])

# 列名不一樣的關聯:pd.merge(left,right,left_on = [‘key1′,’key2’],right_on = [‘key3′,’key4’])

#單個分組:groups = df.groupby(‘district’)

# 作用多個聚合函數:groups.agg([np.mean,np.sum,np.std])

# 針對具體列聚合 groups.age.agg([np.mean,np.sum,np.std])

# 不同列不同聚合函數 groups.agg({“age”:np.mean,”novip_buy_times”:np.sum})

分組後該列值求和顯示:groups[‘vip_buy_times’].transform(‘sum’)

通常用於求佔比:transform(lambda x: x /sum(x))

# 填充指定值:np.full([3,4],1)

# 起始為10,5為步長,30為結尾取不到:np.arange(10, 30, 5)

#隨機矩陣:np.random.random((2,3))

# 平均劃分:np.linspace( 0, 2*pi, 100 )

# 類型及轉換:vector.astype(‘float’)

# 多維變一維:matrix.ravel()

# 矩陣的擴展:a = np.arange(0, 40, 10)    b = np.tile(a, (3, 5))    # 行變成3倍,列變成5倍

# 水平拼接:np.hstack((a,b))  豎直拼接:np.vstack((a,b))

# 豎直分割:np.hsplit(a,3)    #水平分割:np.vsplit(a,3)

8. Select the data in rows [3, 4, 8] and in columns [‘animal’, ‘age’].

A:df.loc[df.index[[3,4,8]],[‘animal’,’age’]]

行採用位置,列採用普通索引,這裡利用index函數將位置變化為具體的普通索引,再利用loc函數

19. The ‘priority’ column contains the values ‘yes’ and ‘no’. Replace this column with a column of boolean values: ‘yes’ should be True and ‘no’ should be False

A1:df[‘priority’].replace([‘yes’,’no’],[True,False],inplace=True) 用replace函數替換

A2:df[‘priority’] = df[‘priority’].map({‘yes’: True, ‘no’: False}) 用map函數替換

最大最小值的索引:df.idxmax、df.idxmin

找出最大最小的前N個數:nlargest()和nsmallest() 

將原表分組 並設置分段區間 pd.cut(df[‘A’], np.arange(0, 101, 10))

resample函數 日期重採樣:s.resample(‘M’).mean()

TimeGrouper 重組:s.groupby(pd.TimeGrouper(‘4M’)).idxmax()

split 分割函數:temp = df[‘From_To’].str.split(‘_’, expand=True) True為DataFrame

兩個DataFrame拼接用join:df = df.join(temp)

import matplotlib.pyplot as plt

plt.rcParams[‘font.sans-serif’]=[‘SimHei’] #用來正常顯示中文標籤

plt.rcParams[‘axes.unicode_minus’]=False #用來正常顯示負號

%matplotlib inline 直接顯示

折線圖:plt.plot(x,y,color = ‘r’)

柱狀圖:plt.bar(x,y)  plt.barh(x,y) 多個bar x設置不同 堆積圖 bottom設置不同

散點圖:plt.scatter(x, y, c=colors, alpha=0.5, s = area)

直方圖:plt.hist(a,bins= 20) bin代表分隔的最小單位

plt.legend() 顯示圖例

for a,b in zip(X+W[i],data[i]):

    plt.text(a,b,”%.0f”% b,ha=”center”,va= “bottom”) 添加數據標籤

plt.annotate(‘注釋文本’,xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16,arrowprops=dict(arrowstyle=”-“)) 添加註釋文本

plt.xlabel(“Group”) x軸標題

plt.ylabel(“Num”) y軸標題

fig, axes = plt.subplots(nrows=2, ncols=2,facecolor=’darkslategray’)  繪製多個圖形

axes[0,0] axes[0,1] axes[1,0] axes[1,1]

pylab.rcParams[‘figure.figsize’] = (10, 6) # 調整圖片大小

動態展示圖表

from pyecharts.charts import Bar

from pyecharts import options as opts

** pyecharts 繪圖的五個步驟:**

創建圖形對象:bar = Bar()

添加繪圖數據:bar.add_xaxis([“襯衫”, “毛衣”, “領帶”, “褲子”, “風衣”, “高跟鞋”, “襪子”])

                         bar.add_yaxis(“商家A”, [114, 55, 27, 101, 125, 27, 105])

                         bar.add_yaxis(“商家B”, [57, 134, 137, 129, 145, 60, 49])

配置系列參數:對標籤、線型等的一些設置

配置全局參數:bar.set_global_opts(title_opts=opts.TitleOpts(title=”銷售情況”))

渲染圖片:生成本地 HTML 文件 bar.render(“mycharts.html”)  bar.render()

notebook 渲染:bar.render_notebook()

bar = (Bar()

    .add_xaxis([“襯衫”, “毛衣”, “領帶”, “褲子”, “風衣”, “高跟鞋”, “襪子”])

    .add_yaxis(“商家A”, [114, 55, 27, 101, 125, 27, 105])

    .add_yaxis(“商家B”, [57, 134, 137, 129, 145, 60, 49])

    .set_global_opts(title_opts=opts.TitleOpts(title=”某商場銷售情況”))

)

bar.render_notebook()

柱狀圖:Bar()

條形圖:bar.reversal_axis() #翻轉XY軸,將柱狀圖轉換為條形圖

折線圖:from pyecharts.charts import Line  line=Line()

餅圖:from pyecharts.charts import Page, Pie    Pie() 

轉換日期類型:df[‘order_dt’]=pd. to_datetime (df.order_dt,format=”%Y%m%d”)

將日期轉換為月為單位:df[‘month’]=df.order_dt.values. astype(‘datetime64[M]’) 所有日期顯示為當月第一天

去除日期單元值:order_diff/ np.timedelta64(1,’D’)

過濾部分極值:grouped_user.sum() .query(‘order_products100’) .order_amount

數據透視表:rfm=df.pivot_table( index =’user_id’, values =[‘order_products’,’order_amount’], aggfunc ={‘order_amount’:’sum’,’order_products’:’sum’})

map() 方法是pandas.series.map()方法, 對DF中的元素級別的操作, 可以對df的某列或某多列

applymap(func) 也是DF的屬性, 對整個DF所有元素應用func操作

purchase_r=pivoted_counts.applymap(lambda x: 1 if x1 else np.NaN if x==0 else 0)

apply(func) 是DF的屬性, 對DF中的行數據或列數據應用func操作,也可用於Series

apply(lambda x:x.cumsum()/x.sum())    累計佔比

apply(lambda x:x/x.sum(),axis=0)     每一列中每行數據佔比

下周開始進入數據分析思維的課程,很期待後面的課程以及項目,加油!

用戶價值分層——基於RFM模型的研究分析

• R(Recency):消費間隔,最近一次距離上次消費的時間間隔

• F(Frequency):消費頻次,一段時間(1個月/1年…)內的消費總次數

• M(Monetary):消費金額,一段時間(1個月/1年…)內的消費總金額

      RFM模型是用戶價值研究中的經典模型,基於近度(Recency),頻度(Frequency)和額度(Monetory)這3個指標對用戶進行聚類,找出具有潛在價值的用戶, 從而輔助商業決策,提高營銷效率。RFM作為一種數據驅動的客戶細分技術,可幫助營銷人員做出更明智的戰略性決策,使營銷人員能夠快速識別用戶並將其細分為同類群體,並針對性制定個性化的營銷策略,提高用戶的參與度和留存率。

      RFM建模所需要的數據源是相對簡單的,只用到了購買記錄中的時間和金額這兩個欄位。我們基於交易數據中用戶的最後一次的購買時間,購買的次數以和頻率,以及平均/總消費額對每個用戶計算了三個維度的標準分。然後我們對於三個維度賦予了不同的權重,再基於加權後的分值應用K-Means進行聚類,根據每種人群三個維度與平均值之間的高低關係,確定哪些是需要保持用戶,哪些是需要挽留的用戶,哪些是需要發展的用戶等。在將這些客戶圈出之後,便可以對不同客戶群使用不同針對性地營銷策略(引導,喚醒等),提高復購率與轉化率。值得注意的是,三個維度的權重製定並沒有統一的標準,比較通用的方法是用層次分析法(AHP),實際場景結合行業以及具體公司的特點進行因地制宜、因人而異的優化。

RFM因素:

• R值越高,顧客的有效期越近,對商家活動的響應越積極

• F值越高,顧客的消費頻次越高,對商家的忠誠度就越高

• M值越高,顧客的消費能力越高,對商家貢獻度就越高

• 想要提高復購率和留存率,需要時刻警惕R值

RFM分析:

• 誰是您最有價值的客戶?

• 導致客戶流失率增多的是哪些客戶?

• 誰有潛力成為有價值的客戶?

• 你的哪些客戶可以保留?

• 您哪些客戶最有可能對參與度活動做出響應?

• 誰是你不需要關注的無價值客戶?

• 針對哪些客戶制定哪種發展、保留、挽回策略?

      通過RFM模型,可以幫助營銷人員實現客戶細分;衡量客戶價值和客戶利潤創收能力;識別優質客戶;指定個性化的溝通和營銷服務;為更多的營銷決策提供有力支持。

數據導入:使用python的pandas.read_csv導入樣本數據。

缺失值校驗:因數據為生產真實的交易數據,質量相對較高,缺失值較低。

極值校驗:第一份樣本數據獲取的用戶訂單實付金額,其中會存在優惠或補差支付,同時因就餐人數不一致,產生的的訂單消費也會存在較大的差異,造成極致波動、標準差值較大,因此需對金額進行處理,以人均消費額替代訂單支付金額,可去掉10元以下、萬元以上的交易訂單。

獲取RFM值:使用 groupby獲取RFM值

獲取RFM評分值:數據離散,pandas.cut

實驗數據RFM分值佔比

說明:F、M分布不均勻,極值差異大,經數據探查知曉該商戶開通了企業團餐業務,企業會給員工發放補貼,導致員工呈現較高的消費頻次,該類用戶的消費行為絕大程度依賴於企業,在實際的RFM模型可踢出此類訂單,降低此類人群的分值,其次數據中的M值為客戶實付金額,該商戶支持預定、會餐、大小桌,同一單的消費群體不同,或可使用人均消費總額作為M值。

RFM數據合併,建立R、F、M數據框:pandas+numpy

計算RFM綜合分值:權重法

權重值主要賦值方法可分為主觀賦權法、客觀賦權法,如下:

主觀賦權法:主要由專家經驗得到權數,然後對指標進行綜合評價。是一種結合性方法,易操作,存在一定主觀性。常用方法:層次分析法AHP、權值因子判斷表法、德爾菲法、模糊分析法、二項係數法、環比評分法、最小平方法、序關係分析法等。

客觀賦權法:依據歷史數據研究指標之間的相關關係或指標與評估結果的影響關係來綜合評價。這是定量研究,無須考慮決策者主觀意願和業務經驗,計算方法較為複雜。常用方法:主成分分析、因子分析、熵值法、變異係數法、均方差法、回歸分析法等。

因樣本數據分布不均勻,故手動賦權重值,去除部分極值。

結論:以近90天的消費活躍來看,用戶消費頻次集中在1-6次,呈現出極佳的復購率。可以針對消費一次的人群進行特徵分析。比如針對人群的流動性,若流動人群佔比較大,可進一步推廣特色菜吸引客戶,若周邊人群佔比較高,可基於復購人群的特徵進行分析,同時平台可提供該類人群近期消費偏好,供商家參考,制定針對性方案。

      了解RFM定義後,將3個指標作為坐標系的XYZ坐標軸,從空間上切割成8類,作為用戶的價值分層,如下圖:

用戶價值分層說明:

上面我們已經計算得到各個用戶的RFM分值,接下來要依據分值進行分類。

定義RFM 的分值等級

使用pyecharts繪製玫瑰圖:

結論:商家顧客表現出來的忠誠度較高,但新客獲取能力較低。但是單純看分層佔比,並沒有實際意義,可以基於價值分層與其他特徵關聯分析進行精準投放。如下圖(網路參考圖,本期實驗並未涉及其他特徵)所示:

      用戶畫像是基於用戶信息與行為衍生出來的特徵屬性,用戶的准入信息是用戶的主觀特徵,是一種既定的事實,通過對用戶行為的採集、研究,刻畫出單個用戶的特徵。其意義在於基於某一事物對群里特徵進行分類,有效的體現事物的合適人群;同時針對群里特徵的偏愛、習慣研究,可以刻畫出用戶的需求,實現精準化營銷。

      用戶畫像的基礎成分來源於用戶的准入信息(會員註冊時的登記信息),更多的特徵數據來源於用戶的各類行為,而RFM模型便是基於用戶消費行為提煉出來的價值指標。通過對各個價值分層的群體特徵研究,可以有效提升獲客能力以及針對各類人群實現精準化營銷。

      市場和運營往往絞盡腦汁做活動、上新品、蹭熱點、做營銷,拓渠道,不斷開發客戶、做回訪維繫客戶感情,除了少數運氣好的之外,但大多效果寥寥,這是為何?

      經驗豐富的營銷人員都知道「了解客戶」和「客戶細分」的重要性。營銷人員不僅要著眼於創造更多的訪問量和點擊量以提高客戶獲取,還必須遵循從提高點擊率(CTR)轉變為提高保留,忠誠度並建立客戶關係的新範式。與其將整個客戶群作為一個整體進行分析,不如將其劃分為同類群體,了解每個群體的特徵,並使他們參與相關的活動,而不是僅根據客戶年齡或地理位置進行客戶細分。而RFM分析是市場營銷人員分析客戶行為的最流行、最簡單、最有效的客戶細分方法之一。

針對RFM分層用戶制定相應的營銷策略:

      • 重要價值客戶是您的最佳客戶,他們是那些最新購買,最常購買,並且花費最多的消費者。提供VIP服務和個性化服務,獎勵這些客戶,他們可以成為新產品的早期採用者,並有助於提升您的品牌。

      • 重要發展客戶:近期客戶,消費金額高,但平均頻率不太高,忠誠度不高。提供會員或忠誠度計劃或推薦相關產品以實現向上銷售並幫助他們成為您的忠實擁護者和高價值客戶。

      • 重要保持客戶:經常購買、花費巨大,但最近沒有購買的客戶。向他們發送個性化的重新激活活動以重新連接,並提供續訂和有用的產品以鼓勵再次購買。

      • 重要挽回客戶:曾經光顧,消費金額大,購買頻率低,但最近沒有光顧的顧客。設計召回策略,通過相關的促銷活動或續訂帶回他們,並進行調查以找出問題所在,避免將其輸給競爭對手。

      •一般價值客戶:最近購買,消費頻次高但消費金額低的客戶,需要努力提高其客單價,提供產品優惠以吸引他們。

      • 一般發展客戶:最近購買,但消費金額和頻次都不高的客戶。可提供免費試用以提高客戶興趣,提高其對品牌的滿意度。

      • 一般保持客戶:很久未購買,消費頻次雖高但金額不高的客戶。可以提供積分制,各種優惠和打折服務,改變宣傳方向和策略與他們重新聯繫,而採用公平對待方式是最佳。

      • 一般挽留客戶:RFM值都很低的客戶。針對這類客戶可以對其減少營銷和服務預算或直接放棄。

      此外,目前的RFM分析中,一般給與M值更高的權重,如果一般挽留客戶與一般發展客戶佔據多數,說明公司的用戶結構不是很合理,需要儘快採取措施進行優化。

基於RFM的客戶價值分析報告

項目背景

在面向客戶制定運營策略、營銷策略時,我們希望針對不同的客戶推行不同的策略,實現精準化運營,以期獲取最大的轉化率。精準化運營的前提是客戶分類。通過客戶分類,對客戶群體進行細分,區別出低價值客戶、高價值客戶,對不同的客戶群體開展不同的個性化服務,將有限的資源合理地分配給不同價值的客戶,實現效益最大化。在客戶分類中,RFM模型是一個經典的分類模型,模型利用通用交易環節中最核心的三個維度——最近消費(Recency)、消費頻率(Frequency)、消費金額(Monetary)細分客戶群體,從而分析不同群體的客戶價值。

項目目標

本項目藉助某電商客戶數據,探討如何對客戶群體進行細分,以及細分後如何利用RFM模型對客戶價值進行分析。在本項目中,主要希望實現以下三個目標:1.藉助某電商客戶數據,對客戶進行群體分類;2.比較各細分群體的客戶價值;3.對不同價值的客戶制定相應的運營策略。

分析過程

1.數據預覽  

我們的源數據是訂單表,記錄著用戶交易相關欄位

通過數據可以發現,訂單狀態有交易成功和退款關閉的,檢查是否還有其他情況

只有這兩種情況,後續清洗中需剔除退款訂單。然後觀察數據類型與缺失情況

訂單一共28833行,沒有缺失,付款日期是時間格式,實付金額、郵費和購買數量是數值型,其他均為字元串類型

2. 數據清洗

(1)剔除退款

(2)關鍵欄位提取:提取RFM模型所需要的買家昵稱,付款時間,實付金額

(3)關鍵欄位構造:構建模型所需的三個欄位,R(最近一次購買時間間隔),F(購買頻次),M(平均或累計購買金額)

首先構造R值,思路是按買家昵稱分組,選取付款日期最大值

為了得到最終的R值,用今天減去每位用戶最近一次付款時間,就得到R值了,這份訂單是7月1日生成的,所以這裡我們把「2019-7-1」當作「今天」

然後處理F,即每個用戶累計購買頻次( 明確一下單個用戶一天內購買多次訂單合併為一次訂單 )

思路:引入一個精確到天的日期標籤,依照「買家昵稱」和「日期標籤」分組,把每個用戶一天內的多次下單合併,再統計購買次數

最後處理M,本案例M指用戶平均支付金額,可以通過總金額除以購買頻次計算出來

三個指標合併

3. 維度打分 

維度確認的核心是分值確定。RFM模型中打分一般採取5分制,依據數據和業務的理解,進行分值的劃分

R值依據行業經驗,設置為30天一個跨度,區間左閉右開

F值和購買頻次掛鉤,每多購買一次,分值多加一分

M值我們按照50元的一個區間來進行劃分

這一步我們確定了一個打分框架,每一個用戶的每個指標,都有其對應的分值

4. 分值計算 

(1)算出每個用戶的R,F,M分值

(2)簡化分類結果  

通過判斷每個客戶的R,F,M值是否大於平均值,來簡化分類結果。0表示小於平均值,1表示大於平均值,整體組合下來有8個分組

5.客戶分層

RFM經典分層按照R,F,M每一項指標是否高於平均值,把用戶劃分為8類

Python實現思路如下:先定義一個人群數值,將之前判斷的R,F,M是否大於均值的三個值加起來

人群數值是數值類型,位於前面的0會自動略過,比如1代表001的高消費喚回客戶人群,10對應010的一般客戶

然後在python中定義一個判斷函數,通過判斷人群數值,來返回對應的分類標籤

數據解讀與建議:

首先查看各類用戶佔比情況

然後查看不同類型客戶消費金額貢獻佔比

最後導出數據,在tableau中數據可視化展示

通過數據可視化後,我們可以發現:

1.客戶流失情況嚴重,高消費喚回客戶,流失客戶佔比超過總客戶的50%

2.高消費喚回客戶和頻次深耕客戶的金額總佔比約66%,這兩部分客戶是消費的重點客戶

3.流失客戶和新客戶的總人數佔比約38%,但金額總佔比只有約13%

建議:

1.針對高消費喚回客戶,流失客戶採用喚回策略,推送相關信息,發禮品券等挽留客戶

2.針對高消費喚回客戶和頻次深耕客戶,考慮繼續挖掘其消費特性,如喜愛購買的產品,消費的時間段,後續據此加強店鋪產品與時間段的改進,最大程度留住這兩部分客戶

3.針對流失客戶和新客戶金額總佔比低,建議推出一些低價產品,用來拉取新客戶,保證店鋪的活躍性。

python數據分析項目:用戶消費行為分析

為了創造更多利潤、實現數據驅動運營,某CD網站擬對18個月以來的近7萬條消費數據進行分析。具體的研究思路如下:

新增[‘month’]列,便於後續按月分析。

重新查看,此時的時間列已轉換為正常格式。

由上圖可知,

接下來我們用之前清洗好的欄位進行數據分析。

前三個月消費訂單數在10000筆左右,後續月份的平均則在2500筆。

前三個月產品購買數在20000以上,後續月份的產品購買量在6000~8000左右 。

前三個月每月的消費人數在8000-10000之間,後續月份平均消費人數在2000人不到

上述消費趨勢的分析可以通過數據透視表分析(不建議數據透視表進行去重操作)

本章小結——

趨勢分析:總體來看,消費總金額、消費次數、產品購買量、消費人數的趨勢想似:均先上升、下跌、趨於平穩並下降。

可以看出網站的流失用戶在增加,採用開源(拉新)節流(留存)的運營方式,來增加銷售收入。

上一部分是按月分析,主要看趨勢;本部分按用戶個體分析,來看消費能力。

按用戶消費金額進行降序排列,由圖可知,共計約25000個用戶:

啟發,只要維護好這5000個用戶(佔比20%)就可以把業績KPI完成70%,如果能把5000個用戶運營的更好就可以佔比更高。

通過以上基本數據描述分析可以清楚該網站整體的消費趨勢和用戶消費能力,現在進一步挖掘用戶消費行為數據,通過RFM模型、生命周期等方法對用戶進行分層,為後續運營管理提供依據。

首購可以進一步依渠道劃分,衡量不同渠道的差異性,從而量化渠道能力,為後期渠道優化提供依據。

用戶第一次購買分布,集中在前三個月(1997年1-3月);其中,在2月11日至2月25日有一次劇烈波動

由圖可知,1997年1-4月新用戶數量由90%跌落至80%以下;之後幾個月的新用戶量保持在80~82%區間。

RFM是一個經典的用戶分類模型,模型利用通用交易環節中最核心的三個維度——最近消費(Recency)、消費頻率(Frequency)、消費金額(Monetary)細分用戶群體,從而分析不同群體的用戶價值,最終達到精準營銷。

RFM從3個維度、分2個等級(均值)得到8類用戶分層。

通過RFM模型,把用戶分為8個類別,分別給用戶打標籤、將客戶分為重要價值、重要保持、重要挽留、重要發展、一般價值、一般保持、一般保留、一般發展8類客戶。

從RFM分層可知,本網站的大部分用戶為一般挽留客戶(可適當放棄這部分低價值客戶、也可進一步提高活躍度)、重要保持客戶(企業優質的客戶群,採用會員制運營)。具體運營策略依據參照如下:

為了避免劃分用戶群體過多(RFM從3個維度、分2個等級得到8類用戶分層的數據立方),可能導致針對性的營銷成本負擔上升;下面將通過聚類方法,基於RFM模型劃分成4類用戶,更快實現後期用戶管理。

顯然,歸一化預處理後,當n=2時,輪廓係數取最大值0.79,僅從模型聚類效果來講分2類合適;而標準正態化預處理後顯示,分4類的輪廓係數最大,達0.6964(但2-7類的輪廓係數整理差別波動不大)

參考漏斗模型,針對每個用戶,按18個月內的每個月對用戶情況進行分類,即新用戶、活躍用戶、迴流用戶、流失用戶。

通過下面的數據透視表即可得到每個用戶每個月的購買情況,從而進行轉化分析。

若本月無消費(即為0)

若本月有消費(即為1)

由上表可知,每月的用戶消費狀態變化

k-means與RFM模型結合進行用戶群體劃分

在CRM系統中經常要對用戶進行劃分,以標記不同的標籤,進行個性化的營銷觸達動作。通常的用戶群體劃分會使用用戶的一些屬性信息,例如年齡,職業,性別等。但是這些屬性基本上都是用戶本身的特徵屬性,並不是和品牌關聯產生的屬性信息。另外一種常用的用戶模型,就是 RFM模型 ,是以用戶的實際購買行為數據作為基礎,進行用戶群體的劃分的,在實踐中更加具有實際價值。

RFM模型由三個指標組成,分別為:

最近一次消費 (Recency)

消費頻率 (Frequency)

消費金額 (Monetary)

可以看到這三個屬性都是通過用戶的購買行為計算得出的,這些指標基本上代表了用戶是否活躍,購買能力,忠誠度等信息。

而我們的目標是通過對每個用戶的RFM屬性進行計算,將用戶群體劃分為不同的種類進行區分,以便我們進行分析和精準營銷。例如我們可以分析出高價值用戶,重點發展用戶,流失用戶等群體進行針對性營銷動作。

本文將使用Python的一些工具包,對用戶數據集進行分析處理,例如建立RFM模型,數據標準化,以及使用k-means聚類演算法將用戶群體進行劃分。需要讀者具有一些基礎的Python和數據統計知識。

首先我們通過一些訂單數據分析得到一部分用戶的樣本數據來:

這裡包括了用戶的id,總購買筆數,總購買金額以及最後一筆訂單時間的信息。我們將文件載入進來,截取一部分後對欄位類型進行處理:

為了將其轉化為我們要使用的RFM屬性,我們需要對last_order_date進行處理,轉換為最後一次訂單時間到目前的天數。這樣我們就獲得了RFM的基本屬性,分別為last_order_day_from_now(R), total_order_count(F), total_order_price(M)。處理完成後對數據進行可視化觀察數據分布:

其散點圖為:

我們會發現實際上的數據大部分都聚集在了一起,並且有一些非常離散的極端值數據,這對我們後續進行數據聚類會產生不利影響,所以我們使用log函數對數據進行處理,讓其分布的更加均勻:

可以看到現在數據分布的已經比較均勻了,這為我們進行聚類打下一個比較好的基礎。但同時我們也會發現RFM這三個屬性的單位卻並不相同,分別是天數,交易筆數和交易金額。這就造成了其數值差別巨大。而聚類演算法一般都是使用不同向量間的距離進行計算劃分的,屬性單位不同造成的數值差異過大會造成計算距離時的權重分布不均衡,也並不能反映實際情況,所以我們還要對數據進行標準化處理,這裡我們使用z-score對RFM屬性進行加工運算。

z-score是一種數據標準化的計算方法,其公式為:

z = (x – μ) / σ

μ代表x所屬數據組的平均值,σ代表x所屬數據組的方差。所以通過z-score計算,我們將絕對值數據轉化為一個數據在所屬數據組中的位置(得分),這樣不同單位和類型間的數據使用z-score做相互的比較也就有了一定的意義。

這時候會看到數據不但分布較為均勻,而且不同維度間的數值差異也很小了,這樣我們可以把三種不同單位的屬性一起進行處理。

當我們建立好RFM的數據模型之後,期望通過不同的RFM值,對用戶進行區分以進行精準化營銷。當然我們可以通過對RFM這三組數值的平均值或者中位數和每個用戶進行比較,以建立起一個數據立方,進行群體劃分。但另外一方面,一般來說用戶群體會大致符合28原則,80%左右的收入是由20%左右的客戶所貢獻的,所以根據平均值或者中位數進行群體劃分也並不能總是科學的反應出不同的用戶群體來,所以我們也可以基於數據本身的特性,使用聚類演算法進行處理,以便讓數據更加「自然」的區分。

這裡我們選用非常常用的k-means演算法進行聚類計算,k-means聚類的原理並不複雜,首先隨機的或者通過更高效的方式(例如k-means++)選取k個點,然後不斷迭代的計算,修正這k個點的坐標,目的是讓集合中的每個點的距離(有很多種距離演算法,比較常用的是歐氏距離)都和k個點裡的其中一個盡量的近,而和其他的盡量的遠。這樣數據集合就能根據自身的分布規律,自然的區分出不同的類別來。

這裡我們將k值設定為3,也就是將數據劃分為三個部分,通過使用我們處理後的RFM屬性進行計算,最終我們得到:

可以看到不同的顏色代表不同的用戶類別,可以簡單的認為標記為0的是流失用戶,1是重點發展用戶,2是高價值用戶。這樣我們就可以對不同的群體使用適合的營銷策略了,同時當有新的用戶加入後,我們也可以使用得到的k-means模型對其進行預測劃分。

在使用這種方式做實際的數據處理時,可能因為數據分布的原因導致區分度並不是特別好,因為根據銷售數據進行用戶區分,並不是總能發現比較明顯的區分「界限」,也就是不同群體間的邊界其實是非常模糊和混雜的(從上面的最終分析圖也可以看出這樣的情況),所以從這個角度講,單純通過RFM模型和聚類進行用戶群體劃分也是有它的局限性的。

原創文章,作者:UYKS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147421.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
UYKS的頭像UYKS
上一篇 2024-11-01 14:09
下一篇 2024-11-01 14:09

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • TensorFlow Serving Java:實現開發全功能的模型服務

    TensorFlow Serving Java是作為TensorFlow Serving的Java API,可以輕鬆地將基於TensorFlow模型的服務集成到Java應用程序中。…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論