淘宝用户行为分析项目

淘宝用户行为分析项目

说明:项目通过jupter notebook。使用pandas,numpy,matplotlib,seaborn等第三方库对数据进行不同维度上的分析。

一、项目背景

本数据报告以淘宝app平台为数据集,通过行业的指标对淘宝用户行为进行分析,从而探索淘宝用户的行为模式,具体指标包括:日PV和日UV分析,付费率分析,复购行为分析,漏斗流失分析和用户价值RFM分析。
在这里插入图片描述

二、数据源

链接: https://pan.baidu.com/s/1468_ZeV0N_J1_FSyUgEMeQ
提取码:3c5c

三、要解决的问题

1.日pv有多少

2.日uv有多少

3.付费率情况

4.复购率是多少

5.漏斗流失情况如何

6.用户价值情况

四、数据说明

本数据集共有104万条左右数据,数据为淘宝APP2014年11月18日至2014年12月18日的用户行为数据,共计6列字段,列字段分别是:

user_id:用户身份,脱敏

item_id:商品ID,脱敏

behavior_type:用户行为类型(包含点击、收藏、加购物车、支付四种行为,分别用数字1、2、3、4表示)

user_geohash:地理位置

item_category:品类ID(商品所属的品类)

time:用户行为发生的时间

五、数据清洗
# 导入必要库
import pandas as pd
import numpy as py
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import re
# 导入数据(注意:需要输入数据的绝对路径)
data_user=pd.read_csv('E:/PythonData/tianchi_mobile_recommend_train_user.csv')
# 查看缺失值
missingTotal = data_user.isnull().sum()
missingTotal

在这里插入图片描述

# 查看前5行数据
data_user.head()

在这里插入图片描述

# 通过正则表达式分别提取日期和时间
import re 
# 提取日期
data_user['date'] = data_user['time'].map(lambda s:re.compile(' ').split(s)[0])
# 通过正则表达式提取小时
data_user['hour'] = data_user['time'].map(lambda s:re.compile(' ').split(s)[1])
# 查看数据
data_user.head()

在这里插入图片描述

# 查看数据类型
data_user.dtypes

在这里插入图片描述

# 将日期和时间转换成相对应的格式
data_user['date']=pd.to_datetime(data_user['date'])
data_user['time']=pd.to_datetime(data_user['time'])

#将小时转换成整形
data_user['hour']=data_user['hour'].astype('int64')
data_user.dtypes

在这里插入图片描述

# 将数据通过time字段进行升序排列
data_user = data_user.sort_values(by='time',ascending=True)

# 排序之后,重新设置索引,得到新的数据集
data_user = data_user.reset_index(drop=True)
data_user

在这里插入图片描述

# 查看数据的统计数据
data_user.describe()

在这里插入图片描述

六、用户行为分析

1、pv和uv分析

PV(访问量):即Page View, 具体是指网站的是页面浏览量或者点击量,页面被刷新一次就计算一次。

UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。

1、日访问量分析
# pv_daily记录每天用户操作次数,uv_daily记录每天不同的上线用户数量

# 日访问量(对日期分组,并对用户id进行计数聚合。重新设置索引,将字段user_id重命名为pv)
pv_daily=data_user.groupby('date')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})

# 日访客量(操作同上,区别在于对不同的user_id进行去重计数)
uv_daily=data_user.groupby('date')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})

#添加中文
plt.rcParams['font.sans-serif'] = ['SimHei']

# 创建图形
plt.figure(figsize=(20,8),dpi=80)
plt.plot(pv_daily.date,pv_daily.pv)

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('日期',size=15)
plt.ylabel('访问量',size=15)

#添加标题
plt.title('pv_daily(日访问量)',size=15)

在这里插入图片描述

# 创建图形
plt.figure(figsize=(20,8),dpi=80)
plt.plot(uv_daily.date,uv_daily.uv)

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('日期',size=15)
plt.ylabel('访客量',size=15)

#添加标题
plt.title('uv_daily',size=15)

在这里插入图片描述
由上图:在双十二期间,访问量和访客量达到的峰值。

2、每小时访问量分析
#pv_hour记录每小时用户操作次数,uv_hour记录每小时不同的上线用户数量
# 每小时的访问量(对小时进行分组,然后对用户id进行计数聚合,重新设置索引,将用户id重命名为pv)
pv_hour=data_user.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})

# 每小时访客量(操作同上,区别在于对用户id进行了去重计数)
uv_hour=data_user.groupby('hour')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})

# 创建图形
plt.figure(figsize=(20,8),dpi=80)
plt.plot(pv_hour.hour,pv_hour.pv)

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('小时',size=15)
plt.ylabel('每小时访问量',size=15)

#添加标题
plt.title('pv_hour(每小时访问量)',size=15)

在这里插入图片描述
由上图可见,在晚上8.00期间,访客量和访问量是最多的。

3、不同行为类型用户pv分析
# 对不同类型的用户行为和小时进行分组
pv_detail=data_user.groupby(['behavior_type','hour'])['user_id'].count().reset_index().rename(columns={'user_id':'total_pv'})

# 查看前10行数据
pv_detail.head(10)

在这里插入图片描述

# 创建图形
plt.figure(figsize=(20,8),dpi=80)

# 绘制不同行为类型用户的每小时pv情况折线图
plt.plot(pv_detail[pv_detail.behavior_type==1].hour,pv_detail[pv_detail.behavior_type==1].total_pv,label='点击',color='r')
plt.plot(pv_detail[pv_detail.behavior_type==2].hour,pv_detail[pv_detail.behavior_type==2].total_pv,label='收藏',color='b')
plt.plot(pv_detail[pv_detail.behavior_type==3].hour,pv_detail[pv_detail.behavior_type==3].total_pv,label='加购物车',color='y')
plt.plot(pv_detail[pv_detail.behavior_type==4].hour,pv_detail[pv_detail.behavior_type==4].total_pv,label='支付',color='g')

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('时间/小时',fontsize=12)
plt.ylabel('数量',fontsize=12)

# 添加图例
plt.legend(loc='best',fontsize=15)

# 添加标题
plt.title('不同用户行为pv分析',fontsize=15)

在这里插入图片描述

3.1 仅对比用户行为为收藏、加购物车、支付的pv情况
# 创建图形
plt.figure(figsize=(20,8),dpi=80)

# 绘制收藏、加购物车、支付的pv折线图
plt.plot(pv_detail[pv_detail.behavior_type==2].hour,pv_detail[pv_detail.behavior_type==2].total_pv,label='收藏',color='b')
plt.plot(pv_detail[pv_detail.behavior_type==3].hour,pv_detail[pv_detail.behavior_type==3].total_pv,label='加购物车',color='y')
plt.plot(pv_detail[pv_detail.behavior_type==4].hour,pv_detail[pv_detail.behavior_type==4].total_pv,label='支付',color='g')

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('时间/小时',fontsize=15)
plt.ylabel('数量',fontsize=15)

# 添加图例
plt.legend(loc='best',fontsize=20)

# 添加标题
plt.title('不同类型用户行为pv分析2',size=15)

在这里插入图片描述

由上图图表显示:

点击这一用户行为相比较于其他三类用户行为,pv访问量较高,同时四种用户行为的波动情况基本一致,因此晚上这一时间段不管哪一种用户行为,pv访问量都是最高的。

从图2可以看出,加入购物车这一用户行为的pv总量高于收藏的总量,因此在后续漏斗流失分析中,用户类型3应该在2之前分析。

七、用户消费行为分析
1、用户购买次数情况分析
# 对数据进行筛选,类型4为支付。对用户id进行分组,对支付类型的数量进行计聚合
data_user_buy=data_user[data_user.behavior_type==4].groupby('user_id')['behavior_type'].count()

# 得到的data_user_buy 为以为序列,索引用户id,值代表为该用户的支付次数
data_user_buy.head(10)

在这里插入图片描述

# 绘制频数直方图,查看购买次数及对应人数的分布
# 创建图形
plt.figure(figsize=(20,8),dpi=80)

# 绘制频数直方图
plt.hist(data_user_buy,bins=50,color = 'steelblue',edgecolor = 'k')

# 调整刻度
plt.xticks(range(100)[::10],size=12)

plt.xlim(0,100)

# 添加标注
plt.xlabel('人数',size=15)
plt.ylabel('购买次数',size=15)

# 添加标题
plt.title('daily_user_buy',size=15)

在这里插入图片描述

# 绘制频率直方图
plt.figure(figsize=(20,8),dpi=80)

# 创建频率直方图
plt.hist(data_user_buy,bins=50,color = 'steelblue',edgecolor = 'k',density = True)

# 调整刻度
plt.xticks(range(100)[::10],size=12)

# 添加标注
plt.xlabel('人数',size=15)
plt.ylabel('频率',size=15)

# 添加标题
plt.title('daily_user_buy',size=15)

plt.xlim(0,100)
plt.show()

在这里插入图片描述

2、日ARPPU

ARPPU(average revenue per paying user)是指从每位付费用户身上获得的收入,它反映的是每个付费用户的平均付费额度。

ARPPU=总收入/活跃用户付费数量

因为本数据集中没有消费金额,因此在计算过程中用消费次数代替消费金额

人均消费次数=消费总次数/消费人数

# 创建新的DataFrame,重新设置索引0,1,2,3... ...
data_use_buy1=data_user[data_user.behavior_type==4].groupby(['date','user_id'])['behavior_type'].count().reset_index().rename(columns={'behavior_type':'total'})

# 查看前10行数据
data_use_buy1.head(10)

在这里插入图片描述

data_use_buy1 = data_use_buy1.groupby('date').apply(lambda x:x.total.sum()/x.total.count())

# 查看数据
data_use_buy1.head()

在这里插入图片描述

plt.figure(figsize=(20,8),dpi=80)
plt.plot(data_use_buy1)

#调整刻度
plt.xticks(size=13)
plt.yticks(size=13)

# 添加标注
plt.xlabel('日期',size=20)
plt.ylabel('人均消费次数',size=20)

# 添加标题
plt.title('人均消费次数',size=20)

在这里插入图片描述
图表显示:平均每天消费次数在1-2次之间波动,双十二期间消费次数达到最高值。

3、日ARPU

ARPU(Average Revenue Per User) :平均每用户收入,可通过 总收入/AU 计算得出。它可以衡量产品的盈利能力和发展活力。

活跃用户数平均消费次数=消费总次数/活跃用户人数(每天有操作行为的为活跃)

data_user['operation']=1
data_use_buy2=data_user.groupby(['date','user_id','behavior_type'])['operation'].count().reset_index().rename(columns={'operation':'total'})

data_use_buy2 = data_use_buy2.groupby('date').apply(lambda x:x[x.behavior_type==4].total.sum()/len(x.user_id.unique()))

# 查看前5行数据
data_use_buy2.head()

在这里插入图片描述

# 创建图形
plt.figure(figsize=(20,8),dpi=80)
# 绘制折线图
plt.plot(data_use_buy2)

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标志
plt.xlabel('日期',size=15)
plt.ylabel('平均消费次数',size=15)

# 添加标题
plt.title('活跃用户数平均消费次数',size=15)

# 显示图形
plt.show()

在这里插入图片描述

4、日付费率

付费率=消费人数/活跃用户人数

data_use_buy2=data_user.groupby(['date','user_id','behavior_type'])['operation'].count().reset_index().rename(columns={'operation':'total'})
daily_afford_rate = data_use_buy2.groupby('date').apply(lambda x:x[x.behavior_type==4].total.count()/len(x.user_id.unique()))

# 查看前5行数据
daily_afford_rate.head()

在这里插入图片描述

# 创建图形
plt.figure(figsize=(20,8),dpi=80)
# 绘制折线图
plt.plot(daily_afford_rate)

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加备注
plt.xlabel('日期',size=15)
plt.ylabel('付费率',size=15)

# 添加标题
plt.title('日付费率',size=15)

# 显示图形
plt.show()

在这里插入图片描述

5、同一时间段用户消费次数分布
data_user_buy3=data_user[data_user.behavior_type==4].groupby(['user_id','date','hour'])['operation'].sum().rename('buy_count')

plt.figure(figsize=(20,8),dpi=80)
plt.hist(data_user_buy3,bins=50,density = True)

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('购买次数',size=15)
plt.ylabel('频率',size=15)

# 添加标题
plt.title('同一时间用户消费次数分布')

print('大多数用户消费:{}次'.format(data_user_buy3.mode()[0]))

大多数用户消费:1次
在这里插入图片描述

八、复购情况分析
1、复购率

复购情况,即两天以上有购买行为,一天多次购买算一次
复购率=有复购行为的用户数/有购买行为的用户总数

date_rebuy=data_user[data_user.behavior_type==4].groupby('user_id')['date'].apply(lambda x:len(x.unique())).rename('rebuy_count')

# 复购行为筛选:date_rebuy>=2,保留4位有效数字
print('复购率:',round(date_rebuy[date_rebuy>=2].count()/date_rebuy.count(),4))

复购率: 0.8717

2、所有复购时间间隔消费次数分布
data_day_buy=data_user[data_user.behavior_type==4].groupby(['user_id','date']).operation.count().reset_index()
data_user_buy4=data_day_buy.groupby('user_id').date.apply(lambda x:x.sort_values().diff(1).dropna())
data_user_buy4=data_user_buy4.map(lambda x:x.days)

# 创建图形
plt.figure(figsize=(20,8),dpi=80)

# 绘制条形图
data_user_buy4.value_counts().plot(kind='bar')

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('gap_day',size=15)
plt.ylabel('gap_count',size=15)

# 添加标题
plt.title('time_gap',size=15)

在这里插入图片描述
多数用户复购率为 0.8717,消费次数随着消费时间间隔的增加而不断下降,在1-10天之内复购次数比较多,10天之后复购次数淘宝用户很少在进行复购,因此需要重视10天之内的淘宝用户复购行为,增加用户复购。不同用户平均复购时间呈正态分布,但是总体来看,呈现逐渐下降趋势。多数淘宝用户平均复购时间集中在1-5天时间间隔内。

3、不同用户平均复购时间分析
# 创建图形
plt.figure(figsize=(20,8),dpi=80)

# 绘制平均复购时间分布直方图
sns.distplot(data_user_buy4.reset_index().groupby('user_id').date.mean())

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('gap_day',size=15)
plt.ylabel('gap_count',size=15)

# 添加标题
plt.title('time_gap',size=15)

在这里插入图片描述
由上图:不同用户平均复购时间呈正态分布。从总体来看,呈现逐渐下降趋势。多数淘宝用户平均复购时间集中在1-5天时间间隔内。

九、漏斗流失分析

漏斗分析是一套流程式数据分析,它能够科学反映用户行为状态以及从起点到终点各阶段用户转化率情况的重要分析模型。
在这里插入图片描述

1、计算各个阶段的流失率

注:在上面不同行为类型用户pv分析中,加入购物车这一用户行为的pv总量高于收藏的总量,因此在漏斗流失分析中,用户类型3应该在2之前分析。

# 对用户类型进行分组,然后进行计数
# 对所有的id进行计数(1:点击 2:收藏 3:加购物车 4:支付)
pv_all=data_user['user_id'].count()
pv_1 = data_user[data_user.behavior_type==1]['user_id'].count()
pv_2 = data_user[data_user.behavior_type==2]['user_id'].count()
pv_3 = data_user[data_user.behavior_type==3]['user_id'].count()
pv_4 = data_user[data_user.behavior_type==4]['user_id'].count()

print(pv_all,pv_1,pv_2,pv_3,pv_4)

12256906 11550581 242556 343564 120205

# 各个阶段的流失率计算
Wastage_rate1 = round(1-pv_1/pv_all,4)
Wastage_rate2 = round(1-pv_3/pv_1,4)
Wastage_rate3 = round(1-pv_2/pv_3,4)
Wastage_rate4 = round(1-pv_4/pv_2,4)

# 格式化输出各个流失率
print('总浏览量—点击量的流失率为%s%%'%(Wastage_rate1*100))
print('点击量-加入购物车量的流失率为%s%%'%(Wastage_rate2*100))
print('加入购物车量-收藏量的流失率为%s%%'%(Wastage_rate3*100))
print('收藏量-购买量的流失率为%s%%'%(Wastage_rate4*100))

总浏览量—点击量的流失率为5.76%点击量-加入购物车量的流失率为97.03%加入购物车量-收藏量的流失率为29.4%收藏量-购买量的流失率为50.44%

十、用户行为与商品种类关系分析
1、不同用户行为类别的转化率
data_category=data_user[data_user.behavior_type!=2].groupby(['item_category','behavior_type']).operation.count().unstack(1).rename(columns={1:'点击量',3:'加入购物车量',4:'购买量'}).fillna(0)

# 查看前10行数据
data_category.head(10)

在这里插入图片描述

#转化率计算
data_category['转化率']=data_category['购买量']/data_category['点击量']
data_category.head(10)

在这里插入图片描述

#异常值处理
data_category=data_category.fillna(0)
data_category=data_category[data_category['转化率']<=1]

# 创建图形
plt.figure(figsize=(20,8),dpi=80)

#转化率绘图
sns.distplot(data_category['转化率'])

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('转化率',fontsize=15)
plt.ylabel('density',fontsize=15)

# 添加标题
plt.title('转化率分布',size=15)

在这里插入图片描述
图表显示:基本上各种用户行为类型转换率都在0.1以内,同时绝大多数用户都没有购买情况,需要重点关注出现该现象的原因进行分析改进。

2、感兴趣比率
data_category['感兴趣比率']=data_category['加入购物车量']/data_category['点击量']
data_category.head(10)

在这里插入图片描述

#异常值处理,感兴趣比率绘图
data_category=data_category[data_category['感兴趣比率']<=1]

# 创建图形
plt.figure(figsize=(20,8),dpi=80)
sns.distplot(data_category['感兴趣比率'])

# 调整刻度
plt.xticks(size=12)
plt.yticks(size=12)

# 添加标注
plt.xlabel('感兴趣比率',fontsize=15)
plt.ylabel('density',fontsize=15)

添加标题
plt.title('感兴趣比率分布情况',size=15)

在这里插入图片描述
图表显示:感兴趣率和转化率类似,基本也是0.1以内,说明用户点击的绝大多数商品并非感兴趣,需要重视推荐系统的调整。

十一、二八理论分析

二八定律:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的,因此又称二八定律。

#二八理论和长尾理论
data_category=data_category[data_category['购买量']>0]
value_8=data_category['购买量'].sum()*0.8
value_10=data_category['购买量'].sum()
data_category=data_category.sort_values(by='购买量',ascending=False)
data_category['累计购买量']=data_category['购买量'].cumsum()
data_category['分类']=data_category['累计购买量'].map(lambda x:'前80%' if x<=value_8 else '后20%')
data_category.head()

在这里插入图片描述

data_category.groupby('分类')['分类'].count()/data_category['分类'].count()

在这里插入图片描述
图表显示:前80%销量有15%左右的商品品类承包,接近二八原则。但我们也看出有接近20%的销量由85%的商品品类提供。

对于传统零售行业,因为成本高,因此只能局限于这前20%的商品提供利润;

对于电子商务,空间成本减少乃至为0,使后80%的商品也可以销售出去,因此将长尾部分的商品优化推荐好,能够给企业带来更大的收益。

十二、用户价值度RFM模型分析

RFM的含义:

R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。

F(Frequency):客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。

M(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。

RFM分析就是根据客户活跃程度和交易金额的贡献,进行客户价值细分的一种方法。
在这里插入图片描述

from datetime import datetime
datenow=datetime(2014,12,20)

#每位用户最近购买时间
recent_buy_time=data_user[data_user.behavior_type==4].groupby('user_id').date.apply(lambda x:datetime(2014,12,20)-x.sort_values().iloc[-1]).reset_index().rename(columns={'date':'recent'})
recent_buy_time.recent=recent_buy_time.recent.map(lambda x:x.days)

#每个用户消费频率
buy_freq=data_user[data_user.behavior_type==4].groupby('user_id').date.count().reset_index().rename(columns={'date':'freq'})
rfm=pd.merge(recent_buy_time,buy_freq,left_on='user_id',right_on='user_id',how='outer')

#将各维度分成两个程度,分数越高越好
rfm['recent_value']=pd.qcut(rfm.recent,2,labels=['2','1'])
rfm['freq_value']=pd.qcut(rfm.freq,2,labels=['1','2'])
rfm['rfm']=rfm['recent_value'].str.cat(rfm['freq_value'])
rfm.head(10)

在这里插入图片描述

表格显示:因为本数据集没有提供消费金额,因此只能R和F进行用户价值分析,通过RF用户价值分析,对于22用户,为重点用户需要关注;对于21这类忠诚度高而购买能力不足的,可以可以适当给点折扣或捆绑销售来增加用户的购买频率。对于12这类忠诚度不高而购买能力强的,需要关注他们的购物习性做精准化营销。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜的乄第七章

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值