單車用戶消費(fèi)行為分析

一、項(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%左右。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容