数据分析实战之淘宝用户购物行为数据可视化分析
数据信息
数据来源:https://tianchi.aliyun.com/dataset/145889
分析步骤
导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme()
sns.set_context('notebook')
数据获取
加载数据
data_user = pd.read_csv('downloads/145889/user_action.csv')
data_user.head(20)

数据中有5个维度的字段,其分别表示用户id、商品id、用户行为类型、商品类别以及时间信息。充分理解这些字段的含义是数据分析的基础,这里我们列出这些字段的主要信息

查看整体数据规模,包括用户数、商品数等:
print('整体数据的大小为',len(data_user))
print('数据集中用户数量是:',len(set(data_user['user_id'])))
print('数据集中商品数量是:',len(set(data_user['item_id'])))
print('数据集中商品类别数量是:',len(set(data_user['item_category'])))
由此可知本次分析的数据集包含了10000个用户在1个月内的的1200多万条购物行为数据,商品总数量超过287万,分布在8916个类目中。
数据处理
数据分析前要完成数据的清洗,包括脏数据、空数据和缺失值的处理等
data_user.isnull().sum()
user_id 0
item_id 0
behavior_type 0
item_category 0
time 0
dtype: int64
分割天(date)和小时(hour)
data_user['date'] = data_user['time'].map(lambda x:x.split(' ')[0])
data_user['hour'] = data_user['time'].map(lambda x:x.split(' ')[1])
data_user.head()

查看数据类型,并将必要的类型进行转化
data_user.dtypes
data_user['user_id'] = data_user['user_id'].astype('object')
data_user['item_id'] = data_user['item_id'].astype('object')
data_user['item_category'] = data_user['item_category'].astype('object')
data_user['date'] = pd.to_datetime(data_user['date'])
data_user['hour'] = data_user['hour'].astype('int64')
data_user.dtypes
数据分析&可视化
流量分析
先从宏观的流量分析入手,主要关注访问量(PV)与独立访问量(UV):
-
访问量(PV):全名为Page View, 基于用户每次对淘宝页面的刷新次数,用户每刷新一次页面或者打开新的页面就记录就算一次访问。
-
独立访问量(UV):全名为Unique
Visitor,一个用户若多次访问淘宝只记录一次,熟悉SQL的小伙伴会知道,本质上是unique操作。
1、基于天级的访问流量分析
# 计算PV: PageView , UV: UniqueView
# PV: select count(user_id) from data_user group by "date";
# UV: select count(distinct(user_id)) from data_user group by "date";
pv_daily = data_user.groupby('date')['user_id'].count()
# pv_daily.head()
pv_daily = pv_daily.reset_index()
pv_daily = pv_daily.rename(columns={'user_id':'pv_daily'})
pv_daily
# 计算UV
uv_daily = data_user.groupby('date')['user_id'].apply(lambda x: len(x.unique()))
uv_daily = uv_daily.reset_index()
uv_daily = uv_daily.rename(columns = {'user_id':'uv_daily'})
uv_daily
基于天级的PV和UV数据,如果直接查看上述结果,会比较耗时且不太直观,我们来看看可视化结果:
fig,axes = plt.subplots(2,1,sharex=True)
pv_daily.plot(x='date', y='pv_daily', ax=axes[0], colormap='cividis')
axes[0].set_title('pv_daily')
uv_daily.plot(x='date', y='uv_daily', ax=axes[1], colormap='RdGy')
axes[1].set_title('uv_daily')

可以看出,不管是PV还是UV趋势,均在12号的时候出现了一个尖峰,这正是著名的双十二大促节的用户集中消费导致的变化。 通过简单的数据分析和可视化工具,这是我们从数据中观察到了第一个结论。
2. 基于小时级别访问流量分析
上面的对不同访问量进行分析,其分析的时间跨度是每天。另外从我们的直觉可以知道,用户在一天当中对淘宝的使用也是有一定规律的。为了探索这个规律,我们将按照每小时统计用户的访问量和独立访问量。
pv_hour = data_user.groupby('hour')['user_id'].count()
pv_hour = pv_hour.reset_index()
pv_hour = pv_hour.rename(columns={'user_id':'pv_hour'})
pv_hour
uv_hour = data_user.groupby('hour')['user_id'].apply(lambda x:len(x.unique()))
uv_hour = uv_hour.reset_index()
uv_hour = uv_hour.rename(columns={'user_id':'uv_hour'})
uv_hour
fig, axes = plt.subplots(2,1,sharex=True)
pv_hour.plot(x='hour',y='pv_hour',ax=axes[0],colormap='cividis')
uv_hour.plot(x='hour', y='uv_hour', ax=axes[1],colormap='RdGy')
axes[0].set_title('pv_hour')
axes[1].set_title('uv_hour')

可以看出,PV的高峰值出现在20点之后,可能的原因是淘宝的主力消费人群是工薪阶层,这部分群体在下班后开始使用淘宝浏览购物;UV的值比较恒定,上午10点之后便没有出现大的波动,一个可能的原因是用户早晨也会刷一下淘宝,比如看看物流状态,UV值在一天之内就不会再有大的变化波动了。 另外也可以看出,凌晨2点之后,PV/UV的趋势一致,均是一天中流量最小的时间段。
从“日PV/UV”趋势看,双十二当天的总体流量会出现明显的峰值。那么双十二当天基于小时的用户访问数据会有变化吗?
#截取双12当天数据
data_user_1212 = data_user.loc[data_user['date']=='2014-12-12']
查看双12当天小时级的流量并对比全部数据小时级流量
pv_hour_1212 = data_user_1212.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'1212_pv_hour'})
uv_hour_1212 = data_user_1212.groupby('hour')['user_id'].apply(lambda x: len(x.unique())).reset_index().rename(columns={'user_id':'1212_uv_hour'})
fig, axes = plt.subplots(2,1,sharex=True)
pv_hour.plot(x='hour',y='pv_hour',ax=axes[0],colormap='cividis')
pv_hour_1212.plot(x='hour', y='1212_pv_hour', ax=axes[1],colormap='RdGy')
axes[0].set_title('pv_hour')
axes[1].set_title('pv_hour_1212')

fig, axes = plt.subplots(2,1,sharex=True)
uv_hour.plot(x='hour',y='uv_hour',ax=axes[0],colormap='cividis')
uv_hour_1212.plot(x='hour', y='1212_uv_hour', ax=axes[1],colormap='RdGy')
axes[0].set_title('uv_hour')
axes[1].set_title('uv_hour_1212')

可以看到,双十二当天,PV变化趋与一个月内的PV变化趋势基本一致,只不过曲线不太平滑,多出来小的凸点,一个可能的原因是大促当天,有整点领券活动,通过推送等形式会有效拉动用户使用淘宝。UV变化趋势稍有不同,可以看到双十二当天在晚上8点之后UV出现了小高峰,表明了大促当天用户的消费意愿还是比较强烈。
不同用户行为流量分析
淘宝用户分布广泛,不同的用户的购物行为有较大差异。比如不同的用户的登录习惯以及购买偏好,因此按照用户的角度进行分析是重要且有趣的。
# 基于 behavior_type & hour 分组
# 点击、收藏、加购物车、支付四种行为,分别用数字1、2、3、4表示
pv_behavior = data_user.groupby(['behavior_type','hour'])['user_id'].count()
pv_behavior = pv_behavior.reset_index()
pv_behavior = pv_behavior.rename(columns={'user_id':'pv_behavior'})
# 可视化
# sns: serborn
ax = sns.lineplot(x='hour',y='pv_behavior',hue='behavior_type',data=pv_behavior)

因为action_type为1(浏览行为)的占比非常大,导致上图其它几类action的趋势不太明显,我们去掉action_type为1的数据后再来看看:
ax = sns.lineplot(x='hour',y='pv_behavior',hue='behavior_type',data=pv_behavior[pv_behavior.behavior_type!=1])

可以看出4种行为按照小时的变化趋势基本一致,都是在晚上8点之后有明显增长,凌晨2-6点是低峰,符合常识。
我们在充分了解用户分时的数据趋势后,可以针对性的进行营销活动,如推送优惠劵等,大家也可以留意下日常使用电商类App的推送通知的推送时间,一般都是在用户高峰期来做推送,可进一步促进转化率。
转化率分析
我们来分析“浏览-收藏/加购-购买”链路的转化漏斗模型,可以更好的了解各个环节的转化链路。
behavior_type = data_user.groupby(['behavior_type'])['user_id'].count()
click_num, fav_num, add_num, pay_num = behavior_type[1], behavior_type[2], behavior_type[3], behavior_type[4]
fav_add_num = fav_num + add_num
print('加购/收藏转化率:', 100 * fav_add_num / click_num)
print('点击 到 购买转化率: ', 100 * pay_num / click_num)
print('加购/收藏 到 购买转化率: ', 100 * pay_num / fav_add_num)
加购/收藏转化率: 5.074376778103197
点击 到 购买转化率: 1.0406835811982098
加购/收藏 到 购买转化率: 20.508598921722513
可以观察到,从浏览到加购/收藏的转化率大约5%;“加购/收藏”后到购买转化率大约为20%,这个比例还是还是非常高的,说明用户感兴趣的商品更容易成单。 两者相乘,我们能粗略估出从浏览到购买的转化率约为1%左右。
双十二当天的数据
data_user_1212 = data_user.loc[data_user['date']=='2014-12-12']
behavior_type = data_user_1212.groupby(['behavior_type'])['user_id'].count()
click_num, fav_num, add_num, pay_num = behavior_type[1], behavior_type[2], behavior_type[3], behavior_type[4]
fav_add_num = fav_num + add_num
print('双十二 加购/收藏转化率:', 100 * fav_add_num / click_num)
print('双十二 点击 到 购买转化率: ', 100 * pay_num / click_num)
print('双十二 加购/收藏 到 购买转化率: ', 100 * pay_num / fav_add_num)
双十二 加购/收藏转化率: 5.448732437837779
双十二 点击 到 购买转化率: 2.3773707847303305
双十二 加购/收藏 到 购买转化率: 43.631630142472964
可以看出,双十二当天,加购/收藏 到 购买转化率是平时的2倍之多,此外,加购/收藏 的转化率也比平时高出不少,说明大促的运营活动对用户活跃度的转化起到了很好的促进作用。
作为商家来讲,可以考虑在特定节日推出特定主题的优惠活动,是个有效的促活、转化的方式。
用户价值分析
在分析完整体变化趋势和转化率之后,商家更关注的是用户行为,什么用户是有价值的,什么用户是潜在用户?商业上已经有不少成熟的模型可供参考,如用户价值RFM分析模型等,从实际问题出发,站在用户购买行为的角度来探索用户价值
用户购买频次分析
用户的点击数据是最多的,但是从淘宝盈利的角度来说,只有购买行为是商家最为关注的,这里就会引入一个问题:在给定的数据集上,淘宝用户购买东西的频次有多少?基于这个问题,我们可以用统计的方法计算。计算结果如下
## 浏览 >> 加购/收藏 >> 购买(4)
data_user_buy = data_user[data_user.behavior_type==4].groupby('user_id')['behavior_type'].count()
data_user_buy.plot(x='user_id',y='buy_count')

X轴代表user_id,Y轴是每个用户的购买次数。可以看到,大部分用户的购买次数均不超过50次,这期间还包括了双十二当天的集中购物,排除双十二高峰,实际消费次数会更少。当然也有部分用户的购买次数超过百次,甚至有超过800次的,高频消费的用户可以看作是忠实的超级用户。
ARPU分析
ARPU(Average Revenue Per User) 表示每日的收益在所有活跃用户中的转化。详细的描述为,每日的所有收益与每日的活跃的用户数量有关,因此可以通过ARPU来计算,每日活跃用户对每日收益的转化效率。
该数据集中没有对金额的体现。那我们可以对ARPU这个指标做一些修改,改为度量平台活跃用户每日平均消费次数。
计算公式为: ARPU = 每日消费总次数 / 每日活跃用户数
#给数据集中每一个用户赋值一个1,表示有登录操作
data_user['action'] = 1
# 得到 date, user_id, behavior_type和计算用户每日的登录次数
data_user_arpu = data_user.groupby(['date','user_id','behavior_type'])['action'].count()
data_user_arpu = data_user_arpu.reset_index()
arpu = data_user_arpu.groupby('date').apply(lambda x:x[x['behavior_type']==4]['action'].sum() / len(x['user_id'].unique()) )
arpu.plot(colormap='cividis')
plt.title('ARPU')

可以看到,活跃用户每天平均消费次数在0.5次左右,双十二期间达到最高值接近2,是平时的4倍左右,表明用户会集中在大促日的时候购买。
ARPPU分析
ARPPU(average revenue per paying user)是指从每位付费用户中获得的收益,它反映的是整个平台的用户消费的均值。
它的计算方式为:ARPPU = 总收入/活跃用户付费数量。但是在该数据集中没有收益金额,因此我们可以对计算方式做一点转化,将总收入转化为总的购买行为次数。
定义如下:ARPPU = 当日总消费次数/当日活跃用户付费数量 , 可以看出和ARPU唯一的区别是分母,ARPU的分母是活跃用户数(包含4种行为类型),ARPPU的坟墓是活跃付费用户数,因此ARPPU的计算会更简单:
# 计算每日的所有用户的购买次数
data_user_arppu = data_user[data_user['behavior_type']==4].groupby(['date','user_id'])['behavior_type'].count()
data_user_arppu = data_user_arppu.reset_index().rename(columns={'behavior_type':'buy_count'})
# 计算ARPPU
data_user_arppu = data_user_arppu.groupby('date').apply(lambda x:x['buy_count'].sum() / x['user_id'].count())
data_user_arppu.plot(colormap='cividis')
plt.title('ARPPU')
可以看到,针对活跃的下单用户来讲,平均每日消费次数在2-2.5次之间波动,双十二当天该数值达超过3.75,一个可能的原因是用户会在平时把喜欢的商品进行加购,等到双十二促销当天再下单购买。
复购情况分析
一般来说,复购是指对产品的重复购买行为。但是这个定义在商业上是不精确的,假若一个用户在一天内多次在淘宝购买商品,不能说明这件用户对淘宝的依赖(有可能是某位用户只是第一次用,但是买的量大)。因此商业分析过程中,对于复购行为进行明确的定义。这里的复购是指:两天以上都在该平台产生了购买行为,需要指出一天多次的购买不算是复购。
因此复购率的计算方式为:复购率 = 复购用户数量 / 有购买行为的用户数量。基于这个公式,我们先计算用户在数据集中的购买频次:
# 计算用户购买频次
data_user_pay = data_user[data_user.behavior_type==4]
# 基于date去重,得到的结果即为购物分布的天数:
data_user_pay = data_user_pay.groupby('user_id')['date'].apply(lambda x: len(x.unique()))
# 计算复购率:
repeat_buy_ratio = data_user_pay[data_user_pay > 1].count() / data_user_pay.count()
repeat_buy_ratio
复购周期分析
除了以上对复购频次的统计,还需要对复购意向做进一步的探究,想要知道用户多久复购一次。这个数据有助于淘宝产品宣传在这个时间间隔内采取策略,增加用户的复购意向,最终转化为实际收

可以看出,大部分用户的复购行为发生在5天之内,在第5天复购的行为出现了明显的拐点,如果这个时候采取营销策略提升用户的购买意图,增加更多收益。超过15天后,复购的意愿基本已经趋于0,此时可以考虑采取一些召回策略,增加复购的可能性,防止用户的流失。
更多推荐
所有评论(0)