电商用户行为可视化分析

数据集说明

来源:阿里云 天池https://tianchi.aliyun.com/dataset/dataDetail?dataId=46

阿里巴巴提供的移动端淘宝用户的行为数据集,包含2014-11-18至2014-12-18共计一千多万条数据。

字段 字段说明 提取说明
user_id 用户标识 抽样&字段脱敏
item_id 商品标识 抽样&字段脱敏
behavior_type 用户对商品的行为类型 包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4。
user_geohash 用户位置的空间标识,可以为空 由经纬度通过保密的算法生成
item_category 商品分类标识 字段脱敏
time 行为时间 精确到小时级别

分析思路

在这里插入图片描述

结论和建议

流量

1.PV、UV:

  • 非活动期间的PV在40或50万左右,UV在12000到13000之间。双十二当天PV达到80万,UV达到15000以上。活动期PV增长45%,UV增长25%左右,但活动结束后下降较快。
  • PV和UV在一周内有周期性变化,周二到周四的UV、PV最大,且保持稳定。周五最低。

2.新增PV和UV:

  • 总体呈下降趋势,活动前期新增UV保持50-60/天,活动的拉新效果比较稳定,但活动后新增访客快速下降,低至7/天。

3.留存率:

  • 次日留存率基本稳定在0.4到0.7,11.23到11.27、12.6的次日留存率过低。
  • 三日留存率基本稳定在0.6到0.8,12.7的数据过低。
  • 七日留存率较高,基本在0.7以上,12.1的数据过低。
  • 12月的留存率增长明显,可见双十二活动提高了留存率,但活动过后的留存率没有增长。

建议:

  • 对周五PV、UV低的情况,需要更长时间的数据分析其原因,建议结合用户行为和商品情况做进一步分析,是否可以提高周五的PV、UV。

  • 12.1到12.6的新增UV下降,但是新增PV维持稳定;12.18以后新增PV下降显著,建议对这两部分用户做进一步分析,为后续拉新和提升PV作参考。

  • 对于留存率过低的时间,建议分析原因,是否存在消息提醒不足或用户体验不佳等问题。

  • 建议关注活动后的留存率变化情况,通过会员、签到奖励等方式提高留存率。

消费习惯

1.每日用户行为:

  • 浏览、收藏、加购物车同样存在周期变化,但不明显。非活动期的用户行为数据稳定。
  • 活动期里,购买增加只在12,12当天。从12.10开始,收藏、加购物车显著增加,也就是说用户活跃期只有3天。

2.日均各时段用户行为:

  • 12.12当天,用户使用时间主要在20到零点,零点的购买、加购物车达到峰值。
  • 非活动期间,浏览、收藏、加购物车主要在18到23点,18到21点处于上升期。购买行为集中在10到23点,18点后有略微上升,21点是购买峰值。购买量受日均时段影响较小。

3.15天内复购率:

  • 非活动期的复购率一直在0.17到0.2之间,12.12当天达到0.45,说明活动前15天的购买转化效果比较明显。
  • 12.5到12.11的复购率明显较低,可能和后面的双十二活动有关,因为活动前的新增用户增加了,同时大多数会在活动当天购买,所以这几天复购率有所下降。
    活动过后的复购率仍在0.2左右,没有提高。

4.日均各时段购买率:

  • 用户总体购买率为88.27%。
  • 相比非活动期,12.12当天的购买率增加了10%左右。3到16点一直在0.2左右,17点下降了5%,随后开始增加,在零点达到峰值0.44,23-1点是购买高峰期。
  • 非活动期的购买高峰期在10到22点,购买率峰值在21点,其中18点下降显著,和用户作息时间有关。因此商品投放和促销活动应重点关注10-22点这段时间,尤其是18-21点。

建议:

  • 1.活动前的用户活跃期只有3天,建议延长活动预热时间,比如从12.5就开始,有利于提高新增用户和活跃率,对活动更有利。
  • 2.商品投放和促销活动应重点关注10-22点这段时间,尤其是18-21点,促销活动建议在19-23点间进行。
  • 3.购买量受日均时段影响较小,可分析各商品在不同时段的购买转化率,针对不同时段投放转化率相对高的商品。
  • 4.关注活动过后的复购率变化,趁活动余热未过、新增用户量还没流失,建议做新的活动和优惠方案,进一步提高用户粘性和复购率。

转化率

1.用户行为转化漏斗

  • 非活动期,从浏览到加购物车、收藏或购买的转化率分别为:4.46%、3.27%、1.4%,活动期的分别是5.59%、3.39%、2.38%。
  • 相比非活动期,活动期的各阶段的总体转化率提高了1%左右,效果不是很明显。

2.登陆天数与转化率

  • 加购物车和收藏的转化率随登陆天数增加,提高用户登陆天数,可促进加购物车和收藏的转化率,登陆6天的用户此指标异常,建议进一步分析寻找原因。
  • 浏览-购买转化率、加购或收藏-购买转化率随用户登陆天数减小,尤其在登陆19天后,购买转化率下降明显,可能和双十二活动后购买率显著下降有关。
  • 用户登陆5天后的购买转化率明显上升,登陆5-19天的用户购买转化率较高。
  • 由于受双十二活动影响,此处的分析不能准确表明常规时期的登陆天数与转化率关系,需要更长时间的数据作进一步分析。

建议:

  • 1.活动期的各阶段的总体转化率提高了1%左右,效果不明显。建议进一步分析用户不同的行为路径以及阶段转化率,比如浏览-购买、收藏-购买、加购物车-购买的转化率,再决定从哪一阶段提高转化率。
  • 2.登陆5-19天的用户购买转化率较高,建议让用户登录时间达到5天及以上,可以通过发放优惠券、发送提醒、签到奖励等方式进行。
  • 3.登陆6天的用户购物车和收藏的转化率过低,建议从商品投放和推送分析原因。

商品偏好:

1.浏览,收藏,加购物车,购买的前十名的商品类别:

  • 各阶段的品类重合度在50%左右,有些浏览、收藏、加购很高的品类,购买量不在前十,比如5027、5894。而有的销量前十的品类,浏览、收藏、加购不在前十,
    比如6344、8877、7957。

2.购物车分析:前20商品及购买转化率

  • 加购物车量与购买率明显不成正比。有的商品购买率低,比如209323160、6703599、382513156。有的商品购买率高但收藏量低,如303205878、289649282、14087919。

3.购买分析:销量前10的商品类别、销量前20的商品

  • 品类分析:活动期和非活动期销量都在前十的品类有5个。活动期1683、6513两个品类的销量显著,其他前十品类的销量差距不大。非活动期1863、6344、5232三个品类的销量显著,其他前十品类的销量差距不大。6513这个品类在活动期销量显著,而平时销量不算高。6344这个品类平时销量很好,而活动期销量不太高。
  • 商品分析:活动期和非活动期销量都在前20的商品只有一个,这说明,活动期和非活动期用户购买的商品差距很大。

4.不同时段销售前十的商品类别:

  • 7-18时和18-24时销量都在前十的品类有8个,可见用户购买何种品类受时段影响不大。如进一步分析,建议查看每个商品日均时段的销量,在不同时段投放销量高的相应品类。

建议:

  • 1.对于浏览、收藏、加购很高,销量低的品类,或浏览、收藏、加购低,销量高的品类,建议结合商品特性进一步分析,是否存在推荐机制准确度不高、商品投放不精准的情况,同时挖掘有潜力的品类。
  • 2.对于购买率低、加购物车多的商品,建议从商品质量特点、用户评价、各销售环节分析原因。对于购买率率高但收藏量低的商品,考虑商品特性,分析推荐机制、投放时段和频率是否有问题,是否增加要曝光率或做主推商品。
  • 6513这个品类在活动期销量显著,而平时销量不算高,建议结合活动期的销售策率和商品特点分析,是否可作为后续活动的主推品类。6344这个品类平时销量很好,而活动期销量不太高,建议分析销售环节是否有问题。
  • 4.针对活动期和非活动期用户购买的商品差距大的情况,除了商品特性和优惠活动的原因外,建议分析平时的推荐机制是否准确。有些商品活动期销量高,而平时的销量不高,比如115052027,对于这样的商品,建议结合商品特点,考虑定价是否合理、是否可以做主推商品或新活动。

数据预处理

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline
plt.style.use('ggplot')    

读取数据

df = pd.read_csv('C:/Users/阿怪不会弹吉他/Desktop/用户行为分析/tianchi_fresh_comp_train_user.csv')
df.head()
user_id item_id behavior_type user_geohash item_category time
0 10001082 285259775 1 97lk14c 4076 2014-12-08 18
1 10001082 4368907 1 NaN 5503 2014-12-12 12
2 10001082 53616768 4 NaN 9762 2014-12-02 15
3 10001082 9947871 1 NaN 2825 2014-11-28 20
4 10001082 150720867 1 95qoghe 3200 2014-12-15 08

查看数据类型及结构

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15463110 entries, 0 to 15463109
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: 707.8+ MB
df.describe()
user_id item_id behavior_type item_category
count 1.546311e+07 1.546311e+07 1.546311e+07 1.546311e+07
mean 7.015207e+07 2.023169e+08 1.153780e+00 6.827181e+03
std 4.572019e+07 1.167524e+08 5.440445e-01 3.810410e+03
min 4.920000e+02 3.700000e+01 1.000000e+00 2.000000e+00
25% 3.021406e+07 1.014015e+08 1.000000e+00 3.687000e+03
50% 5.638708e+07 2.022669e+08 1.000000e+00 6.054000e+03
75% 1.166482e+08 3.035247e+08 1.000000e+00 1.025800e+04
max 1.424430e+08 4.045625e+08 4.000000e+00 1.408000e+04

数据清洗:去重、丢空

#查看缺失值数量
df.isnull().sum()
user_id                0
item_id                0
behavior_type          0
user_geohash     8207386
item_category          0
time                   0
dtype: int64

因为不做地理数据的分析user_geohash 这列的缺失值不做处理

#查看数据重复数量
sum(df.duplicated())
0

数据分析及可视化

1.每日pv(浏览量)、uv(独立用户数)

转换日期格式,提取日期和时间

df['time'] = pd.to_datetime(df['time'])
df['day'] = df.time.dt.date
df['month'] = df.time.dt.month
df['hour'] = df.time.dt.hour
df['day_of_week'] = df.time.dt.weekday
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15463110 entries, 0 to 15463109
Data columns (total 10 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           datetime64[ns]
 6   day            object        
 7   month          int64         
 8   hour           int64         
 9   day_of_week    int64         
dtypes: datetime64[ns](1), int64(7), object(2)
memory usage: 1.2+ GB
df.head()
user_id item_id behavior_type user_geohash item_category time day month hour day_of_week
0 10001082 285259775 1 97lk14c 4076 2014-12-08 18:00:00 2014-12-08 12 18 0
1 10001082 4368907 1 NaN 5503 2014-12-12 12:00:00 2014-12-12 12 12 4
2 10001082 53616768 4 NaN 9762 2014-12-02 15:00:00 2014-12-02 12 15 1
3 10001082 9947871 1 NaN 2825 2014-11-28 20:00:00 2014-11-28 11 20 4
4 10001082 150720867 1 95qoghe 3200 2014-12-15 08:00:00 2014-12-15 12 8 0
#查看日期范围
df.time.min(), df.time.max()
(Timestamp('2014-11-18 00:00:00'), Timestamp('2014-12-18 23:00:00'))
1.流量分析
1.1 每日pv,uv

计算每日pv(浏览量),uv(独立用户数)

#计算每日基于pv的用户行为
behavior_type_by_day = df.groupby(['day','behavior_type']).user_id.count()
behavior_type_by_day
day         behavior_type
2014-11-18  1                395982
            2                 13205
            3                 18703
            4                  6115
2014-11-19  1                405103
                              ...  
2014-12-17  4                  6530
2014-12-18  1                459362
            2                 13805
            3                 18095
            4                  6384
Name: user_id, Length: 124, dtype: int64
#每日pv(浏览量)
pv_by_day = behavior_type_by_day.xs(1, level = 1)
#uv(独立用户数)
uv_by_day = df.groupby('day').user_id.nunique()

PV和UV日变化趋势图

#每日用户浏览量变化趋势图
plt.figure(figsize = (18, 10))

plt.subplot(2,1,1)
plt.plot(pv_by_day, linestyle='-.', marker='o')
plt.title('PV by Day')
plt.xlabel('Date')
plt.ylabel('PV')

#每日用户浏览量变化趋势图
plt.subplot(2,1,2)
plt.plot(uv_by_day, linestyle='-.', marker='o')
plt.title('UV by Day')
plt.xlabel('Date')
plt.ylabel('UV')

在这里插入图片描述

1.2 访问深度:PV/UV
pv_uv = pv_by_day/uv_by_day

plt.figure(figsize = (18, 6))
plt.plot(pv_uv, linestyle='-.', marker='o')
plt.title('PV/UV by Day')
plt.xlabel('Date')
plt.ylabel('PV/UV')

在这里插入图片描述

PV、UV从11.10开始上升,在双十二当天达到峰值,11.13开始下降。非活动期间的PV在40或50万左右,UV在12000到13000之间。双十二当天PV达到80万,UV达到15000以上。
同时,可以看出PV和UV呈现周期性的起伏变化,结合用户访问深度,可看出波谷的日期11.21、11.28、12.5都是星期五,因此PV、UV可能是以星期为周期变化。

分析一周中PV和UV的变化趋势
双十二数据量过大,去除该天数据后再分析

import datetime
pv_by_week = df[~df.day.isin([datetime.date(2014,12,12)])].query('behavior_type == 1').groupby('day_of_week').user_id.count()
uv_by_week = df[~df.day.isin([datetime.date(2014,12,12)])].groupby('day_of_week').user_id.nunique()
#一周中用户浏览量变化趋势图
plt.figure(figsize = (18, 10))

plt.subplot(2,1,1)
plt.plot(pv_by_week, linestyle='-.', marker='o')
plt.title('PV by Week')
plt.xlabel('Day of week')
plt.ylabel('PV')

#一周中用户浏览量变化趋势图
plt.subplot(2,1,2)
plt.plot(uv_by_week, linestyle='-.', marker='o')
plt.title('UV by Week')
plt.xlabel('Day of week')
plt.ylabel('UV')

在这里插入图片描述

PV和UV在一周内有周期性变化,周二到周四的UV、PV最大,且保持稳定。周五UV、PV迅速降低,是一周中最低的一天。对周五PV、UV低的情况,需要更长时间的数据分析其原因,同时结合用户行为和商品情况做进一步分析,是否需要提高周五的PV、UV。

1.3 每日新增访客及浏览量
from copy import deepcopy
import datetime

user_pv = df[df.behavior_type == 1]
s = set()
days = []
nums = []
add_pv = []

for date in np.sort(user_pv['day'].unique()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值