为了检验自己前段时间学习的成果,同时也想通过一个实例来记录学习历程。这是本人第一篇数据分析实战项目,使用excel、MySQL和tableau对CDNow网站用户消费行为进行分析,也欢迎大家提出建议,相互交流探讨学习,实现共同进步。
这次数据分析所用到的数据来源于CDNOW,数据包含了四个方面的数据信息,分别是用户ID、购买日期、订单数和订单金额。
通过可以python可以看到数据集包含了69659行数据,共4个方面的数据信息,没有缺失值。其中购买日期不是规范的日期类型数据,通过excel函数=- -TEXT(B2,“0000-00-00”)转换为文本类型,再转换为短日期类型,同时给数据集增加一列序号信息。
分析:
订单数角度:用户总消费次数是69659次,平均每次消费产生2.41个订单,中位数为2,最大订单数是99次,平均订单数略大于中位数,说明存在一小部分用户一次消费的订单数较多。
订单金额角度:用户每次消费的平均订单金额为35.89元,中位数为25.98,单次购买的最大订单金额为1286.01元,说明存在一小部分用户一次消费的订单金额较大。
分析:
通过月消费次数、月消费金额、月销售量和月消费人数的折线图可以看出,月消费次数、月消费金额、月销量最高均在1997年3月,分别是11598次、393155元和26159单,月消费人数的最高是在1997年2月,达到9524人。
随着时间的改变,这4个指标折线图整体趋势基本一致。前3个月,这4个指标的值均较高,均呈现快速上升至峰值,从第4个月开始骤降至基本平稳,稍微有下降的趋势。
由于数据集中的维度不足,只能推断出现这样分布可能是因为1997年1~3月该网站推出了优惠活动,或者推出某一款或几款当时消费者所期待的新音乐,导致消费次数、消费金额、销售量、消费人数激增的原因。
分析:
从月消费人数折线图中还可以发现,2月消费人数是最多的,3月开始略微下降而消费次数、消费金额、销售量在3月确是达到了峰值,可以推断消费者中存在高价值客户。
用户月人均订单数和月人均消费金额趋势基本一致。
前3个月人均订单数不足3单,从1997年4月开始,人均订单数趋于稳定,在3单和4单之间波动。前3个月人均消费金额相对较低,到3月才略微超过40元,4月份以后开始稳定在45元~60元。
虽然1997年1~3月消费人数较多,总消费金额高,但通过箱线图可以发现,由于这些消费者当中大部分消费的金额不高,订单数也不多,拉低了整体的人均订单数和人均消费金额。
随着4月份开始,这部分低低消费金额、少订单的用户群体减少,并且有小部分高价值用户的出现,月人均消费金额和月人均订单数相对前三个月有一定提高,并且稳定在[45,60]的区间内。
通过散点图可以发现,用户消费金额和订单数成线性关系。
分析:
由于消费金额和消费订单数均存在个别极值,使得图形分布受到了干扰,因此对左边两个分布图的数据进行处理,分别截取了消费金额800元以内和消费订单数100单以内的数据。经过处理后可以看出,消费金额集中在40元以内,消费订单数集中在3单以内,说明大部分的用户的消费能力一般,高消费用户较少,由于网站主营的是cd产品,相对较为单一,这一情况也是满足cd消费市场的规律。通过辅助线可以看出,32.8%的用户占据了80%的的订单数,且32.65%用户所消费的总金额占80%。
这数据说明了这32.65%的用户是网站重点关注的对象,只需要重点维护好这批用户,业绩KPI就能完成80%。
分析:
由上图可以发现,由于很大一部分用户消费周期为0,即只是一次消费,从图中难看出规律。排除只消费一次的数据后得到下图,可以发现分布图呈双峰分布,第一个高峰是20天内,第二个高峰是450天左右,针对这个现象,网站可以在20天内对用户进行引导,促使再次消费;在到30~400天内,可以通过定期短信通知、网络宣传、电话回访的方式,并且可以针对这些用户推出一些营销活动,引导其持续消费。
用户平均生命周期为134.9天,筛选点生命周期为0的数据后,用户平均生命周期是276天,将近是未筛选前的2倍,积极引导生命周期为0的用户,对提高平均生命周期尤为重要。
使用RFM模型对用户进行分层。
R:距离最近一次消费的时间差,数值越小越好。
F:消费次数,数值越大越好。
M:累计消费金额,数值越大越好。
分析:
按照这3个指标的组合,将用户分为8个等级,分别为
重要价值用户、潜力用户、重点深耕用户、一般发展用户、重点唤回用户、一般维持用户、重点挽回用户和流失用户。有57.73%用户为流失用户,占据了主要部分,其次是重要价值用户,有19.59%。
(1)由于本数据集中没有包含用户注册时间的数据集,且没有1997年之前的数据,因此,定义1997年开始第一次购买的用户为新用户。
分析:
结合用户第一次消费和最后一次消费时间分布图发现,新用户集中在前3个月,后面一直都没有新增用户。大部分最后一次消费的用户集中在前3个月,说明忠诚用户的数量较少。从4月份开始,随着时间的递增,最后一次消费的用户数呈略微上升的趋势。
(2)针对每个用户的消费情况,将每个用户的消费状况按月进行划分:
注册未消费用户:注册id,但一直没有消费的用户;
新用户:第一次消费的用户;
活跃用户:上个月有消费,这个月也有消费的用户;
回流用户:上个无消费,这个月有消费的用户;
不活跃用户:上个月有消费,这个月无消费的用户。
通过MySQL生成user_status表(用户状态表):
select a.* ,
(case
when a.s_id!=@k and a.s_amount!=0 then '新用户'
when a.s_id!=@k and a.s_amount=0 then '注册未消费用户'
when
((extract(month from a.s_date)-extract(month from @s_date)=1 and extract(year from a.s_date)=extract(year from @s_date))
or (extract(month from a.s_date)-extract(month from @s_date)=-11 and extract(year from a.s_date)!=extract(year from @s_date)))
and a.s_id=@k
then '活跃用户' else '回流用户'
end) s_status,
@s_date:=s_date,@k:=a.s_id from s_table1 a,(select @ra:=0,@last_id='',@k:=0) b
group by a.s_id,extract(year from a.s_date),extract(month from a.s_date);
-- 查询需要的维度
select s_id,s_date,s_num,s_amount,s_status from user_group;
通过excel中的数据透析表,转换为下图:
1月份有数据的替换成“新用户”,空单元格替换成“未注册用户”。
复制一份上表,通过下面的公式,将剩余的数据替换。
=IF(AND(VLOOKUP( A 2 , ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! A2,'用户消费情况(参照表)'! A2,′用户消费情况(参照表)′!A 1 : 1: 1:S 23571 , M A T C H ( ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! C 2 , ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! 23571,MATCH('用户消费情况(参照表)'!C2,'用户消费情况(参照表)'! 23571,MATCH(′用户消费情况(参照表)′!C2,′用户消费情况(参照表)′!A2: T 2 , 0 ) , 0 ) > 0 , B 2 = " 未 注 册 用 户 " ) , " 新 用 户 " , I F ( A N D ( V L O O K U P ( T2,0),0)>0,B2="未注册用户"),"新用户",IF(AND(VLOOKUP( T2,0),0)>0,B2="未注册用户"),"新用户",IF(AND(VLOOKUP(A2,‘用户消费情况(参照表)’!$A 1 : 1: 1:S 23571 , M A T C H ( ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! C 2 , ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! 23571,MATCH('用户消费情况(参照表)'!C2,'用户消费情况(参照表)'! 23571,MATCH(′用户消费情况(参照表)′!C2,′用户消费情况(参照表)′!A2: T 2 , 0 ) , 0 ) = 0 , B 2 = " 未 注 册 用 户 " ) , " 未 注 册 用 户 " , I F ( A N D ( V L O O K U P ( T2,0),0)=0,B2="未注册用户"),"未注册用户",IF(AND(VLOOKUP( T2,0),0)=0,B2="未注册用户"),"未注册用户",IF(AND(VLOOKUP(A2,‘用户消费情况(参照表)’!$A 1 : 1: 1:S 23571 , M A T C H ( ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! C 2 , ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! 23571,MATCH('用户消费情况(参照表)'!C2,'用户消费情况(参照表)'! 23571,MATCH(′用户消费情况(参照表)′!C2,′用户消费情况(参照表)′!A2: T 2 , 0 ) , 0 ) > 0 , O R ( B 2 = " 活 跃 用 户 " , B 2 = " 新 用 户 " ) ) , " 活 跃 用 户 " , I F ( A N D ( V L O O K U P ( T2,0),0)>0,OR(B2="活跃用户",B2="新用户")),"活跃用户",IF(AND(VLOOKUP( T2,0),0)>0,OR(B2="活跃用户",B2="新用户")),"活跃用户",IF(AND(VLOOKUP(A2,‘用户消费情况(参照表)’!$A 1 : 1: 1:S 23571 , M A T C H ( ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! C 2 , ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! 23571,MATCH('用户消费情况(参照表)'!C2,'用户消费情况(参照表)'! 23571,MATCH(′用户消费情况(参照表)′!C2,′用户消费情况(参照表)′!A2: T 2 , 0 ) , 0 ) > 0 , B 2 = " 不 活 跃 用 户 " ) , " 回 流 用 户 " , I F ( V L O O K U P ( T2,0),0)>0,B2="不活跃用户"),"回流用户",IF(VLOOKUP( T2,0),0)>0,B2="不活跃用户"),"回流用户",IF(VLOOKUP(A2,‘用户消费情况(参照表)’!$A 1 : 1: 1:S 23571 , M A T C H ( ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! C 2 , ′ 用 户 消 费 情 况 ( 参 照 表 ) ′ ! 23571,MATCH('用户消费情况(参照表)'!C2,'用户消费情况(参照表)'! 23571,MATCH(′用户消费情况(参照表)′!C2,′用户消费情况(参照表)′!A2:$T2,0),0)=0,“不活跃用户”,“活跃用户”)))))
最后得到完整的用户状态交叉表。
使用COUNTIF将交叉表转换成下图形式。
=COUNTIF(‘用户消费情况(交叉表)’!B$2:B 23571 , 23571, 23571,A2)
通过PQ转换成下面两张图的形式。
分析:
从绘制的面积图可以发现,前3个月用户人数激增,新增用户数量占比较大,活跃用户从第2个月开始上升,由于4月份开始没有了新客户,活跃用户和回流用户相加的人数总和就是消费人数。可以发现,后期的消费人数中,活跃用户占消费用户的35.3%,回流人数占消费用户的64.7%。
结合每个月活跃用户和回流用户占比图可以发现,从第4个月开始,活跃用户急剧下降,到6月份之后在3%~4%之间波动。
回流用户则在6月份达到了峰值,并在之后的月份波动于4%~7%之间。
这两个指标在后期均带有下降的趋势,说明用户有流失的倾向。
针对后期的流失倾向,网站可以针对这部分用户,制定对应的会员机制,引导这部分用户做到持续消费。
通过MySQL,将仅消费一次和多次的用户划分出来,生成times表(次数划分表)。
select a.* from
(select s_id,sum(s_num),'一次' s_time from buy group by s_id having sum(s_num)=1
union
select s_id,sum(s_num),'多次' s_time from buy group by s_id having sum(s_num)>1) a
order by s_id ;
-- 分组排名
-- 创建新的表格
create table re_buy as
select @K:=@k+1 o_id,a.*,
case when a.s_id=@last_id then @ra:=@ra+1 else @ra:=1 end ra,
@last_id:=a.s_id
from buy a,(select @ra:=0,@last_id='',@k:=0) b
group by o_id;
select * from re_buy;
-- 查询满足回购的用户
-- 保存到新表格
create table rec_buy as
select a.*,
(case when extract(month from a.s_date)-extract(month from @s_date)=1 or extract(month from a.s_date)-extract(month from @s_date)=-11
and a.s_id=@k then 1 else 0 end) yes,
@s_date:=s_date,@k:=a.s_id
from re_buy a,(select @s_date:='2020-01-05',@k:=0) T
group by a.o_id;
-- 查询需要的维度
select s_id,s_date,s_num,s_amount,yes from rec_buy;
通过tableau导入最后两张表格,制作下图。
分析:
在收集到的数据中,仅消费一次的用户人数占了所有用户人数中的51.14%。这也反应的大部分用户粘度较低。后续需要加强用户的引导,提高用户的粘度,为发展更多高价值用户做好基础。
复购率:前期因为大批新用户消费,且仅一次消费的用户较多,导致前期复购较低,后期复购率稳定在20%左右。
回购率:回购率高于复购率,后期稳定在30%上下波动,波动幅度相对于复购率大。结合用消费人数分布表可以发现,3个月之后的消费人数趋于稳到,回购率出现波动的原因有可能是与营销淡旺季或者CD发布者的发布周期相关,若有CD类别、发布时间等相关的维度,可以进一步探索,以此可以针对性地推出营销活动,提高用户的回购率。
留存率:因为计算的是留存率,用户仅消费了一次或者用户第一天内消费了多次,但是往后没有消费,留存率均为0,故筛选点这部分数据。从柱状图可以发现,2.46%的用户在首次购买后,会在1到3天内再次消费,3.22%的用户会在首次购买后3天到一周时间内再次购买。随着时间范围加大,人数逐渐增多,11.88%的用户在首次购买后,会在一个月到两个月内再次消费,而在半年到一年之间再次消费的用户达到了23.83%。从图中可以发现,CD营销确实不是高频次消费行为,若要使利益最大化,新用户的补充和忠诚用户的重点培养是关键。
1、网站的新用户集中在前3个月,且大部分最后一次消费集中在前3个月,表明忠诚用户数量较低。随着时间出现大量用户流失,4月份后消费的用户均为老用户,且存在高价值用户。
2、大部分的用户的消费能力一般,高消费用户较少,由于网站主营的是cd产品,相对较为单一,建议网站可以发展多业务,增加产品种类,吸引更多用户进行二次消费。
3、2.8%的用户占据了80%的的订单数,且32.65%用户所消费的总金额占80%。这数据说明了这32.65%的用户是网站重点关注的对象,只需要重点维护好这批用户,业绩KPI就能完成80%。
4、从第4个月开始,活跃用户急剧下降,到6月份之后在3%~4%之间波动。
回流用户则在6月份达到了峰值,并在之后的月份波动于4%~7%之间,且有流失的趋势。建议网站可以针对这部分老用户,制定对应的会员机制,引导这部分用户做到持续消费。
5、仅一次消费的用户较多,而且复购率、回购率均不高,反应了大部分用户粘度较低,建议推出优惠活动或者定期发送短信等,提高用户粘度。