淘宝用户行为分析
数据来源
数据链接,我下载的是2018年上传的905.80MB的UserBehavior.csv.zip。
本项目完整源码,提取码9a5v。
为减少篇幅,所以本篇的绘图部分代码没有附上,需要的小伙伴可以点开链接下载完整代码。
项目背景
UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究。
本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。
分析目标
- 用户活跃时段,指标趋势
- 用户对哪些产品、类目感兴趣,付费用户和非付费用户区别
- 转化率,跳失率、复购率
- 用户购买行为特点
- 根据RFM模型对用户分类
数据概览
列名称 | 说明 |
---|---|
用户ID | 整数类型,序列化后的用户ID |
商品ID | 整数类型,序列化后的商品ID |
商品类目ID | 整数类型,序列化后的商品所属类目ID |
行为类型 | 字符串,枚举类型,包括(‘pv’, ‘buy’, ‘cart’, ‘fav’) |
时间戳 | 行为发生的时间戳 |
行为类型 | 说明 |
---|---|
pv | 商品详情页pv,等价于点击 |
buy | 商品购买 |
cart | 将商品加入购物车 |
fav | 收藏商品 |
数据准备
导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts import charts as pyc
from pyecharts import options as opts
import warnings
%matplotlib inline
# 忽略警告
warnings.filterwarnings("ignore")
# 修改matplotlib尺寸
plt.rcParams['figure.figsize'] = (20, 8)
# 解决matplotlib中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
数据导入
原数据集有1亿多条,内存不够所以无法全部导入,故此次导入1000万条数据进行分析。
# 数据量过大,这里只选取前1000w行
# 根据官网介绍给定列名
columns = ["userid", 'itemid', 'categoryid', 'type', 'timestamp']
# 使用iterator将数据分块,返回迭代器
data = pd.read_csv("./UserBehavior.csv", iterator=True,
chunksize=10000000, names=columns, parse_dates=['timestamp'])
# 将前1000w行数据存放在df
df=data.get_chunk(10000000)
查看一下数据信息,共1000万行,前三个字段都是int,后两个是object,我们需要将时间戳转换为日期格式。
数据清洗
- 将时间戳转为日期。
- 数据集说明中写的是本数据集的日期范围是2017年11月25日至2017年12月3日,所以剔除这日期以外的数据。
import time
def get_unixtime(timeStamp):
formatStr = "%Y-%m-%d %H:%M:%S"
tmObject = time.strptime(timeStamp, formatStr)
return int(time.mktime(tmObject))
startTime = get_unixtime("2017-11-25 00:00:00")
endTime = get_unixtime("2017-12-03 00:00:00")
# 保留2017年11月25日至2017年12月3日之间的数据(先减少数据量,再转换可以节省点时间)
df = df[(df.timestamp >= startTime) & (df.timestamp <= endTime)]
# 要注意时区问题,pd.to_datetime转换的默认时区不是中国
df['datetime'] = pd.to_datetime(
df.timestamp, unit='s', utc=True).dt.tz_convert("Asia/Shanghai")
# 删除时间戳节约内存
df.drop('timestamp', inplace=True, axis=1)
# 将datetime进行拆分成date和hour
df['date'] = df.datetime.dt.date
df['hour'] = df.datetime.dt.hour
保留下来9994427条数据,最早的是2017-11-25 00:00:01,最晚的是2017-12-03 23:59:59。
数据分析
用户流量类指标
# 取消科学计数法,保留两位小数
pd.set_option("float_format", lambda x: "%.2f" % x)
# 9天总用户量,有操作记录的商品及类目
count_users = df.userid.nunique()
count_itemid = df.itemid.nunique()
count_categoryid = df.categoryid.nunique()
count_user_bought=df[df['type']=='buy'].userid.nunique()
count_user_nobought = count_users-count_user_bought
# 9天总操作记录数
types = ["pv", "cart", "fav", "buy"]
type_s = df.type.value_counts()
# 拼接9天所有、日均、人均指标
type_df = pd.DataFrame([type_s, type_s/9, type_s / count_users],
columns=types, index=["all", "aver_day", "aver_user"])
# 购买过的用户总共浏览了几次,购买了几次
type_df.loc['user_bought']=df[df['userid'].isin(df[df['type']=='buy']['userid'].unique())].type.value_counts