本文是對CD案例的一個總結(jié)鼻弧,主要是根據(jù)用戶消費記錄,分析用戶消費行為锦茁,建立RFM模型攘轩,分析復購率、回購率等關(guān)鍵指標码俩。希望對其他產(chǎn)品的線上消費數(shù)據(jù)分析有一定的借鑒價值度帮。
目錄:
● 項目背景
● 分析目標
● 分析過程
● 小結(jié)
一、項目背景
CDNOW是美國的一家網(wǎng)上唱片公司稿存,成立于1994年笨篷,后來被貝塔斯曼音樂集團收購。
二瓣履、分析目標
本次分析報告的數(shù)據(jù)來源于這家CD網(wǎng)站上的用戶消費記錄率翅,旨在分析用戶消費行為,建立RFM模型袖迎,分析復購率冕臭、回購率等關(guān)鍵指標腺晾。
● 用戶消費趨勢分析(按月)——每月消費總金額、消費次數(shù)辜贵、產(chǎn)品購買量悯蝉、消費人數(shù)、用戶平均消費金額托慨、用戶平均消費次數(shù)鼻由。
● 用戶個體消費分析——用戶消費金額,產(chǎn)品購買量的描述性統(tǒng)計厚棵、用戶消費金額和產(chǎn)品購買量分布嗡靡、用戶累計消費金額占比。
● 用戶消費行為分析——用戶第一次消費(首購)時間分布窟感、用戶最后一次消費時間分布讨彼、新老用戶占比、用戶分層RFM模型柿祈、各類用戶(新用戶哈误、活躍用戶、流失用戶躏嚎、回流用戶)數(shù)量和占比蜜自、用戶購買周期、用戶生命周期卢佣。
● 用戶復購率和回購率分析——復購率重荠、回購率。
三虚茶、分析過程
1戈鲁、數(shù)據(jù)處理
(1)導入數(shù)據(jù)
# 導入常用庫
import pandas as pd
import numpy as np
from datetime import datetime as dt
# 導入數(shù)據(jù)集
df=pd.read_csv("data/CDNOW.txt",header=None,names=['user_id','order_dt','order_products','order_amount'],sep='\s+',index_col='user_id)
df.head()
(2)觀察數(shù)據(jù)
order_dt列表示購買日期,需轉(zhuǎn)換為日期格式嘹叫。
數(shù)據(jù)中存在一個用戶在同一天或不同天下多次訂單的情況婆殿,如user_id為2的用戶就在1月12日下單兩次。
(3)清洗數(shù)據(jù)
檢查數(shù)據(jù)罩扇,發(fā)現(xiàn)數(shù)據(jù)集不存在缺失值婆芦。把order_dt轉(zhuǎn)換為日期型datetime64[ns]。
df['order_dt']=pd.to_datetime(df['order_dt'],format="%Y%m%d")
df.info()
(4)數(shù)據(jù)探索
● 從數(shù)據(jù)的統(tǒng)計描述信息中可以看出喂饥,用戶每個訂單平均購買2.41個商品消约,每個訂單平均消費35.89元,有一定極值的干擾员帮。
● 購買商品數(shù)量的標準差為2.33或粮,說明數(shù)據(jù)具有一定的波動性;中位數(shù)為2個商品,75分位數(shù)為3個商品集侯,說明大部分訂單的購買數(shù)量都不多被啼。最大值在99個帜消,數(shù)字比較高。購買金額的情況差不多浓体,大部分訂單都集中在小額泡挺。
● 一般而言,消費類的數(shù)據(jù)分布命浴,都是長尾形態(tài)娄猫。大部分用戶都是小額,然而小部分用戶貢獻了收入的大頭生闲,俗稱二八媳溺。
2、用戶消費趨勢分析(月維度)
df['month']=df.order_dt.values.astype('datetime64[M]') # 新增month字段
df.head()
#導入繪圖包
import matplotlib.pyplot as plt
# 魔法函數(shù)碍讯,用于可視化自動顯示
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['Simhei'] # 解決中文亂碼問題plt.rcParams['axes.unicode_minus'] = False # 解決坐標軸刻度負號亂碼
plt.style.use('ggplot') # 更改設計風格悬蔽,使用自帶的形式進行美化
# 設置圖的大小,添加子圖
plt.figure(figsize=(20,15))
# 每月的總銷售額
plt.subplot(221)
df.groupby('month')['order_amount'].sum().plot(fontsize=20)
plt.title('總銷售額',fontsize=20)
# 每月的消費次數(shù)
plt.subplot(222)
df.groupby('month')['order_dt'].count().plot(fontsize=20)
plt.title('消費次數(shù)',fontsize=20)
# 每月的銷量
plt.subplot(223)
df.groupby('month')['order_products'].sum().plot(fontsize=20)
plt.title('總銷量',fontsize=20)
# 每月的消費人數(shù)
plt.subplot(224)
df.groupby('month')['user_id'].apply(lambda x:len(x.unique())).plot(fontsize=20)
plt.title('消費人數(shù)',fontsize=20)
plt.tight_layout() # 設置子圖的間距
plt.show()
● 四個折線圖的整體趨勢基本一致捉兴,可以看出來蝎困,前3個月的銷量與銷售額均出現(xiàn)峰值,3月份之后急劇下降倍啥,后趨于平穩(wěn)禾乘。
● 仔細對比發(fā)現(xiàn)2-3月期間,消費人數(shù)有所下降虽缕,但總銷量與總銷售額仍是上升趨勢始藕,3月份的客戶中是否有高價值客戶后續(xù)待分析。
● 針對3月之后銷量與銷售額的劇烈下降氮趋,可假設原因為:①用戶身上出了問題伍派,早期用戶中有異常值,是否有團購大單客戶凭峡;②是否有大促拙已,但本數(shù)據(jù)集只有消費數(shù)據(jù),暫時無法判斷摧冀,但這是一個業(yè)務思考點。
plt.figure(figsize=(16,8))
# 每月用戶平均消費金額
amount=df.groupby('month')['order_amount'].sum()
num=df.groupby('month')['user_id'].apply(lambda x:len(x.drop_duplicates())) avg_amount=amount/num
plt.subplot(121)
avg_amount.plot(fontsize=20)
plt.title('每月用戶平均消費金額',fontsize=20)
# 每月用戶平均消費次數(shù)
times=df.groupby('month')['order_dt'].count()
num=df.groupby('month')['user_id'].apply(lambda x:len(x.drop_duplicates()))
avg_times=times/num
plt.subplot(122)
avg_times.plot(fontsize=20)
plt.title('每月用戶平均消費次數(shù)',fontsize=20)
plt.tight_layout()
plt.show()
● 由上圖可知系宫,每月用戶平均消費金額都在37.5元以上索昂,1997年1月份最低,1998年11月最高扩借,最高值為57元左右椒惨。
● 由上圖可知,每月用戶平均消費次數(shù)都在1次以上潮罪,1997年1月份最低康谆,1998年10月最高领斥,最高值為1.4次左右。
3沃暗、客戶個體消費分析
(1)用戶消費金額月洛,產(chǎn)品購買量的描述性統(tǒng)計
grouped_user=df.groupby('user_id')
grouped_user.sum().describe()
從用戶角度看,每位用戶平均購買7張CD孽锥,最多的用戶購買了1033張嚼黔。用戶的平均消費金額(客單價)100元,標準差是240惜辑,結(jié)合分位數(shù)和最大值看唬涧,平均值才和75分位接近,肯定存在小部分的高額消費用戶,這也符合二八法則盛撑。
(2)用戶消費金額和消費次數(shù)的散點圖
grouped_user.sum().plot.scatter(x='order_amount',y='order_products')
由上圖可知碎节,絕大部分的數(shù)據(jù)集中分布,小部分極值對分析有一定的干擾抵卫。
可以使用query方法钓株,篩選出order_amount<4000的用戶,排除極值的干擾陌僵。
grouped_user.sum().query('order_amount<4000').plot.scatter(x='order_amount',y='order_products')
● 由散點圖可知轴合,用戶消費金額與產(chǎn)品購買量幾乎成線性關(guān)系,購買的商品越多碗短,消費金額越大受葛。
● 因為這是CD網(wǎng)站的銷售數(shù)據(jù),商品比較單一偎谁,金額和銷量的關(guān)系也因此呈線性总滩,也就是商品單價比較穩(wěn)定。假如之后商家拓展了商品品類巡雨,增加了唱片機闰渔,那金額和銷量的關(guān)系就不會是線性。
(3)用戶消費金額分布圖
grouped_user.sum().order_amount.plot.hist(bins=20)
# bins = 20,就是分成20塊铐望,最低金額是0冈涧,最高金額是14000,每個項就是700
從直方圖可知正蛙,用戶消費金額督弓,絕大部分呈現(xiàn)集中趨勢,小部分極大值干擾了判斷乒验,可以使用過濾操作排除異常愚隧。
grouped_user.sum().query('order_products<100').order_amount.plot.hist(bins=20)
可以觀察到,用戶消費金額集中在0~100元锻全,有大約17000名用戶狂塘。大部分用戶的消費能力并不高录煤,絕大部分呈現(xiàn)集中在較低的消費檔次。
(4)用戶購買量分布圖
grouped_user.sum().query('order_products<100').order_products.plot.hist(bins=20)
● 可以觀察到荞胡,用戶購買量集中在0-5妈踊,有大約16000名用戶購買0-5張CD。
● 這里需要注意一點:通常使用切比雪夫定理過濾掉異常值硝训,因為切比雪夫定理說明响委,所有數(shù)據(jù)中至少有96%的數(shù)據(jù)位于平均數(shù)5個標準差之內(nèi),剩下4%的極值就過濾掉窖梁。這里以order_products作為過濾條件赘风,mean+5std=7.12+5*16.98=92.02,近似選擇100作為閾值即可纵刘。
(5)用戶累計消費金額占比(百分之多少的用戶占了百分之多少的消費額)
# 按照用戶消費金額進行升序排序邀窃,cumsum 是求累加值
user_cumsum=grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum()/x.sum())
# reset_index() 是為了得到一個自然數(shù)的行標簽,表示累計用戶數(shù)量
user_cumsum.reset_index().order_amount.plot()
由圖可知:
橫坐標表示累計用戶數(shù)量(總共有23570名用戶)假哎,縱坐標表示累計消費金額占比瞬捕。
50%的用戶僅貢獻了15%的消費額度,70%的用戶僅貢獻了20%的消費額度舵抹,85%的用戶僅貢獻了40%的消費額度肪虎,而排名前3000多的用戶就貢獻了60%的消費額度。
4惧蛹、客戶個體消費分析
(1)用戶第一次消費(首購)時間分布
# 得到最小的日期扇救,然后統(tǒng)計一下各個日期的個數(shù)
grouped_user.min().order_dt.value_counts().plot()
用戶第一次購買分布,集中在前三個月香嗓。其中迅腔,在2月9日到2月25日之間有劇烈的波動】坑椋可以假設原因為:銷售渠道發(fā)生了變化沧烈、銷售政策發(fā)生了變化等。
(2)用戶最后一次消費時間分布
# 得到最大的日期像云,然后統(tǒng)計一下各個日期的個數(shù)锌雀,得到最后一次消費的情況,用戶流失
grouped_user.max().order_dt.value_counts().plot()
● 用戶最后一次購買的時間分布比第一次購買的時間分布廣苫费。上圖3月下旬起出現(xiàn)斷崖式下跌汤锨,一開始用戶數(shù)量迅猛增長,流失的也比較多百框,后面趨于穩(wěn)定,沒有再出現(xiàn)此類用戶嚴重流失的情況牍汹。
● 大部分最后一次購買的時間铐维,集中在前三個月柬泽,剛好首購也是集中在這三個月,說明很多用戶購買了一次后就不再進行購買嫁蛇。
● 隨著時間的遞增锨并,最后一次購買的用戶數(shù)量也在遞增,消費呈現(xiàn)流失上升的狀況睬棚。隨著時間的增長第煮,可能運營沒跟上,或者用戶忠誠度下降了抑党。
(3)新老用戶占比
a包警、多少用戶僅消費一次
# 第一次和最后一次消費日期相同,說明只消費了一次
user_life=grouped_user.order_dt.agg(['min','max'])
# 統(tǒng)計只消費了一次的用戶
(user_life['min']==user_life['max']).value_counts()
結(jié)果表明底靠,有一半的用戶害晦,只消費了一次。
b暑中、每月新用戶占比
# 按照month壹瘟、userid分組,第一次和最后一次消費日期
user_life_month=df.groupby(['month','user_id']).order_dt.agg(['min','max']).reset_index()
# 新增is_new字段鳄逾,用于標記新用戶
user_life_month['is_new']=(user_life_month['min']==user_life_month['max'])
# 再次按month分組稻轨,計算新用戶占比
user_life_month_pct=user_life_month.groupby('month').is_new.apply(lambda x:x.value_counts()/x.count()).reset_index()
# 每月新客(level_1為True)占比作圖
user_life_month_pct[user_life_month_pct.level_1].plot(x='month',y='is_new')
1997年1月新用戶占比最高,達90%以上雕凹,2-4月下降明顯殴俱,后逐漸趨于平穩(wěn)。1997年4月到1998年6月維持在81%左右请琳,1998年6月以后無新用戶粱挡。
(4)用戶分層
a、RFM模型
RFM模型
為了進行精細化運營俄精,可以利用RMF模型對用戶價值指數(shù)(衡量歷史到當前用戶貢獻的收益)進行計算询筏。
最近一次消費-R:客戶最近一次交易時間的間隔。R值越大竖慧,表示客戶交易發(fā)生的日期越久嫌套,反之則交易發(fā)生的日期越近。
消費頻率-F:客戶在最近一段時間內(nèi)交易的次數(shù)圾旨。F值越大踱讨,表示客戶交易越頻繁,反之則表示客戶交易不夠活躍砍的。
消費金額-M:客戶在最近一段時間內(nèi)交易的金額痹筛。M值越大,表示客戶價值越高,反之則表示客戶價值越低帚稠。
根據(jù)上述三個維度谣旁,對客戶做細分。
# 畫RFM滋早,先對原始數(shù)據(jù)進行透視
rfm=pd.pivot_table(df,index='user_id',
values=['order_products','order_amount','order_dt'],
aggfunc={'order_dt':'max',
'order_amount':'sum',
'order_products':'count'})
rfm.head()
# R:最近一次消費(距今天數(shù))榄审,這里因為消費時間距今太久遠,就不用今天了杆麸,而是選用一個時間最大值
# 這里是時間格式相減搁进,得到xxx days,所以需要除以一個單位'D'
rfm['R']= -(rfm.order_dt - rfm.order_dt.max())/np.timedelta64(1,'D')
# F:消費頻次
# M:消費金額
rfm.rename(columns={'order_products':"F",'order_amount':'M'},inplace=True)
rfm.head()
def rfm_func(x):
level=x.apply(lambda x:'1' if x>=0 else '0')
# level是Series,R/F/M都是其索引
# 字符串拼接
label=level.R + level.F + level.M
d={
'111':'重要價值客戶',
'011':'重要保持客戶',
'101':'重要發(fā)展客戶',
'001':'重要挽留客戶',
'110':'一般價值客戶',
'010':'一般保持客戶',
'100':'一般發(fā)展客戶',
'000':'一般挽留客戶',
}
result=d[label]
return result
# 這里要一行行的傳遞進來昔头,所以 axis=1饼问,傳遞一行得到一個 label,然后匹配返回一個值
rfm['label']=rfm[['R','F','M']].apply(lambda x:x-x.median()).apply(rfm_func,axis=1)
rfm.head()
# 其實應該設置8個顏色减细,這里做了簡化:
rfm.loc[rfm.label=='重要價值客戶','color']='g'
rfm.loc[~(rfm.label=='重要價值客戶'),'color']='r'
rfm.plot.scatter('F','R',c=rfm.color)
綠色部分是重要價值客戶匆瓜,消費頻次較高,但最近一次消費時間距今較遠
# 8種客戶類型的總消費金額未蝌、消費頻次
rfm.groupby('label').sum()
8種客戶中驮吱,重要保持客戶(011)的消費頻次和消費金額最高盔粹。其次是一般發(fā)展客戶(100)症汹。
# 8種客戶類型的人數(shù)
rfm.groupby('label').count()
8種客戶中琉苇,一般發(fā)展客戶(100)的人數(shù)最多除破,其次是重要保持客戶(011)瑰枫。
從RFM分層可知光坝,大部分用戶為一般發(fā)展客戶,但是這是由于極值的影響鸳惯,所以RFM的劃分標準應該以業(yè)務為準悲敷,也可以通過切比雪夫定理去除極值后求均值后德,并且 RFM 的各個劃分標準可以都不一樣。
tips:盡量用小部分的用戶覆蓋大部分的額度
不要為了數(shù)據(jù)好看劃分等級
b绵患、新用戶落蝙、活躍用戶、流失用戶管行、回流用戶
# 每月的消費次數(shù)捐顷,缺失值用0填充
pivoted_counts=pd.pivot_table(df,index='user_id',
columns='month',
values='order_dt',
aggfunc='count').fillna(0)
pivoted_counts.head()
# 上面填充了一些null值為0,而實際可能用戶在當月根本就沒有注冊叮姑,這樣會誤導第一次消費數(shù)據(jù)的統(tǒng)計,所以寫一個函數(shù)來處理
def active_status(data):
status=[]
# 數(shù)據(jù)一共有18個月份旷祸,每次輸入一行數(shù)據(jù),也就是一個user_id的信息闰围,進行逐月判斷
for i in range(18):
# 若本月沒有消費
if data[i]==0:
# 判斷之前有沒有數(shù)據(jù)碧查,之前有數(shù)據(jù)
if len(status)>0:
# 判斷上個月是否為未注冊(如果上個月未注冊忠售,本月沒有消費稻扬,仍為未注冊)
if status[i-1]=='unreg':
status.append('unreg')
# 上月有消費泰佳,本月沒有消費,則為不活躍
else:
status.append('unactive')
# 之前一個數(shù)據(jù)都沒有汽绢,就認為是未注冊
else:
status.append('unreg')
# 若本月消費
else:
# 之前無記錄,本月是第一次消費积仗,則為新用戶
if len(status)==0:
status.append('new')
# 之前有記錄
else:
# 上個月是不活躍,這個月消費了隆圆,則為回流用戶
if status[i-1]=='unactive':
status.append('return')
# 上個月未注冊,這個月消費了侣背,則為新用戶
elif status[i-1]=='unreg':
status.append('new')
# 上個月消費了弧腥,本月仍消費管搪,則為活躍用戶
else:
status.append('active')
data=data.astype('object')
for i in range(18):
data[i]=status[i]
return data
關(guān)于active_status的說明:
①若本月沒有消費,這里只是和上個月判斷是否注冊,有一定的缺陷蛇券,應該判斷是否存在就可以了纠亚。
若之前有數(shù)據(jù),是未注冊条篷,則依舊為未注冊鸿染;
若之前有數(shù)據(jù),不是未注冊蚕冬,則為流失/不活躍免糕;
若之前沒有數(shù)據(jù),為未注冊。
②若本月有消費:
若是第一次消費肯夏,則為新用戶;
若之前有過消費徊都,上個月為不活躍,則為回流;
若之前有過消費房轿,上個月為未注冊所森,則為新用戶囱持;
若之前有過消費,其他情況為活躍必峰;
return:回流 new:新客 unreg:未注冊 active:活躍
注意:主流寫法還是使用 etl 洪唐,不是通過透視表。
purchase_stats=df_purchase.apply(active_status,axis=1)
purchase_stats.head()
# 把未注冊的替換為空值吼蚁,這樣count不會計算到肝匆,得到每個月的用戶分布
purchase_stats_ct=purchase_stats.replace('unreg',np.NaN).apply(lambda x:pd.value_counts(x))
purchase_stats_ct
# 繪制面積圖肿轨,描述用戶分布
purchase_stats_ct.fillna(0).T.plot.area()
● 藍色是新用戶,前3個月大量涌入,后面沒有新增森枪。
● 紅色是活躍用戶,前幾個月較多编饺,后面有所下降鲸沮。
● 紫色是回流用戶炫狱,數(shù)量趨于穩(wěn)定憎亚,每月1000多。
● 灰色是流失/不活躍用戶驴剔,數(shù)量非常多琳拭,基本上每月都在20000以上。
# 計算每月各類用戶占比
purchase_stats_ct.fillna(0).T.apply(lambda x:x/x.sum(),axis=1)
purchase_stats_ct.fillna(0).T.apply(lambda x:x/x.sum(),axis=1).plot.area()
● 前三個月有大量新用戶涌入马靠,新用戶占比很高俊戳,而后面幾個月不活躍用戶占比非常高,普遍在90%以上呕臂。
● 活躍用戶褥琐,持續(xù)消費的用戶析显,對應的是消費運營的質(zhì)量谷异。
● 回流用戶分尸,之前不消費,本月才消費歹嘹,對應的是喚回運營尺上。
● 不活躍用戶,對應的是流失蔓涧。
(5)用戶購買周期(按訂單)
a连茧、用戶購買周期描述
# 計算相鄰兩個訂單的時間間隔,shift函數(shù)是對數(shù)據(jù)進行錯位,所有數(shù)據(jù)會往下平移一下
order_diff=grouped_user.apply(lambda x:x.order_dt-x.order_dt.shift())
order_diff.head(10)
order_diff.describe()
** b梅屉、用戶購買周期分布**
# 去除單位
(order_diff/np.timedelta64(1,'D')).hist(bins=20)
訂單周期呈指數(shù)分布值纱。用戶的平均購買周期是68天,最小值0天坯汤,最大值533天虐唠。絕大部分用戶的購買周期都低于100天。
(6)用戶生命周期(按第一次和最后一次消費)
a惰聂、用戶生命周期描述
# 描述性統(tǒng)計
(user_life['max']-user_life['min']).describe()
b疆偿、用戶生命周期分布
# 去除單位
((user_life['max']-user_life['min'])/np.timedelta64(1,"D")).hist(bins=40)
用戶平均生命周期134天,但中位數(shù)僅0天搓幌。
用戶的生命周期分布受只購買一次的用戶(用戶生命周期0天)影響比較嚴重杆故,可以排除。
# 提取用戶生命周期大于0的數(shù)據(jù)
u_1=(user_life['max']-user_life['min']).reset_index()[0]/np.timedelta64(1,"D")
u_1[u_1>0].hist(bins=40,figsize=(6,4))
u_1[u_1>0].describe()
排除了只購買一次的用戶(生命周期0天)影響溉愁,這部分用戶占了接近一半处铛。
用戶平均生命周期276天,中位數(shù)302天拐揭。
(7)復購率和回購率分析:
復購率:自然月內(nèi)撤蟆,購買多次的用戶占比。
回購率:曾經(jīng)購買過的用戶在某一時期再次購買的占比
a堂污、復購率
pivoted_counts.head(10)
# 區(qū)分消費1次家肯,和1次以上的情況,以便于計算復購率盟猖,大于1為1讨衣,等于1為0,等于0為NaN
# (消費兩次及以上記為1式镐,消費一次記為0反镇,沒有消費記為NaN。)
# applymap針對DataFrame里的所有數(shù)據(jù)娘汞。用lambda進行判斷愿险,因為這里涉及了多個結(jié)果,所以要兩個if else价说,記住,lambda沒有elif的用法风秤。
purchase_r=pivoted_counts.applymap(lambda x: 1 if x>1 else np.NaN if x==0 else 0)
purchase_r.head()
# 復購人數(shù)/總消費人數(shù)(不會計算nan值)
(purchase_r.sum()/purchase_r.count()).plot(figsize=(10,4))
復購率穩(wěn)定在20%左右鳖目,前3個月因為有大量新用戶涌入,而這批用戶只購買了一次缤弦,所以導致復購率較低领迈。
用sum和count相除即可計算出復購率。因為這兩個函數(shù)都會忽略NaN,而NaN是沒有消費的用戶狸捅,count不論0還是1都會統(tǒng)計衷蜓,所以是總的消費用戶數(shù),而sum求和計算了兩次以上的消費用戶尘喝。這里用了比較巧妙的替代法計算復購率磁浇,SQL中也可以用。
b朽褪、回購率
pivoted_amount=pd.pivot_table(df,index='user_id',
columns='month',
values='order_amount',
aggfunc='mean').fillna(0)
pivoted_amount.head()
# 1代表這個月消費了置吓,0代表沒消費
df_purchase=pivoted_amount.applymap(lambda x:1 if x>0 else 0)
df_purchase.head()
# 使用函數(shù)判斷是否回購,這里定義的回購指當月消費過的用戶下個月也消費了
def purchase_back(data):
# 判斷每一個月是否是回購缔赠,根據(jù)下個月是否購買來判斷
status=[]
for i in range(17):
# 本月消費
if data[i]==1:
# 下個月回購
if data[i+1]==1:
status.append(1)
# 下個月沒回購
if data[i+1]==0:
status.append(0)
# 本月沒消費衍锚,賦予空值,不參與計算
else:
status.append(np.NaN)
# 第18個月補充NaN嗤堰,因為沒有下個月的數(shù)據(jù)了
status.append(np.NaN)
data=data.astype('object')
for i in range(17):
data[i]=status[i]
return data
# 一行行傳遞戴质,返回的0代表當月消費下個月未消費,1代表當月消費下個月仍消費踢匣,NaN代表當月未消費
purchase_b=df_purchase.apply(purchase_back,axis=1)
purchase_b.head()
# 回購率告匠,回購的次數(shù)/總購買次數(shù)
(purchase_b.sum()/purchase_b.count()).plot(figsize=(10,4))
回購率穩(wěn)定在30%左右,前3個月因為有大量新用戶涌入符糊,而這批用戶只購買了一次凫海,所以導致回購率較低
四、小結(jié)
1男娄、用戶消費趨勢(每月)方面行贪,前3個月有大量新用戶涌入,消費金額模闲、消費訂單數(shù)建瘫、產(chǎn)品購買量均達到高峰,后續(xù)每月較為穩(wěn)定尸折。前3個月消費次數(shù)都在10000筆左右啰脚,后續(xù)月份的平均2500;前3個月產(chǎn)品購買量達到20000甚至以上实夹,后續(xù)月份平均7000橄浓;前3個月消費人數(shù)在8000-10000之間,后續(xù)月份平均2000不到亮航。
2荸实、用戶個體消費方面,小部分用戶購買了大量的CD缴淋,拉高了平均消費金額准给。用戶消費金額集中在0-100元泄朴,有大約17000名用戶。用戶購買量集中在0-5元露氮,有大約16000名用戶祖灰。50%的用戶僅貢獻了15%的消費額度,15%的用戶貢獻了60%的消費額度畔规。大致符合二八法則局扶。
3、用戶消費行為方面油讯,首購和最后一次購買的時間详民,集中在前三個月,說明很多用戶購買了一次后就不再進行購買陌兑。而且最后一次購買的用戶數(shù)量也在隨時間遞增沈跨,消費呈現(xiàn)流失上升的狀況。
4兔综、從整體消費記錄來看饿凛,有一半的用戶,只消費了一次软驰。從每月新用戶占比來看涧窒,1997年1月新用戶占比高達90%以上,后續(xù)有所下降锭亏,1997年4月到1998年6月維持在81%左右纠吴,1998年6月以后無新用戶。
5慧瘤、從RFM模型來看戴已,在8種客戶中,重要保持客戶的消費頻次和消費金額最高锅减,人數(shù)排在第二位糖儡;而一般發(fā)展客戶消費頻次和消費金額排第二位,人數(shù)卻是最多怔匣。
6握联、從用戶分層情況來看,新用戶從第4月份以后沒有新增每瞒;活躍用戶有所下降金闽;回流用戶數(shù)量趨于穩(wěn)定,每月1000多剿骨。流失/不活躍用戶呐矾,數(shù)量非常多,基本上每月都在20000以上懦砂。
7蜒犯、用戶購買周期方面,平均購買周期是68天荞膘,最小值0天罚随,最大值533天。絕大部分用戶的購買周期都低于100天羽资。
8淘菩、用戶生命周期方面,由于只購買一次的用戶(生命周期為0天)占了接近一半屠升,排除這部分用戶的影響之后潮改,用戶平均生命周期276天,中位數(shù)302天腹暖。
9汇在、復購率和回購率方面,復購率穩(wěn)定在20%左右脏答,回購率穩(wěn)定在30%左右糕殉,前3個月因為有大量新用戶涌入,而這批用戶只購買了一次殖告,所以導致復購率和回購率都比較低阿蝶。