数据集:https://tianchi.aliyun.com/dataset/dataDetail?dataId=46
字段
user_id:用户身份
item_id:商品ID
behavior_type:用户行为类型(点击、收藏、加购物车、支付,分别用数字1、2、3、4表示)
user_geohash:地理位置
item_category:品类ID(商品所属品类)
time:用户行为发生时间
电商常用方法
用户行为分析:日访问量分析、小时访问量分析、不同行为类型用户PV(总浏览量点击量)、UV(不同用户的总点击量)分析
用户消费行为分析:用户购买次数情况分析、同一时间段用户消费次数分布日、
ARPPU(平均每付费用户收入,可通过总收入/APA活跃付费用户数算出)、
日ARPU(平均每用户收入,可通过总收入/AU活跃用户(DAU、WAU、MAU日/周/月活跃用户)算出)、
PUR(付费比率,可通过APA活跃付费用户数/AU活跃用户数算出)
【游戏:DNU每日游戏新登入用户数、AU活跃用户、PU付费用户、ARPU平均每用户收入、ARPPU平均每付费用户收入、PUR付费比率、LTV生命周期价值,即平均一个用户在首次到最后一次登录游戏内为游戏创造的收入总计】
复购情况分析:所有复购时间间隔消费次数分布、不同用户平均复购时间分析
漏斗流失分析:流程式数据分析,反映各阶段用户转化率情况
用户行为与商品种类关系分析:不同用户行为类型的转化率、不同用户行为类型的感兴趣率
二八理论分析
用户价值度RFM模型分析
导入数据
data_user = pd.read_csv('tianchi_mobile_recommend_train_user.csv',dtype = str)#因为不需要计算
若数据过大 内存不够 可用sample函数取样
数据清洗
缺失值分析
data_user.apply(lambda x:sum(x.isnull())/len(x))
只有geohash有缺失值 因为分析用不上地理位置 所以可以不作处理
拆分日期
data_user['date'] = data_user['time'].str[0:10]
data_user['hour'] = data_user['time'].str[11:]
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(int)
data_user.sort_values(by='time',ascending=True,inplace=True)
data_user.reset_index(drop=True,inplace=True)#重置索引
data_user.describe(include='all')#观察所有字段有无异常值
数据分析
pv uv
#计算pv 总计访问量
pv_daily = data_user.groupby('date').count()['user_id']
#计算uv 每天不同用户的访问量
#对user_id去重处理后计数
uv_daily = data_user.groupby('date')['user_id'].apply(lambda x:x.drop_duplicates().count())
pv_uv_daily = pd.concat([pv_daily,uv_daily],axis=1)
pv_uv_daily.rename(columns={0:'pv','user_id':'uv'},inplace=True)
pv_uv_daily.corr(method='spearman')
pv_uv_daily.corr(method='pearson')
观察两者的相关系数 呈正相关
plt.figure(figsize=(16,9))
plt.subplot(211)
plt.plot(pv_daily)
plt.title('每天访问量')
plt.subplot(212)
plt.plot(uv_daily)
plt.title('每天访问用户数')
plt.suptitle('pv、uv趋势')
plt.show()
#计算每小时pv
pv_hour = data_user.groupby('hour').count()['user_id']
#计算每小时uv
#对user_id去重处理后计数
uv_hour = data_user.groupby('hour')['user_id'].apply(lambda x:x.drop_duplicates().count())
pv_uv_hour = pd.concat([pv_hour,uv_hour],axis=1)
pv_uv_hour.columns=['pv','uv']
plt.figure(figsize=(16,9))
pv_uv_hour['pv'].plot(color='b',label='每个小时访问量')
plt.ylabel('访问量')
plt.legend(loc='upper center')
pv_uv_hour['uv'].plot(color='r',label='每个小时不同用户访问量',secondary_y=True)
plt.ylabel('访问用户数')
plt.xticks(range(0,24),pv_uv_hour.index)
plt.legend(loc='upper right')
plt.grid()
plt.show()
pv uv日曲线大致相同,从12.09起大幅攀升,在12.12达到顶峰,说明双十二活动效果明显
pv uv在0-4点数据波动情况相似 访问量也比较小
早上5-10点pv急速上升 uv平缓
下午18点后uv急速上升 pv平缓
21点左右pv uv均达到峰值
不同类型行为用户的分析
#使用透视图进行分析
#1点击2收藏3加购物车4购买
pv_detail = pd.pivot_table(columns = 'behavior_type',index='hour',data=data_user,
values='user_id',aggfunc=np.size)#计算个数
plt.figure(figsize=(16,9))
sns.lineplot(data=pv_detail)
plt.show()
因为点击与其他数据差异太大 看不出234的波动 所以将1剔除出去
plt.figure(figsize=(16,9))
sns.lineplot(data=pv_detail.iloc[:,1:])
plt.show()
#加购物车>收藏>购买
#每个用户的购买次数
data_user_buy = data_user[data_user['behavior_type'] == '4'].groupby('user_id').size()
data_user_buy.head()
#每个用户的浏览次数
data_user_click = data_user[data_user['behavior_type'] == '1'].groupby('user_id').size()
data_user_click.head()
#可以查看每个用户平均浏览几次才下单
data_user_clicktobuy = pd.concat([data_user_buy,data_user_click],axis=1)
data_user_clicktobuy.columns=['buy','click']
#因为有的用户没有购买行为
data_user_clicktobuy.fillna(value=0)
data_user_clicktobuy.head()
18点左右四类行为都显著上升,其中上升幅度点击量>加购物车>收藏>购买,说明这段时间内用户在表达购物意向或进行购买行为前愿意花更多的时间,所以要激发用户行为,有针对性地推广
ARPPU
平均每付费用户收入,可通过总收入/APA活跃付费用户数算出
数据中没有金额 因此用消费次数来代替消费金额计算日ARPPU
这个地方我算的好像有点不太对
#消费次数
#每个用户的购买次数
data_user_buyf = data_user[data_user['behavior_type'] == '4'].groupby(['date','user_id'])
data_user_buyf.head(5)
data_user_buyf.count()['behavior_type'].rename(columns={'behavior_type':'total'})
#每日消费总次数
data_user_buyfs = data_user[data_user['behavior_type'] == '4'].groupby(['date'])
data_user_buyfs = data_user_buyfs.count().rename(columns={'behavior_type':'total'})
#.rename(columns={'behavior_type':'total'})
#每日消费总用户数
#data_user_buyu = data_user[data_user['behavior_type'] == '4'].groupby(['date','user_id'])
data_user_buyu = data_user.drop_duplicates(['user_id','date'], 'last')
data_user_buyu = data_user_buyu[data_user_buyu['behavior_type'] == '4'].groupby(['date'])
data_user_buyu = data_user_buyu.count().rename(columns={'user_id':'total'})
data_user_arrpu=data_user_buyfs['total']/data_user_buyu['total']
data_user_arrpu.plot()
plt.title('daily_ARRPU')
日ARPU
平均每用户收入,可通过总收入/AU活跃用户(DAU、WAU、MAU日/周/月活跃用户)算出
用活跃用户数平均消费次数=消费总次数/活跃用户数代替
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()
plt.title('daily_ARPU')
淘宝活跃用户平均每天消费次数较低,在0.6次上下波动,双十二期间达到最高值近2.0次
付费率
消费人数/活跃用户人数
data_use_buy2.groupby('date').apply(lambda x:x[x.behavior_type=='4'].total.count()/len(x.user_id.unique())).plot()
#付费率
afford_rate="%0.2f%%"%(len(data_use_buy2[data_use_buy2.behavior_type=='4'].user_id.unique())/len(data_use_buy2.user_id.unique())*100)
afford_rate
付费率=88.86% 相当高
双十二达到峰值
复购率
复购情况分析 有两天以上的购买行为 一天多次只算一次
复购率=有两天以上购买用户数/有购买行为的用户数
data_rebuy = data_user[data_user.behavior_type == '4'].groupby('user_id')['date'].apply(lambda x:len(x.unique()))
data_rebuy[data_rebuy>=2].count() / data_rebuy.count()
复购率=87.17% 相当高
复购时间间隔分布
排序后 用diff实现下一次-上一次
data_day_buy = data_user[data_user.behavior_type == '4'].groupby('user_id').date.apply(lambda x:x.sort_values().diff(1).dropna())
data_day_buy.map(lambda x:x.days)
data_day_buy.value_counts().plot(kind='bar')
消费次数随消费时间间隔的增加而不断下降 大多数用户在10天后基本不再有复购行为
因此需要重视10天内的用户复购行为 增加用户复购
漏斗流失分析
不同行为的次数
data_user_count = data_user.groupby('behavior_type').size()
#从浏览到点击
pv_all = data_user['user_id'].count()
(pv_all - data_user_count[0])/pv_all
#点击到加购物车
click_to_add = (data_user_count[0] - data_user_count[2])/data_user_count[0]*100
#加购物车到收藏
add_to_fav = (data_user_count[2] - data_user_count[1])/data_user_count[2]*100
#点击到收藏
click_to_fav = (data_user_count[0] - data_user_count[1])/data_user_count[0]*100
#加购物车到购买
add_to_buy = (data_user_count[2] - data_user_count[3])/data_user_count[2]*100
click_to_add=97.03%
add_to_fav=29.40%
click_to_fav=97.90%
add_to_buy=65.01%
浏览到点击、点击到添加购物车/收藏流失率很高,说明大多数用户浏览页面次数较多,但使用购物车和收藏功能较少
从加购物车到购买行为流失率较高,达到了65.01%,说明从加购物车到购买的阶段是指标提升的重点环节
部分分析有参考自:https://blog.csdn.net/sword356/article/details/100997822
发现在运用sum() count() size()的时候有时会弄混
https://www.cnblogs.com/ykit/p/12377673.html
https://www.cnblogs.com/keye/p/11153427.html
sum():将每个分类下的数值分别进行相加
count():计数每个分类有多少个值,不包含nan
size():计数每个分类有多少个值,包含nan