数据分析实战-User Behavior From Taobao-天池

一 分析指标和模型

指标

分析数据集中包含的流量指标——PV和UV。

需要注意的是,PV和UV在一定程度上可以看作是虚荣指标。在《精益数据分析》中提到:

除非商业模式直接与PV挂钩(即展示广告),则更应该统计访问的人数

对于UV只能显示多少人访问了页面,但却不能显示这些人在页面做了什么?为什么停留?是否离开?

模型

AARRR

AARRR分别是Acquisition, Activation, Retenion, Revenue, Refer这五个单词的缩写,代表用户获取、激活、留存、变现和自传播。

RFM模型

RFM模型属于客户关系管理分析模式的一种,用来衡量客户价值和创新能力。该模型通过一个客户的近期交易金额(Recency),交易总体频率(Frequency)和交易金额(Monetary)三个指标将客户价值状况分析8种。

二 数据分析

数据分析步骤:

  • 提出问题
  • 理解数据
  • 数据清洗
  • 模型构建
  • 数据可视化

0 数据导入

解压后的数据有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文件

1 提出问题

问题如下:

  • 分析数据集包含的常见流量指标PV和UV
  • 根据AARRR模型,分析淘宝用户个流程的转化
  • 以时间为维度,分析淘宝用户在一周和一周内某一天的行为特点
  • 根据RFM模型对用户进行划分,发现重要价值用户

2 理解数据

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字段进行搜索,所以为改字段建立一般索引。

3 数据清洗

数据选择

五个字段全部有效,选取全部字段。

去重和子集

这个数据集共有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(

你可能感兴趣的:(SQL,数据分析,数据分析,mysql,python)