Python-数据分析
参考文献
- 极客时间 数据分析实战45讲 陈旸
数据分析
- 数据分析分成三个重要的组成部分
- 数据采集
- 数据挖掘
- 数据可视化
数据挖掘
数据挖掘的过程
- 商业理解: 数据挖掘不是我们的目的,我们的目的是更好地帮助业务,所以第一步我们要从商业的角度理解项目需求,在这个基础上,再对数据挖掘的目标进行定义.
- 数据理解: 尝试收集部分数据,然后对数据进行探索,包括数据描述、数据质量验证等.这有助于你对收集的数据有个初步的认知.
- 数据准备: 开始收集数据,并对数据进行清洗、数据集成等操作,完成数据挖掘前的准备工作.
- 模型建立: 选择和应用各种数据挖掘模型,并进行优化,以便得到更好的分类结果.
- 模型评估: 对模型进行评价,并检查构建模型的每个步骤,确认模型是否实现了预定的商业目标.
- 上线发布: 模型的作用是从数据中找到金矿,也就是我们所说的“知识”,获得的知识需要转化成用户可以使用的方式,呈现的形式可以是一份报告,也可以是实现一个比较复杂的、可重复的数据挖掘过程.数据挖掘结果如果是日常运营的一部分,那么后续的监控和维护就会变得重要.
数据挖掘的十大算法
- 分类算法:
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 |
|
数据预处理
- 数据清洗,数据集成,以及数据变换
数据清洗
- 主要是为了去除重复数据,去噪声(即干扰数据)以及填充缺失值
数据集成
- 是将多个数据源中的数据存放在一个统一的数据存储中.
数据变换
- 就是将数据转换成适合数据挖掘的形式.比如,通过归一化将属性数据按照比例缩放,这样就可以将数值落入一个特定的区间内,比如 0~1 之间.
- 数据后处理是将模型预测的结果进一步处理后,再导出.比如在二分类问题中,一般能得到的是 0~1 之间的概率值,此时把数据以 0.5 为界限进行四舍五入就可以实现后处理
用户画像的准则
-
首先就是将自己企业的用户画像做个白描,告诉他这些用户“都是谁”“从哪来”“要去哪”.
假如你进入到一家卖羊肉串的餐饮公司,老板说现在竞争越来越激烈,要想做得好就要明白顾客喜欢什么.于是上班第一天,老板问你: “你能不能分析下用户数据,给咱们公司的业务做个赋能啊?”
你可以这么和老板说: “老板啊,用户画像建模是个系统的工程,我们要解决三个问题.第一呢,就是用户从哪里来,这里我们需要统一标识用户 ID,方便我们对用户后续行为进行跟踪.我们要了解这些羊肉串的用户从哪里来,他们是为了聚餐,还是自己吃宵夜,这些场景我们都要做统计分析.第二呢,这些用户是谁?我们需要对这些用户进行标签化,方便我们对用户行为进行理解.第三呢,就是用户要到哪里去?我们要将这些用户画像与我们的业务相关联,提升我们的转化率,或者降低我们的流失率.”
为什么要设计唯一标识?
- 用户唯一标识是整个用户画像的核心.我们以一个 App 为例,它把“从用户开始使用 APP 到下单到售后整个所有的用户行为”进行串联,这样就可以更好地去跟踪和分析一个用户的特征.
- 设计唯一标识可以从这些项中选择: 用户名、注册手机号、联系人手机号、邮箱、设备号、CookieID 等.
- 其次,给用户打标签.
- “用户消费行为分析”.可以从这 4 个维度来进行标签划分.
- 用户标签: 它包括了性别、年龄、地域、收入、学历、职业等.这些包括了用户的基础属性.
- 消费标签: 消费习惯、购买意向、是否对促销敏感.这些统计分析用户的消费习惯.
- 行为标签: 时间段、频次、时长、访问路径.这些是通过分析用户行为,来得到他们使用 App 的习惯.
- 内容分析: 对用户平时浏览的内容,尤其是停留时间长、浏览次数多的内容进行分析,分析出用户对哪些内容感兴趣,比如,金融、娱乐、教育、体育、时尚、科技等.
- “用户消费行为分析”.可以从这 4 个维度来进行标签划分.
- 可以说,用户画像是现实世界中的用户的数学建模,我们正是将海量数据进行标签化,来得到精准的用户画像,从而为企业更精准地解决问题.
用户画像可以为企业带来什么业务价值呢?
- 可以从用户生命周期的三个阶段来划分业务价值,包括: 获客、粘客和留客.
- 获客: 如何进行拉新,通过更精准的营销获取客户.
- 粘客: 个性化推荐,搜索排序,场景运营等.
- 留客: 流失率预测,分析关键节点降低流失率.
- 如果按照数据流处理的阶段来划分用户画像建模的过程,可以分为数据层、算法层和业务层.会发现在不同的层,都需要打上不同的标签
- 数据层指的是用户消费行为里的标签.我们可以打上“事实标签”,作为数据客观的记录.
- 算法层指的是透过这些行为算出的用户建模.我们可以打上“模型标签”,作为用户画像的分类标识.
- 业务层指的是获客、粘客、留客的手段.我们可以打上“预测标签”,作为业务关联的结果.
- 所以这个标签化的流程,就是通过数据层的“事实标签”,在算法层进行计算,打上“模型标签”的分类结果,最后指导业务层,得出“预测标签”.
数据采集
- 数据源分成了以下的四类
- 开放数据源: 政府,企业,高校
- 爬虫爬取: 网页,APP
- 日志采集: 前端采集,后端脚本
- 传感器: 图像,测速,热敏
爬虫爬取
-
在 Python 爬虫中,基本上会经历三个过程.
- 使用 Requests 爬取内容.我们可以使用 Requests 库来抓取网页信息.Requests 库可以说是 Python 爬虫的利器,也就是 Python 的 HTTP 库,通过这个库爬取网页中的数据,非常方便,可以帮我们节约大量的时间.
- 使用 XPath 解析内容.XPath 是 XML Path 的缩写,也就是 XML 路径语言.它是一种用来确定 XML 文档中某部分位置的语言,在开发中经常用来当作小型查询语言.XPath 可以通过元素和属性进行位置索引.
- 使用 Pandas 保存数据.Pandas 是让数据分析工作变得更加简单的高级数据结构,我们可以用 Pandas 保存爬取的数据.最后通过 Pandas 再写入到 XLS 或者 MySQL 等数据库中.
-
Requests、XPath、Pandas 是 Python 的三个利器.当然做 Python 爬虫还有很多利器,比如 Selenium,PhantomJS,或者用 Puppteteer 这种无头模式
-
抓取工具
- 火车采集器
- 八爪鱼
- 集搜客
日志采集
- 日志采集可以分两种形式.
- 通过 Web 服务器采集,例如 httpd、Nginx、Tomcat 都自带日志记录功能.同时很多互联网企业都有自己的海量数据采集工具,多用于系统日志采集,如 Hadoop 的 Chukwa、Cloudera 的 Flume、Facebook 的 Scribe 等,这些工具均采用分布式架构,能够满足每秒数百 MB 的日志数据采集和传输需求.
- 自定义采集用户行为,例如用 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)
数据集成
数据集成的两种架构: ELT
和 ETL
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 | # coding:utf-8 |
问题
数据规范化、归一化、标准化是同一个概念么?
- 数据规范化是更大的概念,它指的是将不同渠道的数据,都按照同一种尺度来进行度量,这样做有两个好处,一是让数据之间具有可比较性;另一个好处就是方便后续运算,因为数据在同一个数量级上规整了,在机器学习迭代的时候,也会加快收敛效率。
- 数据归一化和数据标准化都是数据规范化的方式。不同点在于数据归一化会让数据在一个 [0,1] 或者 [-1,1] 的区间范围内。而数据标准化会让规范化的数据呈现正态分布的情况,
- 归一化的“一”,是让数据在 [0,1] 的范围内。
- 标准化,目标是让数据呈现标准的正态分布。