一、项目背景
对淘宝用户行为进行分析,从而探索淘宝用户的行为模式,具体指标包括:日PV和日UV分析,付费率分析,复购行为分析,漏斗流失分析和用户价值RFM分布
二、数据来源
https://tianchi.aliyun.com/dataset/dataDetail?dataId=46&userId=1
三、提出问题
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:用户行为发生的时间
五、数据清洗
5.1导入python中的包
import pandas as pd
from matplotlib import pyplot as plt
import numpy as py
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
data_user = pd.read_csv(r'H:\python案例分析,淘宝\tianchi_mobile_recommend_train_user.csv')
data_user.head()
data_user.shape
查看数据类型
data_user.info()
#缺失值处理
missingTotal=data_user.isnull().sum()
print(missingTotal)
可以看到user_geohash缺失值为8334824,而其他列不缺
这个缺失值,不能删除,因为有其他的关联信息,所以我们这里暂不处理
5.3数据处理。拆数据集
我们把日期和小时拆开,分成两列
拆分日期
#一致化处理
import re
#拆分数据集
data_user['date']=data_user['time'].map(lambda s:re.compile(' ').split(s)[0])
#这个S是data_user['time']的结果,然后通过map函数映射到lambda函数
拆分小时
data_user['hour']=data_user['time'].map(lambda s:re.compile(' ').split(s)[1])
#lambda只是一个表达式,没有函数体,lambda arg1,arg2,arg3,……:expression
#arg1,arg2,arg3表示具体的参数,expression表示参数要执行的操作
data_user.head()
5.4查看data_user数据集数据类型
data_user.dtypes
发现time列和date列应该转化为日期类数据类型,hour列应该是字符串数据类型
#数据类型化
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
data_user=data_user.sort_values(by='time',ascending=True)
data_user
data_user=data_user.reset_index(drop=True)
data_user
#异常值处理
data_user=data_user.sort_values(by='time',ascending=True)
data_user=data_user.reset_index(drop=True)#将原索引删除,不加人columns
data_user.describe()
#利用describe()方法就可以获取所有数值类型字段的分布值
#通过观察数据集的四分位数,总数,平均值,方差等,发现数据集并无异常值存在
通过观察数据集的四分位数,总数,平均值,方差等,发现数据集并无异常值存在
六、用户行为分析
(1)pv和uv分析
pv(访问量):即page view,具体是指网站的页面浏览量或者点击量,页面被刷新一次就计算一次
uv(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。
behavior_type:用户行为类型(包含点击,收藏,加购物车,支付四种行为,分别用数字1、2、3、4表示
6.1日访问量分析
分析:首先我们要求的是日访问量分析,这个分析需要两个指标,一个是日期,一个是日访问量。
所以,我们需要解析数据,处理数据。得到我们想要的数据集,然后用折线图去画。
a:
我们要把每一天的用户ID找出,进行求和
这样呢,我们就处理完这个需求了
#用户行为分析
#(1)pv和uv分析
#pv(访问量):即page view,具体是指网站的是页面浏览量或者点击量,页面被刷新一次就计算一次
#uv(独立访客):即unique visitor 访问您网站的一台电脑客户端为一个访客
#(1)日访问量分析
#pv_daily记录每天用户操作次数,uv_daily记录每天不同的上线用户数量
from matplotlib import pyplot as plt
pv_daily=data_user.groupby('date')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
uv_daily=data_user.groupby('date')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})
fig,axes=plt.subplots(2,1,sharex=True)
pv_daily.plot(x='date',y='pv',ax=axes[0]).set_title('pv_daily')
uv_daily.plot(x='date',y='uv',ax=axes[1])
结果显示如上图所示,在双十二期间,pv和uv访问量达到峰值,并且可以发现,uv和pv两个访问量数值差距比较大,同时,因为数据集总人数大约是10000人左右,因此,通过nv值可以分析出双十二期间淘宝用户的日活跃大概是45%浮动。
6.2#小时访问量分析#pv_hour记录每小时用户操作次数,uv_hour记录每小时不同的上线用户数量
pv_hour=data_user.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
uv_hour=data_user.groupby('hour')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})
fig,axes=plt.subplots(2,1,sharex=True)
pv_hour.plot(x='hour',y='pv',ax=axes[0])
uv_hour.plot(x='hour',y='uv',ax=axes[1])
axes[0].set_title('pv_hour')
axes[1].set_title('uv_hour')
图表显示:pv和uv在凌晨0-5点期间波动情况相同,都呈下降趋势,访问量都比较小,同时在晚上18:00左右,pv波动情况比较剧烈,相比来看uv不太明显,因此晚上18:00以后是淘宝用户访问app的活跃时间段。
pv_hour.head()
uv_hour.head()
pv_detail=data_user.groupby(['behavior_type','hour'])['user_id'].count().reset_index().rename(columns={'user_id':'total_pv'})
fig,axes=plt.subplots(2,1,sharex=True)
sns.pointplot(x='hour',y='total_pv',hue='behavior_type',data=pv_detail,ax=axes[0])
sns.pointplot(x='hour',y='total_pv',hue='behavior_type',data=pv_detail[pv_detail.behavior_type!=1],ax=axes[1])
axes[0].set_title('pv_different_behavior_type')
axes[1].set_title('pv_different_behavior_type_except1')
有图表显示:点击这一用户行为相比较于其他三类用户行为,pv访问量较高,同时四种用户行为的波动情况基本一致,因此晚上这一时间段不管哪一种用户行为,pv访问量都是最高的。从图2可以看出,加入购物车这一用户行为的pv总量高于收藏的总量,因此在后续漏斗流失分析中,用户类型3应该在2之前分析。
七、用户消费行为分析
7.1用户购买次数情况分析
data_user_buy=data_user[data_user.behavior_type==4].groupby('user_id')['behavior_type'].count()
sns.distplot(data_user_buy,kde=False)
plt.title('daily_user_buy')
图表显示:淘宝用户消费次数普遍在10次以内,因此需要重点关注购买次数在10次以上的消费者用户群体。
7.2日ARPPU
ARPPU(average revenue per paying user)是指从每位付费用户身上获得的收入,它反映的是每个付费用户的平均付费额度。
ARPPU=总收入/活跃用户付费数量
因为本数据集中没有消费金额,因此在计算过程中用消费次数代替消费金额
人均消费次数=消费总次数/消费人数
data_use_buy1=data_user[data_user.behavior_type==4].groupby(['date','user_id'])['behavior_type'].count().reset_index().rename(columns={'behavior_type':'total'})
data_use_buy1.groupby('date').apply(lambda x:x.total.sum()/x.total.count()).plot()
plt.title('daily_ARPPU')
图表显示:平均每天消费次数在1-2次之间波动,双十二期间消费次数达到最高值。
7.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.groupby('date').apply(lambda x:x[x.behavior_type==4].total.sum()/len(x.user_id.unique())).plot()
data_use_buy2.groupby('date').apply(lambda x:x[x.behavior_type==4].total.count()/len(x.user_id.unique())).plot()
plt.title('daily_afford_rate')
data_user_buy3=data_user[data_user.behavior_type==4].groupby(['user_id','date','hour'])['operation'].sum().rename('buy_count')
sns.distplot(data_user_buy3)
print('大多数用户消费:{}次'.format(data_user_buy3.mode()[0]))
八、复购情况分析
8.1复购情况,即两天以上有购买行为,一天多次购买算一次#复购率=有复购行为的用户数/有购买行为的用户总数
date_rebuy=data_user[data_user.behavior_type==4].groupby('user_id')['date'].apply(lambda x:len(x.unique())).rename('rebuy_count')
print('复购率:',round(date_rebuy[date_rebuy>=2].count()/date_rebuy.count(),4))
8.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).value_counts().plot(kind='bar')
#value_counts()对某些值的出现次数进行计算
plt.title('time_gap')
plt.xlabel('gap_day')
plt.ylabel('gap_count')
多数用户复购率为0.4693,消费次数随着消费时间间隔的增加而不断下降,在1-10天之内复购次数比较多,10天之后复购次数淘宝用户很少在进行复购,因此需要重视10天之内的淘宝用户复购行为,增加用户复购。不同用户平均复购时间呈正态分布,但是总体来看,呈现逐渐下降趋势。多数淘宝用户平均复购时间集中在1-5天时间间隔内。
九、漏斗流失分析
漏斗分析是一套流程式数据分析,它能够科学反映用户行为状态以及从起点到终点各阶段用户转化率情况的重要分析模型。
data_user_count=data_user.groupby(['behavior_type']).count()
data_user_count.head()
pv_all=data_user['user_id'].count()
print(pv_all)
#用户行为与商品种类关系分析#不同用户行为类别的转化率
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)
data_category.head()
本文来自Python数据分析实战与AI干货这个公众号,我在这基础上学习有补充一些细节。把自己学习过程中的知识点查缺补漏。