一、项目介绍
利用淘宝平台提供的数据集,通过业务指标对淘宝用户行为进行分析,从而探索淘宝用户的行为模式,具体指标包括:日PV和日UV分析,复购行为分析,漏斗流失分析和用户价值RFM分析。
二、理解数据
属性值说明:
- user_id:用户身份
- item_id:商品ID
- behavior_type:用户行为类型(包含点击、收藏、加购物车、支付四种行为,分别用数字1、2、3、4表示)
- user_geohash:地理位置
- item_category:品类ID(商品所属的品类)
- time:用户行为发生的时间
注:数据经过脱敏处理,地理位置作用不大,剔除掉。
三、数据准备
'''
数据清洗:有无缺失、特征筛选、变量类型转换
'''
import pandas as pd
data = pd.read_csv('old_user.csv')
data.pop('user_geohash')
data['date'] = data['time'].map(lambda x: x.split(' ')[0])
data['hour'] = data['time'].map(lambda x: x.split(' ')[1])
data.pop('time')
print(data.info())
data['date'] = pd.to_datetime(data['date'])
data['hour'] = data['hour'].astype('int32')
data.isnull().sum()
data.to_csv('new_user.csv', index=False)
四、用户行为分析
# 读取数据
data = pd.read_csv('new_user.csv')
data.head(10)
# 总浏览量(PV)、访问用户数(UV)
print('总的浏览量是',data['user_id'].shape[0])
print('访问用户数是',len(data['user_id'].unique()))
print('每个UV平均访问深度',data['user_id'].shape[0]/len(data['user_id'].unique()))
print('每个UV每日平均访问深度',data['user_id'].shape[0]/len(data['user_id'].unique())/len(data['date'].unique()))
# 日浏览总量
pv_daily = data.groupby(['date'])['user_id'].count().reset_index(name='pv')
# 日访问人数
uv_daily = data.groupby(['date'])['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
x_major_locator = plt.MultipleLocator(4)
fig,ax = plt.subplots(2,1,figsize=(10,8))
ax[0].plot(pv_daily['date'], pv_daily['pv'])
ax[0].set_xlabel('date')
ax[0].set_ylabel('pv')
ax[0].xaxis.set_major_locator(x_major_locator)
ax[1].plot(uv_daily['date'], uv_daily['uv'])
ax[1].set_xlabel('date')
ax[1].set_ylabel('uv')
ax[1].xaxis.set_major_locator(x_major_locator)
结果表明:
- PV和UV在双十二达到高峰
- UV和PV两个访问量数值差距比较大
- PV和UV在双十二前后两天波动较大,其余时间段期间趋势走向大体一致,整体比较平稳
# 每个时刻的pv
pv_hour = data.groupby(['hour'])['user_id'].count().reset_index(name='pv')
# 每个时刻的uv
uv_hour = data.groupby(['hour'])['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
fig,ax = plt.subplots(2,1,figsize=(10,8))
x_major_locator = plt.MultipleLocator(1)
ax[0].plot(pv_hour['hour'], pv_hour['pv'])
ax[0].set_xlabel('hour')
ax[0].set_ylabel('pv')
ax[0].xaxis.set_major_locator(x_major_locator)
ax[1].plot(uv_hour['hour'], uv_hour['uv'])
ax[1].set_xlabel('hour')
ax[1].set_ylabel('uv')
ax[1].xaxis.set_major_locator(x_major_locator)
结果表明:
- 晚上凌晨之后(0-5),用户都会去睡觉,PV\UV下降显著,早晨6点之后,PV\UV显著上升,在10点左右达到高峰。
- UV10点以后一直比较稳定,PV18点以后迅速上涨,在21点左右涨幅一倍多。说明淘宝用户的活跃时段在18-22点左右,活跃人数在10-22点比较稳定。
五、漏斗流失分析
# 漏斗模型分析,统计各阶段的转化人数
# 点击——>收藏——>加入购物车——>支付
user = data.groupby('behavior_type')['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
print(f'整个过程流失率:{round((user.uv[0]-user.uv[3])*100/user.uv[0],2)}%')
结果表明:
- 从电商链路的角度分析,收藏应该在加购前一步,加购在支付之前,但从UV来看,加购、支付的UV反而更高。
- 原因分析:首先,收藏与加购在功能上存在一定重叠,用户相比收藏更偏爱用加购的方式表达购买意愿。其次,用户可能有时倾向于直接支付购买,不会加入购物车统一下单支付购买,不过这两者差距不是很大,不用着重分析,只是爱好习惯不同
- 用户建议:收藏是否可以进一步细化功能,通过收藏夹管理,自定义标注等方式区别于加购的功能
- 收藏相比加购到支付的流失率更低,说明收藏相比加购转化的成功率更高,可以进一步挖掘偏爱用收藏支持购物决策的人群特点
六、复购情况分析
# 用户复购分析(同一天内的购买不算复购)
d1 = data[data['behavior_type'] == 4]
total = len(d1['user_id'].unique())
d2 = d1.groupby('user_id')['date'].unique().map(lambda x: len(x)).reset_index(name='count')
part = len(d2[d2['count'] > 1])
print(f'复购率为:{round(part/total,4)*100}%')
# 复购次数分布
d3 = d2[d2['count'] > 1]
sns.distplot(d3['count'])
# 复购间隔分布(本次购买与下次购买间隔)
distance = list()
for i in d3['user_id']:
d4 = d1.groupby(by=['user_id'])['date'].get_group(i)
d4 = pd.DataFrame(d4.values,columns=['date']).sort_values(by = 'date')
d4['date'] = pd.to_datetime(d4['date'])
for j in range(len(d4)-1):
flag = (d4.iloc[j+1,0] - d4.iloc[j,0]).days
if flag:
distance.append(flag)
sns.distplot(distance)
结果表明:
- 大多数用户的复购次数在2~10次之间
- 复购集中在购买后10天内,尤以1-5天为高峰期
七、用户价值RFM分析
用户分类规则
用户分类 | recency | frequency |
---|---|---|
重要价值客户 | 高 | 高 |
重要保持客户 | 低 | 高 |
重要发展客户 | 高 | 低 |
流失客户 | 低 | 低 |
分值规则
打分 | recency | frequency |
---|---|---|
4 | 5天以内 | 20次以上 |
3 | 10-15天 | 10-20次 |
2 | 5-10天 | 5-10次 |
1 | 15天以上 | 5次以下 |
# 用户类别划分,RFM模型
# money 在一段时期内的采购总金额(数据缺失)
from datetime import datetime
datenow=datetime(2014,12,19)
d5 = d1.copy()
d5['date'] = pd.to_datetime(d5['date'])
d5['date'] = d5['date'].map(lambda x: (datenow-x).days)
d5.rename(columns={'date':'recency'},inplace=True)
d6 = d5.groupby('user_id')['recency'].min().reset_index()
d6['frequency'] = d2['count']
def rscore(x):
if x < 5:
score = 4
elif 5 <= x < 10:
score = 2
elif 10 <= x < 15:
score = 3
else:
score = 1
return score
d6['rscore'] = d6['recency'].map(rscore)
def fscore(x):
if x > 20:
score = 4
elif 5 <= x < 10:
score = 2
elif 10 <= x < 20:
score = 3
else:
score = 1
return score
d6['fscore'] = d6['frequency'].map(fscore)
def rfm(x,y):
if x > 2 and y > 2:
label = '重要价值客户'
elif x <= 2 and y >= 2:
label = '重要保持客户'
elif x >= 2 and y <= 2:
label = '重要发展客户'
else:
label = '流失客户'
return label
d6['level'] = d6[['rscore','fscore']].apply(lambda x: rfm(*x), axis=1)
print(d6['level'].value_counts())
- 重要价值客户:予以关注并维护
- 重要保持用户:近期消费频次低。予以相应的价格刺激,如折扣和捆绑销售等增加用户的购买频率
- 重要发展用户:远期消费频次高。产品卖点刺激,品牌灌输等加强他们对品牌的认可,提高忠诚度
- 流失客户:需分析流失原因