引言
本项目数据来源于和鲸社区 https://www.kesci.com/home/dataset/5ef7024363975d002c9235d3,记录了 2014 年 11 月 18 日至 2014 年 12 月 18 日的电商 APP 部分用户行为记录,原始数据共 1048575 条,共有 7 个属性。具体属性解释如下:
属性名 | 属性值 |
---|---|
user_id | 用户 ID,一个 ID 允许触发多个行为 |
item_id | 商品 ID |
behavior_type | 用户行为类型,包括浏览=1,收藏=2,加入购物车=3,购买=4 |
user_geohash | 用户地理位置 |
item_category | 商品所属类目的 ID |
date | 用户行为发生的日期,值域为 2014/11/18-2014/12/18 |
time | 用户行为发生的时刻,值域为 0-24 |
本项目从 APP 流量分析、用户行为分析、商品分析、用户价值分析、时间序列这五个维度来分析该 APP 的运营情况。
从 30 天里 APP 的总浏览量、总独立访客量、访问深度、每天访客量及成交量、每个时段访客数及成交量、各环节的流失率分析近 30 天的 APP 流量,及时发现流量运营异常。
从用户浏览活跃时段、用户购买活跃时段、用户浏览或收藏或加购或购买最多的类目、最近 30 天购买频次、最近 7 天活跃天数、复购率分析用户行为,了解用户喜好,以便进行后续的用户分类和商品推荐。
从商品类目的浏览量、收藏量、加购量、成交量分析不同商品类目的受欢迎程度,定位主要盈利和较为冷门的商品类目。
利用传统的 RFM 模型分析用户价值,由于原始数据缺少用户的消费金额,因此本项目只从 RF 划分用户群体。
利用 ARIMA 模型预测未来七天(2014/12/19-2014/12/25)的访客量,包括平稳性检验、差分法平稳序列、拟合预测。
一、 数据预览
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from datetime import datetime
#时间序列分析-ARIMA
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima_model import ARIMA
#from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score
import statsmodels.tsa.stattools as st
import arrow
df=pd.read_excel('D:/download/淘宝用户行为数据/taobao2.xlsx')
#数据预览
print('{:-^60}'.format('查看源数据的数据类型'),'\n',df.dtypes)
二、数据预处理及清洗
(一)缺失值审查及处理
#缺失值处理
na_lines = df.isnull().any(axis=1)
na_cols = df.isnull().any(axis=0) # 查看每一列是否具有缺失值
print('{:-^60}'.format('查看每一列缺失值情况'),'\n',na_cols)
print ('具有缺失值的行记录总数: {0}'.format(na_lines.sum()))
data=df.drop('user_geohash',axis=1) #删除列
user_geohash 列具有缺失值且缺失记录较多,由于该列数据对本项目的分析意义不大,因而本项目对 user_geohash 列进行删除列操作。
(二)数据转换
data['hour']= pd.cut(data['time'],bins=[0,5,10,13,18,24],labels=['凌晨','上午','中午','下午','晚上'])
data.to_csv("tb.csv")
利用 pandas 的 cut()函数将时间列划分为凌晨、上午、中午、下午和晚上,并将数据清洗后的数据集保存到本地,以便后续的数据可视化。
(三)新建用户标签表
users = data['user_id'].unique()
labels = pd.DataFrame(users,columns=['user_id'])
新建用户标签表 labels,以便后续的用户标签研究和挖掘用户购物喜好规则。
三、APP 流量分析
(一)PV
PV 即页面浏览量,每一次页面被加载,PV 将会增加 1,衡量 APP 页面额曝光量。
pv_30=data[data['behavior_type']==1].behavior_type.sum()
print('{:-^60}'.format('APP 整体分析'))
print ('30 天总 PV: {0}'.format(pv_30))
(二)UV
UV 即独立访客,反映了在指定时间内使用该 APP 的用户“数量”。该指标主要由以下因素影响:①JavaScript被禁用时,用户无法被识别;②cookie被清除后,用户在同一时刻再次进入页面将被二次记录成为一个UV。
uv_30=data['user_id'].nunique()
print ('30 天总 UV: {0}'.format(uv_30))
(三)访问深度
访问深度又称人均页面浏览量,等于 PV 与 UV 之比,用来评估每个用户平均看了多少个页面,是衡量用户访问质量的重要指标。访问深度越大,意味着每个用户来到对应渠道之后流量页面增多,用户对网站的内容越有兴趣。但访问深度并不是越高越好,过大的访问深度也可能说明网站的功能引导方面较为薄弱,导致用户在站内迷失方向而无法找到目标内容。
与访问深度相关的流量质量指标还有用户在页面的停留时间,如果该页面较为简单,但用户的停留时间过长,这可能意味着用户没有注意到页面的关键信息或没有注意到引导按钮,从而降低了该页面在引导方面带来的贡献,并弱化了用户体验。
print ('30 天里每个用户平均访问了{0}个页面'.format(int(pv_30/uv_30)))
对于本项目来说,由于近 30 天里有双十二这一促销活动,因此 30 天内每个用户平均访问了 1181 个页面的结果属于正常的现象,可见该 APP 的页面内容对用户的吸引力很大。
(四)每天的访客数及成交量
au_day=data[data['behavior_type']==1].groupby(['date']).user_id.nunique().reset_index().rename(columns={
'user_id':"au"})#每天访客数量
buy_day=data[data['behavior_type']==4].groupby(['date']).user_id.count().reset_index().rename(columns={
'user_id':"buy"})#每天成交量
#每天访客、成交量组合图
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
x=au_day["date"]
y1=au_day["au"]
y2=buy_day["buy"]
plt.xticks(range(1,31),x,rotation=90)
plt.bar(x,y2,label="每日成交量")
plt.ylabel("成交量")
plt.ylim(0,1500)
plt.legend(loc=2)
plt.twinx()
plt.ylabel("AU")
plt.plot(x,y1,label='DAU',color='red',marker = 'o')
plt.ylim(200,700)
plt.legend(loc=1)
plt.savefig("./淘宝用户行为数据/每天访客、成交量组合图.png")
plt.show()
从 APP 的流量示意图可以看出,网站在 2014/11/19 至 2014/12/18 期间的独立访问用户和成交量在总体上呈现稳定的态势,其中出现 DAU 和成交量波动异常的日期是双十二活动当天。观察双十二前后的数据可知,DAU 从 12 月 10 日开始以较大的幅度攀升,在 12 月 12 日达到近 30 天的 DAU 顶峰,其后由快到慢渐渐回落,并在 12 月 15 日有小幅回升的迹象。
结合业务实境分析,在双十二活动正式开始前几天,有大量的商家预告自家活动商品并开启预售送礼等营销活动,用户在接收到消息推送后也开始浏览心仪商品,如若用户想要参与满减等有时限的优惠活动,那么他必须在当天同时下单并支付订单。因此,由双十二活动规则带来的红利使得当天的 DAU 达到了顶峰。而在其后 DAU 呈现出下降的趋势,是因为用户已经在双十二购买了足够的商品,故短期内使用该 APP 的频率将降低。由于快递时效大多在 3~4 天,因而 15 日 DAU 的增长可能是因为有较多的用户查看商品物流情况或确认订单收货。成交量的波动趋势与 DAU 大体上保持同步。
(五)不同时段的访客数及成交量
au_time=data[data['behavior_type']==1].groupby(['time']).user_id.nunique().reset_index().rename(columns={
'user_id':"au"})#每个时间访客数量
buy_time=data[data['behavior_type']==4].groupby(['time']).user_id.count().reset_index().rename(columns={
'user_id':"buy"})#每个时间成交量
#每个时间的访客、成交量组合图
x=au_time["time"]
y1=au_time["au"]
y2=buy_time["buy"]
plt.xticks(range(0,24),x,rotation=90)
plt.bar(x,y2,label="每个时段成交量")
plt.ylabel("成交量")
plt.ylim(0,1000)
plt.legend(loc=2)
plt.twinx()
plt.plot(x,y1,label='每个时段 AU',color='red',marker = 'o')
plt.ylabel("AU")
plt.ylim(0,900)
plt.legend(loc