淘宝用户行为统计分析-python

一 分析背景

本案例数据来源于https://tianchi.aliyun.com/dataset/dataDetail?dataId=649,是阿里巴巴提供的一个淘宝用户行为数据集,其中包含了2017年11月25日至2017年12月3日之间,约一百万个随机用户的所有用户行为(行为包括点击、购买、加购、收藏),关于数据集中的每一列介绍如下:

列名称 说明
用户ID 整数类型,序列化后的用户ID
商品ID 整数类型,序列化后的商品ID
商品类目ID 整数类型,序列化后的商品所属类目ID
行为类型 字符串,枚举类型,包括(‘pv’, ‘buy’, ‘cart’, ‘fav’)
时间戳 行为发生的时间戳

其中行为类型分四种,如下:

行为类型 说明
pv 商品详情页pv,等价于点击
buy 商品购买
cart 将商品加入购物车
fav 收藏商品

二 分析目的

首先我们需要知道什么是用户行为分析(What),为什么进行用户行为分析(Why),如何进行用户行为分析(How)。
1 What
用户行为分析是指对用户的行为数据进行数据分析、研究,从中发现用户行为的规律。
2 Why
从时间的维度来看,通过对用户行为路径的分析可以帮助企业发现:用户从哪里来?用户做了什么操作?用户从哪里流失的?用户为什么流失?
从空间的维度来看,根据用户的行为特征构建用户画像,进而实现精准营销和提升用户体验,达到提升企业盈利的目的。
3 How
如何对用户行为进行分析?已知分析目的,我们需要开启分析思路,将研究目的分解为研究内容,分析思路可分 3种方法:学会提问、熟悉模型和结构化思维。使用结构化思维能全面的思考一个问题使其符合MECE原则,其中结构化思维包括结构思维、时间思维、演绎思维和重要性思维4条逻辑线索。
在时间线索上,可以应用用户行为五阶段理论,用户行为包括产生需求、信息收集、方案比选、购买决策和购后行为五个阶段,用户行为五阶段理论细致全面的考虑了用户购买和使用产品的全流程,符合MECE的不重不漏原则。其次在结构线索上可用5W2H分析法,时间、地点、人物、事件、原因、方式方法、程度七要素,简称5W2H分析法,5W2H分析法应用很广,套用在用户行为分析上就是回答谁(who),时间(when),地点(where),购买什么东(what),为什么买(why),如何买(how),买了多少、花多少钱、买多少次(how much)。5W2H全面细致考虑用户行为的构成要素,符合MECE原则。仅从时间或结构线索考虑问题不够全面,于是从结构和时间两条逻辑线索出发,使用5W2H分析法和用户行为五阶段理论结合行业特点形成用户行为的分析体系,这样会更加全面。
我认为使用用户行为五阶段理论以及5W2H分析法对用户行为进行分析,更适用于市场营销,对单类产品的用户行为进行分析。本案例数据量巨大,种类繁多,且无法从用户行为的整个周期进行分析,但也可以从信息收集、方案比选、购买决策和购后行为的时间线索对用户行为进行分析。 本案例使用模型法进行分析,使用漏斗转化模型和RFM模型进行分析,通过漏斗转化模型对用户行为的各个环节进行分析,发现其薄弱环节,优化该步骤从而达到提升整体盈利,使用RFM模型对用户进行分类,找出有价值用户从而对用户实行精准营销。

三 分析思路

使用统计学方法对用户习惯以及销售规律进行描述统计分析;使用转化漏斗模型对用户行为步骤进行分析,找到其薄弱环节并给出相关建议;使用RFM模型对用户进行分类,找到有价值用户实施进准营销,其具体分析思路如下:
在这里插入图片描述

四 数据处理

数据处理具体可细化为4项任务:数据集成、数据清洗、数据转换和数据消减 。

  • 数据集成是将来自多个数据源的数据合并到一起;
  • 数据清洗要完成四项任务:数据筛选、数据查重、数据补缺以及数据纠错;
  • 数据转换是对数据进行标准化处理;
  • 数据消减是通过因子分析,将数据聚合和降维,以缩小数据的规模。

本案例数据集大小约为3.41G,对于大量数据使用Python进行数据分析是比较方便快速的。本案例不需要对数据进行集成,从数据清洗开始。

4.1 数据导入

由于数据量巨大,使用分块进行导入,其代码如下:

import pandas as pd
import time
reader=pd.read_csv('F:\\Dataanalysis\\UserBehavior\\userbehavior.csv',iterator=True) #返回TextParser对象,可迭代
chunksize=100000
loop=True
chunks=[]
while loop:
    try:
        chunk=reader.get_chunk(chunksize)
        chunks.append(chunk)
    except:
        loop=False
        print('Iterator is over!')
#轴向连接
df=pd.concat(chunks,ignore_index=True) #忽略原索引

4.2 数据清洗

先对列进行命名,分别为user_id、item_id、category_id、behavior、timestamp,然后进行去重,本案例以user_id、item_id和timestamp为主键进行去重,其代码如下:

#对列进行命名
columns=['user_id','item_id','category_id','behavior','timestamp']
df.columns=columns 
#以这三列为主键进行去重
df1=df.drop_duplicates(['user_id','item_id','timestamp'])

数据集包含的是用户2017年11月25日至2017年12月3日之间的数据,需要对数据集中的时间进行检查纠错,其中定义了get_unixtime()函数,目的是将字符串类型时间转化为Timestamp类型,获得Timestamp类型的时间有两个办法 ① time.time( )方法获得 ② 将time.struct_time类型转化为Timestamp类型,本例使用第二种方法,先将Time string类型转化为time.struct_time类型再转化为Timestamp,其代码如下:

扫描二维码关注公众号,回复: 11954590 查看本文章
#定义获得时间戳的函数
def get_unixtime(timestr):
    formatstr='%Y-%m-%d %H:%M:%S'
    tmobj=time.strptime(timestr,formatstr)
    tmstamp=time.mktime(tmobj)
    return int(tmstamp)
#获取时间集的时间范围
starttime=get_unixtime('2017-11-25 00:00:00')
endtime=get_unixtime('2017-12-03 23:59:59')
#筛选时间在合理范围内的数据
df_out=df1[(df['timestamp']>=starttime) & (df['timestamp']<=endtime)]

对处理后的数据进行查看,其代码如下:

print(df.shape)
print(df1.shape)
print(df_out.shape)

输出结果如下:
(100150806, 5)
(100150753, 5)
(100095177, 5)
可知数据集中有53条记录重复,55636条记录的时间不在合理范围内。

由于数据集过于庞大,其中有一亿多条数据,在这里我们选用500万条数据进行分析,使用DataFrame.sample()方法随机抽样,其参数 frac为抽取的比例,random_state=None取得的数据不可重复,为1时可取得重复数据。并对其缺失值进行检查,其代码如下:

#随机抽取500万条数据
tb=df_out.sample(frac=0.05,random_state=None)
tb.reset_index(drop=True,inplace=True)
tb.isnull().sum()

输出结果如下:
user_id 0
item_id 0
category_id 0
behavior 0
timestamp 0
可知筛选出来的数据集没有缺失值。

4.3 数据转换

将数据中Timestamp类型的时间转化为我们所熟知的datetime类型,新增datetime、date和time列,其代码如下:

from datetime import datetime
tb['datetime']=tb['timestamp'].apply(lambda x: datetime.fromtimestamp(x))
tb['date']=tb['datetime'].dt.date
tb['time']=tb['datetime'].dt.time
tb['hour']=tb['datetime'].dt.hour

处理后的数据格式如下所示:

user_id item_id category_id behavior timestamp datetime date time hour
974855 4790420 982926 pv 1512101950 2017-12-01 12:19:10 2017-12-01 12:19:10 12

将原数据导出保存,其代码如下:

tb.to_csv('F:\\Dataanalysis\\UserBehavior\\userbehavior1.csv')

五 统计分析

5.1 用户习惯

1 pv、uv以及平均访问量
求出2017-11-25至2017-12-3七天的淘宝页面的访问量pv,七天内的访客数uv以及七天的人均访问量,其代码如下:

pv=tb[tb.behavior=='pv']['user_id'].count()
uv=len(tb[tb.behavior=='pv']['user_id'].unique())
avg=pv/uv
print('pv={}'.format(pv))
print('uv={}'.format(uv))
print('平均访问量={:.3}'.format(avg))

可以得出pv=4484331、uv=864404、每位用户七天内的平均访问量=5.19
2 跳失率
跳失率为只有点击行为的用户占总点击用户的比例,跳失率反映了商品页面对用户的吸引力,跳失率很高表明商品页面对用户吸引力很低,这不利于商品的转化率,跳失率的计算代码如下:

uv_sum=len(tb[tb.behavior=='pv']['user_id'].unique())
t=(uv_sum-len(tb[tb.behavior!='pv']['user_id'].unique()))/uv_sum
print('跳失率为{:.2f}%'.format(t*100))

得出跳失率t=60.7%,需结合行业数据和以往分析判断跳失率是否处于正常范围,如果偏高则需要对商品界面进行优化,以提升客户吸引力。
3 日访问量及访问人数
日访问量反映了网站的运营情况,其通常会结合MAU(月访问量)一起使用,这两个指标一般用来衡量服务的用户粘性以及服务的衰退周期,可以对营销和推广提供数据上的支持。本案例对日访问量进行计算,其代码及结果如下:

import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
pv_day=tb[tb.behavior=='pv'].groupby('date')['user_id'].count().reset_index().rename(columns={
    
    'user_id':'pv_daily'})
uv_day=tb[tb.behavior=='pv'].drop_duplicates(['user_id','date']).groupby('date')[['user_id']].count().reset_index().rename(columns={
    
    'user_id':'uv_daily'})
fig,axes=plt.subplots(1,1,figsize=(10,6))
ax=sns.lineplot(x='date',y='pv_daily',data=pv_day,label='pv_daily')
ax=sns.lineplot(x='date',y='uv_daily',data=uv_day,label='uv_daily')
ax.set_ylabel('counts')

在这里插入图片描述
由图可知2017年12月2号3号相对比于上个周末日访问量以及访问人数有着明显的增长,推测为临近双12商家进行促销推广等活动,在周一至周五日pv波动平缓相对周末人数较少,这与大部分人工作休息时间相符。
4 时段访问量
对一天中的各个时段的pv,uv进行分析,可得出最佳推广营销等的时间段,其代码及结果如下:

pv_hour= tb[tb.behavior=='pv'].groupby('hour')['user_id'].count().reset_index().rename(columns={
    
    'user_id':'pv_hour'})
uv_hour=tb[tb.behavior=='pv'].drop_duplicates(['user_id','hour']).groupby('hour')['user_id'].count().reset_index().rename(columns={
    
    'user_id':'uv_hour'})
fig,axes=plt.subplots(1,1,figsize=(10,6))
plt.xticks(range(24))
ax=sns.lineplot(x='hour',y='pv_hour',data=pv_hour,label='pv_hour')
ax=sns.lineplot(x='hour',y='uv_hour',data=uv_hour,label='uv_hour')
ax.set_ylabel('counts')

在这里插入图片描述
由图可知从0点到8点访客及点击量较少,4点访问人数到达最低点,此阶段为睡眠时间,符合作息规律;在10点到16点访客数量较为平稳;在18点到21点访客数量快速增加,在21点到达最大值,这个时间段为晚饭过后睡眠之前的放松时间,人们有更多时间精力购物,平台可以抓住21点左右的黄金时段进行营销、推广以达到最佳效果。

5.2 销售规律

1 成交量
由于数据不考虑是否付款以及后续行为,暂时认为一次buy行为即为一次成交,每天成交量代码以及结果如下:

vol=tb[tb.behavior=='buy'].groupby('date')[['user_id']].count().rename(columns={
    
    'user_id':'volume'}).reset_index()
plt.figure(figsize=(10,5))
sns.set(style='whitegrid')
ax=sns.barplot(x='date',y='volume',data=vol)

在这里插入图片描述
由图可知,11月最后一个周末成交量低于最后一周成交量,在12月2号3号成交量显著提高,推测为越靠近近双十二,商品推销打折活动的力度及其数量增加,提高了成交量。
2 复购率
复购率,就是顾客购买一次产品之后,觉得产品不错,又产生第2次甚至第N次的购买的比例,顾客购买的次数越多,直接反应了对产品的忠诚度。如今线上获客成本越来越高,想要提高线上用户新量变得越来越难,而已有用户对于我们来说是相当重要的,这个时候提升已有用户的复购率就变成非常重要!
复购率有多种计算方式,主要按客户进行计算,指在单位时间段内,再次购买人数/总购买人数,计算出来的比例,则为重复购买率,对于再次购买的定义有以下两种:
a.按天非去重,即一个客户一天产生多笔付款交易,则算重复购买;
b.按天去重,即一个客户一天产生多笔交易付款,则算一次购买,除非在统计周期内另外一天也有购买;
按天非去重,是b2c网站统计数据常用计算方法,相对计算出来的重复购买率要高于第二种,本案例使用按天非去重进行计算,其代码如下:

user_buy_data=tb[tb.behavior=='buy'].groupby('user_id')['date'].count()
user_buy=user_buy_data.count()
user_rebuy=user_buy_data[user_rebuy_data>1].count()
print('复购率为:{:.2f}%'.format(user_rebuy/user_buy*100))
复购率为:9.73%

可以得出用户9天的复购率为9.73%,淘宝用户数量巨大,在淘宝下沉扩展获取新用户的同时,提高复购率应是更重要的事情,淘宝可从产品质量、用户体验以及服务等多方面进行改善,提高用户复购率。

5.3 漏斗模型

用户的收藏和加购物车并没有明显的先后顺序,故将其合并进行漏斗分析,其代码以及结果如下:

from pyecharts import options as opts
from pyecharts.charts import Funnel
df=tb.groupby('behavior')['user_id'].count().sort_values(ascending=False)
attr=['pv','cart & fav','buy']
values=list(np.around([df.pv/df.pv*100,(df.cart+df.fav)/df.pv*100,df.buy/df.pv*100],2))
c = (
    Funnel(init_opts=opts.InitOpts(page_title='用户行为转化漏斗'))
    .add(
        "",
        list(zip(attr,values)),
        sort_="descending",
        gap=1,
        label_opts=opts.LabelOpts(position="inside",is_show=True,formatter="{b}: {c}%"),     #标签配置选项
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="用户行为转化漏斗",pos_left='center',pos_top='25'),
                     toolbox_opts=opts.ToolboxOpts(orient='vertical',pos_right='2%')
                    )
)
c.render("funnel.html")

在这里插入图片描述
由图可知,一个用户平均点击浏览的100件商品中加入购物车和收藏的有9.37件,最后购买的有2.24件,从点击到收藏加购的转化率最低,用户大量流失,存在较大增长空间。

5.4 RFM模型

RFM模型是衡量客户价值和客户创利能力的重要工具。该模型通过客户的 最近交易行为Recency)、交易频率(Frequency)以及交易金额(Monetary)三项指标来描述该客户的价值状况。一般来说,会将这三项指标分成几个区间进行评分,通过计算评分找到有价值的用户,并对用户进行分类。
最近一次消费(Recency):是指最近一次消费距离上一次消费之间的时间长短。它反映了客户对产品的态度以及对品牌价值的信任度,它关乎消费者的存留状况;
消费频率(Frequency):是指某个特定时间内消费的次数。它直接反映了客户的忠诚度,消费频率越高,忠诚度就越高,忠诚度越高的客户数量越多,公司的竞争优势越强,市场份额越大;
消费金额(Monetary):是指一定时间内消费某产品金额。它反映的是客户的价值,价值越高,给公司创造的利益就更大。
基于以上三个维度,将每个维度分为高低(1代表高,0代表低)两种情况,可将用户分为8种

R F M 客户类型
1 1 1 重要价值客户
0 1 1 重要保持客户
1 0 1 重要发展客户
0 0 1 重要挽留客户
1 1 0 一般价值客户
0 1 0 一般保持客户
1 0 0 一般发展客户
0 0 0 一般挽留客户

本案例没有金额相关的信息,所以只通过R和F来对客户进行分类。

1 最近一次交易R

以12月3号为参照日期,即距离12月3号的天数为最近一次消费。

tb['datediff']=pd.to_datetime('2017-12-3')-pd.to_datetime(tb1['date'])
user_lastcostday=tb[tb.behavior=='buy'].groupby('user_id')['datediff'].min()
print(user_lastcostday.describe())
print(user_lastcostday.value_counts())

在这里插入图片描述
可知最近一次消费的天数其平均值和中位数大致相等,本案例以中位数判断最近一次消费的评分,即天数小于等于4天的评分为高,大于4天的为低,值为1代表R的评分为高,代码如下:

from datetime import timedelta
user_lastcostday=user_lastcostday.to_frame().rename(columns={
    
    'datediff':'recency'})
user_lastcostday['R']=np.where(user_lastcostday<=timedelta(1),1,0)

2 交易频率F

2017年11月25日至2017年12月3日之间每位用户的消费频率描述性统计如下:

user_costfre=tb[tb.behavior=='buy'].groupby('user_id')['item_id'].count()
print(user_costfre.describe())
print(user_costfre.value_counts())

在这里插入图片描述
同理最近一次消费,用消费频率的中位数判断消费频率高低,即消费频率大于1次的评分为高,反之为低

user_costfre=user_costfre.to_frame().rename(columns={
    
    'item_id':'frequency'})
user_costfre['F']=np.where(user_costfre>1,1,0)

将表user_lastcostday与表user_costfre连接起来,并根据R、F值对用户分类,其代码如下:

user_rf=pd.merge(user_lastcostday,user_costfre,left_index=True,right_index=True)
def user_classify(x,y):
    if x==1 and y==1:
        return '价值客户'
    elif x==0 and y==1:            
        return '保持客户'
    elif x==1 and y==0:
        return '发展客户'
    elif x==0 and y==0:
        return '挽留客户'
    else:
        return np.nan()
user_rf['user_type']=user_rf.apply(lambda x : user_classify(x.R,x.F),axis=1)

使用饼图对用户类型进行统计,代码及饼图如下:

plt.rcParams['font.family']=['SimHei']
users_counts=user_rf['user_type'].value_counts().reset_index().rename(columns={
    
    'index':'user_type','user_type':'count'})
plt.figure(figsize=(10,5))
plt.pie(users_counts['count'],labels=users_counts['user_type'] +users_counts['count'].map(str) ,shadow=True,autopct='%2.2f%%')
plt.show
plt.savefig('F:\\picture\\user_type.jpg')

在这里插入图片描述
由图可知有52.6%的人为发展用户,其次有37.67%为需要挽留的用户,价值客户占比为7.51%,占比最少的为保持用户
对于价值用户,其最近消费时间近,消费频率高,是最优质用户应重点关注并保持;
对于保持用户,其最近消费时间较远,但消费频次很高,说明这是个一段时间没来的忠诚客户,我们需要主动和他保持联系,防止其流失;
对于发展用户,其最近消费时间较近,但频次不高,忠诚度不高,是有潜力的用户,必须重点发展,可通过活动提高其购买频率;
对于挽留用户,最近消费时间较远、消费频次不高,可能是将要流失或者已经要流失的用户,应当给予挽留措施,如赠送优惠券或推送活动信息,唤醒其购买意愿。

六 结论及建议

1 用户习惯
1.1 2017-11-25至2017-12-3这九天内网页的人均访问量为5.19次;
1.2 跳失率即只有点击页面行为的人数占总访问人数的60.7%,商家应改善产品质量,做好售后服务吸引用户进行下一个行为,提高转化率;
1.3 从日访问量曲线可得出,访问人数在12月2号及3号人数显著上升,表明推出的活动具有显著的额效果,吸引大量用户上线,在周一至周五为上班日访问的活跃用户相比周末要少;
1.4 从时段访问量曲线可看出,在晚上21点及22点左右平台活跃人数为一天中最高,商家可在这个时间段进行推广营销以达到最佳效果;
2 销售规律
2.1 从日成交量柱形图看得出,越临近12月3号成交量波动缓慢增加,12月2号3号为九天中成交量最多;
2.2 平台九天的复购率为9.73%,表明总用户中忠诚用户占比不高,淘宝应从产品质量、用户体验等多方面进行改善,提高用户复购率;
3 漏斗模型
3.1 从漏斗模型中可以得出,最后有购买行为的用户仅占总点击用户的2.24%,总转化率不高,用户大量流失,存在较大增长空间,平台应对用户流失进分析,从而找出主要原因并进行改善;
4 RFM模型
4.1 通过RFM模型对用户进行分类并得出各类用户的数量及占比,其中用户主要为发展及挽留客户,价值用户相对较少,平台应对不同用户进行精准营销,提升价值用户的比例。

七(个人总结)

1.本文主要为借鉴各位前辈所写的文章而写的;
2.写本文的目的一是想亲自写去模仿各位前辈的思路方法完整的写下来,从而培养形成自己的思路,二是提高自己对代码的编写运用能力,三是记录监督自己的学习,四是编写过程中加入一点点自己的思考使我对这些知识点能有更加深刻的了解和掌握;
3.由于本人刚接触数据分析,第一次写分析,本文存在很多缺陷不足,如有错误之处还请各位多多指正。

猜你喜欢

转载自blog.csdn.net/weixin_46338676/article/details/107988648