电商平台中的用户行为频繁且较复杂,系统上线运行一段时间后,可以收集到大量的用户行为数据,进而利用数据分析技术进行深入挖掘和分析,得到感兴趣的商业指标并增强对风险的控制。
电商用户行为数据多样,整体可以分为用户行为习惯数据和业务行为数据两大类。
用户的行为习惯数据包括了用户的登录方式、上线的时间点及时长、点击和浏览页面、页面停留时间以及页面跳转等等,我们可以从中进行流量统计和热门商品的统计,也可以深入挖掘用户的特征;这些数据往往可以从web服务器日志中直接读取到。
而业务行为数据就是用户在电商平台中针对每个业务(通常是某个具体商品)所作的操作,我们一般会在业务系统中相应的位置埋点,然后收集日志进行分析。
业务行为数据又可以简单分为两类:一类是能够明显地表现出用户兴趣的行为,比如对商品的收藏、喜欢、评分和评价,我们可以从中对数据进行深入分析,得到用户画像,进而对用户给出个性化的推荐商品列表,这个过程往往会用到机器学习相关的算法;另一类则是常规的业务操作,但需要着重关注一些异常状况以做好风控,比如登录和订单支付。
基于对电商用户行为数据的基本分类,我们可以发现主要有以下三个分析方向:
1.热门统计 利用用户的点击浏览行为,进行流量统计、近期热门商品统计等。
2.偏好统计 利用用户的偏好行为,比如收藏、喜欢、评分等,进行用户画像分析,给出个性化的商品推荐列表。
3.风险控制 利用用户的常规业务行为,比如登录、下单、支付等,分析数据,对异常情况进行报警提示。
本项目限于数据,我们只实现以下三个需求:
用户的四种行为情况,用柱状图显示;统计每天各行为的访问次数,并以折线图显示;找出购买率最高的前二十个商品品类,并以柱状图展示我们准备了一份淘宝用户行为数据集,保存为csv文件。包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢),数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔;用户行为类型共有四种 1. pv:商品详情页点击; 2. buy:购买; 3. cart:加入购物车; 4. fav:收藏商品;
分析数据 —> 整理并清除异常数据 —> 实现需求
数据有3个多G,全部读取耗费时间与内存,因此使用pandas的迭代读取方法,先获取前一万条数据,熟悉数据内容,并加入列名
import pandas as pd user_behavior = pd.read_csv('UserBehavior.csv',header=None,iterator=True) head_data = user_behavior.get_chunk(10000) head_data.head()2、对数据进行整理、清洗 2.1、添加列名,数据特征分别是:用户ID,商品ID,商品类目ID,行为类型,时间戳
head_data.columns = ['user_id','goods_id','category_id','behaviour','timestamp']2.2 查看是否有缺失值
head_data.info()2.3、将时间戳转为时间格式,并新加一列time
head_data['time'] = pd.to_datetime(head_data['timestamp'],unit='s')2.4、时间戳这列数据下面不会用到,可以删除掉
head_data = head_data.drop(['timestamp'],axis=1)2.5、将time字段设为索引,目的是为了方便清除异常时间的数据
head_data.set_index('time',inplace=True)2.6、数据是2017年11月25日至2017年12月3日之间,将异常时间的数据清洗掉
head_data = head_data['2017-11-25':'2017-12-3']需求1 : 统计用户的每个购物行为,思路:使用groupby进行分组并统计
count_by_user_behav = head_data.groupby(['user_id','behaviour']).count() count_by_user_behav.head()只取一列次数,作为画图的Y轴值
count_by_user_behav = count_by_user_behav['goods_id'] count_by_user_behav.head()使用pandas自带的画图功能,因为用户很多,所以x轴就很长,双击图片可以放大
count_by_user_behav.plot(kind='bar', figsize=(150,10))需求2 : 统计每天各行为的访问次数,并以折线图显示
# 接下来结合matplotlib画图 from matplotlib import pyplot as plt %matplotlib inline # 设置画布尺寸 plt.figure(figsize=(20, 8)) # 以行为类型进行分组 for group_name,group_data in head_data.groupby('behaviour'): # 对每天的行为进行统计,resample中的D表示天,也可以用H按小时统计 count_by_day = group_data.resample('D').count()['behaviour'] # 以日期作为X轴,以次数为y轴 x = count_by_day.index y = count_by_day.values 课 # 设置x,y轴数据以及每条线的标签名 plt.plot(range(len(x)), y, label=group_name) # 设置x轴的刻标以及对应的标签,rotation是设置标签的倾斜度 plt.xticks(range(len(x)), x, rotation=45) # 对每条折线的含义进行标注,自动选择最佳位置 plt.legend(loc='best') 可以清晰看出四种购物行为的走势图 plt.show()需求3 : 找出购买率最高的前二十个商品品类,并以柱状图展示
思路:按商品种类进行分组,购买率 = 购买次数/(访问+购物车+收藏+购买)
# 取消以时间为索引 head_data = head_data.reset_index() # 按商品种类进行分组 count_by_category_id = head_data.groupby('category_id') # 分组后每组数据的数量 count_by_category_id.size()看一下分组后的部分数据
for group_name,group_data in count_by_category_id: print('组名:',group_name) print('数据:') print(group_data) print(group_data.shape) break思路:通过shape看出这组数据的形状为两行五列,因此可以直接用shape[0]作为购物的总次数使用,接下来再以behaviour分组,通过size属性,获取buy这一组的次数,最后将商品种类与购买率一一对应保存在字典中,使用内置函数sorted对字典进行排序
con_dict = {} 中,使用内置函数sorted对字典进行排序 # 总次数 for group_name,group_data in count_by_category_id: total = group_data.shape[0] buy = 0 try: # 有些商品没有购买行为,以buy作为索引获取时会出错,使用异常语句捕捉一下 buy = group_data.groupby('behaviour').size()['buy'] except: pass# 转化率 convention = buy/total*100 # 类别名称对应转化率 con_dict[group_name] = convention # 排序 sort_con = sorted(con_dict.items(),key=lambda item:item[1],reverse=True) # 对排好序的列表取值 sort_con_20 = sort_con[:20] sort_con_20sorted的用法: 第一个参数是进行排序的可迭代对象; key:主要是用来比较的元素,lambda函数的参数取自要排序的可迭代对象,指定可迭代对象中的元素进行排序; reverse:排序规则,默认升序,True表示降序;
前二十个商品种类及对应购买率如下,拿到这个,就可以使用matplotlib进行绘图了
# 获取所有的商品种类 tick_label = [i[0] for i in sort_con_20] # 获取转化率 num_list = [i[1] for i in sort_con_20] # 开始画图 plt.figure(figsize=(20, 8)) plt.bar(range(len(sort_con_20)), num_list,tick_label=tick_label) plt.show()