用户行为分析及实战项目python
本文为淘宝用户行为分析,附python代码~欢迎各位拍砖!
目录
- 用户分析理解
- 用户行为分析目的
- 采集用户数据
- 用户行为的指标
- 常用行为分析模型
- 淘宝用户行为分析项目
- 分析目的
- 数据探索EDA
- 整体分析
- 区分个维度分析
- 区分商品ID
- 复购率&留存率sql实现
- 漏斗模型
-
结论
-
其他知识点
- ARPU和ARPPU
- LTV
第一部分 用户分析理解
1. 用户行为分析的目的:
用户行为分析是对用户在产品上产生的行为以及行为背后数据进行一系列分析,通过构建行为模型和用户画像,支持产品决策,精细化运营,实现增长。
对于产品而言,用户行为分析可以验证产品可行性,找到产品缺陷,以便需求迭代;
对于设计而言,用户行为分析可以帮助提高产品体验,发现交互不足,以便设计优化;
对于运营而言,用户行为分析可以实现精准营销,挖掘使用场景分析用户数据,以便运营决策调整;
2. 采集用户数据
一般包括设备id,时间,行为类型,渠道等
3. 用户行为分析指标
(1)粘性指标-表现用户-提高认知度A激活:关注周期内持续访问,比如:留存率、流失率、新用户占比、用户转化率等;
(2)活跃指标-表现行为-诱导参与留存:用户参与度,比如:活跃、新增、流失、平均访问时长、使用频率等;
(3)产出指标-分析出-培养忠诚度R变现:用户价值输出,比如:消费金额、页面UV、消费频次等;
4. 常用用户行为分析模型:
(1)行为事件分析:根据关键指标对用户行为进行分析,比如:注册、登录、搜索流量商品、加入购物车、提交订单、付款、评价一系列属于电商完整事件。在根据用户细分维度,用户渠道、注册时间、订单频率、新老客等维度找到规律,制定方案。
(2)用户留存分析:分析用户产品参与度的指标,一般遵循40-20-10法则,即日留存大于40%周留存大于20%月留存大于10%。
(3)漏斗分析:描述用户使用产品时关键环节转化率情况,能够验证设计是否合理。分析用户在哪个环节流失,为什么流失,如何降低流失提高转化率。
(4)用户路径分析:用户在使用产品过程中的访问路径。首先要梳理用户行为轨迹,认知-熟悉-试用-使用-忠诚。轨迹背后反应的是用户特征,这些特征对产品运营有重要参考价值。当发现偏差时,可能就是产品的缺陷。
(5)福格模型:用来研究用户行为原因的模型。B行动=M动机A能力T触发器。以分享为例,动机-该分享对分享者和被分享者有什么好处,能力-分享路径实现是否有难度,触发器-分享按钮是否醒目,用户是否意识到这个分享带来的好处。
第二部分 淘宝用户行为分析
1. 分析目的
已知数据集中包括用户ID、商品ID、商品类目ID、行为类型和时间戳,其中行为包括点击、购买、加购、喜欢。
(1)用户活跃指标
(2)用户粘性指标
(3)用户行为分析
2. 数据探索EDA
2.1导入数据
data = pd.read_csv('UserBehavior.csv',header=None)
data.rename({0:'userID',1:'productID',2:'categoryID',3:'behavior',4:'datetime'},inplace=True,axis=1)
2.2数据概览
data.info()
data.isnull().sum()#查看缺失值,发现只有datetime中有一个缺失,其他完整
data.describe()#查看统计指标发现datetime有雨题意不符数据
2.3数据缺失值处理
import datetime
data['datetime'].fillna(method='ffill',inplace=True)
data['datetime'] = data.datetime.apply(lambda x: datetime.datetime.fromtimestamp(x))#将时间戳变更为日期格式
data1 = data[data['datetime']>='2017-11-25']
data2 = data1[data1['datetime']<'2017-12-03']#剔除不合格时间记录
2.4增加日期列
data2['date'] = pd.to_datetime(data2['datetime'].apply(lambda unix_ts: unix_ts.strftime('%Y-%m-%d')))
image.png
3. 整体分析
3.1 详情页访问PV
pv = data2[data2['behavior']=='pv'].groupby('date')['userID'].count()
plt.rcParams['font.sans-serif'] = ['SimHei']#避免中文乱码
plt.rcParams['axes.unicode_minus'] = False#避免中文乱码
plt.figure(figsize = (10,5))
for x, y in zip(pv.index, pv.values):
plt.text(x, y+0.3, str(y), ha='center', va='bottom', fontsize=10.5)
plt.plot(pv)
plt.title('详情页访问PV')
image.png
能明显看出12月2日周六的PV突增,但是11月25日和26日同为周末,PV量级却没有那么大,需要继续查看数据,有可能是异常情况。
3.2 详情页访问UV
uv = data2[data2['behavior']=='pv'].drop_duplicates(subset=['date', 'userID']).groupby('date')['userID'].count()
plt.figure(figsize = (10,5))
for x, y in zip(uv.index, uv.values):
plt.text(x, y+0.3, str(y), ha='center', va='bottom', fontsize=10.5)
plt.plot(uv)
plt.title('详情页访问UV')
image.png
与PV情况相似,但是UV增加不一定就是PV增加的原因,还有可能是某些用户访问次数增加导致PV增加或统计问题,因此需要看一下人均访问次数确定。
3.3 详情页人均访问次数
image.png人均访问次数接近,由此可知PV的增加就是新访客带来的。由于双12属于年底大促,因此12月2日访问量突增的原因可能与商家开始进行促销和宣传有关系。
3.4 人均消费频次
#人均消费频次
buy = data2[data2['behavior']=='buy'].count()
buyer = data2[data2['behavior']=='buy'].drop_duplicates(subset=['userID']).count()
buy/buyer
人均消费频次2.8次
4. 区分各维度分析
4.1 时间维度
hours_pv = data2[data2['behavior']=='pv'].groupby('hours')['userID'].count()
plt.figure(figsize = (10,5))
for x, y in zip(hours_pv.index, hours_pv.values):
plt.text(x, y+0.5, str(y), ha='center', va='bottom', fontsize=10.5)
plt.plot(hours_pv)
h = range(1,24,2)
plt.xticks(h)
plt.title('详情页区分时间段访问PV')
image.png
可以看出主要活跃集中在10-23点,从晚上7时开始至10时用户访问处于最佳活跃状态,21时是一天中活跃最高点。
image.png
收藏、加入购物车、购买与pv的趋势相似。
plt.figure(figsize = (10,5))
for x, y in zip(hours_buyrate.index, hours_buyrate.values):
plt.text(x, y+0.01, str(y), ha='center', va='bottom', fontsize=10.5)
plt.plot(hours_buyrate,label='收藏')
h = range(1,24,2)
plt.xticks(h)
plt.legend()
plt.title('区分时间段付费率')
image.png
10时附近付费率最高,因此应该保持10时的运营活动加大21时的活动力度。
4.2 区分商品类目
categoryID_buy = data2[data2['behavior']=='buy'].groupby('categoryID')['userID'].count()
category = pd.DataFrame({'categoryID':categoryID_buy.index,'categoryID_buy':categoryID_buy.values})
category_20 = category.sort_values(by='categoryID_buy',ascending=False).iloc[:20]
category_20
image.png
由图可知,前7个商品类目属于高销量,与第8个类目销量差异较大。
4.3 商品类目top20销量及其付费率
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
#设置字体、图形样式
sns.set_style("whitegrid")
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
#matplotlib.fontsize='15'
#取做图数据
x=range(len(category_rate['categoryID']))
y1=category_rate['categoryID_buy']
y2=category_rate['buy_rate']
#设置图形大小
plt.rcParams['figure.figsize'] = (20,8)
fig = plt.figure()
#画柱子
ax1 = fig.add_subplot(111)
ax1.bar(x, y1,alpha=.7,color='g')
ax1.set_ylabel('商品类目销量',fontsize='15')
ax1.set_title("商品类目top20销量及其付费率",fontsize='20')
plt.yticks(fontsize=15)
plt.xticks(x,category_rate['categoryID'])
plt.xticks(fontsize=15)
ax2 = ax1.twinx() # 这个很重要噢
ax2.plot(x, y2, 'r',marker='*',ms=10)
ax2.set_ylabel('商品类目付费率(%)',fontsize='15')
plt.yticks(fontsize=15)
plt.xticks(x,category_rate['categoryID'])
plt.xticks(fontsize=15)
plt.grid(False)
#添加数据标签
for x, y ,z in zip(x,y2,y1):
plt.text(x, y+0.1, str(y), ha='center', va='bottom', fontsize=14,rotation=0)
image.png
商品类目为‘4159072’付费率最高
rate_low = data2[data2['categoryID']==1320293]#6w
rate_high = data2[data2['categoryID']==4159072]#7k
print(rate_low.groupby('behavior')['userID'].count())
print(rate_high.groupby('behavior')['userID'].count())
image.png
进一步探索与它同销量的’1320293‘付费率却极低,发现1320293的访问量很高但是购买平淡无奇,而4159072虽然访问量低但是每十个人访问就有一人付费。可以深入研究一下它是否有什么特殊性或者高效运营手段,详情页如何展示介绍商品,文案如何设计等,找出规律应用到其他商品上面,提高付费率或者从渠道的角度分析是否前者渠道目标用户不如后者精准。
4.4 商品类目销量的帕累托分析
category_plt = pd.DataFrame({'categoryID':categoryID_buy.index,'categoryID_buy':categoryID_buy.values})
category_plts = category.sort_values(by='categoryID_buy',ascending=False)
category_plts['cumsum'] = category_plts['categoryID_buy'].cumsum()/category_plts['categoryID_buy'].sum()
category_plts[category_plts['cumsum']<0.8]
image.png
有过销量的类目共3666个,以销量由大到小排序占总销量的80%为止,有628个商品类目。因此可以说着628个商品类目占总销量的80%,奇妙的28定律!
4.5 商品类目人均消费频次
cat_buyer = data2[data2['behavior']=='buy'].drop_duplicates(subset=['userID']).groupby('categoryID')['userID'].count()
category_buyer = pd.DataFrame({'categoryID':cat_buyer.index,'categoryID_buyer':cat_buyer.values})
cate = pd.merge(category_20, category_buyer, how='inner',on='categoryID')
cate['per'] =round(cate['categoryID_buy']/cate['categoryID_buyer'],2)
image.png
前面平均消费频次为2.8,销量top20中,‘2885642’‘4756105’‘4159072’这三个类目消费频次与销量差距悬殊,可以根据商品性质分析如何提高用户消费频次,同时可以参考其他消费频次较高商品如‘982926’的运营手段等。
4.6 商品类目收藏和购买的关系
data2[data2['behavior']=='fav'].count()/data2[data2['behavior']=='buy'].count()#1.4
普遍说明每发生1.4次收藏就有1次购买行为。
plt.figure(figsize = (10,5))
plt.plot(fav_buy['categoryID'],fav_buy['rate'],label='收藏/购买')
for x, y in zip(fav_buy['categoryID'],fav_buy['rate']):
plt.text(x, y+0.2, str(y), ha='center', va='bottom', fontsize=10.5)
plt.axhline(y=1.4,c="r", ls="--", lw=2)
plt.legend()
plt.title('收藏和购买的关系')
image.png
可以分析出几个商品每收藏4-5次才会购买一次,考虑是否对这类商品进行个性化召回,比如定向推送询问用户收藏的该商品最近有优惠券是否前来购买等。
5. 区分商品ID
与区分商品类目的分析相似,这里指针对有异常商品类目下的商品名称进行分析
5.1 探索某商品ID下销量与付费率
从商品ID维度分析以商品类目ID=’1320293‘和’4159072‘两者销量相似但是付费率相差悬殊为例。
rate_pro_low = rate_low['productID'].value_counts()
rate_pro_high = rate_high['productID'].value_counts()
print(rate_pro_low)#有14293个商品ID
print(rate_pro_high)#有2011个商品ID
说明商品类目下有与其大量商品不如小而精,精准定位用户需求。
rate_low_pro = rate_low[rate_low['behavior']=='buy'].groupby('productID')['userID'].count()
rate_low_pro.sort_values(ascending=False)
image.png
rate_high_pro = rate_high[rate_high['behavior']=='buy'].groupby('productID')['userID'].count()
rate_high_pro.sort_values(ascending=False)
image.png
能辅助证明上面的观点,如果在某类目下有几个商品吸引用购买,那么该类目的销量就会大增。
6. 留存率&复购率(sql实现)
使用sql较容易实现
6.1 次日留存率
select d.dates,d.user1 as '当天活跃用户数',c.user2 as '次日活跃用户数',concat(round(c.user2/d.user1,2)*100 ,'%')as '次日留存率'
from
(select dates, count(distinct userid) as user1 from tb2 where behavior='pv' group by dates) as d
join
(select a.dates,count(distinct a.userid) as user2
from
(select distinct dates,userid from tb2 where behavior='pv' ) as a
left join
(select distinct dates,userid from tb2 where behavior='pv' ) as b
on a.userid=b.userid
where b.dates=date_add(a.dates,INTERVAL 1 DAY)
group by a.dates) as c
on d.dates=c.dates;
image.png
可以看出整体次日留存率较高,越接近12月份留存率逐步上升,与临近双十二商家宣传促销有关。
6.2 复购率
select d.dates,d.user1 as '当天购买用户数',c.user2 as '次日复购用户数',concat(round(c.user2/d.user1,2)*100 ,'%')as '次日复购率'
from
(select dates, count(distinct userid) as user1 from tb2 where behavior='buy' group by dates) as d
join
(select a.dates,count(distinct a.userid) as user2
from
(select distinct dates,userid from tb2 where behavior='buy' ) as a
left join
(select distinct dates,userid from tb2 where behavior='buy' ) as b
on a.userid=b.userid
where b.dates=date_add(a.dates,INTERVAL 1 DAY)
group by a.dates) as c
on d.dates=c.dates;
image.png
用户复购率也在逐渐提高。
7. 转化漏斗
funnel = Funnel("商品交易总体环节转化率", width=600, height=400, title_pos='center')#初始化漏斗图
pv_users = data2[data2['behavior']=='pv']['userID'].count()
buy_users = data2[data2['behavior']=='buy']['userID'].count()
fav_users = data2[data2['behavior']=='fav']['userID'].count()
cart_users = data2[data2['behavior']=='cart']['userID'].count()
print(pv_users)
print(buy_users)
print(fav_users)
print(cart_users)
values = [round(pv_users/pv_users*100,2),
round(cart_users/pv_users*100,2),
round(buy_users/pv_users*100,2)]
print(values)
funnel.add("",
['浏览','加入购物车','下单'],
values,
is_label_show=True,
label_formatter='{b}{c}%',
label_pos="outside",
is_legend_show = False)
image.png
从浏览到加入购物车的转换率仅6.2%,有空间提升。
结论:
-
从这一周时间的数据来看,临近双十二用户的访问量有大幅提升,与商家宣传促销有关。
-
人均访问次数为13次,人均消费频次2.8次。
-
一天中用户从19点至23点是最佳活跃状态,21时达到活跃最高点。
-
早10点附近付费率较高,因此运营同学可以保持10时的运营活动,加大21时的活动力度。
-
由于商品本质原因,比如电器消费频次较低食品消费频次较高,因此不能盲目比较两者销量。可以分析各类目销量趋势图,结合类目本质去考虑哪些商品需要提高销量。
-
有些类目的销量高但是付费率极低,说明用户进入详情页大部分流失,留下的用户可能会成倍购买。说明这是个好时机,深入研究与其他销量高且付费率高的类目在运营、用户体验、文案设计等方面有什么区别。或者从渠道来源分析,是否是无效非精准用户。
7.仅628个类目占总销量的80%,28定律。 -
有些类目的消费频次远高于或远低于平均消费频次,且与销量不符,因此可以细究原因,互相借鉴。
-
对于收藏与购买之间的关系,平均每收藏1.4次就会产生1次购买行为,因此对于某些类目收藏5次以上才购买的,需要思考是什么原因导致用户只收藏不下单?可以从【福格模型】中试着找找答案,B行动=M动力A能力T触发器,动力即快乐、希望,用户既然收藏了就说明有购买的动力,希望商品给自己带来愉悦感;能力即金钱、时间等;触发器即让用户立即行动的契机。因此,针对能力方面考虑加入个性化推荐,比如根据上面所提到的该用户习惯下单时间个性化推送收藏商品并提供优惠券;
-
对于销量相似但付费率相差悬殊的类目,付费率高的类目下产品个数少于付费率低的产品个数,说明大量投放商品多样性效果不如精准定位用户需求,如果某个类目下仅有几个商品能足够吸引用户,那么销量就会大幅提升。当运营成本有限时,可以优先考虑小而精的运营。
10.留存率能够达到70%以上,复购率达到20%以上,在临近双12明显提升。
11.通过观察漏斗可以看出,加入购物车的转化率仅6.2%还有很大的空间提升。
由于此次数据集没有提高销售金额,因此无法进行ARPU方面数据分析。这里补充下关于消费金额的知识点:
arpu与arppu
- arpu:每用户的平均收入,代表某段时间内平均每个活跃用户给应用创造的收入。
arpu=某段时间应用收入/该段时间活跃用户数
arpu是评估应用变动是否提升变现收益,arpu越高代表这段时间内用户为应用带来的收益越高; - arppu:每付费用户的平均收益,代表某段时间内每个付费用户为应用创造的收入。与arpu不同的是,arppu只考虑付费用户不考虑活跃非付费用户数。
arppu=某段时间应用收入/该段时间付费用户数
arppu能够评估付费用户为应用带来的收益,显示出对付费项目的反应,因为当
注:由于arppu分母注定比arpu的分母小(付费用户小于活跃用户)因此,同一时间段同一应用的arppu比arpu大。 - 当arpu>单用户成本时,说明推广一个用户带来的收益为正,这里的成本是除人工成本外的推广成本、短信推送、新用户奖励等。
- 可以将用户分层进行arpu分析:
(1)按照用户行为:激活用户数、注册用户数、付费用户数-arppu
(2)按照渠道
(3)按照时间:单日arpu、7日arpu、月arpu
(4)按照特殊时间点:完成新手任务的arpu、一天登录三次及以上的arpu等
比如:月注册用户数的arpu=本月注册用户中产生的收入/本月注册用户总数
LTV用户生命周期价值
LTV是平均每个用户带来的价值,可以决策为每个用户付出多少成本。一般来说LTV>CAC认为公司发展空间大,LTV<CAC认为公司变现能力弱,LTV/CAC=3认为公司健康,大于3说明市场拓展较为保守;小于3说明转化效率底下。
LTV=LT*ARPU
LT指用户平均生命周期,留存率之和。
image.png
举例:如果知道用户一个月内的留存率,可以使用excel做出对数趋势线,看下r方。根据对数公式计算出留存率之和,也就是LT。
注意:ARPU与LT要有单位之间的换算。
CAC用户获取成本
CAC计算要考虑进去成本,包括营销费用、推广费用、以及人力成本。CAC是一个平均值,可能在各渠道下成本不一,可以区分渠道分别计算。
PBP回收期
即花费的用户获取成本能在多长时间内回本。PBP越短资金周转越快。
参考:
https://blog.csdn.net/u012164509/article/details/103049740arpu和aprru
https://baijiahao.baidu.com/s?id=1662108604585143388&wfr=spider&for=pcLTV