数据来源:数据集-阿里云天池
一、项目背景
本数据报告以淘宝app平台为数据集随机选取了大约 100 万用户在 2014 年 11 月 18 日至 12 月 18 日期间具有曝光、点击、收藏、加车,购买和商品偏好等行为。
二、项目目标
通过行业的指标对淘宝用户行为进行分析,从而探索淘宝用户的行为模式,具体指标包括:
- 日PV和日UV分析
- 付费率分析
- 复购行为分析
- 漏斗流失分析
- 用户价值RFM分析(由于数据源未提供M特征,只从RF角度进行分析)
三、理解数据
数据集共计6列字段,列字段分别是:
user_id:整数类型,序列化后的用户ID
item_id:整数类型,序列化后的商品ID
behavior_type:用户行为类型(包含点击、收藏、加车、支付四种行为,分别用数字1、2、3、4表示)
user_geohash:地理位置
item_category:品类ID(商品所属的品类)
time:用户行为发生的时间
四、数据清洗
import pandas as pd
user_data=pd.read_csv('tianchi_mobile_recommend_train_user.csv')
#查看数据规模和相关信息
print(user_data.info())
out:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12256906 entries, 0 to 12256905
Data columns (total 6 columns):
# Column Dtype
--- ------ -----
0 user_id int64
1 item_id int64
2 behavior_type int64
3 user_geohash object
4 item_category int64
5 time object
dtypes: int64(4), object(2)
memory usage: 561.1+ MB
#查看缺失数据,存在缺失值的是User_geohash,不能删除缺失值,
#因为地理信息在数据集收集过程中做过加密转换,因此对数据集不做处理。
miss_data=user_data.isnull().sum()
print(miss_data)
out:
user_id 0
item_id 0
behavior_type 0
user_geohash 8334824
item_category 0
time 0
dtype: int64
#去除重复值
user_data=user_data.drop_duplicates()
#将时间分割成日期和小时,time目前是object类型
user_data['date']=user_data['time'].apply(lambda x : x.split(' ')[0])
user_data['hour']=user_data['time'].apply(lambda x : x.split(' ')[1])
#将time列和date列转化为日期类数据类型,hour列应该是字符串数据类型
user_data['date']=pd.to_datetime(user_data['date'])
user_data['time']=pd.to_datetime(user_data['time'])
user_data['hour']=user_data['hour'].astype('int64')
print(user_data.dtypes)
out:
user_id int64
item_id int64
behavior_type int64
user_geohash object
item_category int64
time datetime64[ns]
date datetime64[ns]
hour int64
dtype: object
#查看是否有异常值,可以看到数据没有异常值
print(user_data.describe())
out:
user_id item_id behavior_type item_category hour
count 8.164040e+06 8.164040e+06 8.164040e+06 8.164040e+06 8.164040e+06
mean 7.147382e+07 2.022900e+08 1.151846e+00 6.837000e+03 1.520080e+01
std 4.121085e+07 1.167544e+08 5.401788e-01 3.805719e+03 6.177866e+00
min 4.913000e+03 6.400000e+01 1.000000e+00 2.000000e+00 0.000000e+00
25% 3.574526e+07 1.013781e+08 1.000000e+00 3.695000e+03 1.100000e+01
50% 7.270324e+07 2.020590e+08 1.000000e+00 6.146000e+03 1.600000e+01
75% 1.069264e+08 3.035627e+08 1.000000e+00 1.027500e+04 2.100000e+01
max 1.424559e+08 4.045625e+08 4.000000e+00 1.408000e+04 2.300000e+01
五:用户行为分析
-
pv和uv分析
PV(访问量):即Page View, 具体是指网站的是页面浏览量,页面被刷新一次就计算一次。
UV(独立访客):即Unique Visitor,访问网站的一台电脑客户端为一个访客。
#用户行为分析,分析PV,UV每天的变化趋势
pv_daily=user_data.groupby(['date'])['user_id'].count()
#相同的user_id每天只统计一次
uv_daily=user_data.drop_duplicates(subset='user_id',keep='first').groupby(['date'])['user_id'].count()
#求数据包内user_id的数量
print(len(user_data['user_id'].unique()))
out:
10000
#每小时的PV和UV的变化
pv_hour=user_data.groupby(['hour'])['user_id'].count()
uv_hour=user_data.drop_duplicates(subset=['user_id','hour'],keep='first').groupby(['hour'])['user_id'].count()
由上图可以看出
- UV和PV的量级差距较大,说明用户单次浏览次数较多。
- 日活跃量在6400左右,且在双12到达顶峰。数据集总人数大约是10000人,通过UV值可以分析出双十二期间淘宝用户的日活跃大概是77%左右。
图显示:用户活跃度和作息时间呈现明显一致。pv和uv从晚上10点开始至凌晨5点呈下降趋势,访问量比较小,夜间效应明显,从5点开始UV,PV开始上升,到达10点趋于平缓;上班时间10点到晚上18点处于较为平缓阶段,值得注意的是,从晚上18点一直到22点,用户活跃度呈现逐步增长的趋势,且在21点左右PV到达顶峰,可以看出晚上18:00-22:00是淘宝用户访问app的活跃时间段,这和用户作息时间保持一致。 可以在该时间段加强系统维护,保证系统流畅度,并在该时间段多植入广告以及相关活动,以此留住更多客户,提高销量。
由图表显示:点击PV所占的比例明显高于其他,晚上的用户活跃度明显大于白天,加车这一用户行为的pv总量高于收藏的总量,因此在后续漏斗流失分析中,用户类型3应该在2之前分析。
用户在点击之后,转化率较低,加入购物车的只有3%,最后支付的百分比为1%,但是加车的70%会收藏,收藏了的用户一半会购买。收藏对购买转化率也只有不到50%,推测可能用户是在横向比较价格或者商品,这就需要知道用户在加入购物车之后的行为,对这一点可以提出的建议是在用户加入购物车或者收藏之后可以发放限时优惠券或者倒计时购买提醒,提高购买的转化率。
2.复购率分析
复购情况,即两天以上有购买行为,一天多次购买算一次
复购率=有复购行为的用户数/有购买行为的用户总数
也可以看某一段时间内的复购率
date_rebuy=user_data[user_data.behavior_type==4].groupby('user_id')['date'].apply(lambda x:len(x.unique())).rename('rebuy_count')
print(date_rebuy)
out:
user_id
4913 5
6118 1
7528 6
7591 9
12645 4
..
142376113 1
142412247 7
142430177 5
142450275 8
142455899 7
Name: rebuy_count, Length: 8886, dtype: int64
print('复购率:',round(date_rebuy[date_rebuy>=2].count()/date_rebuy.count(),4))
out:
复购率: 0.8717
可以看出在统计时间段内用户的复购率为87%,说明用户对淘宝的忠诚度挺高。
from matplotlib import pyplot as plt
#解决中文乱码问题
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
# 所有复购时间间隔消费次数分布
buy_again = user_data[user_data.behavior_type == 4].groupby(['user_id', 'date'])['hour'].count().reset_index()
print(buy_again.head())
out:
user_id date hour
0 4913 2014-12-01 1
1 4913 2014-12-07 2
2 4913 2014-12-11 1
3 4913 2014-12-13 1
4 4913 2014-12-16 1
#diff(1)是与上一个数值的差值
gap_day = buy_again.groupby('user_id').date.apply(lambda x: x.sort_values().diff(1).dropna())
gap_day = gap_day.map(lambda x: x.days)
gap_day.value_counts().plot(kind='bar',color='g')
plt.title('所有复购时间间隔消费次数')
plt.xlabel('间隔天数')
plt.ylabel('购买人数')
plt.show()
由上图可以看出大部分人的复购时间在10天以内,说明淘宝的用户粘性还是不错的。20天之后很少有用户复购,因此要重视用户10天之内的复购,10天之内尽可能多根据用户的喜好推荐商品。
3.RMF模型分析
由于数据集没有金额,故只做RF二维分析
gap_day = gap_day.reset_index(drop=False)
gap_day.rename(columns={'level_1': 'user_cnt'}, inplace=True)
gap_day1 = gap_day.groupby(['user_id'])['date'].min().rename('gap_day').reset_index(drop=False)
gap_day = gap_day.groupby(['user_id'])['date'].count().rename('count').reset_index(drop=False)
data=pd.merge(gap_day,gap_day1,on='user_id')
print(data.describe())
out:
user_id count gap_day
count 7.746000e+03 7746.000000 7746.000000
mean 7.154969e+07 5.204622 2.783372
std 4.112887e+07 3.883498 4.159948
min 4.913000e+03 1.000000 1.000000
25% 3.574126e+07 2.000000 1.000000
50% 7.251422e+07 4.000000 1.000000
75% 1.067762e+08 7.000000 2.000000
max 1.424559e+08 29.000000 30.000000
由上可知,复购时间间隔在1天-30天之间,复购次数在1次到29次之间。
-
R维度分析
复购时间间隔在1天-30天之间,因此设置3天为一个区间。
1-3天 设置为10,4-6天 设置为9,7-9天 设置为8,10-12天 设置为7,13-15天 设置为6
16-18天 设置为5,19-21天 设置为4,22-24天 设置为3,25-27天 设置为2,28-30 设置为1
def f(x):
if x>=1 and x<=3:
return 10
elif x>=4 and x<=6:
return 9
elif x>=7 and x<=9:
return 8
elif x>=10 and x<=12:
return 7
elif x>=13 and x<=15:
return 6
elif x>=16 and x<=18:
return 5
elif x>=19 and x<=21:
return 4
elif x>=22 and x<=24:
return 3
elif x>=25 and x<=27:
return 2
elif x>=28 and x<=30:
return 1
data['R_score']=data['gap_day'].apply(lambda x:f(x) )
由上图可知,超过82%的用户在1-3天会复购,说明淘宝有较好的用户粘度。
-
F维度分析
复购次数为1-3次 设置为1,4-6次 设置为2,7-9次 设置为3,10-12次 设置为4,13-15次 设置为5,16-18次 设置为6,19-21次 设置为7,22-24次 设置为8,25-27天次, 设置为9,28-29次设置为10
def g(x):
if x>=1 and x<=3:
return 1
elif x>=4 and x<=6:
return 2
elif x>=7 and x<=9:
return 3
elif x>=10 and x<=12:
return 4
elif x>=13 and x<=15:
return 5
elif x>=16 and x<=18:
return 6
elif x>=19 and x<=21:
return 7
elif x>=22 and x<=24:
return 8
elif x>=25 and x<=27:
return 9
elif x>=28 and x<=29:
return 10
data['F_score']=data['count'].apply(lambda x:g(x))
由上图可以知道70%的用户的复购次数在1-7次之间。
-
用户分层
total_score为各用户R_score与F_score的和,total_score最高为20分,最低为2分。
2 ~ 4分:不活跃用户
5 ~ 8分:易流失用户
9~ 12分:较活跃用户
13~ 16分:活跃用户
17~ 20分:忠实粉丝
由上图可以看出超过60%的用户得分在10~12分之间 属于较活跃用户,活跃用户占比约为25%。
结论及建议
1.双12期间,相对于其他日期,流量增长明显,推测和搞活动有关;
2.大部分用户在18时到21时会比较活跃,其中21到22时,是一天当中最活跃的时段,成交量也是这一时段最高。建议可以在用户活跃的时段进行推广以使运营效果最大化。
3.对于复购率比较高的用户,建议对于这些忠实用户,建议要更全面地了解,开发用户信息库,建立详实的用户资料数据库,追踪记录顾客的交易情况。或者线上组建VIP客户微信群等,针对这些用户的购买偏好推送更精准的销售方案。
4.用户行为转化率只有1%,有99%的用户行为是没有转化为成交的,用户在浏览商品详情页后出现了大量的流失。建议通过活动、优惠券、产品详情页的改进等提高转化。建议在用户加入购物车后能有促进用户下单的利益“诱导”,如赠送优惠券或采用倒计时购物车增加客户购买紧近感。
5.用RFM模型对用户进行分类后,可知重要价值用户比较少,用户类型主要还是集中于重要保持用户和一般价值用户。建议根据用户类型,进行有针对性的精准营销.