一、項(xiàng)目介紹
CDNOW是一家網(wǎng)上唱片公司,通過18個(gè)月的用戶消費(fèi)記錄,深入分析用戶消費(fèi)行為,建立RFM模型,進(jìn)行用戶分層,發(fā)掘高價(jià)值用戶并進(jìn)行針對(duì)性管理和維護(hù),實(shí)現(xiàn)用戶運(yùn)營精細(xì)化。
二、RFM模型
簡述:
RFM模型是網(wǎng)點(diǎn)衡量當(dāng)前用戶價(jià)值和客戶潛在價(jià)值的重要工具和手段。RFM是Rencency(最近一次消費(fèi)),F(xiàn)requency(消費(fèi)頻率)、Monetary(消費(fèi)金額),三個(gè)指標(biāo)首字母組合
特點(diǎn):
客觀–利用客觀的數(shù)字尺度,對(duì)客戶進(jìn)行簡明而翔實(shí)的高水平描述。
簡單–只需要客戶的消費(fèi)時(shí)間、消費(fèi)頻率和消費(fèi)金額三個(gè)字段,業(yè)務(wù)人員就可以在不需要信息部門或復(fù)雜軟件的情況下就能有效使用它。
直觀–這種分割方法的輸出很容易理解和解釋。

基于RFM模型,將客戶分為8種類型

客戶分類:

RFM模型較為動(dòng)態(tài)地顯示了一個(gè)客戶的全部輪廓,這對(duì)個(gè)性化的溝通和服務(wù)提供了依據(jù),同時(shí),如果與該客戶打交道的時(shí)間足夠長,也能夠較為精確地判斷該客戶的長期價(jià)值(甚至是終身價(jià)值),通過改善三項(xiàng)指標(biāo)的狀況,從而為更多的營銷決策提供支持。
三、項(xiàng)目過程
1. 總體消費(fèi)趨勢分析
分析指標(biāo):每月消費(fèi)總金額、每月訂單量、每月銷量、每月的消費(fèi)人數(shù)、平均客單價(jià)、人均消費(fèi)次數(shù)
2.用戶個(gè)體消費(fèi)趨勢分析
累計(jì)消費(fèi)金額、消費(fèi)次數(shù)、消費(fèi)額與銷量散點(diǎn)圖、消費(fèi)占比曲線
3. 用戶消費(fèi)行為分析
(1) 用戶第一次消費(fèi)與最后一次消費(fèi)情況
(2) 用戶價(jià)值分層(RFM)
(3) 用戶活躍度分層(活躍用戶、不活躍用戶、新用戶、回流用戶)
(4) 用戶生命周期
4.復(fù)購率和回購率分析
0.數(shù)據(jù)預(yù)處理
-
通過數(shù)據(jù)觀察,一共有69659條數(shù)據(jù),沒有缺失字段
字段解釋如下:
user_id:用戶id
order_dt:訂單日期
order_products:產(chǎn)品數(shù)量
order_amount:訂單金額
從csv中讀取數(shù)據(jù)源,篩選所需要的字段,同時(shí)增加月份字段將用戶按月進(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)趨勢分析
使用groupby按月份將訂單信息進(jìn)行統(tǒng)計(jì)計(jì)算,每月消費(fèi)總金額、每月訂單量、每月銷量、每月消費(fèi)用戶數(shù)量等指標(biāo),查看總體消費(fèi)趨勢。
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)品銷量")
ax[1,1].set_title("消費(fèi)用戶")
ax[2,0].set_title("平均客單價(jià)")
ax[2,1].set_title("人均消費(fèi)次數(shù)")
plt.show()

觀察圖形得知:
- 消費(fèi)額、訂單量、產(chǎn)品銷量、消費(fèi)用戶指標(biāo)折線圖基本類似,都于前三個(gè)月較高,隨后驟降在較低值趨于穩(wěn)定,但整體仍有輕微下降趨勢。初步猜測前三個(gè)月要么數(shù)據(jù)異常,要么就是存在某種營銷活動(dòng)的影響。
- 平均客單價(jià)以及人均消費(fèi)次數(shù)的趨勢相近,前三個(gè)月穩(wěn)步上升,隨后穩(wěn)定;客單價(jià)在47.5-57.5元區(qū)間波動(dòng),但最后也有下降勢頭,人均消費(fèi)次數(shù)最后穩(wěn)定與1.35次左右。
- 以上分為兩種趨勢圖,結(jié)合情況可能與用戶復(fù)購率和回購率有關(guān),需要后續(xù)進(jìn)一步探討。
2. 用戶個(gè)體消費(fèi)趨勢分析
- 用戶整體消費(fèi)情況統(tǒng)計(jì)
- 消費(fèi)金額與銷量散點(diǎn)圖
- 消費(fèi)額和消費(fèi)訂單數(shù)分布直方圖
- 用戶占比與消費(fèi)金額占比的關(guān)系曲線圖
按照user_id字段對(duì)用戶進(jìn)行統(tǒng)計(jì),計(jì)算消費(fèi)金額、訂單量、銷量等指標(biāo),再對(duì)不同指標(biāo)繪制分布散點(diǎn)圖。
2.1 用戶整體消費(fèi)情況統(tǒng)計(jì)
grouped_user.agg({"order_products":"sum","order_amount":"sum","order_dt":"count"}).describe()

- 以上結(jié)果信息分別為產(chǎn)品銷量、消費(fèi)金額、訂單量的描述統(tǒng)計(jì)
- 平均銷量、消費(fèi)額、訂單量分別為7.12,106,2.9但是中位數(shù)為3,43,1
- 銷量、消費(fèi)金額、訂單量均存在明顯的極值偏差(左偏)
2.2 繪制消費(fèi)金額與銷量散點(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')

- 剔除偏差值后,銷量與銷售額基本呈線性關(guān)系。
2.3 用戶消費(fèi)額和消費(fèi)次數(shù)分布直方圖
繪制每位用戶消費(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()

- 大部分用戶消費(fèi)金額分布在0-250之間,大部分用戶消費(fèi)次數(shù)在0-5次之間(0-1次尤為較多)
2.4 繪制用戶消費(fèi)占比曲線圖
將每位用戶的累計(jì)消費(fèi)金額從低到高排序,然后進(jìn)行累加求和,并計(jì)算當(dāng)前用戶的累加與消費(fèi)總額的關(guān)系,繪制消費(fèi)金額比例與用戶比例關(guā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('用戶比例',fontproperties=my_font)
plt.ylabel('消費(fèi)金額比例',fontproperties=my_font)
plt.title('消費(fèi)金額比例與用戶比例關(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()

- 用戶的消費(fèi)遵循二八法則,20%的用戶貢獻(xiàn)了近70%的消費(fèi)額,消費(fèi)額的主要貢獻(xiàn)還是出自于少部分客戶
從用戶個(gè)體消費(fèi)趨勢情況來看,大部分用戶消費(fèi)金額偏低,訂單數(shù)極少(很多1次訂單),我們推測可能是用戶僅享用了首次購買的福利,便不再進(jìn)行后續(xù)消費(fèi)
3. 用戶消費(fèi)行為分析
- 用戶整體消費(fèi)情況統(tǒng)計(jì)
- 消費(fèi)金額與銷量散點(diǎn)圖
- 消費(fèi)額和消費(fèi)訂單數(shù)分布直方圖
- 用戶占比與消費(fèi)金額占比的關(guān)系曲線圖
3.1 用戶首次與最后一次消費(fèi)折線圖
先將用戶按照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("用戶第一次消費(fèi)")
ax[1].set_title("用戶最后一次消費(fèi)")
plt.show()

- 用戶第一次消費(fèi)值存在于前三個(gè)月呈鐘型,最后一次消費(fèi)也在前三個(gè)月較多達(dá)到170人左右,隨后在每月20人左右的基礎(chǔ)上略微上漲;
- 再次驗(yàn)證可能是前三個(gè)月有活動(dòng),有大量客戶涌入,但很多客戶僅消費(fèi)一次;3個(gè)月后沒有新客戶的輸入,隨著時(shí)間的增長老,客戶也在以每月20人的數(shù)量流失,且逐漸增加。
3.2 用戶RFM分層
R:最后一次消費(fèi)時(shí)間間隔,F(xiàn):消費(fèi)銷量,M:消費(fèi)額
- 根據(jù)以上指標(biāo)創(chuàng)建用戶透視表
- 根據(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())

- 得到每位用戶的R、F、M指標(biāo)后,給用戶分級(jí)(重要價(jià)值客戶、重要保持客戶、重要挽留客戶...)
- 如果相應(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à)值客戶',
'011':'重要保持客戶',
'101':'重要挽留客戶',
'001':'重要發(fā)展客戶',
'110':'一般價(jià)值客戶',
'010':'一般保持客戶',
'100':'一般挽留客戶',
'000':'一般發(fā)展客戶'}
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("購買周期")
plt.tight_layout(pad = 1)

觀察數(shù)據(jù)得知:
- 59%的客戶屬于一般發(fā)展客戶,19%的客戶屬于重要價(jià)值客戶,14%的客戶屬于一般挽留客戶;
- 消費(fèi)金額與訂單量均是重要價(jià)值客戶遙遙領(lǐng)先,同時(shí)這一類客戶是第二大群體,需要做好維護(hù)工作避免流失;
- 整體情況上不容樂觀,只有20%左右的客戶是忠誠客戶,其余大多數(shù)為流失客戶。
3.3 活躍、新、回流、不活躍用戶每月占比
根據(jù)每位用戶的消費(fèi)情況,將用戶分為活躍用戶、新用戶、回流用戶、不活躍用戶
活躍用戶:當(dāng)月有消費(fèi)的用戶
新用戶:當(dāng)月消費(fèi)且屬于第一次消費(fèi)的用戶
回流用戶:上一個(gè)月未消費(fèi),本月消費(fèi)了的老用戶
不活躍用戶:當(dāng)月未消費(fèi),且不是新用戶
根據(jù)每位用戶的消費(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ī)則,將用戶歸屬于上述4種類型
def user_label(data):
status = []
for i in range(18):
#當(dāng)月無消費(fèi)
if data[i] == 0:
if len(status) == 0: # 本月是第一個(gè)月
status.append('unreg')
else:
if status[i-1] == 'unreg': #前一個(gè)月是未注冊用戶
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ì)各種用戶進(jìn)行統(tǒng)計(jì),繪制折線圖
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()

- 活躍用戶與回流用戶始終占比較低在5%以下
- 3個(gè)月以后已經(jīng)沒有新用戶輸入,且不活躍用戶在3個(gè)月后急劇增長達(dá)到90%左右
3.4 用戶生命周期
- 用戶生命周期:用戶第一次與最后一次消費(fèi)的時(shí)間間隔
user_life = grouped_user.order_dt.apply(lambda x:x.max()-x.min()) / np.timedelta64(1,'D')

- 絕大部分用戶聲明周期都在0天,為了方便觀察,剔除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

- 除開0的影響,用戶平均周期為276天,中位數(shù)為302天幾乎不存在極值偏差
- 周期分布呈凹型,生命周期為0-50與400-500之間的用戶較多
4. 復(fù)購率和回購率
- 復(fù)購率:自然月內(nèi)重復(fù)購買的用戶占比
- 回購率:本月購買,上一個(gè)月也購買的用戶占比
4.1 復(fù)購率
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ù)購率在21%左右,且較為穩(wěn)定,存在一部分忠誠客戶
4.2 回購率
# 創(chuàng)建用戶回購標(biāo)簽
def back(data):
status = []
for i in range(18):
# 本月未購買
if data[i] == 0:
status.append(np.nan)
else: #本月有購買
if len(status) == 0: #為第一個(gè)月
status.append(0)
else: #不是第一個(gè)月
if data[i-1] == 0: #上個(gè)月未購買
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()

綜上:
- 初期用戶回購率并不高,其中1月僅有10%左右,隨后逐漸增長在3月的60%達(dá)到最高,但同時(shí)開始下降最后在30%趨于穩(wěn)定。
- 再次驗(yàn)證,從用戶角度來看前三個(gè)月吸引力較大,而后續(xù)需要使用營銷策略進(jìn)行積極引導(dǎo)。
四、總結(jié)
用戶總體趨勢方面:前三個(gè)月有大量新用戶的涌入,各項(xiàng)數(shù)據(jù)指標(biāo)如消費(fèi)額、訂單量等均達(dá)到最大值。但三個(gè)月之后,整體突然驟降,隨后也處于輕微下降趨勢。
用戶個(gè)體方面:其中有少量用戶貢獻(xiàn)了大量消費(fèi)、訂單量,將平均值拉高。大約有17000用戶消費(fèi)金額集中在0-100元之間,16000名用戶的訂單量集中在0-5之間。50%的用戶僅貢獻(xiàn)了15%的消費(fèi)額,而20%的用戶貢獻(xiàn)了70%的消費(fèi)額,符合二八法則。
用戶生命周期:聲明周期為0或者1的用戶占了大半,排除這部分用戶,用戶平均生命周期在276,中位數(shù)為302不存在明顯的極值偏差。
用戶分層方面:從RFM模型來看,重要價(jià)值客戶的消費(fèi)頻次和消費(fèi)金額最高,占比人數(shù)排第二,這類客戶需要重點(diǎn)維持。從用戶活躍分層來看,第四個(gè)月開始沒有新用戶的產(chǎn)生,并且活躍用戶也在一直下降,回流用戶處于穩(wěn)定狀態(tài),流失用戶一直增加并且占比最高。
復(fù)購率和回購率方面:排除前三個(gè)月的營銷活動(dòng)影響,真事復(fù)購率在20%左右,回購率為30%左右。
