电商用户行为数据分析(以阿里云数据为基础)
本文数据来自阿里云天池:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1
前言
本文根据淘宝app的运营数据,按照行业常见指标对用户进行分析,包括PV、UV,新增用户分析、漏斗流失分析、留存分析、价值分析、复购分析等。
本文使用的工具为jupyter notebook,相关库为pandas、numpy和datetime。
一、提出问题
1. 本次分析希望解决的业务问题是什么?
本次分析,基于淘宝用户的行为和时间数据,可以提供以下问题的解答:
1.1 基于AARRR模型,了解当前用户的新增、转化、留存数据,确定影响新增用户数量的因素,找到需要改进的转化环节,发现留存问题。
1.2 根据用户在不同时间尺度的行为变化,找到用户活跃规律。
1.3 找出核心用户,并对核心用户进行行为分析。
1.4 根据用户的行为偏好,确定商品营销策略。
2. 本次分析使用哪些数据模型?
电商分析通常从四个方面展开:流程效率分析、流量/用户分析、商品分析、产品分析。其中,通过流程效率拆解追踪问题产生环节,通过用户粘性、价值、满意度分析来进行用户分层及流失预警,通过商品生命周期及关联分析来划分商品等级,通过产品分析提升用户浏览-购买过程体验。
电商数据分析体系
电商数据分析指标
本文采用常用的电商指标和AARRR模型、RFM模型,对用户进行分析。
AARRR漏斗模型
二、理解数据
1. 数据来源
本次采用的数据集,是阿里云平台开放的公共数据,数据集包含了2017年11月25日至2017年12月3日之间,有行为的约4万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集大小情况为:用户数量约4万(37376),商品数量约93万(930607),商品类目数量7106以及总的淘宝用户行为记录数量约为400万条(3835331)。
2. 字段含义以及数据量
三、数据清洗
1. 列名重命名
由于原数据集没有表头,在导入时进行设置
userbehaviorDf = pd.read_csv('UserBehavior.csv',names = ['userid','itemid','category','behavior','timestamp'])
2. 删除重复值
根据'userid','itemid','timestamp'三组值去重
userbehaviorDf = userbehaviorDf.drop_duplicates(['userid','itemid','timestamp'])
3. 去除缺失值
使用dropna去除为NA的数据
userbehaviorDf = userbehaviorDf.dropna()
4. 一致化处理
根据timestamp,增加时间(datetime)、日期(date)、小时(hour)字段
userbehaviorDf['datetime'] = pd.to_datetime(userbehaviorDf['timestamp'], unit='s')
userbehaviorDf['date'] = userbehaviorDf['datetime'].dt.date
userbehaviorDf['hour'] = userbehaviorDf['datetime'].dt.hour
5. 异常值处理
检查时间范围在2017年11月25日至2017年12月3日内,并将不合规的数据删除
userbehaviorDf = userbehaviorDf[(userbehaviorDf['datetime'] >= datetime.datetime.strptime('2017-11-25 00:00:00','%Y-%m-%d %H:%M:%S')) & (tem1Df['datetime'] < datetime.datetime.strptime('2017-12-04 00:00:00','%Y-%m-%d %H:%M:%S'))]
6. 数据清洗后
数据清洗后剩余3788541条记录,见下表:
四、数据分析
1. 分析用户行为漏斗
该部分主要分析用户从获客-转化-留存-变现各阶段的行为,涉及指标有新增用户数、PV/UV、跳失数、转化率、留存率、复购率等。
1.1 获客:每日新增用户情况
此处选取2017年11月25日为首日,并定义新增用户为出现第一次购买的用户,可以通过behavior进行筛选。
通过sort_values+drop_duplicates可以挑选出有购买行为的用户的首次购买日期,再利用groupby统计。
huokeDf = userbehaviorDf[userbehaviorDf['behavior']=='buy'].sort_values(['date','userid']).drop_duplicates('userid')
huokeDf.groupby('date')['userid'].count()
如下图所示,每天都有新增下单用户,但新增用户在递减,12月2日有略微上升,可能和营销活动有关。
1.2 转化:转化及流失情况
1.2.1 PV、UV
这里使用userid判断UV、当behavior为'pv'时计算PV,使用nunique函数可以去重计数,达到UV的效果。最后再使用merge对PV、UV进行合并展示
UVDf = userbehaviorDf.groupby('date')['userid'].nunique()
UVDf = pd.DataFrame({'UV':UVDf}).reset_index()
PVDf = userbehaviorDf[userbehaviorDf['behavior']=='pv'].groupby('date')['userid'].count()
PVDf = pd.DataFrame({'PV':PVDf}).reset_index()
PVUVDf = PVDf.merge(UVDf, how = 'left',on = 'date')
结果如下图,每天访问量PV超过30万,UV超过2万。
1.2.2 跳失数
跳失数是指只访问一次就离开的用户,这里可以理解为只有pv行为而没有其他行为的用户数。
这里可以采用pivot_table方法,先获取每个用户发生不同行为的次数,再判断产生的行为是否只有pv。
#这一步对每个用户的不同行为进行计数
tiaoshi2Df = userbehaviorDf.pivot_table(index = 'userid',columns='behavior',values = 'timestamp',aggfunc='count')
#这一步是把没有行为的情况设置为0
tiaoshi2Df = tiaoshi2Df.reset_index().fillna(0)
#这一步将每个用户所有行为求和,再判断是否产生的行为数量和pv数量相同
tiaoshi2Df['panduan'] = tiaoshi2Df['buy']+tiaoshi2Df['cart']+tiaoshi2Df['fav']+tiaoshi2Df['pv']
tiaoshi2Df[tiaoshi2Df['panduan']==tiaoshi2Df['pv']]['userid'].count()
结果这9天的跳失用户总数为2236个
1.2.3 用户行为转化漏斗计算
在漏斗计算中需要设置中间步骤,在购物环节中收藏和加入购物车都是确定购物意向的行为,没有先后之分,所以将这两个环节合并为购物环节中的一步。这里可以将购物环节设置为:点击——加购或收藏——购买。定义各环节数量时按照用户数量作为标准并去重。
因此有两个指标:加购收藏率和购买率。
加购收藏率=加购或收藏数/点击数;
购买率=购买数/点击数
#2.3、用户行为转化漏斗计算
loudouDf = userbehaviorDf.pivot_table(columns='behavior',values = 'userid',aggfunc=pd.Series.nunique) #pd.Series.nunique保证结果去重
#'|'符号代表'或',即加购或收藏都作为判断标准
loudouDf['加购收藏数'] = userbehaviorDf[(userbehaviorDf['behavior']=='cart')|(userbehaviorDf['behavior']=='fav')]['userid'].nunique()
loudouDf['加购收藏率'] = loudouDf['加购收藏数']/loudouDf['pv']
loudouDf['购买率'] = loudouDf['buy']/loudouDf['pv']
loudouDf = loudouDf.rename(columns = {'pv':'点击数','buy':'购买数'})
loudouDf = loudouDf[['点击数','加购收藏数','购买数','加购收藏率','购买率']]
loudouDf
结果如下图,加购或收藏率约为87%,购买率约为68%,都很高,说明打开淘宝app的用户有很高的购买需求。
1.2.4 独立访客漏斗
独立访客是指产生行为的用户数,即按照不同类型的行为(点击、加购、收藏、购买)统计用户数量。
#2.4、独立访客漏斗
duliDf = userbehaviorDf.groupby('behavior')['userid'].nunique()
duliDf = pd.DataFrame({'独立访客数':duliDf}).reset_index()
#按照“pv-cart-fav-buy”重排序
duliDf.reindex(index=[3,1,2,0]).reset_index(drop=True)
结果如下:
1.3 留存:新增用户的留存情况
对新增用户的留存,是每个APP重点关注的指标之一。这里对留存的定义是用户首次下单时间作为首日,统计之后每天该用户群中下单用户数量的变化,作为留存。次日、3日、7日留存比较常用。
这里处理的时候先找到每个用户首次下单时间,确定分母。再统计每天下单用户数量,和首次的下单时间做比较。
先计算具体留存数值:
#3 留存:新增用户的留存情况
#查询首次下单用户的下单日期
liucunDf = userbehaviorDf[userbehaviorDf['behavior']=='buy'][['date','userid']].sort_values(['date','userid']).drop_duplicates('userid').reset_index(drop=True)
#查询用户每天的下单日期
liucun2Df = userbehaviorDf[userbehaviorDf['behavior']=='buy'][['date','userid']].sort_values(['date','userid']).drop_duplicates().reset_index(drop=True)
#对用户信息合并,日期列重命名,方便之后区分
liucun2Df = liucun2Df.rename(columns = {'date':'date2'})
liucun2Df = liucun2Df.merge(liucunDf, on = 'userid', how = 'inner')
liucun2Df['assist'] = 1 #设置辅助列,方便透视
#按照日期维度透视出每个人的下单日期,可以将日期横排列
liucun3Df = liucun2Df[liucun2Df['assist']==1].pivot_table(index = 'userid',columns='date2',values = 'assist',aggfunc='count')
liucun3Df = liucun3Df.reset_index()
liucun4Df = liucun3Df.merge(liucunDf,on = 'userid', how = 'inner')
#最后使用groupby把用户按照首次下单日期计算每天的留存
liucun5Df = liucun4Df.groupby('date').count().reset_index()
liucun5Df
结果如下:
再根据该结果计算留存率:
#百分比计算
#用copy来避免对之前数据的更改
liucun6Df = liucun5Df.copy()
#将原日期列设置成字母,再重新计算日期百分比
temList = list(chr(i) for i in range(97,106)) #['a','b','c','d','e','f','g','h','i']
liucun6Df.columns = ['date','userid'] + temList
#生成新的日期列表,从11.25到12.3号
dateList = list(pd.Series(pd.date_range(start='11/25/2017', end='12/03/2017', freq='1D')).dt.strftime('%Y-%m-%d'))
for i in range(0,9):
date = dateList[i]
tem = temList[i]
liucun6Df[date] = (liucun6Df[tem]/liucun6Df['userid']).apply(lambda x: format(x, '.2%')) #换算百分比
#去掉字母列
liucun6Df = liucun6Df.drop(temList,axis = 1)
liucun6Df
结果如下:
可以看出,样本数据的3日、7日留存率都在20%左右,比较优秀,但次日留存也只有20%,可以关注并适当提升,最后两天留存略有上升,可能和促销活动有关。
*注:本次分析讲2017.11.25日当天有购买的用户全作为新用户,与实际情况不符,仅供参考。
1.4 变现:复购分析
复购是指用户购买的次数,很好计算,看有购买行为的用户的购买次数就好。
1.4.1 复购人数
先计算每个人的购买次数,再按照购买次数计算每个购买次数下的人数
#4、变现:复购分析
#复购人数
fugouDf = userbehaviorDf[userbehaviorDf['behavior']=='buy'].groupby('userid')['timestamp'].count().reset_index()
fugou2Df = fugouDf.groupby('timestamp')['userid'].count().reset_index()
fugou2Df = fugou2Df.rename(columns = {'timestamp':'复购次数','userid':'复购人数'})
fugou2Df.head(10)
结果如下:
从复购人数分布来看,复购人数超过5次的用户占总购买用户的不到10%,高复购用户较少。
1.4.2 复购率
复购率用复购次数大于1次的人数除以总复购人数来计算
#复购率
format(fugouDf[fugouDf['timestamp']>=2]['userid'].count()/fugouDf['userid'].count(),'.2%')
可以看出,整体复购率还是很高的。
2. 不同时间尺度下的用户行为模式分析
样本数据只有9天,这里按照日维度和小时维度进行观察,找出用户活跃规律。
[图片上传中...(image.png-f1096c-1591761289546-0)]
2.1 分析9天中每天的用户行为
用户行为的代码较简单,只需要通过pivot_table进行透视计数就好:
#1、分析2017年11月25日至12月3日 9天中每天的用户行为
riqiDf = userbehaviorDf.pivot_table(index='date',columns = 'behavior', values = 'userid', aggfunc= 'count').reset_index()
riqiDf = riqiDf.rename(columns = {'date':'日期','buy':'购买数','cart':'加购数','fav':'收藏数','pv':'点击数'})
riqiDf
结果如下图:
可以看出,在日期范围内,用户行为数据较平稳,在促销日(12.2-12.3)略有上涨。加购、收藏数在促销日前一天就开始上涨,可能是因为用户有预购行为。
2.2 分析一天中每小时的用户行为
代码:
#2、分析一天中每小时的用户行为
hourDf = userbehaviorDf.pivot_table(index=['date','hour'],columns = 'behavior', values = 'userid', aggfunc= 'count').reset_index()
hourDf = hourDf.rename(columns = {'date':'日期','hour':'小时','buy':'购买数','cart':'加购数','fav':'收藏数','pv':'点击数'})
hourDf
结果如下图:
观察图像可知,每天用户的活跃高峰是11-15点,13点最高,可能和午休有关。令人惊讶的是从2点之后到10点,用户活跃很平稳,需要进一步挖掘原因。而用户活跃度下降的时间是17-23点,可能和下班、吃晚饭有关。
3. 用户价值分析
3.1 用户价值分层(RFM模型)
由于缺少金额情况,这里只针对F(频率)和R(最近一次购买)来分层。
分层是差异化营销的重要手段之一。这里先计算每个用户的最近一次购买时间进行排序,使用sort_values+drop_duplicates就可以。再计算每个用户的购买次数。最后利用qcut函数计算R值和F值。
#1、用户价值分层(RFM模型)
#用户访问排名
rfm1Df = userbehaviorDf[userbehaviorDf['behavior']=='buy'].sort_values('timestamp',ascending=False).drop_duplicates('userid').reset_index(drop=True)
rfm1Df = rfm1Df.reset_index()[['userid','index']]
rfm1Df['index'] = rfm1Df['index']+1
rfm1Df = rfm1Df.rename(columns = {'index':'访问排名'})
#用户购买次数
rfm2Df = userbehaviorDf[userbehaviorDf['behavior']=='buy'].groupby('userid')['timestamp'].count()
rfm2Df = pd.DataFrame({'购买次数':rfm2Df}).reset_index()
rfm3Df = rfm1Df.merge(rfm2Df, how = 'left', on = 'userid')
#计算R值F值
rfm3Df['R_value'] = pd.qcut(rfm3Df['访问排名'], 4, labels=[1,2,3,4])
rfm3Df['F_value'] = pd.qcut(rfm3Df['购买次数'], 5, labels=[1,2,3,4], duplicates='drop')
#拼接R值F值
rfm3Df['user_value'] = rfm3Df['R_value'].map(str).str.cat(rfm3Df['F_value'].map(str)) #map(str)用来对转化列类型,cat用来拼接两列
rfm3Df.head()
结果如图:
还可以统计一下各类型用户的人数,判断APP的主流用户类型:
#统计各类型人数
rfm4Df = rfm3Df.groupby('user_value')['userid'].count()
rfm4Df = pd.DataFrame({'RFM人数':rfm4Df}).reset_index()
rfm5Df = rfm4Df.sort_values('RFM人数',ascending = False).reset_index(drop=True)
rfm5Df
结果如下:
如图可知,F值为1的用户较多,即购买次数少的用户较多,可以考虑根据他们的用户习惯进行精准化营销,增加用户粘性和购买次数。
4. 商品销售分析
4.1 商品销售情况
4.1.1 购买次数频次分布
销售情况一般是统计各商品的购买次数和不同购买次数下有多少商品。
需要先按照商品id(itemid)计算购买次数,再按照购买次数统计上面,用到两次groupby函数
#1.1 购买次数频次分布
xiaoshouDf = userbehaviorDf[userbehaviorDf['behavior']=='buy'].groupby('itemid')['userid'].count()
xiaoshouDf = pd.DataFrame({'购买次数':xiaoshouDf}).reset_index()
xiaoshou2Df = xiaoshouDf.groupby('购买次数')['itemid'].count()
xiaoshou3Df = pd.DataFrame({'购买商品数':xiaoshou2Df}).reset_index()
xiaoshou3Df
结果如下:
可以看出,只购买一次的商品占比很高(约81%),因此商品售卖几乎是依靠长尾产品拉动的,而非爆款商品。
4.1.2 各类型用户行为top20的商品
不同行为的目的不同,这里列举各行为下top20的商品目录,来观察不同行为之间的关系。
代码比较简单,分别按照行为计算商品发生行为的数量,再进行排序和拼接。
#1.2 各类型动作top20的商品
xiaoliangDf = xiaoshouDf.sort_values('购买次数',ascending=False).head(20).reset_index(drop=True).rename(columns={'itemid':'销量商品编号'})
liulanDf = userbehaviorDf[userbehaviorDf['behavior']=='pv'].groupby('itemid')['userid'].count()
liulanDf = pd.DataFrame({'浏览次数':liulanDf}).reset_index().sort_values('浏览次数',ascending=False).head(20).reset_index(drop=True).rename(columns={'itemid':'浏览商品编号'})
shoucangDf = userbehaviorDf[userbehaviorDf['behavior']=='fav'].groupby('itemid')['userid'].count()
shoucangDf = pd.DataFrame({'收藏次数':shoucangDf}).reset_index().sort_values('收藏次数',ascending=False).head(20).reset_index(drop=True).rename(columns={'itemid':'收藏商品编号'})
jiagouDf = userbehaviorDf[userbehaviorDf['behavior']=='cart'].groupby('itemid')['userid'].count()
jiagouDf = pd.DataFrame({'加购次数':jiagouDf}).reset_index().sort_values('加购次数',ascending=False).head(20).reset_index(drop=True).rename(columns={'itemid':'加购商品编号'})
top20Df = pd.concat([xiaoliangDf,liulanDf,shoucangDf,jiagouDf],axis=1)
top20Df
结果如下:
下面看下不同行为之间top20商品的情况。
首先对比销量top20和浏览top20(黄色填充),可见重合度不高,说明浏览多的商品并没有转化到成交。
其次对比浏览和收藏top20的商品(红色字体),重合度很高,说明浏览后收藏商品的可能性很大。
最后看下加购物车和购买商品top20(绿色字体),重合度一般,说明加购和实际购买有一定差距。
4.2 商品类目销售情况
最后看下销售情况,可以看出销售商品是否集中,是否存在爆款等。
代码:
#2、商品类目销售情况
leimuDf = userbehaviorDf[userbehaviorDf['behavior']=='buy'].groupby('category')['userid'].count()
leimuDf = pd.DataFrame({'商品类目销售次数':leimuDf}).reset_index().sort_values('商品类目销售次数',ascending=False).reset_index(drop=True)
leimuDf.head(20)
结果如下:
top20的商品销量如图所示,商品类目销售情况中有较为明显的集中趋势,可以根据类目优化商品展示,加强商品捆绑,进而提高销量。
五、结论
本文通过分析了阿里云提供的约400万条淘宝APP用户行为数据,从四个不同角度分析业务问题,得出如下结论。
角度1.AARRR模型分析用户使用的各个环节
1)用户获取
在研究时段内,每天都有新增用户,除去第一天数据,每天新增用户在递减,同时在推出营销活动的周末有小幅回升。可知推出的营销活动能够对新用户产生吸引。另外周末的自然流量增加也可能有贡献。
2)用户激活
在购物环节中收藏和加入购物车都是确定购物意向的行为,这里将两个环节合并为购物环节中的一个环节。
从浏览到有购买意向的转化率为88%,从有购买意向到实际购买有77%的转化率,当前转化率很高,由于有些人可能浏览后直接购买,意向到实际购买转化率偏高,可以考虑改善和提高这一环节。
针对这一环节改善转化率的建议有:
①优化电商平台的搜索匹配度和推荐策略,主动根据用户喜好推荐相关的商品,优化商品搜索的准确度和聚合能力,对搜索结果排序优先级进行优化;
②给客户提供同类产品比较的功能,让用户不需要多次返回搜索结果反复查看,便于用户确定心怡产品;
③在商品详情页的展示上突出用户关注的重点信息,精简信息流的呈现方式,减少用户寻找信息的成本;
④优化加入购物车和收藏按键的触达,用户在滑屏时也能方便触达,增加功能使用的次数。
3)用户留存
淘宝APP的留存表现稳定,周留存表现优秀,但次日留存略显不理想,可以结合产品设计和新用户转化路径来分析用户的流失原因,通过不断的修改和调整来降低用户流失,提升次日留存率;另外,12月2日、3日的留存率相较之前有3%左右的上涨,故营销活动能为提升留存带来一定正向的影响。
4)获得收益
使用APP的用户中有68%的付费用户,付费转化率相当高。
有购买行为的用户中,大概有66%的用户会重复购买,淘宝APP的整体复购率相对可观,但复购人数超过5次的用户占总购买用户的不到10%,应将经营重点转化为培养用户的忠诚度上,鼓励用户更高频次的消费。
5)推荐传播
本次分析中未包含用户分享数据,故未进行分析。
角度2.不同时间尺度下的用户行为模式分析
针对日期的统计可以发现,促销日的点击量和加购量有明显上涨,故可多推出营销活动,同时要考虑到营销活动触达用户的方式。
针对每天的统计可以看出,中午12-14点是浏览和购买高峰。高峰期营销活动收益高,因此可以在午间增加一些营销活动,如限时抢购等。
角度3.通过RFM模型分析用户行为
本次数据无购买金额,这里使用最近一次购买时间和购买频率对用户进行打分。
价值评分是44的用户是体系中的最有价值用户,需要重点关注。
价值评分是31、21、11的用户较多,其购买次数较少,运营活动需要重点针对这部分用户,增加促销活动宣传力度,进行有效唤回。
角度4.商品销售的策略分析
根据对不同商品售卖次数的分析可知,样本数据中的商品销售依靠长尾商品,而非爆款商品。销量最高的商品不在浏览榜单前20位置,而浏览次数最高的商品也没有进入销量前20,说明吸引用户更多注意力的商品和销量关系不大。
针对浏览量高而销量不高的这部分商品,商家可以从以下几个方面提高销售额:
①诚信吸引用户,有的商家为吸引用户点击,在商品展示页投放的价格具有较强吸引力,而实际价格偏高,反而造成用户流失;
②从用户角度出发设计详情页信息流展示,便于用户获取信息;
③优化商品展示的形式,可以采用视频等更直观的展示方式;
④评论区评价管理,尤其对于差评区的用户反馈进行认真对待,分析自身劣势,并做出积极的回应和弥补。
最后,特别鸣谢:电商用户行为数据分析