一、项目背景
1.1、背景介绍:
CDNow曾经是一家在线音乐零售平台,后被德国波泰尔斯曼娱乐集团公司出资收购,其资产总价值在最辉煌时曾超过10亿美元。本文主要通过分析CDNow网站的用户整体消费情况和用户行为展开分析,找出高价值用户人群,及用户活跃、流失等情况,为平台指定策略提供数据分析支持和建议。
1.2、数据源介绍
本次分析数据来源CDNow网站的用户在1997年1月1日至1998年6月30日期间内购买CD交易明细。
二、数据处理
2.1 导入模块
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'] # 用来显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.style.use('seaborn-colorblind') # 更改设计风格,使用自带形式进行美化
# plt.style.use('ggplot')
2.2 导入数据
columns=["id","date","num","money"]
data=pd.read_table('CDNOW.txt',sep='\s+',names=columns)
data.head()
2.3 查看数据类型
data.info()
- 没有缺失值;购买日期是int类型的,需要转换成日期类型;其他数据类型正常。
2.4 更改数据类型
data['date']=pd.to_datetime(data['date'],format='%Y%m%d') # 字符串类型转时间类型
data['month']=data['date'].values.astype('datetime64[M]') # 添加月份字段,方便之后的数据分析
data.head()
2.5 描述性统计
data.describe()
- 观察数据发现: 订单金额和订单量的平均值皆大于中位数,数据整体分布呈右偏状态,说明绝大数据的用户消费金额相对较低。
三、数据分析
3.1 用户总体消费数据分析
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)
# 消费次数趋势图
plt.subplot(423)
data.groupby('month').id.count().plot(fontsize=15,marker='o')
plt.title('消费次数趋势图',fontsize=15)
# 消费人数趋势图
plt.subplot(424)
data.groupby('month').id.nunique().plot(fontsize=15,marker='o')
plt.title('消费人数趋势图')
# 用户每月平均消费金额
plt.subplot(425)
(data.groupby('month').money.sum()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('客单价趋势图')
# 件单价
plt.subplot(426)
(data.groupby('month').money.sum()/data.groupby('month').num.sum()).plot(fontsize=15,marker='o')
plt.title('件单价')
# 用户平均消费次数趋势图
plt.subplot(427)
(data.groupby('month').id.count()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('人均消费次数')
plt.subplot(428)
(data.groupby('month').num.sum()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('人均消费量')
plt.tight_layout(pad=2) #用于设置子图见的间距
- 观察数据发现:
前四个折线图:消费金额、销量、消费次数、用户数的整体趋势基本一致,都是1997年前三个月数据异常高,随后骤降,然后趋于平稳;为什么会出现这种异常现象呢?初步猜测要么是前三个月有异常值,要么就是受营销活动或者其他外部因素的影响,但这里没有更多的数据提供验证素材,所以也无法判断其原因。
用户平消费金额大概为50,前三个月低,后续在[47,5]波动;用户平均消费次数,也是前三个月低,后续上升,并维持在1.35次左右,商品复购率较低;
对于客单价和人均消费次数这两个数据趋势基本一致,相较于销售额等数据,前面三个月数据反而低,后续才慢慢上升,结合两种趋势图来看,在消费次数和金额稳定的情况下,用户复购下降或者用户数下降会导致总体销售额和销量的下降,关于这个问题的验证,稍后在复购率和留存率的分析中再探究。
3.2 用户个体消费数据分析
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('用户订单数量',fontsize=18)
plt.subplot(122)
group_userid[['money']].sort_values(by=['money'],ascending=True).reset_index()['money'].plot(fontsize=15)
plt.title('用户消费金额',fontsize=18)
3.2.2消费金额、订单量、消费次数分布
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('消费金额分布图')
axes0.set_xlabel('消费金额')
axes0.set_ylabel('订单人数')
# 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('订单人数')
# plt.subplot(133)
data.groupby('id').count()[['date']].query('date<20').plot.hist(bins=19,fontsize=15,ax=axes2)
axes2.set_title('消费次数分布图')
axes2.set_xlabel('消费次数')
axes2.set_ylabel('订单人数')
- 从上图可以看出,用户购买金额普遍偏低,消费频次也是普遍偏低,当然这也符合销售数据的一般规律。
3.2.3 用户累计订单量和用户累计消费金额
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('用户累计订单量占比')
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('用户累计消费金额占比')
plt.axhline(y=0.8,ls='--',lw=1,c='blue')
plt.axvline(x=data.id.nunique()*0.8,ls='--',lw=1,c='green')
- 20%的客户贡献了超过65%的销售额和销售量,符合二八趋势。
3.3 用户消费周期分析
3.3.1 用户购买周期分析
# 先把每个用户每次购买的时间间隔计算出来,这里用到的方法是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()
用户消费周期分布
plt.figure(figsize=(15,8))
purchase_period.dt.days.plot.hist(bins=40)
plt.title('用户消费周期分组',fontsize=18)
plt.xlabel('购买周期')
plt.ylabel('人数')
- 观察图表发现:仍然是长尾形态分布,大部分用户消费周期是很短的;不妨将用户找回点设置为消费后立即赠送优惠券,10天后回访用户体验,30天后提醒优惠券即将到期,60天后发送召回短信。
3.3.2用户生命周期分析
用户收购时间和用户最后一次消费时间
plt.figure(figsize=(15,5))
plt.subplot(121)
data.groupby('id').date.min().value_counts().plot()
plt.title('用户收购时间')
plt.subplot(122)
data.groupby('id').date.max().value_counts().plot()
plt.title('用户最后一次消费时间')
- 1997年4月之后不在有新增用户,而且大多数用户在前四个月就流失了,因此,也验证了此前提出的与首购的优惠有关的可能性。
仅消费一次用户占总用户的比例
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(["仅消费一次人数","多次消费人数"])
- 大约一半的用户仅仅消费了一次,很有必要对用户进行定期召回。
用户生命周期分布
# 用户生命周期计算:最后一次减第一次
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('天数')
plt.ylabel('人数')
plt.subplot(122)
life_cycle=life_cycle.reset_index()
life_cycle.query('date>0').date.plot.hist(bins=50) # 消费两次及以上的用户
plt.title('用户生命周期分布')
plt.xlabel('天数')
plt.ylabel('人数')
life_cycle[['date']].describe()
life_cycle[['date']].query('date>0').describe()
- 一般的用户生命周期为一天。
- 消费两次及以上的用户生命周期分布呈双峰结构,用户平均生命周期是 276 天,远高于总体的134天;在用户首次消费后引导其进行多次消费,可以有效提高用户生命周期。
3.4 用户分层分析
3.4.1用户价值分层(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":"重要价值客户",
'101':'重要发展客户',
"011":"重要维护客户",
'001':'重要挽留客户',
'001':'重要挽留客户',
'110':'一般价值客户',
'100':'一般发展客户',
'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('用户分层人数占比')
plt.subplot(132)
rfm_rate['sum'].plot.bar(fontsize=13)
plt.title('用户分层消费金额占比')
plt.subplot(133)
rfm_rate['avg'].plot.bar(fontsize=13)
plt.title('用户分层平均消费金额')
- 从上图可以看出,接近60%的用户属于一般发展客户,这一类客户占比较大,但是仅仅贡献消费金额的17%左右,平均消费金额仅仅0.25万美元,在各类客户当中属于最低水平;第二大用户群是重要维护客户,人数占比接近20%,贡献的销售额达到63%左右,平均消费金额达3.3万元,这一类客户价值极高,对于这一类客户应该做好重点维护,防止用户流失,从而为平台创造更大的收入。
3.4.2 用户活跃程度分层
#将用户消费数据进行数据透视:
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)):
#若本月没有消费
if x[i] ==0:
if i!=0:
if status[i-1]=='unreg':
status.append('unreg')
else :status.append('unactive')
else :status.append('unreg')
#若本月消费了
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('每月用户活动状态人数')
plt.ylabel('人数')
plt.figure(figsize=(8,5))
data3_status.apply(lambda x:x/x.sum(),axis=1).plot.area()
plt.title('每月用户活动状态')
plt.ylabel('用户人数占比')
3.4.3 每月回流用户占比
(data3_status['return']/data3_status['unactive'].shift(1)).plot(marker='o')
plt.title('每月回流用户占比')
plt.ylabel('用户占比')
- 四月份以后,用户回流率开始显著下降,并且稍有波动。
3.5 复购率、回购率、留存率
复购率:在一个时间窗口里,多次购买的客户数量占总客户的比例
回购率:本时间窗口内购买的客户中,下个时间窗口继续购买的客户比例
3.5.1 复购率
#每个用户在每月的订单数
pivoted_data=data.pivot_table(index='id',
columns='month',
values='date',
aggfunc='count').fillna(0)
# 消费两次及以上为 1 ,消费1次为 0 ,没有消费为空
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=['日期','复购率']
plt.figure(figsize=(15,5))
plt.plot(repurchase_rate.日期,repurchase_rate.复购率)
plt.title('复购率',fontsize=18)
- 复购率稳定在 20% 左右,前三个月因为有大量新用户涌入,而这批用户只购买了一次,所以导致复购率降低
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月份起回购率稳定在30%左右。
从每月有回购消费的用户数数据可以看出,回购用户数整体有下降趋势。对回购率的分析,再次说明了对于新用户,在其第一次消费后的三个月内是一段重要的时期,需要营销策略积极引导其再次消费及持续消费。
另外,对于有持续消费的老客,也要适时推出反馈老客户的优惠活动,以加强老客的忠诚度。
只有2.5%的用户在第一次消费的次日至3天内有过消费,3%的用户在3~7天内有过消费。数字并不好看,CD购买确实不是高频消费行为。有20%的用户在第一次消费后的三个月到半年之间有过购买,27%的用户在半年后至1年内有过购买。从运营角度看,CD机营销在服务新用户的同时,应该注重用户忠诚度的培养,放长线掉大鱼,在一定时间内召回用户购买。
四、总结
- 用户总体消费趋势(每月)方面,前3个月有大量新用户涌入,消费金额、消费订单数、产品购买量均达到高峰,后续每月较为稳定。前3个月消费次数都在10000笔左右,后续月份的平均2500;前3个月产品购买量达到20000甚至以上,后续月份平均7000;前3个月消费人数在8000-10000之间,后续月份平均2000不到。
用户个体消费方面,小部分用户购买了大量的CD,拉高了平均消费金额。用户消费金额集中在0100元,有大约17000名用户。用户购买量集中在05,有大约16000名用户。50%的用户仅贡献了15%的消费额度,15%的用户贡献了60%的消费额度。大致符合二八法则。 - 用户个体消费行为方面,首购和最后一次购买的时间,集中在前三个月,说明很多用户购买了一次后就不再进行购买。而且最后一次购买的用户数量也在随时间递增,消费呈现流失上升的状况。
从整体消费记录来看,有一半的用户,只消费了一次。从每月新用户占比来看,1997年1月新用户占比高达90%以上,后续有所下降,1997年4月到1998年6月维持在81%左右,1998年6月以后无新用户。
从RFM模型来看,在8种客户中,重要保持客户的消费频次和消费金额最高,人数排在第二位;而一般发展客户消费频次和消费金额排第二位,人数却是最多。 - 用户生命周期方面,由于只购买一次的用户(生命周期为0天)占了接近一半,排除这部分用户的影响之后,用户平均生命周期276天,中位数302天。
- 从用户分层情况来看,新用户从第4月份以后没有新增;活跃用户有所下降;回流用户数量趋于稳定,每月1000多。流失/不活跃用户,数量非常多,基本上每月都在20000以上。
用户购买周期方面,平均购买周期是68天,最小值0天,最大值533天。绝大部分用户的购买周期都低于100天。 - 复购率和回购率方面,复购率稳定在20%左右,回购率稳定在30%左右,前3个月因为有大量新用户涌入,而这批用户只购买了一次,所以导致复购率和回购率都比较低。