一爷抓、項(xiàng)目背景
1.1、背景介紹:
CDNow曾經(jīng)是一家在線音樂零售平臺(tái)沟饥,后被德國波泰爾斯曼娛樂集團(tuán)公司出資收購添怔,其資產(chǎn)總價(jià)值在最輝煌時(shí)曾超過10億美元。本文主要通過分析CDNow網(wǎng)站的用戶整體消費(fèi)情況和用戶行為展開分析贤旷,找出高價(jià)值用戶人群广料,及用戶活躍、流失等情況幼驶,為平臺(tái)指定策略提供數(shù)據(jù)分析支持和建議艾杏。
1.2、數(shù)據(jù)源介紹
本次分析數(shù)據(jù)來源CDNow網(wǎng)站的用戶在1997年1月1日至1998年6月30日期間內(nèi)購買CD交易明細(xì)盅藻。
二购桑、數(shù)據(jù)處理
2.1 導(dǎo)入模塊
import pandas as pd
import numpy as np
from datetime import datetime
from sqlalchemy import create_engine
import pymysql
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負(fù)號(hào)
plt.style.use('seaborn-colorblind') # 更改設(shè)計(jì)風(fēng)格,使用自帶形式進(jìn)行美化
# plt.style.use('ggplot')
2.2 導(dǎo)入數(shù)據(jù)
columns=["id","date","num","money"]
data=pd.read_table('CDNOW.txt',sep='\s+',names=columns)
data.head()
2.3 查看數(shù)據(jù)類型
data.info()
- 沒有缺失值氏淑;購買日期是int類型的勃蜘,需要轉(zhuǎn)換成日期類型;其他數(shù)據(jù)類型正常假残。
2.4 更改數(shù)據(jù)類型
data['date']=pd.to_datetime(data['date'],format='%Y%m%d') # 字符串類型轉(zhuǎn)時(shí)間類型
data['month']=data['date'].values.astype('datetime64[M]') # 添加月份字段缭贡,方便之后的數(shù)據(jù)分析
data.head()
2.5 描述性統(tǒng)計(jì)
data.describe()
- 觀察數(shù)據(jù)發(fā)現(xiàn): 訂單金額和訂單量的平均值皆大于中位數(shù)炉擅,數(shù)據(jù)整體分布呈右偏狀態(tài),說明絕大數(shù)據(jù)的用戶消費(fèi)金額相對較低阳惹。
三谍失、數(shù)據(jù)分析
3.1 用戶總體消費(fèi)數(shù)據(jù)分析
plt.figure(figsize=(20,15))
# 每月總銷售額趨勢圖
plt.subplot(421)
data.groupby('month').money.sum().plot(fontsize=15,marker='o')
plt.title('銷售額趨勢圖',fontsize=15)
# 每月總銷量趨勢圖
plt.subplot(422)
data.groupby('month').num.sum().plot(fontsize=15,marker='o')
plt.title('銷售量趨勢圖',fontsize=15)
# 消費(fèi)次數(shù)趨勢圖
plt.subplot(423)
data.groupby('month').id.count().plot(fontsize=15,marker='o')
plt.title('消費(fèi)次數(shù)趨勢圖',fontsize=15)
# 消費(fèi)人數(shù)趨勢圖
plt.subplot(424)
data.groupby('month').id.nunique().plot(fontsize=15,marker='o')
plt.title('消費(fèi)人數(shù)趨勢圖')
# 用戶每月平均消費(fèi)金額
plt.subplot(425)
(data.groupby('month').money.sum()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('客單價(jià)趨勢圖')
# 件單價(jià)
plt.subplot(426)
(data.groupby('month').money.sum()/data.groupby('month').num.sum()).plot(fontsize=15,marker='o')
plt.title('件單價(jià)')
# 用戶平均消費(fèi)次數(shù)趨勢圖
plt.subplot(427)
(data.groupby('month').id.count()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('人均消費(fèi)次數(shù)')
plt.subplot(428)
(data.groupby('month').num.sum()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('人均消費(fèi)量')
plt.tight_layout(pad=2) #用于設(shè)置子圖見的間距
- 觀察數(shù)據(jù)發(fā)現(xiàn):
前四個(gè)折線圖:消費(fèi)金額、銷量莹汤、消費(fèi)次數(shù)快鱼、用戶數(shù)的整體趨勢基本一致,都是1997年前三個(gè)月數(shù)據(jù)異常高纲岭,隨后驟降抹竹,然后趨于平穩(wěn);為什么會(huì)出現(xiàn)這種異持钩保現(xiàn)象呢柒莉?初步猜測要么是前三個(gè)月有異常值,要么就是受營銷活動(dòng)或者其他外部因素的影響沽翔,但這里沒有更多的數(shù)據(jù)提供驗(yàn)證素材,所以也無法判斷其原因窿凤。
用戶平消費(fèi)金額大概為50仅偎,前三個(gè)月低,后續(xù)在[47雳殊,5]波動(dòng)橘沥;用戶平均消費(fèi)次數(shù),也是前三個(gè)月低夯秃,后續(xù)上升座咆,并維持在1.35次左右,商品復(fù)購率較低仓洼;
對于客單價(jià)和人均消費(fèi)次數(shù)這兩個(gè)數(shù)據(jù)趨勢基本一致介陶,相較于銷售額等數(shù)據(jù),前面三個(gè)月數(shù)據(jù)反而低色建,后續(xù)才慢慢上升哺呜,結(jié)合兩種趨勢圖來看,在消費(fèi)次數(shù)和金額穩(wěn)定的情況下箕戳,用戶復(fù)購下降或者用戶數(shù)下降會(huì)導(dǎo)致總體銷售額和銷量的下降某残,關(guān)于這個(gè)問題的驗(yàn)證,稍后在復(fù)購率和留存率的分析中再探究陵吸。
3.2 用戶個(gè)體消費(fèi)數(shù)據(jù)分析
3.2.1 按用戶分組
group_userid=data.groupby('id') # 按月分組
plt.figure(figsize=(25,5))
plt.subplot(121)
group_userid[['num']].sort_values(by=['num'],ascending=True).reset_index()['num'].plot(fontsize=15)
plt.title('用戶訂單數(shù)量',fontsize=18)
plt.subplot(122)
group_userid[['money']].sort_values(by=['money'],ascending=True).reset_index()['money'].plot(fontsize=15)
plt.title('用戶消費(fèi)金額',fontsize=18)
3.2.2消費(fèi)金額玻墅、訂單量、消費(fèi)次數(shù)分布
fig,axes=plt.subplots(1,3,figsize=(16,4))
axes0,axes1,axes2=axes.flatten()
group_userid[['money']].query('money<1000').plot.hist(bins=50,fontsize=15,ax=axes0)
axes0.set_title('消費(fèi)金額分布圖')
axes0.set_xlabel('消費(fèi)金額')
axes0.set_ylabel('訂單人數(shù)')
# plt.subplot(132)
group_userid[['num']].query('num<100').plot.hist(bins=30,fontsize=15,ax=axes1)
axes1.set_title('訂單量分布圖')
axes1.set_xlabel('訂單量')
axes1.set_ylabel('訂單人數(shù)')
# plt.subplot(133)
data.groupby('id').count()[['date']].query('date<20').plot.hist(bins=19,fontsize=15,ax=axes2)
axes2.set_title('消費(fèi)次數(shù)分布圖')
axes2.set_xlabel('消費(fèi)次數(shù)')
axes2.set_ylabel('訂單人數(shù)')
- 從上圖可以看出壮虫,用戶購買金額普遍偏低澳厢,消費(fèi)頻次也是普遍偏低,當(dāng)然這也符合銷售數(shù)據(jù)的一般規(guī)律。
3.2.3 用戶累計(jì)訂單量和用戶累計(jì)消費(fèi)金額
plt.figure(figsize=(15,5))
plt.subplot(121)
group_userid[['num']].sort_values(by='num').apply(lambda x:x.cumsum()/x.sum()).reset_index().num.plot(fontsize=15)
plt.title('用戶累計(jì)訂單量占比')
plt.axhline(y=0.8,ls='--',c='blue',lw = 1)
plt.axvline(x=data.id.nunique()*0.8,ls='--',c='green',lw=1)
plt.subplot(122)
group_userid[['money']].sort_values(by='money').apply(lambda x:x.cumsum()/x.sum()).reset_index().money.plot(fontsize=15)
plt.title('用戶累計(jì)消費(fèi)金額占比')
plt.axhline(y=0.8,ls='--',lw=1,c='blue')
plt.axvline(x=data.id.nunique()*0.8,ls='--',lw=1,c='green')
- 20%的客戶貢獻(xiàn)了超過65%的銷售額和銷售量赏酥,符合二八趨勢喳整。
3.3 用戶消費(fèi)周期分析
3.3.1 用戶購買周期分析
# 先把每個(gè)用戶每次購買的時(shí)間間隔計(jì)算出來,這里用到的方法是shift()
def diff(data):
d=data.date-data.date.shift(1)
return d
purchase_period=data.groupby('id').apply(diff)
purchase_period.dt.days
purchase_period.head()
用戶消費(fèi)周期分布
plt.figure(figsize=(15,8))
purchase_period.dt.days.plot.hist(bins=40)
plt.title('用戶消費(fèi)周期分組',fontsize=18)
plt.xlabel('購買周期')
plt.ylabel('人數(shù)')
- 觀察圖表發(fā)現(xiàn):仍然是長尾形態(tài)分布裸扶,大部分用戶消費(fèi)周期是很短的框都;不妨將用戶找回點(diǎn)設(shè)置為消費(fèi)后立即贈(zèng)送優(yōu)惠券,10天后回訪用戶體驗(yàn)呵晨,30天后提醒優(yōu)惠券即將到期魏保,60天后發(fā)送召回短信。
3.3.2用戶生命周期分析
用戶收購時(shí)間和用戶最后一次消費(fèi)時(shí)間
plt.figure(figsize=(15,5))
plt.subplot(121)
data.groupby('id').date.min().value_counts().plot()
plt.title('用戶收購時(shí)間')
plt.subplot(122)
data.groupby('id').date.max().value_counts().plot()
plt.title('用戶最后一次消費(fèi)時(shí)間')
- 1997年4月之后不在有新增用戶摸屠,而且大多數(shù)用戶在前四個(gè)月就流失了谓罗,因此,也驗(yàn)證了此前提出的與首購的優(yōu)惠有關(guān)的可能性季二。
僅消費(fèi)一次用戶占總用戶的比例
group_userid_date_min_max=data.groupby('id').date.agg(['min','max'])
new_user=(group_userid_date_min_max['min']==group_userid_date_min_max['max']).value_counts()
plt.figure(figsize=(15,5))
new_user.plot.pie(autopct="%.1f%%",
shadow= True,
explode=[0,0.05],
startangle=0,
fontsize=15)
plt.legend(["僅消費(fèi)一次人數(shù)","多次消費(fèi)人數(shù)"])
- 大約一半的用戶僅僅消費(fèi)了一次檩咱,很有必要對用戶進(jìn)行定期召回。
用戶生命周期分布
# 用戶生命周期計(jì)算:最后一次減第一次
order_date_min=data.groupby('id').date.min()
order_date_max=data.groupby('id').date.max()
life_cycle = (order_date_max-order_date_min).dt.days
plt.figure(figsize=(15,5))
plt.subplot(121)
life_cycle.plot.hist(bins=30)
plt.title('用戶生命周期分布')
plt.xlabel('天數(shù)')
plt.ylabel('人數(shù)')
plt.subplot(122)
life_cycle=life_cycle.reset_index()
life_cycle.query('date>0').date.plot.hist(bins=50) # 消費(fèi)兩次及以上的用戶
plt.title('用戶生命周期分布')
plt.xlabel('天數(shù)')
plt.ylabel('人數(shù)')
life_cycle[['date']].describe()
life_cycle[['date']].query('date>0').describe()
總體
|
消費(fèi)兩次以上
|
---|
- 一般的用戶生命周期為一天胯舷。
- 消費(fèi)兩次及以上的用戶生命周期分布呈雙峰結(jié)構(gòu)刻蚯,用戶平均生命周期是 276 天,遠(yuǎn)高于總體的134天桑嘶;在用戶首次消費(fèi)后引導(dǎo)其進(jìn)行多次消費(fèi)炊汹,可以有效提高用戶生命周期。
3.4 用戶分層分析
3.4.1用戶價(jià)值分層(FRM)
rfm=data.groupby('id').sum()
rfm['r']=(data.date.max()-data.groupby('id').date.max()).dt.days
rfm.columns=['f','m','r']
def level_label(x):
level=x.apply(lambda x:'1' if x>=0 else '0' )
label=level['r']+level['f']+level['m']
dic={
"111":"重要價(jià)值客戶",
'101':'重要發(fā)展客戶',
"011":"重要維護(hù)客戶",
'001':'重要挽留客戶',
'001':'重要挽留客戶',
'110':'一般價(jià)值客戶',
'100':'一般發(fā)展客戶',
'010':'一般維持客戶',
'000':'一般挽留客戶'
}
return dic[label]
rfm['label']=rfm.apply(lambda x:x-x.mean()).apply(level_label,axis=1)
rfm_rate=rfm_group[['count','sum']].apply(lambda x:x/x.sum())
rfm_rate['avg']=rfm_group['sum']/rfm_group['count']
plt.figure(figsize=(15,5))
plt.subplot(131)
rfm_rate['count'].plot.bar(fontsize=13)
plt.title('用戶分層人數(shù)占比')
plt.subplot(132)
rfm_rate['sum'].plot.bar(fontsize=13)
plt.title('用戶分層消費(fèi)金額占比')
plt.subplot(133)
rfm_rate['avg'].plot.bar(fontsize=13)
plt.title('用戶分層平均消費(fèi)金額')
- 從上圖可以看出逃顶,接近60%的用戶屬于一般發(fā)展客戶讨便,這一類客戶占比較大帕棉,但是僅僅貢獻(xiàn)消費(fèi)金額的17%左右胰坟,平均消費(fèi)金額僅僅0.25萬美元笑陈,在各類客戶當(dāng)中屬于最低水平界逛;第二大用戶群是重要維護(hù)客戶蜂厅,人數(shù)占比接近20%蝇摸,貢獻(xiàn)的銷售額達(dá)到63%左右宿刮,平均消費(fèi)金額達(dá)3.3萬元是辕,這一類客戶價(jià)值極高眉反,對于這一類客戶應(yīng)該做好重點(diǎn)維護(hù)昙啄,防止用戶流失,從而為平臺(tái)創(chuàng)造更大的收入寸五。
3.4.2 用戶活躍程度分層
#將用戶消費(fèi)數(shù)據(jù)進(jìn)行數(shù)據(jù)透視:
data3 = data.pivot_table(index = "id",
columns = "month",
values = 'date',
aggfunc = 'count').fillna(0)
def active_status(x):
status=[]
for i in range(len(x)):
#若本月沒有消費(fèi)
if x[i] ==0:
if i!=0:
if status[i-1]=='unreg':
status.append('unreg')
else :status.append('unactive')
else :status.append('unreg')
#若本月消費(fèi)了
elif x[i]!=0:
if i!=0:
if status[i-1]=='unreg':
status.append('new')
elif status[i-1]=='unactive':
status.append('return')
else :status.append('active')
else :status.append('new')
return pd.Series(status,index=x.index)
data3_status=data3.apply(active_status,axis=1)
data3_status=data3_status.apply(lambda x:x.value_counts()).fillna(0).T.drop('unreg',axis=1)
plt.figure(figsize=(8,5))
data3_status.plot()
plt.title('每月用戶活動(dòng)狀態(tài)人數(shù)')
plt.ylabel('人數(shù)')
plt.figure(figsize=(8,5))
data3_status.apply(lambda x:x/x.sum(),axis=1).plot.area()
plt.title('每月用戶活動(dòng)狀態(tài)')
plt.ylabel('用戶人數(shù)占比')
3.4.3 每月回流用戶占比
(data3_status['return']/data3_status['unactive'].shift(1)).plot(marker='o')
plt.title('每月回流用戶占比')
plt.ylabel('用戶占比')
- 四月份以后梳凛,用戶回流率開始顯著下降,并且稍有波動(dòng)梳杏。
3.5 復(fù)購率韧拒、回購率淹接、留存率
復(fù)購率:在一個(gè)時(shí)間窗口里,多次購買的客戶數(shù)量占總客戶的比例
回購率:本時(shí)間窗口內(nèi)購買的客戶中叛溢,下個(gè)時(shí)間窗口繼續(xù)購買的客戶比例
3.5.1 復(fù)購率
#每個(gè)用戶在每月的訂單數(shù)
pivoted_data=data.pivot_table(index='id',
columns='month',
values='date',
aggfunc='count').fillna(0)
# 消費(fèi)兩次及以上為 1 塑悼,消費(fèi)1次為 0 ,沒有消費(fèi)為空
pivoted_data_trans=pivoted_data.applymap(lambda x: 1 if x>1 else np.nan if x==0 else 0)
repurchase_rate=(pivoted_data_trans.sum()/pivoted_data_trans.count()).reset_index()
repurchase_rate.columns=['日期','復(fù)購率']
plt.figure(figsize=(15,5))
plt.plot(repurchase_rate.日期,repurchase_rate.復(fù)購率)
plt.title('復(fù)購率',fontsize=18)
- 復(fù)購率穩(wěn)定在 20% 左右楷掉,前三個(gè)月因?yàn)橛写罅啃掠脩粲咳?而這批用戶只購買了一次厢蒜,所以導(dǎo)致復(fù)購率降低
3.5.2 回購率
group_month_user_order=data.pivot_table(index='id',
columns='month',
values='num',
aggfunc='sum').fillna(0)
pivoted_repurchase = group_month_user_order.applymap(lambda x:1 if x>0 else 0)
def buy_back_choose(x):
mask=x>0
label=[]
for i in range(len(x)-1):
if mask[i] and mask[i+1]:
label.append(1)
elif mask[i]:
label.append(0)
else:
label.append(np.NaN)
return pd.Series(label,index=x.index[:-1])
pivoted_repurchase_return= pivoted_repurchase.apply(buy_back_choose,axis=1)
plt.figure(figsize=(15,5))
pivoted_repurchase_return.apply(lambda x:x.sum()/x.count()).plot()
plt.title('回購率',fontsize=15)
上圖可以看出,在初期用戶的回購率并不高烹植,1月的回購率只有15%左右斑鸦,4月份起回購率穩(wěn)定在30%左右。
從每月有回購消費(fèi)的用戶數(shù)數(shù)據(jù)可以看出草雕,回購用戶數(shù)整體有下降趨勢巷屿。對回購率的分析,再次說明了對于新用戶墩虹,在其第一次消費(fèi)后的三個(gè)月內(nèi)是一段重要的時(shí)期嘱巾,需要營銷策略積極引導(dǎo)其再次消費(fèi)及持續(xù)消費(fèi)。
另外诫钓,對于有持續(xù)消費(fèi)的老客浓冒,也要適時(shí)推出反饋老客戶的優(yōu)惠活動(dòng),以加強(qiáng)老客的忠誠度尖坤。
只有2.5%的用戶在第一次消費(fèi)的次日至3天內(nèi)有過消費(fèi),3%的用戶在3~7天內(nèi)有過消費(fèi)闲擦。數(shù)字并不好看慢味,CD購買確實(shí)不是高頻消費(fèi)行為。有20%的用戶在第一次消費(fèi)后的三個(gè)月到半年之間有過購買墅冷,27%的用戶在半年后至1年內(nèi)有過購買纯路。從運(yùn)營角度看,CD機(jī)營銷在服務(wù)新用戶的同時(shí)寞忿,應(yīng)該注重用戶忠誠度的培養(yǎng)驰唬,放長線掉大魚,在一定時(shí)間內(nèi)召回用戶購買腔彰。
四叫编、總結(jié)
- 用戶總體消費(fèi)趨勢(每月)方面,前3個(gè)月有大量新用戶涌入霹抛,消費(fèi)金額搓逾、消費(fèi)訂單數(shù)、產(chǎn)品購買量均達(dá)到高峰杯拐,后續(xù)每月較為穩(wěn)定霞篡。前3個(gè)月消費(fèi)次數(shù)都在10000筆左右世蔗,后續(xù)月份的平均2500;前3個(gè)月產(chǎn)品購買量達(dá)到20000甚至以上朗兵,后續(xù)月份平均7000污淋;前3個(gè)月消費(fèi)人數(shù)在8000-10000之間,后續(xù)月份平均2000不到余掖。
用戶個(gè)體消費(fèi)方面寸爆,小部分用戶購買了大量的CD,拉高了平均消費(fèi)金額浊吏。用戶消費(fèi)金額集中在0100元而昨,有大約17000名用戶。用戶購買量集中在05找田,有大約16000名用戶歌憨。50%的用戶僅貢獻(xiàn)了15%的消費(fèi)額度,15%的用戶貢獻(xiàn)了60%的消費(fèi)額度墩衙。大致符合二八法則务嫡。 - 用戶個(gè)體消費(fèi)行為方面,首購和最后一次購買的時(shí)間漆改,集中在前三個(gè)月心铃,說明很多用戶購買了一次后就不再進(jìn)行購買。而且最后一次購買的用戶數(shù)量也在隨時(shí)間遞增挫剑,消費(fèi)呈現(xiàn)流失上升的狀況去扣。
從整體消費(fèi)記錄來看,有一半的用戶樊破,只消費(fèi)了一次愉棱。從每月新用戶占比來看,1997年1月新用戶占比高達(dá)90%以上哲戚,后續(xù)有所下降奔滑,1997年4月到1998年6月維持在81%左右,1998年6月以后無新用戶顺少。
從RFM模型來看朋其,在8種客戶中,重要保持客戶的消費(fèi)頻次和消費(fèi)金額最高脆炎,人數(shù)排在第二位梅猿;而一般發(fā)展客戶消費(fèi)頻次和消費(fèi)金額排第二位,人數(shù)卻是最多秒裕。 - 用戶生命周期方面粒没,由于只購買一次的用戶(生命周期為0天)占了接近一半,排除這部分用戶的影響之后簇爆,用戶平均生命周期276天癞松,中位數(shù)302天爽撒。
- 從用戶分層情況來看,新用戶從第4月份以后沒有新增响蓉;活躍用戶有所下降硕勿;回流用戶數(shù)量趨于穩(wěn)定,每月1000多枫甲。流失/不活躍用戶源武,數(shù)量非常多,基本上每月都在20000以上想幻。
用戶購買周期方面粱栖,平均購買周期是68天,最小值0天脏毯,最大值533天闹究。絕大部分用戶的購買周期都低于100天。 - 復(fù)購率和回購率方面食店,復(fù)購率穩(wěn)定在20%左右渣淤,回購率穩(wěn)定在30%左右,前3個(gè)月因?yàn)橛写罅啃掠脩粲咳爰郏@批用戶只購買了一次价认,所以導(dǎo)致復(fù)購率和回購率都比較低。