系列文章目录
第二章 淘宝用户生命周期分析
文章目录
一、项目背景
随着互联网行业快速发展,其中电商已成为消费的主要趋势,并且电商板块收入已经成为企业新的主要增长点。近几年,我国的电商发展快速,电商市场越来越趋于成熟,竞争加剧,用户有了更多的选择,导致用户对于商品和服务的质量的要求也越来越高。因此需要企业更高的运营能力,在各个方面都需要做到精细化运营,这样才能更好的不被市场和用户所淘汰,因此越来越多的电商企业开始关注数据的价值,日常业务产生的海量数据蕴含着巨大的价值,如何在现在竞争激烈的环境中生存下来,其中最重要的一个因素就是数据化运营。
二、项目目的
基于淘宝用户行为数据进行数据分析,探索用户行为规律,帮助用户快速找到商品,提高用户忠诚度,为商家寻找高价值客户,为商家的精准营销与精细化运营提供数据支撑,从而帮助商家实现营收增长。
三、理解数据
数据来源:来自阿里云天池,共有1225万条左右数据,数据为淘宝APP2014年11月18日至2014年12月18日的用户行为数据,共计6列字段。
天池数据集
user_id: 用户id
item_id: 商品id
behavior_type: 用户行为类型(1:点击;2:收藏;3:加入购物车;4:支付)
user_geoshash: 地理位置
item_category: 用户行为发生的时间
二、分析思路
三、用户生命周期分析
1、 用户活跃规律
(1)不同日期的网页浏览量和访问量情况
代码
# 每天UV和PV的变化
# 浏览量不用去重,直接分组计算
pv_daily = tbdata['user_id'].groupby(tbdata['date']).count().rename('pv').reset_index()
# 访客数,先分组,去重,最后统计count
uv_daily = tbdata['user_id'].groupby(tbdata['date']).apply(lambda x:x.drop_duplicates().count()).rename('uv').reset_index()
# 日期变换
date = pv_daily.date.astype('str').to_list()
可视化
from pyecharts.charts import *
import pyecharts.options as opts
import numpy as np
pv = (
Line(init_opts=opts.InitOpts(width="1000px",height="500px")) #设置画布大小
.add_xaxis(date)
.add_yaxis(
"页面访问量(PV)",
#PV数据,用np的方法,转为十万,取小数点2位
np.round(pv_daily.pv/10000,decimals=2)
)
.add_yaxis(
"页面访客数(UV)",
yaxis_index=1,
#UV数据,用np的方法,转为,取小数点2位
y_axis=np.round(uv_daily.uv/1,decimals=2)
)
.extend_axis( #添加新的Y轴
yaxis=opts.AxisOpts(
name="uv",
type_="value",
min_=0,
max_=10000,
interval=2000, #最小值,最大值,步长
axislabel_opts=opts.LabelOpts(formatter="{value} 人"),
)
)
# 全局
.set_global_opts(
tooltip_opts=opts.TooltipOpts(#打开提示框
is_show=True, # 是否显示提示框组件,包括提示框浮层和 axisPointer。
trigger="axis", # 触发类型,坐标轴
axis_pointer_type="cross" #指示器类型,十字
),
xaxis_opts=opts.AxisOpts(
type_="category",#纵轴区间阴影
axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),
),
yaxis_opts=opts.AxisOpts( #调整主Y轴的名称 最小值,最大值,步长
name="pv",
type_="value",
min_=0,
max_=40,
interval=10,
axislabel_opts=opts.LabelOpts(formatter="{value} 万次"),
axistick_opts=opts.AxisTickOpts(is_show=True), #显坐标轴刻度
splitline_opts=opts.SplitLineOpts(is_show=True), #显分割线
),
title_opts=opts.TitleOpts(title="日期维度下的PV和UV",pos_left='center'),#标题设置
legend_opts=opts.LegendOpts(is_show=True,pos_top='95%') #显示图例
)
.set_series_opts(
# 为了不影响标记点,这里把标签关掉
label_opts=opts.LabelOpts(is_show=False), #不显示标签数字
markpoint_opts=opts.MarkPointOpts( #显示最大值和最小值
data=[
opts.MarkPointItem(type_="max", name="x轴最大", value_index=1),
opts.MarkPointItem(type_="min", name="x轴最大", value_index=1),
])
)
)
pv.render_notebook()```
## 2.读入数据
代码如下(示例):
```c
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
(2)分析
从图中可以看出,pv和uv数据成正相关关系。双十二当天浏览量和访问量急剧上升,均达到最高值,这是因为当天双十二活动,推测为大量优惠活动推广拉新活动带来的影响,吸引了大量用户的访问点击,也证明了这次活动的效果很好。
(3)不同日期的网页浏览量和访问量情况
# 24小时pv的变化
pv_moment = tbdata.groupby('hour')['user_id'].count().rename('pv').reset_index()
# 24小时uv的变化
uv_moment = tbdata.groupby('hour')['user_id'].apply(lambda x:x.drop_duplicates().count()).rename('uv').reset_index()
# 日期变换
attr = pv_moment.hour.astype('str').to_list() #日期列表
可视化
from pyecharts.charts import *
import pyecharts.options as opts
import numpy as np
pv = (
Line(init_opts=opts.InitOpts(width="1000px",height="500px")) #设置画布大小
.add_xaxis(xaxis_data=attr)
.add_yaxis(
"页面访问量(PV)",
np.around(pv_moment.pv/10000,decimals=2), #PV数据,用np的方法,转为十万,取小数点2位
)
.add_yaxis(
series_name="页面访客数(UV)",
yaxis_index=1,
y_axis=uv_moment['uv'].to_list(),
)
.extend_axis( #添加新的Y轴
yaxis=opts.AxisOpts(
name="uv",
type_="value",
min_=0,
max_=10000,
interval=2000, #最小值,最大值,步长
axislabel_opts=opts.LabelOpts(formatter="{value} 人"),
)
)
# 全局
.set_global_opts(
tooltip_opts=opts.TooltipOpts(#打开提示框
is_show=True, # 是否显示提示框组件,包括提示框浮层和 axisPointer。
trigger="axis", # 触发类型,坐标轴
axis_pointer_type="cross" #指示器类型,十字
),
xaxis_opts=opts.AxisOpts(
type_="category",#纵轴区间阴影
axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),
),
yaxis_opts=opts.AxisOpts( #调整主Y轴的名称 最小值,最大值,步长
name="pv",
type_="value",
min_=0,
max_=100,
interval=20,
axislabel_opts=opts.LabelOpts(formatter="{value} 万人"),
axistick_opts=opts.AxisTickOpts(is_show=True), #显坐标轴刻度
splitline_opts=opts.SplitLineOpts(is_show=True), #显分割线
),
title_opts=opts.TitleOpts(title="时刻维度下的PV和UV",pos_left='center'),#标题设置
legend_opts=opts.LegendOpts(is_show=True,pos_top='95%') #显示图例
)
.set_series_opts(
# 为了不影响标记点,这里把标签关掉
label_opts=opts.LabelOpts(is_show=False), #不显示标签数字
markpoint_opts=opts.MarkPointOpts( #显示最大值和最小值
data=[
opts.MarkPointItem(type_="max", name="x轴最大", value_index=1),
opts.MarkPointItem(type_="min", name="x轴最大", value_index=1),
])
)
)
pv.render_notebook()
(4)分析
由图可以看出,发现每天用户活跃的高峰时间段在晚上21点和22点,这可能是因为上班族这时候也差不多下班结束工作,学生也结束了学习选择娱乐放松的休闲时刻;低峰时间段是在凌晨4点,该时间段人大都处于睡眠休息中。
建议:可以考虑在晚上8点增大商品推广力度,加大营销投入,可取的较好的收益,1点到5点之间适合做系统维护。
2、用户留存规律
(1)跳失率
跳失率 = 只有过1次pv的用户数量/总用户数
gourpby_userid = tbdata.groupby(tbdata['user_id'])
user_type = gourpby_userid.behavior_type.value_counts().unstack()
# print("分组情况",user_type.head(10))
# 跳失率:计算只浏览过一次界面的用户数量
only_pv_users = user_type[user_type[1]==1].shape[0]
bounce_rate = only_pv_users/to_uv
(2)分析
这个周期内的跳失率为0.0009,在一定程度上反应了商品的受欢迎程度高,说明店铺的商品详情页能吸引到用户进行下一步行为。
(3)留存率
由于数据不完整,假设将第一天(2014.12.18)登录的用户作为新用户,对其分析次日留存率、三日留存率、七日留存率。
# 次日新用户人数
ciri = df_date[df_date['date_diff']=='1 days'].drop_duplicates('user_id').shape[0]
# 三日新用户人数
sanri = df_date[df_date['date_diff']=='2 days'].drop_duplicates('user_id').shape[0]
# 七日新用户人数
qiri = df_date[df_date['date_diff']=='6 days'].drop_duplicates('user_id').shape[0]
print('次日留存率:{}'.format(round(ciri/diyi*100,2)))
print('三日留存率:{}'.format(round(sanri/diyi*100,2)))
print('七日留存率:{}'.format(round(qiri/diyi*100,2)))
结果:
(4)分析
用户的留存率较高,并保持相对稳定,由于无法获得第一天新用户人数,故数据的准确含义不能确定,但也从侧面说明淘宝平台是一个较成熟的平台。
3、用户购买情况
(1)复购率
复购率 = 购买2次及以上用户数/总购买用户数
gourpby_userid = tbdata.groupby(tbdata['user_id'])
user_type = gourpby_userid.behavior_type.value_counts().unstack()
# 复购率:计算支付行为>=2的用户数量 / 总购买数
user_bought_twice = user_type[user_type[4]>=2].shape[0]
# print("计算支付行为>=2的用户数量:",user_bought_twice)
user_bought = user_type[user_type[4]>0].shape[0]
repurchase = user_bought_twice/user_bought
可视化
(3)分析
平台整体复购率较高,淘宝用户的忠诚度以及淘宝对用户的粘性高。
(4)购买频次分析
# 这个id共发生了多少次支付行为(behavior_type==4),count对
a = tbdata['behavior_type'][tbdata['behavior_type']==4].groupby(tbdata['user_id']).count().rename('pay_count').reset_index()
# print("每个id发生的支付行为情况",'\n',a)
# 对支付行为的次数进行计数\分类,10次|20次|30次
b = a['user_id'].groupby(a['pay_count']).count().rename('user_count').reset_index()
print("每种支付次数对应多少个用户",'\n',b)
# 添加一列:支付次数分层,[1,10):10 ; [10,20):20 ; ...
b['fenceng'] = b['pay_count'].apply(lambda x:(int(x/10)+1)*10)
# 算算每层有多少用户,count数条数,sum求和:将user_count加和
data_user_buy = b['user_count'].groupby(b['fenceng']).sum().rename('num').reset_index()
data_user_buy
可视化
from pyecharts.charts import *
import pyecharts.options as opts
bar = (Bar()
.add_xaxis(data_user_buy.fenceng[0:15].tolist())
.add_yaxis('人数', data_user_buy.num[0:15].tolist(), yaxis_index=0)
.set_global_opts(
tooltip_opts=opts.TooltipOpts(
is_show=True,trigger="axis",axis_pointer_type="cross"
),
xaxis_opts=opts.AxisOpts(
name="频次",
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),
),
yaxis_opts=opts.AxisOpts(
name="人数",
axislabel_opts=opts.LabelOpts(formatter="{value}人"),
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
title_opts=opts.TitleOpts(title="用户购买次数情况分析",pos_left='center'),
legend_opts=opts.LegendOpts(is_show=False)
)
)
bar.render_notebook()
(5)分析
由图可见,58.05%的用户购买10次以内,10-20-30次之间的流失较多,下降幅度较大,10-20次用户流失了57.44%,20-30次用户流失了62.93%。
建议:针对较少成交的买家要多次触达,养成消费习惯,增加推广,完善购物体验,提高用户消费频次。30次以上,较高几率会成为高度忠实用户,应提高其满意度,增大留存率。
(6)复购特征分析
代码
# 多重行索引分组聚合,先按user_id分组,然后按date分组,最后统计各组内支付行为的次数
buy_again_days1 = tbdata[tbdata['behavior_type']==4].groupby(['user_id','date']).count().reset_index()
# 加一列,实现date数据列的格式转换:str-> datetime
buy_again_days1['date_time'] = pd.to_datetime(buy_again_days1['date'])
# 对date_time 里的每个用户下面的所有交易时间进行升序排序,然后做差分,删除空值
buy_again_days2 = buy_again_days1.groupby('user_id')['date_time'].apply(lambda x:x.sort_values().diff(1).dropna())
# 将时间数据转换成int型,然后统计数量
buy_again_days = buy_again_days2.map(lambda x:x.days).value_counts().reset_index()
可视化
line = (Line()
.add_xaxis([i for i in range(1,31)])
.add_yaxis('',buy_again_days.date_time.tolist())
.set_global_opts(
tooltip_opts=opts.TooltipOpts(
is_show=True,trigger="axis",axis_pointer_type="cross"
),
xaxis_opts=opts.AxisOpts(
name="天数",
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),
),
yaxis_opts=opts.AxisOpts(
name="人数",
type_="value",
min_=0,
max_=15000,
interval=3000,
axislabel_opts=opts.LabelOpts(formatter="{value}人"),
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
title_opts=opts.TitleOpts(title="用户复购间隔时间及消费次数分布",pos_left='center'),
legend_opts=opts.LegendOpts(is_show=True,pos_top='95%')
)
)
line.render_notebook()
(7)分析
从上图可知,用户复购时间间隔主要在2天,大部分买家会在购买后的2天内在重新购买。推测可能商店本身性质,及相关优惠活动对用户的吸引力较大,用户在短时间发生复购。
总结
以上是对用户生命周期的分析。从用户活跃规律、用户留存规律、用户购买情况入手,分析用户频繁浏览、访问的时间,发现规律,找到增加访问量、点击量的活动投入时间点;分析用户留存规律,及时采取新的活动策略,预防流失;分析用户购买情况,了解用户购买规律,知道用户的购买习惯,利于我们活动商品的推荐。