3探索用户行为模式

3探索用户行为模式

这一期数据分析学习博文主要讲述如何运用
PV 每天访客量(访问多少次)、
UV 去重后的每天访客量(有多少人访问)、
ARPPU Average Revenue Per Paying User(从每位付费用户上获得的收入,反映每个付费用户的平均付费额度=总收入/活跃用户付费数量)、
ARPU Average Revenue Per User(平均从每位用户获得的收入,由总收入/AU(Active Users)计算得到,可以衡量产品的盈利能力和发展能力,这里使用活跃用户数平均消费次数=消费总次数/活跃用户数代替平均从每位用户获得的收入,每天有操作行为的为活跃用户)、
付费率=付费人次/用户总数、复购情况分析、漏斗流失分析等方法对用户行为模式进行探索

百度网盘资源:
链接:https://pan.baidu.com/s/1UwaHncc5K4P-SCMar9h7CQ
提取码:2222

import plotly as py
py.offline.init_notebook_mode()
pyplot = py.offline.iplot

import plotly.graph_objs as go
from plotly.graph_objs import Scatter

from scipy import stats

import pandas as pd

import numpy as np

import seaborn as sns
sns.set(style='darkgrid')


import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"


import os
os.chdir(r'E:\2020年Python数据分析师特训营全套84节视频完结版(就业向零基础友好)\2020年Python数据分析师特训营全套84节视频完结版') 
data_user = pd.read_csv('tianchi_mobile_recommend_train_user.csv')
data_user

data_user.info()

#缺失率
data_user.apply(lambda x: sum(x.isnull())/len(x))
#每个字段缺失值的数量
data_user.apply(lambda x: sum(x.isnull()))


#分别取出'time'中的'date'和'hour'
data_user['date'] = data_user['time'].str[0:10]
data_user['hour'] = data_user['time'].str[11:]


#转换为datetime格式
data_user['date'] = pd.to_datetime(data_user['date'])
#需终止服务后重新运行该行,否则原数据已被这句替换为datetime格式
data_user['time'] = pd.to_datetime(data_user['time'])
#将hour字段转换为整数
data_user['hour'] = data_user['hour'].astype(int)

#按照time降序排序
data_user.sort_values(by='time',ascending=True,inplace=True)
data_user.reset_index(drop=True,inplace=True)
data_user.describe(include='all',datetime_is_numeric=True)

#每天访客量(访问多少次),先把这一个字段由user_id重命名为pv
pv_daily = data_user.groupby('date').count()['user_id'].rename('pv')
pv_daily

#去重后的每天访客量(有多少人访问),先把这一个字段由user_id重命名为uv
uv_daily = data_user.groupby('date')['user_id'].apply(lambda x: x.drop_duplicates().count()).rename('uv')
uv_daily

#将pv_daily和uv_daily合并,如果上面没有先把两个user_id分别重命名为pv和uv,这边就会出现两个名为user_id的字段,无法再进行重命名
pv_uv_daily = pd.concat([pv_daily,uv_daily],axis=1)
pv_uv_daily

#计算斯皮尔曼相关系数
pv_uv_daily.corr(method='spearman')
#计算皮尔森相关系数
pv_uv_daily.corr(method='pearson')
#说明访问量与访问用户数是成正相关的

#画图
plt.figure(figsize=(16,9))
plt.subplot(211)
plt.plot(pv_daily,color='orange')
plt.title('每天访问量')
plt.subplot(212)
plt.plot(uv_daily,color='blue')
plt.title('每天访问用户数')
plt.suptitle('PV和UV变化趋势',fontsize=20)
plt.show()

#按小时统计访问量和访问用户数
pv_daily_hour = data_user.groupby('hour').count()['user_id'].rename('pv_hour')
uv_daily_hour = data_user.groupby('hour')['user_id'].apply(lambda x: x.drop_duplicates().count()).rename('uv_hour')
pv_daily_hour
uv_daily_hour
pv_uv_daily_hour = pd.concat([pv_daily_hour,uv_daily_hour],axis=1)
pv_uv_daily_hour
#计算斯皮尔曼相关系数
pv_uv_daily_hour.corr(method='spearman')
#计算皮尔森相关系数
pv_uv_daily_hour.corr(method='pearson')
#说明访问量与访问用户数是成正相关的

#画图
plt.figure(figsize=(16,9))

pv_uv_daily_hour['pv_hour'].plot(color='orange',label='每个小时访问量')
plt.ylabel('访问量')
plt.legend(loc = 'upper right')
pv_uv_daily_hour['uv_hour'].plot(color='blue',label='每个小时访问用户数',secondary_y=True)
plt.ylabel('访问用户数')
plt.legend(loc = 'upper center')
plt.xticks(range(0,24),pv_uv_daily_hour.index)

plt.grid(True)
plt.show()


#用户的不同行为类型每小时访问量
pv_detail = pd.pivot_table(columns='behavior_type',index='hour',data = data_user,values='user_id',aggfunc=np.size)
pv_detail


#画图
plt.figure(figsize=(16,9))
sns.lineplot(data = pv_detail.iloc[:,1:])
plt.show()


#找出behavior_type为4的访问量,按照user_id分组,保存为data_user_buy
data_user_buy = data_user[data_user.behavior_type == 4].groupby('user_id').size()
data_user_buy.head()
plt.hist(x=data_user_buy,bins=30)
plt.show()


#计算日ARPPU Average Revenue Per Paying User,是从每位付费用户上获得的收入,反映每个付费用户的平均付费额度=总收入/活跃用户付费数量,这里使用消费总次数代替消费总金额
#按照日期和不同的已经付费的用户计算不同类型的行为发生的访问量
data_user_buy1 = data_user[data_user.behavior_type == 4].groupby(['date','user_id']).count()['behavior_type'].reset_index().rename(columns={'behavior_type':'total'})
data_user_buy1
data_user_buy2 = data_user_buy1.groupby('date').sum()['total']/data_user_buy1.groupby('date').count()['total']
data_user_buy2.plot()
plt.show()
data_user_buy2.describe()


#日ARPU Average Revenue Per User,平均从每位用户获得的收入,由总收入/AU(Active Users)计算得到,可以衡量产品的盈利能力和发展能力,这里使用活跃用户数平均消费次数=消费总次数/活跃用户数代替平均从每位用户获得的收入,每天有操作行为的为活跃用户
#取出data_user['operation']字段中的值为1的用户,即活跃用户
data_user['operation'] = 1
#把这些用户按照日期和行为类型分类计数,重命名'operation'为'total'
data_user_buy3 = data_user.groupby(['date','user_id','behavior_type'])['operation'].count().reset_index().rename(columns={'operation':'total'})
#把total字段中behavior_type=4的用户按照date分类计数/用户总数
data_user_buy3.groupby('date').apply(lambda x: x[x.behavior_type==4].total.sum()/len(x.user_id.unique())).plot()
#付费率=付费人次/用户总数
data_user_buy3.groupby('date').apply(lambda x: x[x.behavior_type==4].total.count()/len(x.user_id.unique())).plot()

1 PV&UV变化趋势.png
图一 PV&UV变化趋势
2 每小时访问量&每小时访问用户数
图二 每小时访问量&每小时访问用户数
3 behavior type
图三 用户行为模式
4 behavior_type为4的访问量,按照user_id分组,保存为data_user_buy
图四 behavior_type为4的访问量,按照user_id分组,保存为data_user_buy
5
图五 计算日ARPPU Average Revenue Per Paying User,是从每位付费用户上获得的收入,反映每个付费用户的平均付费额度=总收入/活跃用户付费数量,这里使用消费总次数代替消费总金额。按照日期和不同的已经付费的用户计算不同类型的行为发生的访问量。
6
图六 日ARPU Average Revenue Per User,平均从每位用户获得的收入,由总收入/AU(Active Users)计算得到,可以衡量产品的盈利能力和发展能力,这里使用活跃用户数平均消费次数=消费总次数/活跃用户数代替平均从每位用户获得的收入,每天有操作行为的为活跃用户。取出data_user[‘operation’]字段中的值为1的用户,即活跃用户。把这些用户按照日期和行为类型分类计数,重命名’operation’为’total’。把total字段中behavior_type=4的用户按照date分类计数/用户总数。付费率=付费人次/用户总数。

#同一时间段用户消费次数分布,取出behavior_type=4的用户,按照'user_id','date','hour'分组对'operation'字段计数
data_user_buy4 = data_user[data_user['behavior_type']==4].groupby(['user_id','date','hour'])['operation'].sum()
sns.distplot(data_user_buy4)

7
图七 同一时间段用户消费次数分布

#复购情况分析
#每位用户不同日期的购买次数
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()
#选出有购买行为的用户,按照user_id分组,取出日期,对其排序后依次用后一行减去前一行,
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_user_count = data_user.groupby('behavior_type').size()
#浏览量
pv_all = data_user['user_id'].count()
#(浏览量 - 不同行为的浏览次数)/总浏览量,总浏览量到总点击量的流失率
(pv_all - data_user_count[1])/pv_all
#总浏览量到总加入购物车量的流失率
(data_user_count[1] - data_user_count[2])/data_user_count[1]
#总加入购物车量到总收藏量的流失率
(data_user_count[3] - data_user_count[2])/data_user_count[3]
#总收藏量到总购买量的流失率
(data_user_count[2] - data_user_count[4])/data_user_count[2]

复购率=复购行为用户数/有购买行为的用户总数:
0.8717083051991897
(浏览量 - 不同行为的浏览次数)/总浏览量,总浏览量到总点击量的流失率:
0.05762669632939993
总浏览量到总加入购物车量的流失率:
0.9790005368561114
总加入购物车量到总收藏量的流失率:
0.29400053556251526
总收藏量到总购买量的流失率:
0.5044237207077953

#RFM
from datetime import datetime

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])


recent_buy_time = recent_buy_time.reset_index().rename(columns={'date':'recent'})

recent_buy_time.recent = recent_buy_time.recent.apply(lambda x:x.days)


#每个用户的消费频率
buy_freq = data_user[data_user['behavior_type']==4].groupby('user_id').date.count()
buy_freq = buy_freq.reset_index().rename(columns={'date':'freq'})


#关联recent_buy_time与buy_freq
rfm = pd.merge(recent_buy_time,buy_freq,left_on='user_id',right_on='user_id')
rfm['recent_values'] = pd.qcut(rfm.recent,2,labels=['2','1'])

rfm['freq_values'] = pd.qcut(rfm.freq,2,labels=['1','2'])
rfm['rfm'] = rfm['recent_values'].str.cat(rfm['freq_values'])

rfm.info()

def trans_rfm(x):
    if x == '22':
        return '重点关注的用户'
    elif x == '21':
        return '高忠诚度但购买能力不足的用户'
    elif x == '12':
        return '忠诚度不高但购买能力强的用户'
    else:
        return '非重点关注用户'


rfm['用户等级'] = rfm['rfm'].apply(trans_rfm)
#画条形图
trace_basic=[go.Bar(x=rfm['用户等级'].value_counts().index,y=rfm['用户等级'].value_counts().values,marker=dict(color='orange'),opacity=0.50)]
layout=go.Layout(title='用户等级情况',xaxis=dict(title='用户重要度'))
figure_basic=go.Figure(data=trace_basic,layout=layout,)
pyplot(figure_basic)


#画饼图
trace_basic1 = [go.Pie(labels = rfm['用户等级'].value_counts().index,values = rfm['用户等级'].value_counts().values,hole=0.2,textfont = dict(size=12,color='white'))]
layout1 = go.Layout(title = '用户等级比例')
figure_basic1 = go.Figure(data = trace_basic1,layout = layout1,)
pyplot(figure_basic1)

8
图八 用户等级情况
9
图九 用户等级比例

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值