一、数据来源
来源:天池数据—淘宝用户的行为数据
数据列字段介绍:
column description
user_id 用户身份
item_id 商品id
behavior_type 用户行为类型
(包括点击,收藏,加购物车和付款四种行为,相应的值分别为1,2,3和4。)
user_geohash 地理位置
item_category 品类ID(商品所b属的品类)
二、分析目标
总PV、总UV、PV与UV的关系、
复购率、下次购买周期
每周的用户行为情况
每日的活跃时间情况
点击--收藏&加购物车--支付各环节转化率如何?
购买次数前10的品类
如何划分不同客户群体
三、数据处理
1、数据抽取
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import seaborn as sns
import plotly as py
import plotly.graph_objs as go
sns.set(style='darkgrid',font_scale=1.5)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
import os
os.chdir(r'E:\Users\Sen\Desktop\Da\user_behavior_data')
data=pd.read_csv('tianchi_mobile_recommend_train_user.csv',dtype=str)
data.info()
data.head()
2、数据清洗
#将数据处理为时间格式
data['time']=pd.to_datetime(data['time'])
data.dropna(subset=['time'],how='any',inplace=True)
data['date']=data['time'].dt.date
data['hour']=data['time'].dt.hour.astype('int')
data.sort_values(by='time',ascending=True,inplace=True)
data.reset_index(drop=True,inplace=True)
#将behavior_type的四种行为类型分别用1,2,3,4代表,
#为方便查看现将数字转为pv,collect,cart,buy
def behavior_type_change(x):
if x=='1':
return 'pv'
elif x=='2':
return 'collect'
elif x=='3':
return 'cart'
elif x=='4':
return 'buy'
else :
return x
data['behavior_type']=data['behavior_type'].apply(behavior_type_change)
data.groupby(['behavior_type']).count()
四、数据分析
1)PV(总访问量 )&UV(用户总数)
PV即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。
UV即Unique Visitor,访问您网站的一台电脑客户端为一个访客。 00:00-24:00内相同的客户端只被计算一次。
pv_date=data[data['behavior_type']=='pv'].groupby('date').count()['user_id']
uv_date=data.groupby('date').nunique()['user_id']
pv_uv_date=pd.concat([pv_date,uv_date],axis=1)
pv_uv_date.columns = ['pv','uv']
pv_uv_date.corr(method='pearson')
pv_uv_date.corr(method='spearman')
通过观察,pv,uv相关性强
pv_uv_date.index
plt.figure(figsize=(16,9))
plt.subplot(211)
plt.plot(pv_date,color='red')
plt.title('每天访问量')
plt.subplot(212)
plt.plot(uv_date,color='green')
plt.title('每天访问人数')
plt.suptitle('uv和pv每日变化趋势',fontsize='30')
plt.show()
在12月份开始,用户行为逐渐有增多趋势,尤其在12月9日开始,用户行为明显高于其他时期,这几天用户行为增多是因为淘宝的“双十二”活动。
- 复购率=购买2次或以上的用户/购买用户总数
user_buy_num=data[data['behavior_type']=='buy'].groupby('user_id').count()['behavior_type']
user_rebuy=user_buy_num[user_buy_num>=2].count()
user_buy=user_buy_num[user_buy_num>=1].count()
user_rebuy/user_buy
3)下次购买天数
data_day_buy=data[data.behavior_type=='buy'].groupby('user_id')
data_day_buy=data_day_buy.date.apply(lambda x:x.sort_values().diff(1).dropna())
data_day_buy=data_day_buy.map(lambda x:x.days)
data_day_buy.describe()
- 每周的用户行为数量变化趋势
data['weekday']=[x.weekday() for x in data['time']]
data_weekday=data.groupby('weekday').count().user_id
data_weekday.index=[1,2,3,4,5,6,7]
fig=plt.figure(figsize=(20,6))
plt.title('每周的用户行为数量变化趋势',fontsize='xx-large')
plt.xticks([1,2,3,4,5,6,7])
ax=fig.add_subplot(111)
ax.plot(data_weekday.index,data_weekday)
可以看到,周一到周二的用户行为逐渐增加,周二-周四达到一个稳定值,周四到-周六用户行为明显减少,周六为一周最低,周六后开始逐渐增加。
结论:用户总数变化趋势与PV量变化趋势类似,周末的数量逐渐增加,到工作日又逐渐降低。在双十二期间,用户总数明显上升,活动过后,人数明显下降至平稳状态。
5)一天当中不同时段,用户行为的数量
data['hour']=data['time'].dt.hour
pv_hour=data[data['behavior_type']=='buy'].groupby('hour').user_id.count().sort_index(ascending=True)
uv_hour=data.groupby('hour').user_id.nunique().sort_index(ascending=True)
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='steelblue',label='每个小时访问量')
plt.ylabel('访问量')
plt.legend(loc='upper left')
pv_uv_hour['uv'].plot(color='red',label='每个小时用户量',secondary_y=True)
plt.ylabel('用户量')
plt.xticks(range(24),pv_uv_hour.index)
plt.legend(loc='upper center')
plt.grid(True)
plt.show()
一天当中不同时段中,22:00-5:00用户行为逐步进入低谷,因为此段时间大多数人处于休息之中。
6:00-11:00用户行为逐渐提升,用户开始活跃
12:00-18:00用户行为较为稳定,因为此段时间,大部分人在工作或者处理事情
17:00-19:00 UV有所下降,因为这段时间大部分下班,吃晚饭,或者还要处理其他事情
而19:00-22:00用户行为达到高潮,这段时间大部分人才有了自己的空余时间
6)购买转化率:用户行为转化漏斗
pv_num=data[data['behavior_type']=='pv']['user_id'].count()
collect_num=data[data['behavior_type']=='collect']['user_id'].count()
cart_num=data[data['behavior_type']=='cart']['user_id'].count()
buy_num=data[data['behavior_type']=='buy']['user_id'].count()
far_num=collect_num+cart_num
trace = go.Funnel(
y = ['pv','far','buy'],
x = [pv_num,far_num,buy_num],
textinfo = "label+text+percent previous+percent initial+value",
marker=dict(color=[ "lightsalmon", "tan", "teal"]),
# connector = {"line": {"color": "royalblue", "dash": "solid", "width": 10}}
)
fig_data =[trace]
fig = go.Figure(fig_data)
fig.show()
结论:用户点击后,收藏或者加购物车的概率在5%左右,而最后真正的购买率在1%,已经收藏或者加购物车到最终购买的转化率为20%,购买转化率很低,后面可以采取活动提高购买转化率。
- 销售次数前十的品类
sale_top=data[data['behavior_type']=='buy'].groupby('item_category').count()
sale_top=sale_top.sort_values('user_id',ascending=False)
sale_top[:100]
- RFM分析
#因缺少Money字段,故只做RF分析
recent_buy_time=data[data['behavior_type']=='buy'].groupby('user_id')['date']
recent_buy_time
recent_buy_time=recent_buy_time.apply(lambda x:pd.to_datetime('2014-12-20').date()-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)
recent_buy_time
buy_freq=data[data['behavior_type']=='buy'].groupby('user_id')['date'].count()
buy_freq=buy_freq.reset_index().rename(columns={'date':'freq'})
rfm=pd.merge(recent_buy_time,buy_freq,left_on='user_id',right_on='user_id')
rfm['recent_value']=pd.qcut(rfm.recent,2,labels=['1','0'])
rfm['freq_value']=pd.qcut(rfm.freq,2,labels=['0','1'])
rfm['rfm_value']=rfm['recent_value'].str.cat(rfm['freq_value'])
def kehu(x):
if x=='11':
return '价值客户'
elif x=='01':
return '保持客户'
elif x=='10':
return '发展客户'
else :
return '一般客户'
rfm['kehu']=rfm['rfm_value'].apply(kehu)
rfm.groupby('kehu')['user_id'].count()
总结:可对不同客户进行精准运营,降低成本,提高运营效果
五、结论
1.pv与uv呈强相关性,受双十二活动影响,12月9日开始,pv,uv开始暴涨,12月13日迅速回落,说明活动效果显著
2.复购率高达52%,平均下次购买周期为4.6天,说明用户购买频次高
3.每周当中的用户行为,周二至周四最高,而周六至周一最低
4.每日的活跃时间段为9:00-22:00,其中18:00-22:00开始逐渐增加,达到一天之中的顶峰。
5.漏斗分析模型中收藏或者加购物车的转化率在5%左右,而购买购买转化率在20%,需要进一步提高
6.RFM分析模型中将用户划分为不同客户群体,可对其进行精准运营,降低成本,提高运营效果