参考文献

  • 极客时间 数据分析实战45讲 陈旸

数据分析

  • 数据分析分成三个重要的组成部分
    • 数据采集
    • 数据挖掘
    • 数据可视化

数据挖掘

数据挖掘的过程

  1. 商业理解: 数据挖掘不是我们的目的,我们的目的是更好地帮助业务,所以第一步我们要从商业的角度理解项目需求,在这个基础上,再对数据挖掘的目标进行定义.
  2. 数据理解: 尝试收集部分数据,然后对数据进行探索,包括数据描述、数据质量验证等.这有助于你对收集的数据有个初步的认知.
  3. 数据准备: 开始收集数据,并对数据进行清洗、数据集成等操作,完成数据挖掘前的准备工作.
  4. 模型建立: 选择和应用各种数据挖掘模型,并进行优化,以便得到更好的分类结果.
  5. 模型评估: 对模型进行评价,并检查构建模型的每个步骤,确认模型是否实现了预定的商业目标.
  6. 上线发布: 模型的作用是从数据中找到金矿,也就是我们所说的“知识”,获得的知识需要转化成用户可以使用的方式,呈现的形式可以是一份报告,也可以是实现一个比较复杂的、可重复的数据挖掘过程.数据挖掘结果如果是日常运营的一部分,那么后续的监控和维护就会变得重要.

数据挖掘的十大算法

  • 分类算法: C4.5,朴素贝叶斯(Naive Bayes),SVM,KNN,Adaboost,CART
  • 聚类算法: K-Means,EM
  • 关联分析: Apriori
  • 连接分析: PageRank

基本概念

商业智能BI

  • 商业智能的英文是Business Intelligence,缩写是 BI.相比于数据仓库、数据挖掘,它是一个更大的概念.商业智能可以说是基于数据仓库,经过了数据挖掘后,得到了商业价值的过程.所以说数据仓库是个金矿,数据挖掘是炼金术,而商业报告则是黄金.

数据仓库DW

  • 数据仓库的英文是Data Warehouse,缩写是 DW.它可以说是 BI 这个房子的地基,搭建好 DW 这个地基之后,才能进行分析使用,最后产生价值.

数据挖掘DM

  • 数据挖掘的英文是Data Mining,缩写是 DM.在商业智能 BI 中经常会使用到数据挖掘技术.数据挖掘的核心包括分类、聚类、预测、关联分析等任务,通过这些炼金术,我们可以从数据仓库中得到宝藏,比如商业报告.

元数据MetaData 数据元Data Element

  • 元数据MetaData描述其它数据的数据,也称为“中介数据”
  • 数据元Data Element就是最小数据单元
  • 在生活中,只要有一类事物,就可以定义一套元数据.举个例子,比如一本图书的信息包括了书名、作者、出版社、ISBN、出版时间、页数和定价等多个属性的信息,就可以把这些属性定义成一套图书的元数据.
  • 在图书这个元数据中,书名、作者、出版社就是数据元.可以理解是最小的数据单元.元数据最大的好处是使信息的描述和分类实现了结构化,让机器处理起来很方便

数据挖掘的流程

  • 数据挖掘的一个英文解释叫 Knowledge Discovery in Database,简称 KDD,也就是数据库中的知识发现.
  • 在数据挖掘中,有几个非常重要的任务,就是分类、聚类、预测和关联分析

分类

  • 就是通过训练集得到一个分类模型,然后用这个模型可以对其他数据进行分类.
  • 一般来说数据可以划分为训练集和测试集.训练集是用来给机器做训练的,通常是人们整理好训练数据,以及这些数据对应的分类标识.通过训练,机器就产生了自我分类的模型,然后机器就可以拿着这个分类模型,对测试集中的数据进行分类预测.同样如果测试集中,人们已经给出了测试结果,我们就可以用测试结果来做验证,从而了解分类器在测试环境下的表现.

聚类

  • 人以群分,物以类聚.聚类就是将数据自动聚类成几个类别,聚到一起的相似度大,不在一起的差异性大

预测

  • 顾名思义,就是通过当前和历史数据来预测未来趋势,它可以更好地帮助我们识别机遇和风险.

关联性分析

  • 就是发现数据中的关联规则,它被广泛应用在购物篮分析,或事务数据分析中.

KDD过程

1
2
3
4
5
6
7
8

输入数据 --> 数据预处理 --> 数据挖掘 --> 后处理 -->信息
| |
特征选择 模式过滤
维归约 可视化
规范化 模式表示
选择数据子集

数据预处理

  • 数据清洗,数据集成,以及数据变换

数据清洗

  • 主要是为了去除重复数据,去噪声(即干扰数据)以及填充缺失值

数据集成

  • 是将多个数据源中的数据存放在一个统一的数据存储中.

数据变换

  • 就是将数据转换成适合数据挖掘的形式.比如,通过归一化将属性数据按照比例缩放,这样就可以将数值落入一个特定的区间内,比如 0~1 之间.
  • 数据后处理是将模型预测的结果进一步处理后,再导出.比如在二分类问题中,一般能得到的是 0~1 之间的概率值,此时把数据以 0.5 为界限进行四舍五入就可以实现后处理

用户画像的准则

  • 首先就是将自己企业的用户画像做个白描,告诉他这些用户“都是谁”“从哪来”“要去哪”.

    假如你进入到一家卖羊肉串的餐饮公司,老板说现在竞争越来越激烈,要想做得好就要明白顾客喜欢什么.于是上班第一天,老板问你: “你能不能分析下用户数据,给咱们公司的业务做个赋能啊?”

    你可以这么和老板说: “老板啊,用户画像建模是个系统的工程,我们要解决三个问题.第一呢,就是用户从哪里来,这里我们需要统一标识用户 ID,方便我们对用户后续行为进行跟踪.我们要了解这些羊肉串的用户从哪里来,他们是为了聚餐,还是自己吃宵夜,这些场景我们都要做统计分析.第二呢,这些用户是谁?我们需要对这些用户进行标签化,方便我们对用户行为进行理解.第三呢,就是用户要到哪里去?我们要将这些用户画像与我们的业务相关联,提升我们的转化率,或者降低我们的流失率.”

为什么要设计唯一标识?

  • 用户唯一标识是整个用户画像的核心.我们以一个 App 为例,它把“从用户开始使用 APP 到下单到售后整个所有的用户行为”进行串联,这样就可以更好地去跟踪和分析一个用户的特征.
    • 设计唯一标识可以从这些项中选择: 用户名、注册手机号、联系人手机号、邮箱、设备号、CookieID 等.
  • 其次,给用户打标签.
    • 用户消费行为分析”.可以从这 4 个维度来进行标签划分.
      1. 用户标签: 它包括了性别、年龄、地域、收入、学历、职业等.这些包括了用户的基础属性.
      2. 消费标签: 消费习惯、购买意向、是否对促销敏感.这些统计分析用户的消费习惯.
      3. 行为标签: 时间段、频次、时长、访问路径.这些是通过分析用户行为,来得到他们使用 App 的习惯.
      4. 内容分析: 对用户平时浏览的内容,尤其是停留时间长、浏览次数多的内容进行分析,分析出用户对哪些内容感兴趣,比如,金融、娱乐、教育、体育、时尚、科技等.
  • 可以说,用户画像是现实世界中的用户的数学建模,我们正是将海量数据进行标签化,来得到精准的用户画像,从而为企业更精准地解决问题.

用户画像可以为企业带来什么业务价值呢?

  • 可以从用户生命周期的三个阶段来划分业务价值,包括: 获客、粘客和留客.
    1. 获客: 如何进行拉新,通过更精准的营销获取客户.
    2. 粘客: 个性化推荐,搜索排序,场景运营等.
    3. 留客: 流失率预测,分析关键节点降低流失率.
  • 如果按照数据流处理的阶段来划分用户画像建模的过程,可以分为数据层、算法层和业务层.会发现在不同的层,都需要打上不同的标签
    • 数据层指的是用户消费行为里的标签.我们可以打上“事实标签”,作为数据客观的记录.
    • 算法层指的是透过这些行为算出的用户建模.我们可以打上“模型标签”,作为用户画像的分类标识.
    • 业务层指的是获客、粘客、留客的手段.我们可以打上“预测标签”,作为业务关联的结果.
    • 所以这个标签化的流程,就是通过数据层的“事实标签”,在算法层进行计算,打上“模型标签”的分类结果,最后指导业务层,得出“预测标签”.

数据采集

  • 数据源分成了以下的四类
    • 开放数据源: 政府,企业,高校
    • 爬虫爬取: 网页,APP
    • 日志采集: 前端采集,后端脚本
    • 传感器: 图像,测速,热敏

爬虫爬取

  • 在 Python 爬虫中,基本上会经历三个过程.

    1. 使用 Requests 爬取内容.我们可以使用 Requests 库来抓取网页信息.Requests 库可以说是 Python 爬虫的利器,也就是 Python 的 HTTP 库,通过这个库爬取网页中的数据,非常方便,可以帮我们节约大量的时间.
    2. 使用 XPath 解析内容.XPath 是 XML Path 的缩写,也就是 XML 路径语言.它是一种用来确定 XML 文档中某部分位置的语言,在开发中经常用来当作小型查询语言.XPath 可以通过元素和属性进行位置索引.
    3. 使用 Pandas 保存数据.Pandas 是让数据分析工作变得更加简单的高级数据结构,我们可以用 Pandas 保存爬取的数据.最后通过 Pandas 再写入到 XLS 或者 MySQL 等数据库中.
  • Requests、XPath、Pandas 是 Python 的三个利器.当然做 Python 爬虫还有很多利器,比如 Selenium,PhantomJS,或者用 Puppteteer 这种无头模式

  • 抓取工具

    • 火车采集器
    • 八爪鱼
    • 集搜客

日志采集

  • 日志采集可以分两种形式.
    1. 通过 Web 服务器采集,例如 httpd、Nginx、Tomcat 都自带日志记录功能.同时很多互联网企业都有自己的海量数据采集工具,多用于系统日志采集,如 Hadoop 的 Chukwa、Cloudera 的 Flume、Facebook 的 Scribe 等,这些工具均采用分布式架构,能够满足每秒数百 MB 的日志数据采集和传输需求.
    2. 自定义采集用户行为,例如用 JavaScript 代码监听用户的行为、AJAX 异步请求后台记录日志等.
  • 埋点就是在有需要的位置采集相应的信息,进行上报.比如某页面的访问情况,包括用户信息、设备信息;或者用户在页面上的操作行为,包括时间长短等.这就是埋点,每一个埋点就像一台摄像头,采集用户行为数据,将数据进行多维度的交叉分析,可真实还原出用户使用场景,和用户使用需求.
    • 埋点就是在你需要统计数据的地方植入统计代码,当然植入代码可以自己写,也可以使用第三方统计工具.我之前讲到“不重复造轮子”的原则,一般来说需要自己写的代码,一般是主营核心业务,对于埋点这类监测性的工具,市场上已经比较成熟,这里推荐你使用第三方的工具,比如友盟、Google Analysis、Talkingdata 等.他们都是采用前端埋点的方式,然后在第三方工具里就可以看到用户的行为数据.

数据质量的准则

  • 整性:单条数据是否存在空值,统计的字段是否完善.
  • 面性:观察某一列的全部数值,比如在 Excel 表中,我们选中一列,可以看到该列的平均值、最大值、最小值.我们可以通过常识来判断该列是否有问题,比如:数据定义、单位标识、数值本身.
  • 法性:数据的类型、内容、大小的合法性.比如数据中存在非 ASCII 字符,性别存在了未知,年龄超过了 150 岁等.
  • 性:数据是否存在重复记录,因为数据通常来自不同渠道的汇总,重复的情况是常见的.行数据、列数据都需要是唯一的,比如一个人不能重复记录多次,且一个人的体重也不能在列指标中重复记录多次.

完整性

问题1: 缺失值
  • 通常采用三种方法
    • 删除: 删除数据确实的记录
    • 均值: 使用当前列的均值
    • 高频: 使用当前列出现频率最高的数据
问题2: 空行
  • 如除了 index 之外,全部的值都是 NaN.Pandas 的 read_csv() 并没有可选参数来忽略空行,这样,就需要在数据被读入之后再使用 dropna() 进行处理,删除空行.

    1
    2
    # 删除全空的行
    df.dropna(how='all',inplace=True)

全面性

问题:列数据的单位不统一
  • 如某些数据单位不统一,有的单位是千克(kgs),有的单位是磅(lbs).则需要将单位统一.

合法性

问题:非 ASCII 字符
  • 可以采用删除或者替换的方式来解决非 ASCII 问题,这里我们使用删除方法:

    1
    2
    3
    # 删除非 ASCII 字符
    df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
    df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

唯一性

问题 1:一列有多个参数
  • 使用 Python 的 split 方法,str.split(expand=True),将列表拆成新的列,再将原来的 Name 列删除.

    1
    2
    3
    # 切分名字,删除源数据列
    df[['first_name','last_name']] = df['name'].str.split(expand=True)
    df.drop('name', axis=1, inplace=True)
问题 2:重复数据
  • 如果存在重复记录,就使用 Pandas 提供的 drop_duplicates() 来删除重复数据.

    1
    2
    # 删除重复数据行
    df.drop_duplicates(['first_name','last_name'],inplace=True)

数据集成

数据集成的两种架构: ELTETL

  • ELT是英文 Extract、Transform 和 Load 的缩写,顾名思义它包括了数据抽取、转换、加载三个过程.
    • 抽取是将数据从已有的数据源中提取出来.
    • 转换是对原始数据进行处理
  • 根据转换发生的顺序和位置,数据集成可以分为 ETL 和 ELT 两种架构
    • ETL 的过程为提取 (Extract)——转换 (Transform)——加载 (Load),在数据源抽取后首先进行转换,然后将转换的结果写入目的地.
    • ELT 的过程则是提取 (Extract)——加载 (Load)——变换 (Transform),在抽取后将结果先写入目的地,然后利用数据库的聚合分析能力或者外部计算框架,如 Spark 来完成转换的步骤.
  • 目前数据集成的主流架构是 ETL,但未来使用 ELT 作为数据集成架构的将越来越多.这样做会带来多种好处:
    • ELT 和 ETL 相比,最大的区别是“重抽取和加载,轻转换”,从而可以用更轻量的方案搭建起一个数据集成平台.使用 ELT 方法,在提取完成之后,数据加载会立即开始.一方面更省时,另一方面 ELT 允许 BI 分析人员无限制地访问整个原始数据,为分析师提供了更大的灵活性,使之能更好地支持业务.
    • 在 ELT 架构中,数据变换这个过程根据后续使用的情况,需要在 SQL 中进行,而不是在加载阶段进行.这样做的好处是你可以从数据源中提取数据,经过少量预处理后进行加载.这样的架构更简单,使分析人员更好地了解原始数据的变换过程

ETL 工具

  • 典型的 ETL 工具有:
    • 商业软件:Informatica PowerCenter、IBM InfoSphere DataStage、Oracle Data Integrator、Microsoft SQL Server Integration Services
    • 开源软件:Kettle、Talend、Apatar、Scriptella、DataX、Sqoop

数据变换

  • 在数据变换前,我们需要先对字段进行筛选,然后对数据进行探索和相关性分析,接着是选择算法模型(这里暂时不需要进行模型计算),然后针对算法模型对数据的需求进行数据变换,从而完成数据挖掘前的准备工作.
  • 数据变换是数据准备的重要环节,它通过数据平滑、数据聚集、数据概化和规范化等方式将数据转换成适用于数据挖掘的形式
  • 常见的变换方法
    • 数据平滑:去除数据中的噪声,将连续数据离散化.这里可以采用分箱、聚类和回归的方式进行数据平滑
    • 数据聚集:对数据进行汇总,在 SQL 中有一些聚集函数可以供我们操作,比如 Max() 反馈某个字段的数值最大值,Sum() 返回某个字段的数值总和;
    • 数据概化:将数据由较低的概念抽象成为较高的概念,减少数据复杂度,即用更高的概念替代更低的概念.比如说上海、杭州、深圳、北京可以概化为中国.
    • 数据规范化:使属性数据按比例缩放,这样就将原来的数值映射到一个新的特定区域中.常用的方法有最小—最大规范化、Z—score 规范化、按小数定标规范化等,我会在后面给你讲到这些方法的使用;
    • 属性构造:构造出新的属性并添加到属性集中.这里会用到特征工程的知识,因为通过属性与属性的连接构造新的属性,其实就是特征工程.比如说,数据表中统计每个人的英语、语文和数学成绩,你可以构造一个“总和”这个属性,来作为新属性.这样“总和”这个属性就可以用到后续的数据挖掘计算中.

数据规范化的方法

  • 数据规范化有两个作用:
    • 一是让数据之间具有可比较性
    • 二是加快后续算法的迭代收敛速度
Min-max规范化
  • Min-max 规范化方法是将原始数据变换到 [0,1] 的空间中.用公式表示就是:

    1
    新数值 =(原数值 - 极小值)/(极大值 - 极小值)
Z-Score规范化
  • 假设 A 与 B 的考试成绩都为 80 分,A 的考卷满分是 100 分(及格 60 分),B 的考卷满分是 500 分(及格 300 分).虽然两个人都考了 80 分,但是 A 的 80 分与 B 的 80 分代表完全不同的含义.
1
新数值 =(原数值 - 均值)/ 标准差
  • 能看到 Z-Score 的优点是算法简单,不受数据量级影响,结果易于比较.不足在于,它需要数据整体的平均值和方差,而且结果没有实际意义,只是用于比较.

  • Z-Score 规范化可以直接将数据转化为正态分布的情况

小数定标规范化
  • 小数定标规范化就是通过移动小数点的位置来进行规范化.小数点移动多少位取决于属性 A 的取值中的最大绝对值.
  • 举个例子,比如属性 A 的取值范围是 -999 到 88,那么最大绝对值为 999,小数点就会移动 3 位,即新数值 = 原数值 /1000.那么 A 的取值范围就被规范化为 -0.999 到 0.088.

使用SciKit-Learn进行数据规范化

Min-max 规范化
  • 在 SciKit-Learn 里有个函数 MinMaxScaler 是专门做这个的,它允许我们给定一个最大值与最小值,然后将原数据投射到 [min, max] 中.默认情况下 [min,max] 是 [0,1],也就是把原始数据投放到 [0,1] 范围内

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # coding:utf-8
    from sklearn import preprocessing
    import numpy as np

    # 初始化数据,每一行表示一个样本,每一列表示一个特征
    x = np.array([[0., -3., 1.],
    [3., 1., 2.],
    [0., 1., -1.]])
    print(np.amax(x, axis=0))
    print(np.amin(x, axis=0))
    # 将数据进行 [0,1] 规范化
    min_max_scaler = preprocessing.MinMaxScaler()
    minmax_x = min_max_scaler.fit_transform(x)
    # 运算示例: [0., -3., 1.] max=[3. 1. 2.] min=[ 0. -3. -1.]
    # 新数值 =(原数值 - 极小值)/(极大值 - 极小值)
    # (0,0)= 0 - 0 / 3 - 0 =0
    # (0,1)= -3 - (-3) / 1 - (-3) = 0
    # (0,2)= 1 - (-1) / 2 - (-1) = 2 / 3 = 0.66666667
    print(minmax_x)

    [3. 1. 2.]
    [ 0. -3. -1.]
    [[0. 0. 0.66666667]
    [1. 1. 1. ]
    [0. 1. 0. ]]
Z-Score 规范化
  • SciKit-Learn库中使用preprocessing.scale()函数,可以直接将给定数据进行 Z-Score 规范化.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # coding:utf-8
    from sklearn import preprocessing
    import numpy as np

    # 初始化数据
    x = np.array([[0., -3., 1.],
    [3., 1., 2.],
    [0., 1., -1.]])
    # 将数据进行 Z-Score 规范化
    scaled_x = preprocessing.scale(x)
    print(scaled_x)

    [[-0.70710678 -1.41421356 0.26726124]
    [ 1.41421356 0.70710678 1.06904497]
    [-0.70710678 0.70710678 -1.33630621]]
小数定标规范化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# coding:utf-8
from sklearn import preprocessing
import numpy as np


# 初始化数据
x = np.array([[0., -3., 1.],
[3., 1., 2.],
[0., 1., -1.]])
# 小数定标规范化
j = np.ceil(np.log10(np.max(abs(x))))
scaled_x = x / (10 ** j)
print(scaled_x)

[[ 0. -0.3 0.1]
[ 0.3 0.1 0.2]
[ 0. 0.1 -0.1]]

问题

数据规范化、归一化、标准化是同一个概念么?

  • 数据规范化是更大的概念,它指的是将不同渠道的数据,都按照同一种尺度来进行度量,这样做有两个好处,一是让数据之间具有可比较性;另一个好处就是方便后续运算,因为数据在同一个数量级上规整了,在机器学习迭代的时候,也会加快收敛效率。
  • 数据归一化和数据标准化都是数据规范化的方式。不同点在于数据归一化会让数据在一个 [0,1] 或者 [-1,1] 的区间范围内。而数据标准化会让规范化的数据呈现正态分布的情况,
    • 归一化的“一”,是让数据在 [0,1] 的范围内。
    • 标准化,目标是让数据呈现标准的正态分布。