項目介紹
該數(shù)據(jù)來源于某CD網(wǎng)站的銷售記錄。通過對該數(shù)據(jù)的分析,了解整體的消費趨勢以及用戶個體的消費行為,在RFM模型下用戶的分層,探究用戶生命周期。
數(shù)據(jù)鏈接:https://pan.baidu.com/s/1OfQzPvktlykDczdlk3uUsQ
提取碼:pcne
本文分析的主要框架
1.進(jìn)行用戶消費趨勢的分析(按月):探究每月消費的人數(shù)、金額、次數(shù)等
2.用戶個體消費分析:分析個體用戶的消費金額、購買量的描述統(tǒng)計、散點圖,探究其在總體消費金額中的占比
3.用戶消費行為:用RFM模型進(jìn)行用戶分層并分析用戶的購買周期、生命周期等
4.復(fù)購率及回購率分析
5.結(jié)論及建議
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負(fù)號
columns = ['user_id','order_dt','order_products','order_amount']
df = pd.read_table(r'F:\data\CDanalysis\CDNOW_master.txt',names=columns, sep='\s+')
df.head()

df.info()

原始數(shù)據(jù)中共有4個字段,每個字段共69659行,數(shù)據(jù)沒有缺失,字段解釋如下:
user_id: 用戶ID
order_dt:訂單日期
order_products:商品數(shù)量
order_amount:訂單金額
df['order_dt']=pd.to_datetime(df.order_dt,format='%Y%m%d')#將訂單時間的格式修改為年-月-日的形式
df['month']=df.order_dt.values.astype('datetime64[M]')#在原始數(shù)據(jù)的結(jié)構(gòu)上增加‘月份’列
df.head()

1.進(jìn)行用戶消費趨勢的分析(按月)
a.每月的消費總金額
grouped_month=df.groupby(by='month')
grouped_month.order_amount.sum().plot()

b.每月的消費次數(shù)
grouped_month.user_id.count().plot()

c.每月的產(chǎn)品購買量
grouped_month.order_products.sum().plot()

d.每月的消費人數(shù)
grouped_month.user_id.apply(lambda x:len(x.drop_duplicates())).plot()
#grouped_month.user_id.apply(lambda x: x.drop_duplicates().count()).plot() #另一種方法

從以上四幅折線圖可以看出,在前三個月消費總金額、消費次數(shù)、產(chǎn)品購買量、消費人數(shù)都呈上升趨勢,而在四月份驟然下降。
2.用戶個體消費分析
a.用戶的消費金額、購買量的描述統(tǒng)計
grouped_user=df.groupby('user_id')
grouped_user.sum().describe()

以用戶ID分組的描述統(tǒng)計來看,平均每位用戶購買量約為7,購買金額約為106;而用戶最多的購買量為1033,購買金額為13990.93;至少有一半的用戶購買量在3及3以下,購買金額在43.395及以下。
b.用戶的消費金額、購買量的散點圖
grouped_user.sum().query('order_amount < 4000').plot.scatter(x='order_amount', y='order_products')
#grouped_user.sum().plot.scatter(x='order_amount', y='order_products')

從散點圖來看,用戶的消費金額主要集中在0-1500元,產(chǎn)品購買量集中在0-100。
c.用戶累計消費金額占比
user_cumsum=grouped_user.sum().sort_values('order_amount').apply(lambda x: x.cumsum()/x.sum())
user_cumsum.reset_index().order_amount.plot()

3.用戶消費行為
a.用戶第一次消費(首購)
grouped_user.order_dt.min().value_counts().plot()

用戶最后一次消費
grouped_user.order_dt.max().value_counts().plot()

用戶最后一次消費,可見大部分的用戶在前3個月只消費一次就不消費了。
多少用戶僅消費了一次
user_life=grouped_user['order_dt'].agg(['min','max'])
(user_life['min']==user_life['max']).value_counts()

總共有12054個用戶只消費了一次。
b.用戶分層
RFM模型
rfm=df.pivot_table(index='user_id',
values=['order_dt','order_products','order_amount'],
aggfunc={'order_dt':'max','order_products':'count','order_amount':'sum'}
)
rfm['R']=(rfm.order_dt.max()-rfm.order_dt)/np.timedelta64(1,'D')
rfm.rename(columns={'order_amount':'M','order_products':'F'},inplace=True)
a=rfm[['R','F','M']].apply(lambda x: x-x.mean())
RFM=a.applymap(lambda x: '1' if x>0 else '0')
def RFM_func(x):
label=x.R+x.F+x.M
b={
'111':'重要價值客戶',
'011':'重要保持客戶',
'101':'重要發(fā)展客戶',
'001':'重要挽留客戶',
'110':'一般價值客戶',
'010':'一般保持客戶',
'100':'一般挽留客戶',
'000':'一般發(fā)展客戶'
}
result=b[label]
return result
RFM['label']=RFM.apply(RFM_func,axis=1)
RFM.head()

RFM模型,其中R表示最近一次消費時間,F(xiàn)表示消費頻次,M表示消費金額。用RFM模型進(jìn)行用戶群體劃分。
RFM.groupby('label')['F'].count().plot.pie(autopct='%.2f%%')

重要價值客戶占比1.9%,大部分客戶都是購買金額比較小的一般客戶。
用戶分層--新、活躍、回流、流失/不活躍
pivoted_counts=df.pivot_table(index='user_id',
columns='month',
values='order_dt',
aggfunc='count').fillna(0)
df_purchase=pivoted_counts.applymap(lambda x: 1 if x>0 else 0)
def active_status(data):
status=[]
for i in range(18):
#若本月沒有消費
if data[i]==0:
if len(status)>0:
if status[i-1]=='未注冊':
status.append('未注冊')
else:
status.append('不活躍')
else:
status.append('未注冊')
#若本月消費
else:
if len(status)>0:
if status[i-1]=='未注冊':
status.append('新用戶')
elif status[i-1]=='不活躍':
status.append('回流')
else:
status.append('活躍')
else:
status.append('新用戶')
return status
#data.iloc[0:]=status
#return data
purchase_status=df_purchase.apply(active_status,axis=1)
purchase_status.head()

將每個用戶在不同月份的狀態(tài)以‘新用戶’、‘活躍’、‘回流’、‘不活躍’來進(jìn)行用戶分層。
purchase_status_count=purchase_status.replace('未注冊',np.NaN).apply(lambda x:x.value_counts())
purchase_status_count

新用戶在前三個月不斷增加,從四月份開始就沒有新用戶注冊,活躍用戶后期穩(wěn)定在500人左右。
purchase_status_count.fillna(0).T.apply(lambda x: x/x.sum(),axis=1).head()

c.用戶購買周期
統(tǒng)計描述
#order_diff=grouped_user.apply(lambda x: x.order_dt-x.order_dt.shift())
order_diff=grouped_user['order_dt'].apply(lambda x: x-x.shift())
order_diff.describe()

至少有75%用戶購買時間間隔在89天及以下,平均用戶購買周期為68天。
分布
(order_diff/np.timedelta64(1,'D')).hist(bins=20)

d.用戶生命周期
統(tǒng)計描述
#user_life=grouped_user['order_dt'].agg(['min','max']) (引用前面的user_life)
(user_life['max']-user_life['min']).describe()

平均用戶生命周期為134天,最長的為544天,但是至少有一半的用戶生命周期為0。
分布
((user_life['max']-user_life['min'])/np.timedelta64(1,'D')).hist(bins=20)

#受只消費一次的用戶影響嚴(yán)重,因此去掉只消費一次的用戶進(jìn)行繪畫分布圖
user_life['a']=(user_life['max']-user_life['min'])/np.timedelta64(1,'D')
#user_life.head(10)
user_life.loc[user_life['a']> 0]['a'].hist(bins=20)

4.回購率和復(fù)購率分析
a.復(fù)購率
pivoted_counts.head(5)

purchase_r=pivoted_counts.applymap(lambda x: 1 if x>1 else np.NaN if x==0 else 0)
(purchase_r.sum()/purchase_r.count()).plot(figsize=(10,4))

復(fù)購率在四月份之前一直呈現(xiàn)上升趨勢,四月份以后有些微波動,但是基本穩(wěn)定在20%左右
b.回購率
df_purchase.head()

def purchase_back(data):
status=[]
for i in range(17):
if data[i]==1:
if data[i+1]==1:
status.append(1)
else:
status.append(0)
else:
status.append(np.NaN)
status.append(np.NaN)#將最后一個月份填充好
return status
purchase_b=df_purchase.apply(purchase_back,axis=1)
(purchase_b.sum()/purchase_b.count()).plot(figsize=(10,4))

回購率在五月份之前呈上升趨勢,五月份以后在25%-40%之間波動
5.結(jié)論及建議
1、用戶消費趨勢的分析(按月)
- 結(jié)論匯總:在前三個月消費總金額、消費次數(shù)、產(chǎn)品購買量、消費人數(shù)都呈上升趨勢,而在四月份驟然下降,四月份之后穩(wěn)定在低水平狀態(tài)。
- 后續(xù)改進(jìn):在四月份之后舉辦一些優(yōu)惠活動吸引新用戶、促活流失用戶等來提高消費金額、消費人數(shù)等。
2、用戶個體消費分析
- 結(jié)論匯總:
1)描述統(tǒng)計來看,平均每位用戶購買量約為7,購買金額約為106;而用戶最多的購買量為1033,購買金額為13990.93;至少有一半的用戶購買量在3及3以下,購買金額在43.395及以下。
2)用戶的消費金額主要集中在0-1500元,產(chǎn)品購買量集中在0-100。 - 后續(xù)改進(jìn):
1)可以分析最受用戶歡迎的商品和其他一些相關(guān)的商品做一些捆綁銷售,帶動其他商品的銷量,從而提高產(chǎn)品購買量;
2)對購買金額較大的用戶做好售后,分析這些用戶特點,在用戶運營方面考慮側(cè)重于相關(guān)用戶。
3.用戶消費行為分析
- 結(jié)論匯總
1)大部分的用戶在前3個月只消費一次就不消費了,且總共有12054個用戶只消費了一次。
2)用RFM模型進(jìn)行用戶群體劃分,重要價值客戶占比1.9%,重要保持客戶占19.59%,大部分客戶都是購買金額比較小的一般客戶。
3)用戶在不同月份的狀態(tài)以‘新用戶’、‘活躍’、‘回流’、‘不活躍’來進(jìn)行用戶分層,新用戶在前三個月不斷增加,從四月份開始就沒有新用戶注冊,活躍用戶后期穩(wěn)定在500人左右。 - 后續(xù)改進(jìn):
1)用戶只消費了一次可能是被最開始的活動所吸引,建議多做一些促銷活動,可以以節(jié)日為主題帶動用戶消費。
2)對于購買金額較大的用戶要做好客戶關(guān)懷,不斷提高他們經(jīng)常購買的產(chǎn)品的質(zhì)量;而對于購買金額較小但卻在用戶量中占比最大的用戶可以用捆綁銷售來盡量提高他們的購買總額。
3)從第四個月后沒有新用戶加入是一個嚴(yán)重的問題,可以不斷開拓營銷渠道、舉辦活動以及用老帶新的方式來開拓新用戶;同時促活流失用戶。
4.回購率和復(fù)購率分析
- 結(jié)論匯總:回購率在五月份之前呈上升趨勢,五月份以后在25%-40%之間波動;復(fù)購率在四月份之前一直呈現(xiàn)上升趨勢,四月份以后有些微波動,但是基本穩(wěn)定在20%左右
- 后續(xù)改進(jìn):四五月份之后需要做好用戶經(jīng)營以及產(chǎn)品運營