电商用户行为分析

数据集使用了阿里巴巴提供的一个淘宝用户行为数据集–UserBehavior是,用于隐式反馈推荐问题的研究。该数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。由用户ID、商品ID、商品类目ID、行为类型和时间戳组成。

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据


我将记录自己对这个数据集的简单分析,通过使用pandas和mysql对数据做处理,使用pyplot来进行可视化。(由于该数据集过于庞大,设备的性能有限,本次实验中仅使用前10000000条数据)

下面是分析思路:

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据_02

1.数据的清洗

首先导入一些我们会用到的包

import pandas as pd
from collections import Counter
from datetime import datetime
import matplotlib.pyplot as plt
import pymysql

先将数据导入,转换成一个df,由于数据本身是不带列名的,这里我们自己设置

df = pd.read_csv(r"2.csv")
df.columns = ['user_id', 'item_id', 'category_id', 'behavior_type', 'timestamp']

处理数据的重复值和缺失值

print(df.duplicated().sum())  # 查看重复值数量
df.drop_duplicates(inplace=True)
print(df.duplicated().sum())
print(df.isnull().sum())  # 查看缺失值

可以看出是没有缺失值的,只需要删除5条重复值即可

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_sql_03


下面我们对这个时间戳进行转换

df['timestamp'] = pd.to_datetime(df['timestamp'], unit="s")
df["timestamp"] = df["timestamp"].astype(str)  # 转换为字符串方便后续处理
df1 = df["timestamp"].str.split(" ", 2, True)  # 将年月日与时分秒分开
df1.columns = ["date", "time"]
df = df.drop("timestamp", axis=1).join(df1)
df = df.sort_values(['date'])
print(df)

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据分析_04


处理完后可以发现还是有很多不在正确时间段内的数据,我们将其删除

df = df.drop(df[(df.date < '2017-11-25') | (df.date > '2017-12-04')].index)
print(df)

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_sql_05


至此基本完成了数据的预处理,下面我们将数据导入mysql中

首先在MySQL中创建一个表,表结构如下:

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据分析_06

接下来使用pandas提供的to_sql来进行处理

conn = create_engine("mysql+pymysql://root:123456@localhost:3306/demo?charset=utf8")
df.to_sql(name="ubd", con=conn, index=False)

结果pychram一直在运行,但是数据缺无法导入,我猜想可能是我的设备性能的问题,于是自己写了一个分批导入

conn = create_engine("mysql+pymysql://root:123456@localhost:3306/demo?charset=utf8")
df.to_sql(name="ubd", con=conn, index=False)
for i in range(100000, 10000000+1, 100000):
df1 = df[i - 100000:i]
print('开始')
df1.to_sql(name="ubd", con=conn, index=False, if_exists='append')
print('完成' + str((i / 10000000)*100) + '%')

成功将数据导入

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_mysql_07


对比查询一下记录数也没有错误

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_python_08

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据分析_09

2.数据分析

将数据导入完成后,就可以开始进行数据的分析了,我们需要从不同的角度去分析,找到能让营收额提高的策略,首先我们从整体的一个时间上来进行分析,找到用户的活动规律,以此为基础再来探究用户的行为爱好,用户消费价值等等。

2.1时间轴分析

由于数据的时间只有几天,我们就从这几天的维度来分析,找到突出的的日期,再从小时的维度来进行分析。首先我们查看一下在这几天总体的各类事件发生情况和每日的人流量。

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据分析_10


下面我们从每一天来看,由于要用到数据可视化,因此再次使用python来访问mysql中的数据,来方便使用了pyplot进行数据可视化

import numpy as np
import matplotlib.pyplot as plt
from pymysql import Connect
import matplotlib.font_manager as fm

conn = Connect(host='localhost', port=3306, user='root', password='123456', database='demo')
cursor = conn.cursor()  # 获取游标

sql = '''select date,
count(distinct user_id) as 用户数,
sum(case when behavior_type = 'pv'   then 1 else 0 end ) as 总点击数,
sum(case when behavior_type = 'fav'   then 1 else 0 end ) as 总收藏数,
sum(case when behavior_type = 'cart'   then 1 else 0 end ) as 总加入购物车数,
sum(case when behavior_type = 'buy'   then 1 else 0 end ) as 总购买数
from ubd
group by date;
'''
cursor.execute(sql)
data = cursor.fetchall()  # 读取数据
data = np.array(data)  # 将数据转换为数组

x = [data[i][0] for i in range(data.shape[0])]  # 以时间为x轴
y1 = [data[i][1] for i in range(data.shape[0])]  # y1用于存放每天的独立访客数
y2 = [int(data[i][2]) for i in range(data.shape[0])]  # y1用于存放每天的点击数
y3 = [int(data[i][3]) for i in range(data.shape[0])]  # y1用于存放每天的收藏数
y4 = [int(data[i][4]) for i in range(data.shape[0])]  # y1用于存放每天的加入购入车数
y5 = [int(data[i][5]) for i in range(data.shape[0])]  # y1用于存放每天的购买数

下面进行数据可视化,首先是每日用户流量趋势

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
myfont = fm.FontProperties(fname=r'C:\WINDOWS\Fonts\simfang.ttf')  # 自定义仿宋字体
colors = ['lightcoral', 'coral', 'darkorange', 'gold', 'palegreen', 'paleturquoise',
          'skyblue', 'plum', 'hotpink', 'pink']  # 自定义颜色

fig1 = plt.figure()  # 创建一个画布
ax1 = fig1.add_subplot(1, 2, 1)  # 第一个子图放在第一行第一列
ax1.bar(x, y1, color=colors)  # 创建柱图
ax1.set_title('每日访客量(柱图)', fontsize=12, fontproperties=myfont)
ax1.set_xticklabels(x, rotation=30)
for i in range(len(x)):
    ax1.text(x=x[i], y=y1[i], s=y1[i], ha='center', size=9)
ax2 = fig1.add_subplot(1, 2, 2)

ax2.plot(x, y1)  # 创建折线图
ax2.set_title('每日访客量(折线图)', fontsize=12, fontproperties=myfont)
ax2.set_xticklabels(x, rotation=30)
for i in range(len(x)):
    ax2.text(x=x[i], y=y1[i], s=y1[i], ha='center', size=9)
a = [np.mean(np.array(y1)) for i in range(len(x))]

ax2.plot(x, a, '--')  # 将平均量用虚线绘制
ax2.text(x=x[-1], y=a[-1], s='平均值:' + str(round(a[-1])), color='r', fontproperties=myfont)
plt.show()

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_sql_11


额,这里由于之前切片10000000条数据的原因,导致了在12月4日这一天的数据不足,我们在mysql中将其删除,再次进行可视化。

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据_12


基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_sql_13


不难看出用户流量在12月01日后发生了飞速上涨,下面我再结合这几日用户的各类行为根据日期变化的趋势来分析。

点击量:(画图的代码就是将y轴变成之前相应的存放列表即可,因此后面的几个行为分析可视化代码就不再贴出)

fig1 = plt.figure()  # 创建一个画布
ax1 = fig1.add_subplot(1, 2, 1)  # 第一个子图放在第一行第一列
ax1.bar(x, y2, color=colors)  # 创建柱图
ax1.set_title('每日点击量(柱图)', fontsize=12, fontproperties=myfont)
ax1.set_xticklabels(x, rotation=30)
for i in range(len(x)):
    ax1.text(x=x[i], y=y2[i], s=y2[i], ha='center', size=9)
ax2 = fig1.add_subplot(1, 2, 2)

ax2.plot(x, y2)  # 创建折线图
ax2.set_title('每日点击量(折线图)', fontsize=12, fontproperties=myfont)
ax2.set_xticklabels(x, rotation=30)
for i in range(len(x)):
    ax2.text(x=x[i], y=y2[i], s=y2[i], ha='center', size=9)
a = [np.mean(np.array(y2)) for i in range(len(x))]

ax2.plot(x, a, '--')  # 将平均量用虚线绘制
ax2.text(x=x[-1], y=a[-1], s='平均值:' + str(round(a[-1])), color='r', fontproperties=myfont)
plt.show()

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据_14


每日收藏量:

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_sql_15


每日加入购物车量:

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据_16


每日购买量:

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据_17


将这些折线图都整合在一起:

plt.plot(x, y1)
plt.plot(x, [i / 10 for i in y2])  # 由于点击数比其他四项过大,稍微规约一下方便看图
plt.plot(x, y3)
plt.plot(x, y4)
plt.plot(x, y5)
plt.xticks(rotation=30)
plt.legend(['用户数', '点击量', '收藏量', '加入购物车量', '购买量'], frameon=False)
plt.show()

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_数据分析_18

结合以上的图,不难发现在12月02日之前的几天5项指标都是比较平稳没有太大波动的,但是在12月02日,12月03日却远超这几天的平均值,为了找到原因,我们可以百度一下2017年12月02日这几天淘宝有什么活动

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_sql_19


基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_python_20

由此可知在12月1日到6日淘宝天猫开启了服饰焕新和双十二预热的活动。而且取得很好的成效,使得淘宝在整体的流量上都有了巨大的提升。而且从日历上可以看到12月2,3日也正是周末的日子。

下面我们再从一天中24小时的维度来对这5项指标进行分析:
先将点击量单独拿出来,只是由于它的数量远远超出其他4项指标,放在同一张图中会严重影响到可视化的观感

sql1 = """select hour(time),
COUNT(DISTINCT user_id) as 用户数,
sum(case when behavior_type= 'pv' then 1 else 0 end) as 点击数,
sum(case when behavior_type= 'fav' then 1 else 0 end) as 收藏数,
sum(case when behavior_type= 'cart' then 1 else 0 end) as 加购数,
sum(case when behavior_type= 'buy' then 1 else 0 end) as 购买数
from ubd
group by hour(time)
order by hour(time);
"""

cursor.execute(sql1)
data1 = cursor.fetchall()
data1 = np.array(data1)
print(data1)

xx = [data1[i][0] for i in range(data1.shape[0])]
yy1 = [data1[i][1] for i in range(data1.shape[0])]
yy2 = [int(data1[i][2]) for i in range(data1.shape[0])]
yy3 = [int(data1[i][3]) for i in range(data1.shape[0])]
yy4 = [int(data1[i][4]) for i in range(data1.shape[0])]
yy5 = [int(data1[i][5]) for i in range(data1.shape[0])]

plt.plot(xx, yy2)
"""
由于加上这个图片会变得巨大,因此在这里注释
"""
# for i in range(len(xx)):
#     plt.text(x=xx[i], y=yy2[i], s=yy2[i], ha='center', size=9)  
a = [np.mean(np.array(yy2)) for i in range(len(xx))]
plt.plot(xx, a, '--')
plt.text(x=xx[-1], y=a[-1], s='平均值:' + str(round(a[-1])), color='r', fontproperties=myfont)
b = [np.max(yy2), np.min(yy2)]
plt.text(x=xx[np.argmax(yy2)], y=yy2[np.argmax(yy2)], s=np.max(yy2), color='r', ha='center')
plt.text(x=xx[np.argmin(yy2)], y=yy2[np.argmin(yy2)], s=np.min(yy2), color='r', ha='center')
plt.title('各小时用户流量', fontproperties=myfont, fontsize=12)
plt.xticks(xx)
plt.show()

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_sql_21


下面再将其他4项根据小时来可视化

plt.plot(xx, yy1, color='r')
plt.text(x=xx[np.argmax(yy1)], y=yy1[np.argmax(yy1)], s=np.max(yy1), color='r', ha='center')
plt.text(x=xx[np.argmin(yy1)], y=yy1[np.argmin(yy1)], s=np.min(yy1), color='r', ha='center')
plt.plot(xx, yy3, color='b')
plt.text(x=xx[np.argmax(yy3)], y=yy3[np.argmax(yy3)], s=np.max(yy3), color='b', ha='center')
plt.text(x=xx[np.argmin(yy3)], y=yy3[np.argmin(yy3)], s=np.min(yy3), color='b', ha='center')
plt.plot(xx, yy4, color='k')
plt.text(x=xx[np.argmax(yy4)], y=yy4[np.argmax(yy4)], s=np.max(yy4), color='k', ha='center')
plt.text(x=xx[np.argmin(yy4)], y=yy4[np.argmin(yy4)], s=np.min(yy4), color='k', ha='center')
plt.plot(xx, yy5, color='y')
plt.text(x=xx[np.argmax(yy5)], y=yy5[np.argmax(yy5)], s=np.max(yy5), color='y', ha='center')
plt.text(x=xx[np.argmin(yy5)], y=yy5[np.argmin(yy5)], s=np.min(yy5), color='y', ha='center')
plt.legend(['用户数', '收藏量', '加入购物车量', '购买量'], frameon=False)
plt.xticks(xx)
plt.title('各项指标趋势图', fontproperties=myfont, fontsize=12)
plt.show()

基于MapReduce的某电商消费用户行为数据分析实验报告 电商用户行为数据集_sql_22

可以看出每天在10时平台总流量开始上升,14时达到最高值,之后便一直下降至20时,在20时之后再次上升到凌晨2时后再次下降。其实这与现代使用淘宝的人作息很相似,早上的6时9时是一个上班上学高峰期,流量确实会比较平稳;10时之后就可以开始摸鱼刷手机,并且随着午饭时间的到来流量呈指数式上涨;14时之后便是下午的上班上课时间,其实还可以看到18时之后的下降斜率几乎为0,这肯定是因为下班下课的高峰期到了,刷手机的用户又开始多起来了;20时左右就是一天的放松时间,吃完晚饭忙完一天的工作;0时 后夜猫子开始活跃,直到2时大多数用户睡觉后平台的总流量才开始下降。

以上,便是从时间的维度来进行分析的结果。针对这些可视化的数据,可以提出以下几个建议:

1.多在周末时段举行活动,多进行一些推荐推送来引流,商家也应该准备好应对比平时多的流量。
2.在早上到午间的时段用户的流量最多,此时应大量投放推荐并且进行单个时段的促销活动,结合下文的用户行为喜好分析来进行商品广告的引流。
3.夜间时段的潜在价值也很高,也可以相应的进行小时段促销活动,不过重点还是要集中在早上和午间。