分析数据集中包含的流量指标——PV和UV。
需要注意的是,PV和UV在一定程度上可以看作是虚荣指标。在《精益数据分析》中提到:
除非商业模式直接与PV挂钩(即展示广告),则更应该统计访问的人数
对于UV只能显示多少人访问了页面,但却不能显示这些人在页面做了什么?为什么停留?是否离开?
AARRR分别是Acquisition, Activation, Retenion, Revenue, Refer这五个单词的缩写,代表用户获取、激活、留存、变现和自传播。
RFM模型属于客户关系管理分析模式的一种,用来衡量客户价值和创新能力。该模型通过一个客户的近期交易金额(Recency),交易总体频率(Frequency)和交易金额(Monetary)三个指标将客户价值状况分析8种。
数据分析步骤:
解压后的数据有3.4G,这样基本就告别EXCEL了。所以可以加载到SQL里面观察一下。
先在SQL里面建立一个表用来放数据,字段名设置好。不要使用Navicat直接导入,太慢了。可以使用使用LOAD DATA INFILE。在新版的Sql里面,一般会提示secure_file_priv的权限问题。通过show variables like ‘%secure%’,可以看到secure_file_priv的状态,如果为null,则意味着不允许SQL写入和写出。
关于改权限的方式,网上有很多教程,可以参考。我说一下我碰到的坑。目前我使用的SQL是8.0.16解压版。网上有些教程说,可以改C:\ProgramData\MySQL下面的my.ini文件。但这个版本在C盘下没有这个文件。那么需要改的就是安装目录下的配置文件。在[mysqld]下增加secure_file_priv=’'语句。这个一个大坑是:安装目录下的配置文件名必须为my.ini,如果为my-default.ini则无效。之后重启MySQL服务即可。
通过下面语句将数据文件添加到之前建立的表。
教训:为了提高LOAD DATA的速度,不要在设计表时建立任何索引。
USE 数据库名称;
LOAD DATA INFILE ‘文件名称’
INTO TABLE 表名
FIELDS TERMINATED BY ‘,’ – csv文件
问题如下:
UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究。
下载地址:戳这里
本数据集包含了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 |
在MySQl中新建表格—tb2017,具体如下:
字段名 | 类型 | 主键 |
---|---|---|
UserID | int | True |
ItemID | int True | |
CategoryID | int | False |
BehaviorType | var | False |
TimeStamps | int | True |
同时,因为需要对BehaviorType字段进行搜索,所以为改字段建立一般索引。
五个字段全部有效,选取全部字段。
这个数据集共有100,150,807条记录,这个数据量就告别excel了。但在导入的过程中,我们发现了重复记录,所以只能使用pandas来处理了。对于过于大的数据,我们可以考虑分块读取,通过pd.read_csv(iterator=True)开启迭代读取,通过get_chunk()读取数据。
在最后的连接过程中,还是出现了MemoryError的错误。。我的内存是8G,只好含泪修改虚拟内存了(通过实验发现,最大虚拟内存开到10G就不会出现MemoryError)。
我们定义了UseID,ItemID和TimeStamps字段为主键,因此以这三列为基准在python中去重。
该数据集中,第五列TimeStamps为时间,采用的是Unixtime。通过发现,时间记录有错误,即有部分记录不在给定的时间范围内。通过自定义函数获取正确的时间范围并筛选。
由于数据集过于庞大,所以我们抽取了大约20, 000, 000条记录用于下一步分析。
Python代码如下。
import pandas as pd
import time
reader = pd.read_csv('UserBehavior.csv', iterator=True)
loop = True
chunk_size = 100000 #chunk_size
chunks = []
while loop:
try:
chunk = reader.get_chunk(chunk_size)
chunks.append(chunk)
except:
loop = False
print('Iteration is stopped!')
df = pd.concat(chunks, ignore_index=True)
# 对df列命名
cols = ['UserID', 'ItemID', 'CatogoryID', 'BehaviorType', 'TimeStamps']
df.columns = cols
# 针对主键去重
df2 = df.drop_duplicates(subset=['UserID', 'ItemID', 'TimeStamps'])
# 获取unixtime
def get_unixtime(timeStr):
formatStr = "%Y-%m-%d %H:%M:%S"
tmObject = time.strptime(timeStr, formatStr)
tmStamp = time.mktime(tmObject)
return int(