淘宝用户行为分析

项目背景

电商行业经过十几年来的高速增长,随着中国互联网行业人口红利逐渐消失,电商获客成本显著上升,目前已经进入下半场,从之前的粗犷式发展逐步迈向精细化发展。因此各电商企业也把重心从过去注重增量的发展逐渐转向存量的运营。在这样的背景下,对电商用户行为进行分析,理解用户需求,从而指导产品营销和设计,成为了各电商在发展时的重要环节。在这样的背景下,本文将基于部分电商用户数据进行分析。

项目内容

一. 确定目标

用户行为分析:以数据集中的UV、PV等指标,推测出用户行为与时间的关系。
产品数据分析:从商品的点击、收藏、加购、购买的情况,探索用户对商品的购买偏好,找出最受欢迎的产品,优化产品推荐。
分析思路

二. 数据下载

数据源地址:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1&lang=en-us

本数据集包含了2017年11月25日至2017年12月3日之间,随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:

列名称 说明
用户ID 整数类型,序列化后的用户ID
商品ID 整数类型,序列化后的商品ID
商品类目ID 整数类型,序列化后的商品所属类目ID
行为类型 字符串,枚举类型,包括(‘pv’, ‘buy’, ‘cart’, ‘fav’)
时间戳 行为发生的时间戳

行为类型 说明
pv 商品详情页pv,等价于点击
buy 商品购买
cart 将商品加入购物车
fav 收藏商品

三. 数据预处理

下载数据集之后我尝试用 Excel 打开,但是提示我文件未完全打开,看来 Excel 果然无法处理大的数据集,所以转用 pandas 进行、和处理,将数据导入到 MySQL 之后再进行分析。
首先使用pandas导入数据并进行数据初探

import numpy as np
import pandas as pd
file_path = r'C:\E\code\data\UserBehavior.csv'
columns = ['id', 'item', 'category', 'behavior', 'time']
df = pd.read_csv(file_path, names=columns)
df.head(10)

结果展示如下:
查看前10行数据
查看数据结构:

df.shape

查看数据结构
共有三百多行数据,下面开始检查各项数据是否存在缺失值或异常值。

df['id'].isnull().value_counts(dropna=False)  # 没有
df['item'].isnull().value_counts(dropna=False)  # 没有
df['category'].isnull().value_counts(dropna=False)
df['behavior'].isnull().value_counts(dropna=False)
df['time'].isnull().value_counts(dropna=False)    # 有一条缺失值

发现除了 time 字段有一条缺失值之外,其余数据都没有缺失值。因为数据量较大,所有直接找出并删除这一条缺失值。

df[df['time'].isnull()==True]   # 找出NaN值的数据
df.dropna(inplace=True)   # 由于数据量大,缺失数据少,故此删除此条缺失数据

找出缺失值
经过以上步骤可以认为数据源的数据还是比较靠谱的,缺失值很少,不需要进行太多操作。下面进行异常值的处理,观察之后发现除了 time 字段,其余字段都不能直接确实是否为异常值,所以先处理 time 字段,由于 time 字段为时间戳,为了便于比较将时间戳转为日期进行处理。

df['time'] = pd.to_datetime(df['time'], unit='s')   # 将time的时间戳转为日期 参数unit表示单位为 秒
df['time'].head()

将时间戳转为日期
转换完成后查看开始日期,发现两条异常值,因为量小所以直接删除。
查看并删除异常值
同理查看结束日期,也有一条异常值也直接删除。

由于后面计划对用户行为按日期和一天内24小时两个维度进行分析,所以需要将 time 字段进行拆分, 拆分出日期和小时。

# 忽然想到需要将时间切分为年月日部分和小时分秒部分 分开进行分析用户行为
# 所以将time字段转为object类型,然后拆分为两列
def date_to_str(date):
    return str(date)
time_data = df['time'].apply(date_to_str)
df['time'] = time_data
df['date'] = df['time'].str[0:10]   # 提取出年月日
df['hour'] = df['time'].str[11:13]   # 提取出小时
df.head()

拆分 time 字段
将 time 字段分为 date 字段和 hour 字段之后查看数据范围,发现日期数据有2018年8月的数据,不在我的分析范围之内,所以需要进行处理
查看数据是否符合预期
将不需要的数据去除

df = df[df['date']<='2018-01-01']   # 只取2017年的数据

删除目标之外的数据
数据预处理完成,将处理后的数据保存并准备存入 MySQL 进行分析
删除 time 字段并保存
数据导入 MySQL :在这里我是使用 Navicat 建好表之后,右键单击新建好的表直接导入的。
将数据导入 MySQL
数据导入完成后即可开始进行基本的数据分析操作。

四. 数据概览

完成数据导入后首先查看数据集的基本信息:

select count(distinct(id)) as '用户总数',
			 count(distinct(item)) as '商品总数',
			 count(distinct(category)) as '类目总数',
			 count(distinct(behavior)) as '行为总数',
	  	 count(distinct(date)) as '日期总数'
from user_behavior;

初次数据概览
通过数据概览可以发现日期总数多达35个,然后进一步查看日期分布,发现数据量大、有价值的日期只有2017-11-25至2017-12-03 这9天时间,所以将不在这9天时间里面的数据都删掉

select date, count(date) total
from user_behavior
GROUP BY date;
ORDER BY date DESC;
delete from user_behavior where date BETWEEN '2017-07-01 00:00:00' AND '2017-11-24 00:00:00';

DELETE FROM user_behavior WHERE date='2017-12-06 00:00:00';

再次查看数据概览
数据概览
此时数据已基本清洗完毕,可以进行进一步的分析活动了。

五. 用户分析

(一) 用户整体购物情况分析

在对数据进行简单处理后即可开始对用户行为进行一定维度的分析了,首先查看一下总的访问量和日均访问量

# 查看PV总数及日均PV数
select count(behavior) pv_count, count(behavior)/COUNT(DISTINCT(date)) pv_avg
from user_behavior
where behavior='pv';

PV数及日均PV数

# 总用户数
select count(distinct(id)) from user_behavior;

用户总数

从日均PV数及总用户数可以看出淘宝的用户活跃度较高。
查看有购买行为的用户数

# 有购买行为的用户数
select count(distinct(id)) from user_behavior where behavior='buy';

有购物行为的用户数
从有购买行为的用户数和用户总数可以看出超过三分之二的用户都有购物行为,说明淘宝用户的购物意向比较强。

(二)用户行为分析
2.1 漏斗模型分析

首先由之前的查询可知总PV数为37375,然后直接创建用户行为视图方便后续分析

# 用户各行为视图
CREATE VIEW sum_behavior as
select id, sum(case when behavior='pv' then 1 else 0 end) as sum_pv,
           sum(case when behavior='fav' then 1 else 0 end) as sum_fav,
					 sum(case when behavior='cart' then 1 else 0 end) as sum_cart,
					 sum(case when behavior='pv' then 1 else 0 end) as sum_buy
					 from user_behavior
					 GROUP BY id;

然后即可得出各阶段数值和各阶段转化率
各阶段数值

select CONCAT(round(sum(sum_pv)/sum(sum_pv)*100,2),'%') as pv_to_pv,    
			 CONCAT(round(sum(sum_cart+sum_fav)/sum(sum_pv)*100,2),'%') as pv_to_fav_and_cart,   # 访问转化为加购+收藏
			 CONCAT(round(sum(sum_buy)/sum(sum_cart+sum_fav)*100,2),'%') as cart_to_buy   # 收藏加购转化为购买
from sum_behavior;

各阶段转化率
最后使用 Excel 制作漏斗图进行更加直观的展示
用户行为漏斗图

2.2 时间维度分析
2.2.1 9天中每天的用户行为分析

尝试对9天内的用户行为进行分析,主要查看用户在一周内的活跃情况如何,首先查看9天内每天的用户数的活跃情况

# 9日内用户分布
select date, count(DISTINCT(id))
from user_behavior
GROUP BY date;

9日内每日用户活跃数据
然后查看9日内各种行为的分布情况,此处仅以PV数为例

# 查看9日内访问数分布,以浏览为例
SELECT date, count(behavior) as '总访问数'
from user_behavior 
where behavior='pv'
GROUP BY date;

将所有数据整理成表格
数据总览
将数据制作成图表进行更加直观的展示
9日内用户及行为分布
查看日历发现2017-11-25日为星期六,2017-11-26日为星期天,则2017-12-2也为星期六,2017-12-3日为星期天。从图中可以看出在2017-11-27日至2017-12-3日这一个星期中,在星期六和星期天这两天中用户各项数据的活跃度明显大于星期一至星期五。但是在2017-11-25日至2017-12-1日这一周时间内星期六和星期天并没有更突出的表现。
对此我的猜想是因为双十一活动刚刚过去没有多久的原因,用户的活跃性已经被提前透支一部分了,所以即使在周末也没有比平常有更大的提升,但是到了12月份,消费者会更多的认为已经过了一个月了,所以用户在周末的活跃度与平常又有了区别。所以可以确定的结论是在星期六与星期天用户的活跃度比星期一至星期五是要高的,商家可以在周末进行更多的活动提高产品的受众数量。

2.2.2 一天中各个时间段的用户行为分析

直接选取从2017-11-27至2017-12-0查看一天中24小时内的用户行为分布

select hour, count(behavior),
       sum(case when behavior='pv' then 1 else 0 end)as sum_pv,
			 sum(case when behavior='fav' then 1 else 0 end)as fav_pv,
			 sum(case when behavior='cart' then 1 else 0 end)as cart_pv,
			 sum(case when behavior='buy' then 1 else 0 end)as buy_pv
from user_behavior
GROUP BY hour
order by hour;

24小时内行为分布
将数据整理为图表
一天中各时间段用户行为分布情况
从图表可以看出用户在一天中的12点至15点的活跃度是比较高的,但是这与我的判断是有出入的。按照常理来说这个时间段大部分用户应该是午睡时间,相比于其他时间对购物的兴趣应该不大才对,并且13点至15点用户活跃度仍在上升,这是违背常理的。所以我判断是我的数据有问题,在查看了其他人对此数据集的处理和分析之后我发现了我的问题:对于数据集初始的 time 字段其格式是时间戳,但是这个时间戳的时间并不是东八区的北京时间,而是世界时间,要转换成东八区的时间必须要加上8个小时,所以对 hour 字段进行处理

# 将所有的小时加8,如果大于等于24的就减去24
update user_behavior set hour= hour+8;
update user_behavior set hour= hour-24 where hour>=24;

将时间处理完毕后再查看一天中各时间段用户行为分布情况,将数据整理成表格一天中各时间段用户行为分布情况-数据表
再整理成图表
一天中各时间段用户行为分布情况-图表
从图表可以看出用户的活跃度从早上8点开始有逐步上升并趋于稳定的过程,在19点之后开始有快速增长的表现,其峰值在22点至23点,并在凌晨之后暴跌。这个结果相比较之前的结果更加符合实际,所以后续将在这个结果的基础上进行分析判断。所以,如果商家有活动或者新品需要推广,建议将工作重心放在7点至11点这段时间内,在这段时间可以提高产品的受众数量。
接着使用上一步提取出的数据生成浏览购买比和整体的平均值,再绘制成图表进行分析
24小时内转化率
从图表中可以看出用户喜欢在9点至18点下单,在这个时间段商家需要准备好货源和客服资源,因为用户在下单之前可能会询问更多的问题,同时准备好货源可以快速发货,提高用户的购物体验。

(三)用户特征分析
3.1 高购买率用户特征分析

选择查看购买率高的前20名用户的行为数据

select *, sum_buy/sum_pv as buy_total
from sum_behavior
ORDER BY buy_total DESC
limit 20;

高购买率用户
虽然PV数小,购买数大看起来不真实,但是有可能是用户之前有收藏加购,这次是直接购买的。从结果可以看出购买率高的用户喜欢先收藏或者加购之后再统一购买,直接浏览购买占比不大,所以针对这部分用户如果能够推荐合乎心意的产品就能提升他们的消费金额。(好的就买的多)

高购买量高用户特征分析

选择查看购买量高的前20名用户的行为数据

# 研究购买量高的用户行为
SELECT *
from sum_behavior
ORDER BY sum_buy DESC
limit 20;

购买量高的用户

虽然高购买量的用户中有一条异常值:浏览、收藏、加购都是0,但是从结果可以看出其余的用户都是有着较高的浏览量,才带来了较高的购买量,浏览量少直接购买的客户很少。所以针对这部分用户应该广泛的推荐他们喜欢的产品,从而提高他们的消费金额。(喜欢买买买)

(四)用户价值分析

对于用户价值方面采用RFM模型进行分析,RFM模型的含义如下:
R 用户最近购买时间,越近分数越高
F 用户购买评率,越大分数越高
M 用户购买金额,越大分数越高
按照不同的情况可以将客户分为9种类型,并分别给出相应的处理方向。
RFM模型
因为数据集的用户购物金额缺失,所以只进行两个维度的分析,即只对用户的最近消费时间和消费频率进行分析。
首先得出频率得分,最近一次消费时间越近分数越高,并统计出消费次数

select id, (1-(DATEDIFF(max(date), '2017-12-03 00:00:00'))/(DATEDIFF('2017-11-25 00:00:00','2017-12-03 00:00:00'))) as R_score, COUNT(behavior) as F_times
from user_behavior
where behavior='buy'
GROUP BY id;

统计消费次数及最近消费得分
然后计算平均数 时间平均数为0.67666627, 购买次数平均3.0051

select avg(a.R_score), AVG(a.F_times)
from (select id, (1-(DATEDIFF(max(date), '2017-12-03 00:00:00'))/(DATEDIFF('2017-11-25 00:00:00','2017-12-03 00:00:00'))) as R_score,  COUNT(behavior) as F_times
from user_behavior
where behavior='buy'
GROUP BY id)as a;

统计平均数
根据两项平均数进行用户划分

select a.id, (case when a.R_score>0.67666627 and a.F_times>3.0051 then '重要价值客户'
                  when a.R_score>0.67666627 and a.F_times<=3.0051 then '重要保持客户'
  								when a.R_score<=0.67666627 and a.F_times>3.0051 then '重要发展客户'
									when a.R_score<=0.67666627 and a.F_times<=3.0051 then '重要挽留客户' end) as user_type
from (select id, (1-(DATEDIFF(max(date), '2017-12-03 00:00:00'))/(DATEDIFF('2017-11-25 00:00:00','2017-12-03 00:00:00'))) as R_score,  COUNT(behavior) as F_times
from user_behavior
where behavior='buy'
GROUP BY id)as a;

将用户划分好之后查看各种分类的用户人数

select b.user_type, COUNT(b.id) as user_total
from (select a.id, (case when a.R_score>0.67666627 and a.F_times>3.0051 then '重要价值客户'
                  when a.R_score>0.67666627 and a.F_times<=3.0051 then '重要保持客户'
  								when a.R_score<=0.67666627 and a.F_times>3.0051 then '重要发展客户'
									when a.R_score<=0.67666627 and a.F_times<=3.0051 then '重要挽留客户' end) as user_type
from (select id, (1-(DATEDIFF(max(date), '2017-12-03 00:00:00'))/(DATEDIFF('2017-11-25 00:00:00','2017-12-03 00:00:00'))) as R_score,  COUNT(behavior) as F_times
from user_behavior
where behavior='buy'
GROUP BY id)as a) as b
GROUP BY b.user_type;

最后的结果为
客户分类
制作成饼图进行展示
客户分类饼图
从图中可以看出可以对重要挽留客户再做一些工作,减少其所占的百分比,比如提供一些优惠,精准推荐商品等操作激活用户的消费欲望,对用户完成召回工作。

六. 商品分析

高销量商品分析

首先查看一下购买人数最多的商品,探索一下大众的喜好风向如何

select item, COUNT(DISTINCT(id))
FROM user_behavior
where behavior='buy'
GROUP BY item
ORDER BY COUNT(DISTINCT(id)) DESC limit 20;

在探究一下高销量商品有哪些

select item, count(id)
FROM user_behavior
where behavior='buy'
GROUP BY item
ORDER BY COUNT(id) DESC limit 20;

接着研究一下高销量商品的转化率如何

select b.item, concat(round(b.sum_buy/b.sum_pv*100, 2), '%') as '转化率'
from (SELECT item, 
       SUM(if(behavior='pv', 1, 0))  as sum_pv,
       SUM(if(behavior='fav', 1, 0))  as sum_fav,
			 SUM(if(behavior='cart', 1, 0))  as sum_cart,
			 SUM(if(behavior='buy', 1, 0))  as sum_buy
from user_behavior
where item in 
      (select a.item from(select item
			FROM user_behavior
			where behavior='buy'
			GROUP BY item
			ORDER BY COUNT(id) DESC limit 20)as a)
group by item)as b
ORDER BY b.sum_buy/b.sum_pv DESC;

高销量商品转化率

可以发现有的高销量商品的点击转化率非常高,即使点击转化率不高的也完全超过均值。对于高销量商品而言能够实现高转化率说明商家的销售策略和营销对象的选取都非常的正确,可以对他们的经验进行借鉴。

高浏览量商品分析

最后查看一下高浏览量商品的转化率如何,找出表现不好的商品

select b.item, CONCAT(round(b.sum_buy/b.sum_pv*100, 2),'%') as '转化率'
from (
select item,
       SUM(if(behavior='buy', 1, 0))  as sum_buy,
			 SUM(if(behavior='pv', 1, 0))  as sum_pv
from user_behavior
where item in (select a.item from (select item, count(item) as pv_total
from user_behavior
where behavior='pv'
GROUP BY item
order by count(item) DESC limit 100)as a )# and behavior='buy' or behavior='pv'
GROUP BY item) as b
order by b.sum_buy/b.sum_pv;

高浏览量商品转化率
从查询结果可以看出大部分的高浏览量的商品的转化率都在平均值以上,但是仍然有一部分商品的转化率很低甚至为0。对于这一部分商品应该进行详细的分析,查看用户的流失情况,视情况更改商品营销策略,比如修改详情页、调整价格等操作。

总结

通过本次项目熟悉了pandas清洗数据的基本流程和MySQL的各种查询语句的使用,以及Excel对数据的整理展示,同时也明白了电商用户行为分析的基本流程和思路以及相关指标。在这次的项目中也清楚的认识到自己业务思维的不足,还是需要按照别人的思路一步步实现,自己的想法比较少,并且前期使用python对数据的清洗和处理也不够彻底,给后续工作带来了不便,这也是欠考虑的后果。总的来说这次的项目还是成功的,并且也给了我很多的收获。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值