一超埋、項(xiàng)目介紹
CDNOW是一家網(wǎng)上唱片公司哲思,通過(guò)18個(gè)月的用戶(hù)消費(fèi)記錄洼畅,深入分析用戶(hù)消費(fèi)行為,建立RFM模型棚赔,進(jìn)行用戶(hù)分層帝簇,發(fā)掘高價(jià)值用戶(hù)并進(jìn)行針對(duì)性管理和維護(hù),實(shí)現(xiàn)用戶(hù)運(yùn)營(yíng)精細(xì)化靠益。
二丧肴、RFM模型
簡(jiǎn)述:
RFM模型是網(wǎng)點(diǎn)衡量當(dāng)前用戶(hù)價(jià)值和客戶(hù)潛在價(jià)值的重要工具和手段。RFM是Rencency(最近一次消費(fèi))胧后,F(xiàn)requency(消費(fèi)頻率)芋浮、Monetary(消費(fèi)金額),三個(gè)指標(biāo)首字母組合
特點(diǎn):
客觀(guān)–利用客觀(guān)的數(shù)字尺度壳快,對(duì)客戶(hù)進(jìn)行簡(jiǎn)明而翔實(shí)的高水平描述纸巷。
簡(jiǎn)單–只需要客戶(hù)的消費(fèi)時(shí)間、消費(fèi)頻率和消費(fèi)金額三個(gè)字段眶痰,業(yè)務(wù)人員就可以在不需要信息部門(mén)或復(fù)雜軟件的情況下就能有效使用它瘤旨。
直觀(guān)–這種分割方法的輸出很容易理解和解釋。
基于RFM模型竖伯,將客戶(hù)分為8種類(lèi)型
客戶(hù)分類(lèi):
RFM模型較為動(dòng)態(tài)地顯示了一個(gè)客戶(hù)的全部輪廓存哲,這對(duì)個(gè)性化的溝通和服務(wù)提供了依據(jù)因宇,同時(shí),如果與該客戶(hù)打交道的時(shí)間足夠長(zhǎng)祟偷,也能夠較為精確地判斷該客戶(hù)的長(zhǎng)期價(jià)值(甚至是終身價(jià)值)察滑,通過(guò)改善三項(xiàng)指標(biāo)的狀況,從而為更多的營(yíng)銷(xiāo)決策提供支持修肠。
三贺辰、項(xiàng)目過(guò)程
1. 總體消費(fèi)趨勢(shì)分析
分析指標(biāo):每月消費(fèi)總金額、每月訂單量氛赐、每月銷(xiāo)量魂爪、每月的消費(fèi)人數(shù)、平均客單價(jià)艰管、人均消費(fèi)次數(shù)
2.用戶(hù)個(gè)體消費(fèi)趨勢(shì)分析
累計(jì)消費(fèi)金額滓侍、消費(fèi)次數(shù)、消費(fèi)額與銷(xiāo)量散點(diǎn)圖牲芋、消費(fèi)占比曲線(xiàn)
3. 用戶(hù)消費(fèi)行為分析
(1) 用戶(hù)第一次消費(fèi)與最后一次消費(fèi)情況
(2) 用戶(hù)價(jià)值分層(RFM)
(3) 用戶(hù)活躍度分層(活躍用戶(hù)撩笆、不活躍用戶(hù)、新用戶(hù)缸浦、回流用戶(hù))
(4) 用戶(hù)生命周期
4.復(fù)購(gòu)率和回購(gòu)率分析
0.數(shù)據(jù)預(yù)處理
-
通過(guò)數(shù)據(jù)觀(guān)察夕冲,一共有69659條數(shù)據(jù),沒(méi)有缺失字段
字段解釋如下:
user_id:用戶(hù)id
order_dt:訂單日期
order_products:產(chǎn)品數(shù)量
order_amount:訂單金額
從csv中讀取數(shù)據(jù)源裂逐,篩選所需要的字段歹鱼,同時(shí)增加月份字段將用戶(hù)按月進(jìn)行統(tǒng)計(jì)
# 將order_dt保存為日期格式
df['order_dt'] = pd.to_datetime(df.order_dt,format = '%Y%m%d')
# 增加月份字段
df['month'] = df.order_dt.values.astype('datetime64[M]')
1. 總體消費(fèi)趨勢(shì)分析
使用groupby按月份將訂單信息進(jìn)行統(tǒng)計(jì)計(jì)算,每月消費(fèi)總金額卜高、每月訂單量弥姻、每月銷(xiāo)量、每月消費(fèi)用戶(hù)數(shù)量等指標(biāo)掺涛,查看總體消費(fèi)趨勢(shì)庭敦。
fig, ax = plt.subplots(3,2,figsize = (14,12),dpi = 100)
ax[0,0].plot(grouped_month.sum().order_amount)
ax[0,1].plot(grouped_month.count().order_dt)
ax[1,0].plot(grouped_month.sum().order_products)
ax[1,1].plot(grouped_month.user_id.apply(lambda x:len(x.unique())))
ax[2,0].plot(grouped_month.sum().order_amount / grouped_month.user_id.apply(lambda x:len(x.unique())))
ax[2,1].plot(grouped_month.count().order_amount / grouped_month.user_id.apply(lambda x:len(x.unique())))
ax[0,0].set_title("消費(fèi)額")
ax[0,1].set_title("訂單量")
ax[1,0].set_title("產(chǎn)品銷(xiāo)量")
ax[1,1].set_title("消費(fèi)用戶(hù)")
ax[2,0].set_title("平均客單價(jià)")
ax[2,1].set_title("人均消費(fèi)次數(shù)")
plt.show()
觀(guān)察圖形得知:
- 消費(fèi)額、訂單量薪缆、產(chǎn)品銷(xiāo)量秧廉、消費(fèi)用戶(hù)指標(biāo)折線(xiàn)圖基本類(lèi)似,都于前三個(gè)月較高拣帽,隨后驟降在較低值趨于穩(wěn)定疼电,但整體仍有輕微下降趨勢(shì)。初步猜測(cè)前三個(gè)月要么數(shù)據(jù)異常减拭,要么就是存在某種營(yíng)銷(xiāo)活動(dòng)的影響澜沟。
- 平均客單價(jià)以及人均消費(fèi)次數(shù)的趨勢(shì)相近,前三個(gè)月穩(wěn)步上升峡谊,隨后穩(wěn)定;客單價(jià)在47.5-57.5元區(qū)間波動(dòng),但最后也有下降勢(shì)頭既们,人均消費(fèi)次數(shù)最后穩(wěn)定與1.35次左右濒析。
- 以上分為兩種趨勢(shì)圖,結(jié)合情況可能與用戶(hù)復(fù)購(gòu)率和回購(gòu)率有關(guān)啥纸,需要后續(xù)進(jìn)一步探討号杏。
2. 用戶(hù)個(gè)體消費(fèi)趨勢(shì)分析
- 用戶(hù)整體消費(fèi)情況統(tǒng)計(jì)
- 消費(fèi)金額與銷(xiāo)量散點(diǎn)圖
- 消費(fèi)額和消費(fèi)訂單數(shù)分布直方圖
- 用戶(hù)占比與消費(fèi)金額占比的關(guān)系曲線(xiàn)圖
按照user_id字段對(duì)用戶(hù)進(jìn)行統(tǒng)計(jì),計(jì)算消費(fèi)金額斯棒、訂單量盾致、銷(xiāo)量等指標(biāo),再對(duì)不同指標(biāo)繪制分布散點(diǎn)圖荣暮。
2.1 用戶(hù)整體消費(fèi)情況統(tǒng)計(jì)
grouped_user.agg({"order_products":"sum","order_amount":"sum","order_dt":"count"}).describe()
- 以上結(jié)果信息分別為產(chǎn)品銷(xiāo)量庭惜、消費(fèi)金額、訂單量的描述統(tǒng)計(jì)
- 平均銷(xiāo)量穗酥、消費(fèi)額护赊、訂單量分別為7.12,106,2.9但是中位數(shù)為3,43,1
- 銷(xiāo)量、消費(fèi)金額砾跃、訂單量均存在明顯的極值偏差(左偏)
2.2 繪制消費(fèi)金額與銷(xiāo)量散點(diǎn)圖
grouped_user.sum().plot.scatter(x='order_amount',y='order_products',fontsize = 14)
- 結(jié)果發(fā)現(xiàn)存在極值骏啰,現(xiàn)在需要剔除極值疑苫,選擇order_products<400的部分
grouped_user.sum().query('order_products < 400').plot.scatter(x='order_amount',y='order_products')
- 剔除偏差值后睦疫,銷(xiāo)量與銷(xiāo)售額基本呈線(xiàn)性關(guān)系。
2.3 用戶(hù)消費(fèi)額和消費(fèi)次數(shù)分布直方圖
繪制每位用戶(hù)消費(fèi)額和訂單數(shù)的直方圖
fig3,ax3 = plt.subplots(1,2,figsize = (14,4),dpi = 80)
grouped_user.sum().order_amount.plot.hist(bins = 30,ax = ax3[0])
grouped_user.count().order_dt.plot.hist(bins = 30, ax = ax3[1])
ax3[0].set_title("消費(fèi)額")
ax3[1].set_title("訂單數(shù)")
plt.show()
- 由于均存在明顯的極值偏差寻馏,需進(jìn)行篩選處理
fig,ax = plt.subplots(1,2,figsize = (14,4),dpi = 80)
grouped_user.sum().query('order_amount <2000').order_amount.plot.hist(bins = 30,ax = ax[0])
grouped_user.count().query('order_dt <50').order_dt.plot.hist(bins = 30, ax = ax[1])
ax3[0].set_title("消費(fèi)額")
ax3[1].set_title("訂單數(shù)")
plt.show()
- 大部分用戶(hù)消費(fèi)金額分布在0-250之間翘骂,大部分用戶(hù)消費(fèi)次數(shù)在0-5次之間(0-1次尤為較多)
2.4 繪制用戶(hù)消費(fèi)占比曲線(xiàn)圖
將每位用戶(hù)的累計(jì)消費(fèi)金額從低到高排序壁熄,然后進(jìn)行累加求和,并計(jì)算當(dāng)前用戶(hù)的累加與消費(fèi)總額的關(guān)系雏胃,繪制消費(fèi)金額比例與用戶(hù)比例關(guān)系的曲線(xiàn)圖请毛。
user_amount = grouped_user.sum().order_amount.sort_values() #根據(jù)金額排序
user_amount_pet = user_amount.cumsum()/user_amount.sum() #換算為百分比
plt.style.use('ggplot') #設(shè)置matplotlib格式
# 字體設(shè)置
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc",size=16)
x = np.arange(1/23570,1+1/23570,1/23570) #取x刻度
y = user_amount_pet.reset_index(drop = True)
fig = plt.figure(figsize=(8,5),dpi = 80)
plt.plot(x,y)
plt.xlabel('用戶(hù)比例',fontproperties=my_font)
plt.ylabel('消費(fèi)金額比例',fontproperties=my_font)
plt.title('消費(fèi)金額比例與用戶(hù)比例關(guān)系',fontproperties=my_font)
plt.axhline(y = 0.8,ls = "--",lw = 1, c="b",alpha = 0.5)
plt.axvline(x = 0.8,ls = "--",lw = 1, c="b",alpha = 0.5)
plt.show()
- 用戶(hù)的消費(fèi)遵循二八法則,20%的用戶(hù)貢獻(xiàn)了近70%的消費(fèi)額瞭亮,消費(fèi)額的主要貢獻(xiàn)還是出自于少部分客戶(hù)
從用戶(hù)個(gè)體消費(fèi)趨勢(shì)情況來(lái)看方仿,大部分用戶(hù)消費(fèi)金額偏低,訂單數(shù)極少(很多1次訂單)统翩,我們推測(cè)可能是用戶(hù)僅享用了首次購(gòu)買(mǎi)的福利仙蚜,便不再進(jìn)行后續(xù)消費(fèi)
3. 用戶(hù)消費(fèi)行為分析
- 用戶(hù)整體消費(fèi)情況統(tǒng)計(jì)
- 消費(fèi)金額與銷(xiāo)量散點(diǎn)圖
- 消費(fèi)額和消費(fèi)訂單數(shù)分布直方圖
- 用戶(hù)占比與消費(fèi)金額占比的關(guān)系曲線(xiàn)圖
3.1 用戶(hù)首次與最后一次消費(fèi)折線(xiàn)圖
先將用戶(hù)按照user_id進(jìn)行分組,根據(jù)最小消費(fèi)訂單日期記為第一次消費(fèi)厂汗,最大消費(fèi)訂單日期記為最后一次消費(fèi)
grouped_user = df.groupby('user_id')
fig,ax = plt.subplots(1,2,figsize=(14,5),dpi = 80)
grouped_user.order_dt.min().value_counts().plot(ax = ax[0])
grouped_user.order_dt.max().value_counts().plot(ax = ax[1])
ax[0].set_title("用戶(hù)第一次消費(fèi)")
ax[1].set_title("用戶(hù)最后一次消費(fèi)")
plt.show()
- 用戶(hù)第一次消費(fèi)值存在于前三個(gè)月呈鐘型委粉,最后一次消費(fèi)也在前三個(gè)月較多達(dá)到170人左右,隨后在每月20人左右的基礎(chǔ)上略微上漲娶桦;
- 再次驗(yàn)證可能是前三個(gè)月有活動(dòng)贾节,有大量客戶(hù)涌入汁汗,但很多客戶(hù)僅消費(fèi)一次;3個(gè)月后沒(méi)有新客戶(hù)的輸入栗涂,隨著時(shí)間的增長(zhǎng)老知牌,客戶(hù)也在以每月20人的數(shù)量流失,且逐漸增加斤程。
3.2 用戶(hù)RFM分層
R:最后一次消費(fèi)時(shí)間間隔角寸,F(xiàn):消費(fèi)銷(xiāo)量,M:消費(fèi)額
- 根據(jù)以上指標(biāo)創(chuàng)建用戶(hù)透視表
- 根據(jù)order_dt.max()-now()計(jì)算R指標(biāo)
# 創(chuàng)建R忿墅、F扁藕、M的原始數(shù)據(jù)指標(biāo)
rfm_1 = df.pivot_table(index = 'user_id',
values = ['order_dt','order_products','order_amount'],
aggfunc = {'order_dt':'max','order_products':'sum','order_amount':'sum'})
rfm_1['R'] = (rfm_1.order_dt - rfm_1.order_dt.max()) / np.timedelta64(1,'D')
rfm_1.rename(columns = {'order_amount':'M','order_products':'F'},inplace = True)
# 使原始指標(biāo)減去對(duì)應(yīng)平均值得到R、F疚脐、M指標(biāo)
rfm_2 = rfm_1[['R','F','M']].apply(lambda x:x-x.mean())
- 得到每位用戶(hù)的R亿柑、F、M指標(biāo)后亮曹,給用戶(hù)分級(jí)(重要價(jià)值客戶(hù)橄杨、重要保持客戶(hù)、重要挽留客戶(hù)...)
- 如果相應(yīng)指標(biāo)>0則視為活躍指標(biāo)
def user_label(data):
level = data.apply(lambda x: '0' if x < 0 else '1' )
label = level.R + level.F + level.M
a = {'111':'重要價(jià)值客戶(hù)',
'011':'重要保持客戶(hù)',
'101':'重要挽留客戶(hù)',
'001':'重要發(fā)展客戶(hù)',
'110':'一般價(jià)值客戶(hù)',
'010':'一般保持客戶(hù)',
'100':'一般挽留客戶(hù)',
'000':'一般發(fā)展客戶(hù)'}
return a[label]
rfm_1['label'] = rfm_2.apply(user_label,axis = 1)
# 進(jìn)行統(tǒng)計(jì)
RFM = rfm_1.groupby('label').agg({"order_dt":"count","M":"mean","F":"mean","R":"mean"})
RFM["rate"] = RFM.order_dt/RFM.order_dt.sum()
RFM.sort_values("rate",ascending = False)
# 作圖
plt.figure(figsize = (14,12),dpi = 80)
plt.rcParams["font.size"] = "13"
plt.subplot(221)
RFM.order_dt.plot(kind = "pie", autopct = "%.1f%%")
plt.title("人數(shù)")
plt.subplot(222)
RFM.M.plot(kind = "bar")
plt.title("金額")
plt.subplot(223)
RFM.F.plot(kind = "bar")
plt.title("訂單量")
plt.subplot(224)
RFM.R.plot(kind = "bar")
plt.title("購(gòu)買(mǎi)周期")
plt.tight_layout(pad = 1)
觀(guān)察數(shù)據(jù)得知:
- 59%的客戶(hù)屬于一般發(fā)展客戶(hù)照卦,19%的客戶(hù)屬于重要價(jià)值客戶(hù)式矫,14%的客戶(hù)屬于一般挽留客戶(hù);
- 消費(fèi)金額與訂單量均是重要價(jià)值客戶(hù)遙遙領(lǐng)先役耕,同時(shí)這一類(lèi)客戶(hù)是第二大群體采转,需要做好維護(hù)工作避免流失;
- 整體情況上不容樂(lè)觀(guān)瞬痘,只有20%左右的客戶(hù)是忠誠(chéng)客戶(hù)故慈,其余大多數(shù)為流失客戶(hù)。
3.3 活躍框全、新察绷、回流、不活躍用戶(hù)每月占比
根據(jù)每位用戶(hù)的消費(fèi)情況津辩,將用戶(hù)分為活躍用戶(hù)拆撼、新用戶(hù)、回流用戶(hù)喘沿、不活躍用戶(hù)
活躍用戶(hù):當(dāng)月有消費(fèi)的用戶(hù)
新用戶(hù):當(dāng)月消費(fèi)且屬于第一次消費(fèi)的用戶(hù)
回流用戶(hù):上一個(gè)月未消費(fèi)闸度,本月消費(fèi)了的老用戶(hù)
不活躍用戶(hù):當(dāng)月未消費(fèi),且不是新用戶(hù)
根據(jù)每位用戶(hù)的消費(fèi)情況蚜印,給每月打上0,1印記(1表示有消費(fèi)莺禁,0表示未消費(fèi))
pivot_count = df.pivot_table(index = 'user_id',values = 'order_dt',columns = 'month',aggfunc = 'count')
df_purchase = pivot_count.fillna(0).applymap(lambda x:1 if x>= 1 else 0)
創(chuàng)建規(guī)則,將用戶(hù)歸屬于上述4種類(lèi)型
def user_label(data):
status = []
for i in range(18):
#當(dāng)月無(wú)消費(fèi)
if data[i] == 0:
if len(status) == 0: # 本月是第一個(gè)月
status.append('unreg')
else:
if status[i-1] == 'unreg': #前一個(gè)月是未注冊(cè)用戶(hù)
status.append('unreg')
else:
status.append('unactive')
#當(dāng)月有消費(fèi)
else:
if len(status) == 0:
status.append('new')
else:
if status[i-1] == 'unreg':
status.append('new')
elif status[i-1] == 'unactive':
status.append('return')
else:
status.append('active')
return status
purchase_status = df_purchase.apply(lambda x:pd.Series(user_label(x)),axis = 1)
每月對(duì)各種用戶(hù)進(jìn)行統(tǒng)計(jì)窄赋,繪制折線(xiàn)圖
purchase_T = purchase_status.replace('unreg',np.nan).apply(lambda x:x.value_counts()).T
purchase_T= purchase_T.fillna(0)
# 繪圖
purchase_T.div(purchase_T.sum(axis = 1),axis=0).plot(figsize = (10,6), fontsize = 15)
plt.legend(fontsize = 16)
plt.show()
- 活躍用戶(hù)與回流用戶(hù)始終占比較低在5%以下
- 3個(gè)月以后已經(jīng)沒(méi)有新用戶(hù)輸入哟冬,且不活躍用戶(hù)在3個(gè)月后急劇增長(zhǎng)達(dá)到90%左右
3.4 用戶(hù)生命周期
- 用戶(hù)生命周期:用戶(hù)第一次與最后一次消費(fèi)的時(shí)間間隔
user_life = grouped_user.order_dt.apply(lambda x:x.max()-x.min()) / np.timedelta64(1,'D')
- 絕大部分用戶(hù)聲明周期都在0天楼熄,為了方便觀(guān)察,剔除0
user_life[user_life>0].hist(bins = 100)
user_life[user_life>0].describe()
count 11516.000000
mean 276.044807
std 166.633990
min 1.000000
25% 117.000000
50% 302.000000
75% 429.000000
max 544.000000
Name: order_dt, dtype: float64
- 除開(kāi)0的影響浩峡,用戶(hù)平均周期為276天孝赫,中位數(shù)為302天幾乎不存在極值偏差
- 周期分布呈凹型,生命周期為0-50與400-500之間的用戶(hù)較多
4. 復(fù)購(gòu)率和回購(gòu)率
- 復(fù)購(gòu)率:自然月內(nèi)重復(fù)購(gòu)買(mǎi)的用戶(hù)占比
- 回購(gòu)率:本月購(gòu)買(mǎi)红符,上一個(gè)月也購(gòu)買(mǎi)的用戶(hù)占比
4.1 復(fù)購(gòu)率
pivot_return = pivot_count.fillna(0).applymap(lambda x:1 if x > 1 else 0 if x == 1 else np.nan)
pivot_return_pet = pivot_return.apply(lambda x:x[x==1].count()) / pivot_return.count()
# 作圖
pivot_return_pet.plot()
- 每月的復(fù)購(gòu)率在21%左右,且較為穩(wěn)定伐债,存在一部分忠誠(chéng)客戶(hù)
4.2 回購(gòu)率
# 創(chuàng)建用戶(hù)回購(gòu)標(biāo)簽
def back(data):
status = []
for i in range(18):
# 本月未購(gòu)買(mǎi)
if data[i] == 0:
status.append(np.nan)
else: #本月有購(gòu)買(mǎi)
if len(status) == 0: #為第一個(gè)月
status.append(0)
else: #不是第一個(gè)月
if data[i-1] == 0: #上個(gè)月未購(gòu)買(mǎi)
status.append(0)
else:
status.append(1)
return status
reback_user = df_purchase.apply(lambda x:pd.Series(back(x)),axis = 1)
#進(jìn)行統(tǒng)計(jì)
reback_pet = reback_user.apply(lambda x:x[x==1].count()) / reback_user.count()
reback_pet.plot()
綜上:
- 初期用戶(hù)回購(gòu)率并不高预侯,其中1月僅有10%左右,隨后逐漸增長(zhǎng)在3月的60%達(dá)到最高峰锁,但同時(shí)開(kāi)始下降最后在30%趨于穩(wěn)定萎馅。
- 再次驗(yàn)證,從用戶(hù)角度來(lái)看前三個(gè)月吸引力較大虹蒋,而后續(xù)需要使用營(yíng)銷(xiāo)策略進(jìn)行積極引導(dǎo)糜芳。
四、總結(jié)
用戶(hù)總體趨勢(shì)方面:前三個(gè)月有大量新用戶(hù)的涌入魄衅,各項(xiàng)數(shù)據(jù)指標(biāo)如消費(fèi)額峭竣、訂單量等均達(dá)到最大值。但三個(gè)月之后晃虫,整體突然驟降皆撩,隨后也處于輕微下降趨勢(shì)。
用戶(hù)個(gè)體方面:其中有少量用戶(hù)貢獻(xiàn)了大量消費(fèi)哲银、訂單量扛吞,將平均值拉高。大約有17000用戶(hù)消費(fèi)金額集中在0-100元之間荆责,16000名用戶(hù)的訂單量集中在0-5之間滥比。50%的用戶(hù)僅貢獻(xiàn)了15%的消費(fèi)額,而20%的用戶(hù)貢獻(xiàn)了70%的消費(fèi)額做院,符合二八法則盲泛。
用戶(hù)生命周期:聲明周期為0或者1的用戶(hù)占了大半,排除這部分用戶(hù)山憨,用戶(hù)平均生命周期在276查乒,中位數(shù)為302不存在明顯的極值偏差。
用戶(hù)分層方面:從RFM模型來(lái)看郁竟,重要價(jià)值客戶(hù)的消費(fèi)頻次和消費(fèi)金額最高玛迄,占比人數(shù)排第二,這類(lèi)客戶(hù)需要重點(diǎn)維持棚亩。從用戶(hù)活躍分層來(lái)看蓖议,第四個(gè)月開(kāi)始沒(méi)有新用戶(hù)的產(chǎn)生虏杰,并且活躍用戶(hù)也在一直下降,回流用戶(hù)處于穩(wěn)定狀態(tài)勒虾,流失用戶(hù)一直增加并且占比最高纺阔。
復(fù)購(gòu)率和回購(gòu)率方面:排除前三個(gè)月的營(yíng)銷(xiāo)活動(dòng)影響,真事復(fù)購(gòu)率在20%左右修然,回購(gòu)率為30%左右笛钝。