利用Python对淘宝用户行为进行分析
源数据来源于: https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1
可以注册他的账号之后,免费下载。
以下是我下载的数据分享:
链接:https://pan.baidu.com/s/1uGddx2BzRdNencKnyN4quQ
提取码:puam
UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究。
数据集介绍
文件名称 | 说明 | 包含特征 |
UserBehavior.csv | 包含所有的用户行为数据 | 用户ID,商品ID,商品类目ID,行为类型,时间戳 |
UserBehavior.csv
本数据集包含了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 | 收藏商品 |
关于数据集大小的一些说明如下
维度 | 数量 |
用户数量 | 987,994 |
商品数量 | 4,162,024 |
商品类目数量 | 9,439 |
所有行为数量 | 100,150,807 |
活跃度整理:
按一日的时刻来统计哪个时间段活动程度,从所有的数据里面取了:1万条数据进行统计:
如下图所示:
def time_data():
data=get_data()
#转换时间
data['time']=pd.to_datetime(data['timestamp'],unit='s')
# 先设置索引再清洗数据
data.set_index('time',inplace=True)
data=data.drop(['timestamp'],axis=1)
data=data['2017-11-25':'2017-12-3']
data.reset_index(inplace=True)
# 提取,周,日,时
data['week']=data['time'].dt.weekday
data['day']=data['time'].dt.day
data['hour']=data['time'].dt.hour
data['date']=data['time'].dt.date
data.drop_duplicates(['user_id','time','category_id'],keep='first',inplace=True)
return data
# 天不同时间段的活跃度
def day_report():
data=time_data()
# 根据hour分组,以用户id为主计算每个用户活跃次数
day_active=data.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'Count'})
# user_id 表名?
day_data=day_active
# 打印柱状图
x=day_data.hour.tolist()
y=day_data.Count.tolist()
plt.figure(figsize=(20,8),dpi=80)
day_plt=plt.bar(range(len(x)),y,width=0.3)
# x刻度
x_ticks=('{}点'.format(i) for i in x)
plt.xticks(x)
plt.xlabel('时间点')
plt.ylabel('用户活跃数')
plt.title('日活跃度统计分析表')
# 设置每一柱的具体值
for dd in day_plt:
d_pat=dd # type: matplotlib.patches.Rectangle
height_value = d_pat.get_height()
plt.text(d_pat.get_x()+d_pat.get_width()/2,height_value+10,str(height_value),ha='center',color='r')
plt.show()
按以上的时刻统计出来的活跃程序不正常,晚上下班的活跃程序不如三更半夜。不知道哪里出错了。?????
问题分析 :时间戳按子午线时间存储,需要转换成北京时间东8区的,需要加8个小时。调用python内部的接口转换。
已经找到解决方法了,重新参考了网上的代码,用:time.localtime,这个方法转换时间如下:重写的time_data()方法:
def time_data():
data=get_data()
data.drop_duplicates(subset=['user_id','goods_id','timestamp'],
keep='first',inplace=True)
def stramp2time(x):
return time.strftime('%Y-%m-%d %H',time.localtime(x))
data['date']=data['timestamp'].apply(stramp2time) #将时间戳转化为时间元组,再转换为标准的时间:time.localtime
data['date']=pd.to_datetime(data['date']) # 转换为datetiem格式
data['week']=data['date'].dt.weekday
data['day'] = data['date'].dt.day
data['hour'] = data['date'].dt.hour
# 获取时间是17.11.25至17.12.3之间的数据,去掉无效数据
tl=datetime.datetime(year=2017,month=11,day=25)
th = datetime.datetime(year=2017,month=12,day=3)
data = data[(data.date>=tl) & (data.date<=th)]
return data
生成的日活跃度的数据流正常了。