数据分析与挖掘概述 - tup.tsinghua.edu.cn ·...

28
1 数据分析与挖掘概述 马云曾说“中国正迎来从 IT 时代到 DT 时代的变革”,DT 就是大数据时代。随着移动互联网的 发展,人们越来越感受到技术所带来的便捷,同时企业也将搜集到越来越多与用户相关的数据,包括 用户的基本信息、交易记录、个人喜好、行为特征等。这些数据就相当于隐藏在地球深处的宝贵资源, 企业都想从数据红利中分得一杯羹,进而推进企业重视并善加利用数据分析与挖掘相关的技术。 本章将以概述的形式介绍数据分析和挖掘相关的内容,通过本章的学习,你将了解如下几方面的 知识点: 数据分析与挖掘的认识; 数据分析与挖掘的几个应用案例; 数据分析与挖掘的几方面区别; 数据分析与挖掘的具体操作流程; 数据分析与挖掘的常用工具。 1.1 什么是数据分析和挖掘 随着数据时代的蓬勃发展,越来越多的企事业单位开始认识到数据的重要性,并通过各种手 段进行数据的搜集。例如,使用问卷调查法获取用户对产品的评价或改善意见;通过每一次的实验 获得产品性能的改良状况;基于各种设备记录空气质量状况、人体健康状态、机器运行寿命等;通 过网页或 APP 记录用户的每一次登录、浏览、交易、评论等操作;基于数据接口、网络爬虫等手 段获取万维网中的公开数据;甚至是企业间的合作实现多方数据的共享。企事业单位花费人力、物 力获取各种数据的主要目的就是通过数据分析和挖掘手段实现数据的变现,否则囤积的数据就是资 源的浪费。 数据分析和挖掘都是基于搜集来的数据,应用数学、统计、计算机等技术抽取出数据中的有

Transcript of 数据分析与挖掘概述 - tup.tsinghua.edu.cn ·...

Page 1: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 1 章

数据分析与挖掘概述

马云曾说“中国正迎来从 IT时代到DT时代的变革”,DT就是大数据时代。随着移动互联网的

发展,人们越来越感受到技术所带来的便捷,同时企业也将搜集到越来越多与用户相关的数据,包括

用户的基本信息、交易记录、个人喜好、行为特征等。这些数据就相当于隐藏在地球深处的宝贵资源,

企业都想从数据红利中分得一杯羹,进而推进企业重视并善加利用数据分析与挖掘相关的技术。

本章将以概述的形式介绍数据分析和挖掘相关的内容,通过本章的学习,你将了解如下几方面的

知识点:

� 数据分析与挖掘的认识;

� 数据分析与挖掘的几个应用案例;

� 数据分析与挖掘的几方面区别;

� 数据分析与挖掘的具体操作流程;

� 数据分析与挖掘的常用工具。

1.1 什么是数据分析和挖掘

随着数据时代的蓬勃发展,越来越多的企事业单位开始认识到数据的重要性,并通过各种手

段进行数据的搜集。例如,使用问卷调查法获取用户对产品的评价或改善意见;通过每一次的实验

获得产品性能的改良状况;基于各种设备记录空气质量状况、人体健康状态、机器运行寿命等;通

过网页或 APP 记录用户的每一次登录、浏览、交易、评论等操作;基于数据接口、网络爬虫等手

段获取万维网中的公开数据;甚至是企业间的合作实现多方数据的共享。企事业单位花费人力、物

力获取各种数据的主要目的就是通过数据分析和挖掘手段实现数据的变现,否则囤积的数据就是资

源的浪费。

数据分析和挖掘都是基于搜集来的数据,应用数学、统计、计算机等技术抽取出数据中的有

Page 2: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

2 | 从零开始学 Python 数据分析与挖掘

用信息,进而为决策提供依据和指导方向。例如,应用漏斗分析法挖掘出用户体验过程中的不足之

处,从而进一步改善产品的用户流程;利用 AB 测试法检验网页布局的变动对交易转化率的影响,

从而确定这种变动是否有利;基于 RFM模型实现用户的价值分析,进而针对不同价值等级的用户

采用各自的营销方案,实现精准触达;运用预测分析法对历史的交通数据进行建模,预测城市各路

线的车流量,进而改善交通的拥堵状况;采用分类手段,对患者的体检指标进行挖掘,判断其所属

的病情状况;利用聚类分析法对交易的商品进行归类,可以实现商品的捆绑销售、推荐销售等营销

手段。应用数据分析和挖掘方法,让数据产生价值的案例还有很多,这里就不一一枚举了,所以只

有很好地利用数据,它才能产生价值,毫不夸张地说,大部分功劳都要归功于数据分析和挖掘。

1.2 数据分析与挖掘的应用领域

也许读者也曾自我发问——学会了数据分析和挖掘技术,可以从事哪些行业的相关工作呢?

在笔者看来,有数据的地方就有用武之地。现在的数据充斥在各个领域,如庞大的互联网行业,包

含各种电商平台、游戏平台、社交平台、中介类平台等;金融行业,包含银行、P2P、互联网金融

等;影响国计民生的教育、医疗行业;各类乙方数据服务行业;传统行业,如房地产、餐饮、美容

等。这些行业都需要借助数据分析和挖掘技术来指导下一步的决策方向,以下仅举 3个行业应用的

例子,进一步说明数据分析和挖掘的用武之地。

1.2.1 电商领域——发现破坏规则的“害群之马”

移动互联网时代下,电商平台之间的竞争都特别激烈,为了获得更多的新用户,往往会针对

新用户发放一些诱人的福利,如红包券、满减券、折扣券、限时抢购优惠券等,当用户产生交易时,

就能够使用这些券减免一部分交易金额。电商平台通过类似的营销手段一方面可以促进新用户的获

取,增添新鲜血液;另一方面也可以刺激商城的交易,增加用户的活跃度,可谓各取所需的双赢效

果。

然而,某些心念不正的用户为了从中牟取利益,破坏大环境下的游戏规则。某电商数据分析

人员在一次促销活动的复盘过程中发现交易记录存在异常,于是就对这批异常交易作更深层次的分

析和挖掘。最终发现这批异常交易都有两个共同特点,那就是一张银行卡对应数百个甚至上千个用

户 id,同时,这些 id 自始至终就发生一笔交易。暗示了什么问题?这说明用户很可能通过廉价的

方式获得多个手机号,利用这些手机号去注册 APP 成为享受福利的多个新用户,然后利用低价优

势买入这些商品,最后再以更高的价格卖出这些商品,这种用户我们一般称为“黄牛”。

这些“害群之马”的行为至少给电商平台造成两方面的影响,一是导致真正想买商品的新用

户买不到,因为有限的福利或商品都被这些用户抢走了;二是虚增了很多“薅羊毛”的假用户,因

为他们很可能利用完新用户的福利资格后就不会再交易了。如果没有数据分析与挖掘技术在互联网

行业的应用,就很难发现这些“害群之马”,企业针对“害群之马”对游戏规则做了相应的调整,

从而减少了不必要的损失,同时也挽回了真实用户的利益。

Page 3: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 1 章 数据分析与挖掘概述 | 3

1.2.2 交通出行领域——为打车平台进行私人订制

打车工具的出现,改变了人们的出行习惯,也改善了乘车的便捷性,以前都是通过路边招手

才能搭乘出租车,现在坐在家里就可以完成一对一的打车服务。起初滴滴、快滴、优步、易到等打

车平台,为了抢占市场份额,不惜花费巨资补贴给司机端和乘客端,在一定程度上获得了用户的青

睐,甚至导致用户在短途出行中都依赖上了这些打车工具。然而随着时间的推移,打车市场的格局

基本定型,企业为了自身的利益和长远的发展,不再进行这种粗放式的“烧钱”运营手段。

当司机端和乘客端不再享受以前的福利待遇时,在一定程度上影响了乘客端的乘车频率和司

机端的接单积极性。为了弥补这方面的影响,某打车平台利用用户的历史交易数据,为司机端和乘

客端的定价进行私人订制。

例如,针对乘客端,通过各种广告渠道将折扣券送到用户手中,一方面可以唤醒部分沉默用

户(此时的折扣力度会相对比较高),让他们再次回到应用中产生交易,另一方面继续刺激活跃用

户的使用频率(此时的折扣力度会相对比较低),进而提高用户的忠诚度。针对司机端,根据司机

在平台的历史数据,将其接单习惯、路线熟悉度、路线拥堵状况、距离乘客远近、天气变化、乘客

乘坐距离等信息输入到逻辑模型中,可以预测出司机接单的概率大小。这里的概率在一定程度上可

以理解为司机接单的意愿,概率越高,说明司机接单的意愿越强,否则意愿就越弱。当模型发现司

机接单的意愿比较低时,就会发放较高的补贴给司机端,否则司机就会获得较少的补贴甚至没有补

贴。如果不将数据分析与挖掘手段应用于大数据的交通领域,就无法刺激司机端和乘客端的更多交

易,同时,也会浪费更多的资金,造成运营成本居高不下,影响企业的发展和股东的利益。

1.2.3 医疗健康领域——找到最佳医疗方案

众所周知,癌症的产生是由于体内某些细胞的 DNA或 RNA发生了病变,这种病变会导致癌

细胞不断地繁殖,进而扩散至全身,最终形成可怕的肿瘤。早在 2003年,乔布斯在一次身体检查

时发现胰腺处有一块阴影,医生怀疑是一块肿瘤,建议乔布斯马上进行手术,但乔布斯选择了药物

治疗。遗憾的是,一年后,医生从乔布斯的身体检查中发现可怕的癌细胞已经扩散到了全身,认为

乔布斯的生命即将走到人生的终点。

乐观的乔布斯认为还可以有治疗的希望,于是花费几十万美元,让专业的医疗团队将自己体

内的 DNA与历史肿瘤 DNA样本进行比对,目的就是找到符合肿瘤病变的 DNA。这样,对于乔布

斯体内的 DNA来说就有了病变与正常的标签,然后基于这个标签构建分类算法。当正常 DNA出

现病变特征时,该算法就能够准确地找出即将病变的 DNA,从而指导医生及时地改变医疗方案和

寻找有效的药物。最终,使得原本即将走到终点的生命,延续了八年时间,正是这短短的八年,让

乔布斯一次次地创造了苹果的辉煌。如果没有数据分析与挖掘在医疗行业的应用,也许就没有现在

的苹果。

Page 4: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

4 | 从零开始学 Python 数据分析与挖掘

1.3 数据分析与挖掘的区别

从广义的角度来说,数据分析的范畴会更大一些,涵盖了数据分析和数据挖掘两个部分。数

据分析就是针对搜集来的数据运用基础探索、统计分析、深层挖掘等方法,发现数据中有用的信息

和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。所以广义的数据分析就包含

了数据挖掘的部分,正如读者在各招聘网站中所看见的,对于数据分析师的任职资格中常常需要应

聘者熟练使用数据挖掘技术解决工作中的问题。从狭义的角度来说,两者存在一些不同之处,主要

体现在两者的定义说明、侧重点、技能要求和最终的输出形式。接下来阐述这几个方面的差异。

� 从定义说明出发:数据分析采用适当的统计学方法,对搜集来的数据进行描述性分析和探索

性分析,并从描述和探索的结果中发现数据背后存在的价值信息,用以评估现状和修正当前

的不足;数据挖掘则广泛交叉数据库知识、统计学、机器学习、人工智能等方法,对搜集来

的数据进行“采矿”,发现其中未知的规律和有用的知识,进一步应用于数据化运营,让数据

产生更大的价值。

� 从侧重点出发:数据分析更侧重于实际的业务知识,如果将数据和业务分开,往往会导致数

据的输出不是业务所需,业务的需求无法通过数据体现,故数据分析需要两者的紧密结合,

实现功效的最大化;数据挖掘更侧重于技术的实现,对业务知识的熟练度并没有很高的要求,

如何从海量的数据中发现未知的模式和规律,是数据挖掘的目的所在,只有技术过硬,才能

实现挖掘项目的落地。

� 从掌握的技能出发:数据分析一般要求具备基本的统计学知识、数据库操作技能、Excel 报

表开发和常用可视化图表展现的能力,就可以解决工作中的分析任务;数据挖掘对数学功底

和编程能力有较高的要求,数学功底是数据挖掘、机器学习、人工智能等方面的基础,没有

好的数学功底,在数据挖掘领域是走不远的,编程能力是从数据中发现未知模式和规律途径,

没有编程技能,就无法实现算法的落地。

� 从输出的结果出发:数据分析更多的是统计描述结果的呈现,如平均水平、总体趋势、差异

对比、数据转化等,这些结果都必须结合业务知识进行解读,否则一组数据是没有任何实际

意义的;数据挖掘更多的是模型或规则的输出,通过模型或规则可对未知标签的数据进行预

测,如预测交通的畅通度(预测模型)、判别用户是否响应某种营销活动(分类算法);通过

模型或规则实现智能的商业决策,如推荐用户可能购买的商品(推荐算法)、划分产品所属的

群类(聚类算法)等。

为了读者更容易理解和区分两者之间的差异,这里将上面描述的四方面内容做一个简短的对

比和总结,如表 1-1所示。

表 1-1 数据分析与挖掘对比

差异角度 数据分析 数据挖掘

定义 描述和探索性分析,评估现状和修正不足 技术性的“采矿”过程,发现未知的模式和规律

侧重点 实际的业务知识 挖掘技术的落地,完成“采矿”过程

Page 5: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

1.

差异角

技能

结果

流程

范,

作步

.4.

数据

挖掘

角度

本书

程做

才可

步骤

1

前面

据分

掘之

这里

� 在

� 当

书将安

一个

可以

面讲了

析与

前必

里通过

在餐

餐准

又可

当前

数据

统计

需结

安排

个详

以在数

明确

了几

与挖

必须

过三

餐饮行

准备多

可以避

前互联

据分析

计学、

结合业

排 10

细的

数据

确目

几个有

掘的

明确

三个实

行业

多少

避免

联网

数据

业务知

个章

的说

据挖掘

有关

的重

确自

实际

业,可

食材

食材

经济

据库

知识

章节

明。

掘过

关数据

要性

己需

际的案

可能

材比

材的

济下

库、E

识解读

节的内

这里

过程

据分

性。你

需要

案例

都会

较合

浪费

的消

Excel

读统计

1.4

内容

里的

中做

分析和

你可

解决

例来加

会存在

合理

费。

消费信

、可

计结

4

容来讲

的流程

做到游

和数

可能非

决的

加以

在这

。如

信贷

可视化

讲解

程可

游刃

数据挖

非常

问题

以说明

这方面

如果解

贷和现

化等

数据

解具体

可以理

刃有余

图 1-

挖掘

常期待

题是

明数

面的

解决

现金

体的

理解

余。

1 数

掘在电

待数

什么

数据挖

的痛点

决了这

金信贷

据挖

的数据

解为数

首先

数据

电商

数据分

么,

挖掘

点,

这个

贷都

挖掘

据挖

数据

先通

挖掘

商行业

分析

然后

掘流程

即如

个问题

都非常

数据

过硬

模型

掘的

挖掘算

据挖掘

通过图

掘步骤

业、

析与挖

后才

程中

如何

题,

常流

据挖

硬的

型或

的流

算法

掘过

图 1

交通

挖掘

可以

中的第

何调整

那么

流行,

第 1

挖掘

的数学

或规则

流程

法和应

过程中

-1中

通领

掘在工

以有

第一

整中餐

么对

1 章

学功底

应用

中的

中的

领域和

工作

的放

一步,

餐或

于餐

于企

底和

用案例

的规范

的金字

和医

作中

放矢

或晚餐

餐厅来

企业来

数据分

编程

例,

范,

字塔

医疗

的应

矢。

即明确

餐的

来说

来说

分析

程技术

故需

只有

塔了解

健康

应用

确目

的当班

说既可

说可以

析与挖

需要

有熟

解数

康方

,先

标:

班人

可以

以达

挖掘

对数

悉了

数据挖

面的

先别急

人数,

以降低

达到

掘概述

数据

了这

挖掘

的案

急,

低人

“以

(续表

据挖掘

这些具

掘中具

例,

在实

以及为

人工成

以钱赚

|

表)

掘的

具体

具体

实施

为下

成本

赚钱

5

的具

体的

体的

体现

施数

下一

本,

钱”

Page 6: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

6 | 从零开始学 Python 数据分析与挖掘

的功效,对于用户来说短期内可以在一定程度上减轻经济压力,从而实现两端的双赢。但是

企业会面临给什么样的用户放发信贷的选择,如果选择正确了,可以赚取用户的利息,如果

选择错误了,就得赔上本金。所以风险控制(简称“风控”)尤其重要,如果风控做得好,就

能够降低损失,否则就会导致大批“坏账”甚至是面临倒闭。

� 对于任何一个企业来说,用户的价值高低决定了企业可从用户身上获得的利润空间。用户越

忠诚、价值越高,企业从用户身上获取的利润就越多,反之利润就越少。所以摆在企业眼前

的重大问题就是如何提升用户的生命价值。

1.4.2 数据搜集

当读者明确企业面临的痛点或工作中需要处理的问题后,下一步就得规划哪些数据可能会影

响到这些问题的答案,这一步就称为数据的搜集过程。数据搜集过程显得尤为重要,其决定了后续

工作进展的顺利程度。接下来继续第一步中的例子,说明这三个案例中都需要搜集哪些相关的数据。

1. 餐饮相关

� 食材数据:食材名称、食材品类、采购时间、采购数量、采购金额、当天剩余量等。

� 经营数据:经营时间、预定时间、预定台数、预定人数、上座台数、上座人数、上菜名称、

上菜价格、上菜数量、特价菜信息等。

� 其他数据:天气状况、交通便捷性、竞争对手动向、是否为节假日、用户口碑等。

2. 金融授信

� 用户基本数据:姓名、性别、年龄、受教育水平、职业、工作年限、收入状况、婚姻状态、

借贷情况、房产、汽车等。

� 刷卡数据:是否有信用卡、刷卡消费频次、刷卡缴费规律、刷卡金额、是否分期、是否逾期、

逾期天数、未偿还金额、信用额度、额度使用率等。

� 其他数据:信用报告查询记录、电话核查记录、银行存款、社交人脉、其他APP数据等。

3. 影响用户价值高低

� 会员数据:性别、年龄、教育水平、会员等级、会员积分、收入状况等。

� 交易数据:用户浏览记录、交易商品、交易数量、交易频次、交易金额、客单价、最后交易

时间、偏好、下单与结账时差等。

� 促销数据:用户活动参与度、优惠券领取率、优惠券使用率、购买数量、购买金额等。

� 客服数据:实时沟通渠道数量、用户沟通次数、用户疑问响应速度、疑问解答率、客户服务

满意度等。

1.4.3 数据清洗

为解决企业痛点或面临的问题,需要搜集相关的数据。即使数据搜集上来,也必须保证数据

“干净”,因为数据质量的高低将影响最终结果的准确性。通常都有哪些“不干净”的数据会影响

后面的建模呢?针对这些数据都有哪些解决方案呢?这里不妨做一个简要的概述。

Page 7: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 1 章 数据分析与挖掘概述 | 7

� 缺失值:由于个人隐私或设备故障导致某些观测在维度上的漏缺,一般称为缺失值。缺失值

的存在可能会导致模型结果的错误,所以针对缺失值可以考虑删除法、替换法或插值法解决。

� 异常值:异常值一般指远离正常样本的观测点,它们的存在同样会影响模型的准确性,故可

以考虑删除法或单独处理法。当然某些场景下,异常值是有益的,例如通过异常值可以筛选

出钓鱼网站。

� 数据的不一致性:主要是由于不同的数据源或系统并发不同步所导致的数据不一致性,例如

两个数据源中数据单位的不一致(一个以元为单位,另一个以万元为单位);系统并发不同步

导致一张电影票被多个用户购买。针对这种情况则需要不同数据源的数据更新(SQL)或系

统实现同步并发。

� 量纲的影响:由于某些模型容易受到不同量纲的影响,因此需要通过数据的标准化方法将不

同量纲的数据进行统一处理,如将数据都压缩至 0~1的范围。

� 维度灾难:当采集来的数据包含上百乃至成千上万的变量时,往往会提高模型的复杂度,进

而影响模型的运行效率,故需要采用方差分析法、相关系数法、递归特征消除法、主成分分

析法等手段实现数据的特征提取或降维。

1.4.4 构建模型

“万事俱备,只欠建模”!据不完全统计,建模前的数据准备将占整个数据挖掘流程 80%左

右的时间,可谓“地基不牢,地动山摇”。接下来,在数据准备充分的前提下,需要考虑企业面临

的痛点或难题可以通过什么类型的挖掘模型解决。

� 对于餐饮业需要预测下一餐将有多少消费者就餐的问题,可以归属于预测类型的挖掘模型。

如基于整理好的餐饮相关数据使用线性回归模型、决策树、支持向量机等实现预测,进而为

下一顿做好提前准备。

� 对于选择什么样的用户放发信贷问题,其实就是判断该用户是否具有良好信用的特征,属于

分类类型的挖掘模型。例如,基于 Logistic 模型、决策树、神经网络等完成用户的分类,为

选择优良用户提供决策支持。

� 对于用户的价值分析,不再具有现成的标签,故无法使用预测或分类类型的模型解决,可以

考虑无监督的聚类类型模型,因为“物以类聚,人以群分”。例如,使用K均值模型、DBSCAN、

最大期望 EM等实现不同价值人群的划分。

1.4.5 模型评估

到此阶段,已经完成了数据挖掘流程中的绝大部分工作,并且通过数据得到解决问题的多个

方案(模型),接下来要做的就是从这些模型中挑选出最佳的模型,主要目的就是让这个最佳的模

型能够更好地反映数据的真实性。例如,对于预测或分类类型的模型,即使其在训练集中的表现很

好,但在测试集中结果一般,则说明该模型存在过拟合的现象,需要从数据或模型角度做进一步修

正。

Page 8: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

8 | 从零开始学 Python 数据分析与挖掘

1.4.6 应用部署

通常,模型构建和评估工作的完成,并不代表整个数据挖掘流程的结束,往往还需要最后的

应用部署。尽管模型构建和评估是数据分析师或挖掘工程师所擅长的,但是这些挖掘出来的模式或

规律是给真正的业务方或客户服务的,故需要将这些模式重新部署到系统中。

例如,疾控中心将网民在互联网上的搜索记录进行清洗和统计,并将整理好的数据输入某个

系统中,就可以预测某地区发生流感的概率;用户在申请贷款时,前端业务员通过输入贷款者的信

息,就可以知道其是否满足可贷款的结论;利用用户在电商平台留下的浏览、收藏、交易等记录,

就可以向用户推荐其感兴趣的商品。这些应用的背后,都将数据中的模式或规律做了重新部署,进

而便于使用方的操作。

1.5 常用的数据分析与挖掘工具

“欲先善其事,必先利其器!”这里的“器”含有两方面的意思,一方面是软实力,包含对

企业业务逻辑的理解、理论知识的掌握和施展工作的清醒大脑;另一方面是硬实力,即对数据挖掘

工具的掌握。接下来就针对数据分析和挖掘过程中所使用的几种常用工具做简单介绍。

1. R 语言

R语言是由奥克兰大学统计系的 Robert Gentleman和 Ross Ihaka共同开发的,并在 1993年首

次亮相。其具备灵活的数据操作、高效的向量化运算、优秀的数据可视化等优点,受到用户的广泛

欢迎。近年来,由于其易用性和可扩展性也大大提高了 R 语言的知名度。同时,它也是一款优秀

的数据挖掘工具,用户可以借助强大的第三方扩展包,实现各种数据挖掘算法的落地。

2. Python

Pyhton是由荷兰人 Guido van Rossum于 1989年发明的,并在 1991年首次公开发行。它是一

款简单易学的编程类工具,同时,其编写的代码具有简洁性、易读性和易维护性等优点,也受到广

大用户的青睐。其原本主要应用于系统维护和网页开发,但随着大数据时代的到来,数据挖掘、机

器学习、人工智能等技术越发热门,进而促使了 Python进入数据科学的领域。Python同样拥有各

种五花八门的第三方模块,用户可以利用这些模块完成数据科学中的工作任务。例如,pandas、

statsmodels、scipy等模块用于数据处理和统计分析;matplotlib、seaborn、bokeh等模块实现数据的

可视化功能;sklearn、PyML、keras、tensorflow等模块实现数据挖掘、深度学习等操作。

3. Weka

Weka 由新西兰怀卡托大学计算机系 Ian Written 博士于 1992 年末发起开发,并在 1996 年公

开发布Weka 2.1版本。它是一款公开的数据挖掘平台,包含数据预处理、数据可视化等功能,以

及各种常用的回归、分类、聚类、关联规则等算法。对于不擅长编程的用户,可以通过Weka的图

形化界面完成数据分析或挖掘的工作内容。

Page 9: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 1 章 数据分析与挖掘概述 | 9

4. SAS

SAS 是由美国北卡罗来纳州大学开发的统计分析软件,当时主要是为了解决生物统计方面的

数据分析。在 1976年成立 SAS软件研究所,经过多年的完善和发展,最终在国际上被誉为统计分

析的标准软件,进而受到各个领域的广泛应用。SAS 由数十个模块构成,其中 Base 为核心模块,

主要用于数据的管理和清洗、GHAPH模块可以帮助用户实现数据的可视化、STAT模块则涵盖了

所有的实用统计分析方法、EM模块则是更加人性化的图形界面,通过托拉拽的方式实现各种常规

挖掘算法的应用。

5. SPSS

SPSS 是世界上最早的统计分析软件,最初由斯坦福大学的三个研究生在 1968 年研发成功,

并成立 SPSS公司,而且在 1975年成立了 SPSS芝加哥总部。用户可以通过 SPSS的界面实现数据

的统计分析和建模、数据可视化及报表输出,简单的操作受到了众多用户的喜爱。除此之外,SPSS

还有一款 Modeler工具,其前身是 Clementine,2009年被 IBM收购后,对其性能和功能做了大幅

的改进和提升。该工具充分体现了数据挖掘的各个流程,例如数据的导入、清洗、探索性分析、模

型选择、模型评估和结果输出,用户可基于界面化的操作完成数据挖掘的各个环节。

上面向读者介绍了 5款较为常用的数据分析与挖掘工具,其中 R语言、Python和 Weka都属

于开源工具,读者不需要支付任何费用就可以从官网下载并安装使用;而 SAS 和 SPSS 则为商业

软件,需要支付一定的费用方可使用。本书将基于开源的 Python 工具来讲解有关数据分析和挖掘

方面的应用和实战。

1.6 本章小结

本章主要站在读者的角度,回答了有关数据分析与挖掘的定义、应用的领域、两者的差异、

实际的操作流程和常用的落地工具,同时,通过一个个小案例来说明数据分析和挖掘在实际应用中

的价值体现,让读者对其拥有足够的重视。通过本章的学习,希望读者能够对数据分析与挖掘有一

个清晰的认识,进而为后续章节的学习做铺垫。

Page 10: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章

从收入的预测分析开始

在数据分析与挖掘过程中,预测性或分类性问题往往是企业需要解决的主要问题,例如下一

季度的营收可能会达到多少、什么样的用户可能会流失、一场营销活动中哪些用户的参与度会比较

高等。

本章将通过 Python语言,以一个实战案例介绍分类性问题的解决步骤。通过本章的学习,你

将会了解到基于 Python的数据处理和建模方法:

� 外部数据的读取;

� 数据的预处理;

� 数据的探索性分析;

� 数据建模;

� 模型预测与评估。

2.1 下载与安装 Anoconda

本书中的所有代码都是基于 Python 3实现的,所以必须确保你的电脑已经安装好了 Python工

具。如果没有安装也不用担心,本节的主要内容就是引导读者如何下载并安装一款好用的 Python

工具。

Anoconda是不错的选择,专门用于科学计算的 Python发行版,支持Windows、Linux和Mac

系统,可以很方便地解决多版本 Python并存、切换以及各种第三方模块安装的问题。更重要的是,

当你下载并安装好 Anoconda后,它就已经集成了上百个科学计算的第三方模块,例如书中将要使

用的 numpy、pandas、matplotlib、seaborn、statsmodels、sklearn等。用户需要使用这些模块时,直

接导入即可,不用再去下载。

接下来将针对Windows、Linux和Mac系统,分别介绍各自的安装方法,以便读者按步操作。

Page 11: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章 从收入的预测分析开始 | 11

首先你需要到 Anoconda官网(https://www.anaconda.com/download/)下载对应系统的 Anoconda工

具。注意,本书是基于 Python 3的应用,所以你需要下载 Python 3.X的 Anoconda。

2.1.1 基于Windows系统安装

从官网中下载好Windows版本的Anoconda后,双击该软件并进入安装向导,并单

击“Next”按钮,如图 2-1所示。

图 2-1 安装引导页

进入阅读“License Agreement”窗口,单击“I Agree”按钮。

推荐选择“Just Me (recommended)”,如果选择的是“All Users”,就需要Windows

的管理员权限。

选择目标路径用于Anodonda工具的安装,并单击“Next”按钮,如图 2-2所示。

图 2-2 选择安装路径

Page 12: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

12

2.

2

故选择

.1.2

,单

钮,

| 从

择将

2

单击

从零

Pyt

“C

图 2

零开始

thon3

基于

Conti

2-5所

始学

建议

3.×

大概

于 M

从官

inue

进入

进入

进入

所示

学 Py

议不添

作为

概 5分

Mac

官网

”按

入“R

入阅读

入“D

示。

yth

添加

为 A

分钟

c 系

中下

按钮。

Rea

Dest

on

加 An

Anoc

钟就可

系统

下载好

d M

“Lic

tinat

数据

noco

ond

可以

统安

好M

Me”

cens

tion

据分

onda

a的

以完成

安装

Mac

窗口

e”窗

Sele

分析与

a 到

的默认

成安

版本

口,继

窗口

ect”

与挖

环境

认版

2-3

安装,

图 2

本的

继续

口,勾

窗口

挖掘

境变量

版本。

,单

2-4

An

续单击

勾选

口,推

量中

设置环

单击

安装

nocon

击“

选“I

推荐

中,因

环境变

“Fin

装成功

nda

“Con

I Agr

荐选择

因为

“Ins

变量

nish

功页

后,

ntinu

ree”

择“

为它可

stall”

量页

”按

ue”

,并

Inst

可能

”按

按钮即

双击该

按钮

并单

tall f

能会影

按钮,

即可

该软件

钮。

for m

影响

,进

可,如

件,

“Co

me o

响到其

进入安

如图

进入

ontin

nly”

其他

安装

图 2-4

入 A

nue”

”,并

软件

装环节

4所

Anoc

按钮

并单

件的正

节,

示。

cond

钮。

击“

正常

如图

da的

“Con

常运行

图 2-

的安装

ntinu

行,

-3所

装向

ue”

Page 13: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章 从收入的预测分析开始 | 13

图 2-5 目标选择页

进入“Installation Type”窗口,推荐默认设置(将Anoconda安装在主目录下),无

须改动安装路径,单击“Install”按钮,进入安装环节,如图 2-6所示。

图 2-6 安装类型页

经过几分钟,即完成整个安装流程,如图 2-7所示。

图 2-7 安装成功页

Page 14: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

14 | 从零开始学 Python 数据分析与挖掘

当然,如果你不习惯在 Mac 系统中使用图形化的安装方式,也可以通过命令行的方式完成

Anoconda的安装(以 Anaconda3-5.0.1版本为例),具体步骤如下:

同样需要通过官网下载好Mac版本的Anoconda,并将其放在桌面。

打开终端,输入“bash Anaconda3-5.0.1-MacOSX-x86_64.sh”。

接下来会提示阅读“条款协议”,只需按一下回车键即可。

滑动滚动条到协议底部,输入“Yes”。

提示“按下回车键”接受默认路径的安装,接下来继续输入“Yes”,进入安装环节。

最终完成安装,并提示“Thank you for installing Anaconda!”。

注意,关闭终端,重启后安装才有效。

2.1.3 基于 Linux系统安装

从官网中下载好 Linux版本的Anoconda,并将其放在桌面。

打开终端,输入“bash Anaconda3-5.0.1-Linux-x86_64.sh”。

接下来会提示阅读“条款协议”,只需按一下回车键即可。

滑动滚动条到协议底部,输入“Yes”。

提示“按下回车键”接受默认路径的安装,接下来继续输入“Yes”。

最终完成安装,并提示“Thank you for installing Anaconda3!”。

注意,关闭终端,重启后安装才有效。

2.2 基于 Python的案例实战

2.2.1 数据的预处理

1994年 Ronny Kohavi和 Barry Becker针对美国某区域的居民做了一次人口普查,经过筛选,

一共得到 32 561 条样本数据。数据中主要包含了关于居民的基本信息以及对应的年收入,其中年

收入就是本章中需要预测的变量,具体数据指标和含义见表 2-1。

表 2-1 美国某区域居民基本数据集

变量名称 变量含义 变量类型

age 年龄 数值型

workclass 工作类型 离散型

fnlwgt 序号 数值型

education 受教育程度 离散型

education-num 受教育时长 数值型

marital-status 婚姻状态 离散型

occupation 职业 离散型

Page 15: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章 从收入的预测分析开始 | 15

(续表)

变量名称 变量含义 变量类型

relationship 家庭成员关系 离散型

race 种族 离散型

sex 性别 离散型

capital-gain 资本收益 数值型

capital-loss 资本损失 数值型

hours-per-week 每周工作小时数 数值型

native-country 国籍 离散型

income 收入 离散型

基于上面的数据集,需要预测居民的年收入是否会超过 5万美元,从表 2-1的变量描述信息可

知,有许多变量都是离散型的,如受教育程度、婚姻状态、职业、性别等。通常数据拿到手后,都

需要对其进行清洗,例如检查数据中是否存在重复观测、缺失值、异常值等,而且,如果建模的话,

还需要对字符型的离散变量做相应的重编码。首先将上面的数据集读入 Python的工作环境中:

# 导入第三方包

import pandas as pd

import numpy as np

import seaborn as sns

# 数据读取

income = pd.read_excel(r'C:\Users\Administrator\Desktop\income.xlsx')

# 查看数据集是否存在缺失值

income.apply(lambda x:np.sum(x.isnull()))

见表 2-2。

表 2-2 变量缺失概览

变量名 缺失个数 变量名 缺失个数

age 0 race 0

workclass 1836 sex 0

fnlwgt 0 capital-gain 0

education 0 capital-loss 0

education-num 0 hours-per-week 0

marital-status 0 native-country 583

occupation 1843 income 0

relationship 0

表 2-2显示,居民的收入数据集中有 3个变量存在数值缺失,分别是居民的工作类型、职业和

国籍。缺失值的存在一般都会影响分析或建模的结果,所以需要对缺失数值做相应的处理。

缺失值的处理一般采用三种方法:一是删除法,即将存在缺失的观测进行删除,如果缺失比

例非常小,则删除法是比较合理的,反之,删除比例比较大的缺失值将会丢失一些有用的信息;二

是替换法,即使用一个常数对某个变量的缺失值进行替换,如果缺失的变量是离散型,则可以考虑

用众数替换缺失值,如果缺失的变量是数值型,则可以考虑使用均值或中位数替换缺失值;三是插

Page 16: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

16 | 从零开始学 Python 数据分析与挖掘

补法,即运用模型方法,基于未缺失的变量预测缺失变量的值,如常见的回归插补法、多重插补法、

拉格朗日插补法等。

由于收入数据集中的 3个缺失变量都是离散型变量,这里不妨使用各自的众数来替换缺失值:

# 缺失值处理

income.fillna(value = {'workclass':income.workclass.mode()[0],

'occupation':income.occupation.mode()[0],

'native-country':income['native-country'].mode()[0]},

inplace = True)

2.2.2 数据的探索性分析

在上面的数据清洗过程中,对缺失值采用了替换处理的方法,接下来对居民收入数据集做简

单的探索性分析,目的是了解数据背后的特征,如数据的集中趋势、离散趋势、数据形状和变量间

的关系等。

首先,需要知道每个变量的基本统计值,如均值、中位数、众数等,只有了解了所需处理的

数据特征,才能做到“心中有数”:

# 数值型变量的统计描述,参见表 2-3。

income.describe()

表 2-3 数值变量的统计描述

如表 2-3 所示,描述了有关数值型变量的简单统计值,包括非缺失观测的个数(count)、平

均值(mean)、标准差(std)、最小值(min)、下四分位数(25%)、中位数(50%)、上四分

位数(75%)和最大值(max)。以 3万多居民的年龄为例,他们的平均年龄为 38.6岁;最小年龄

为 17岁;最大年龄为 90岁;四分之一的居民年龄不超过 28岁;一半的居民年龄不超过 37岁;四

分之三的居民年龄不超过 48岁;并且年龄的标准差为 13.6岁。同理,读者也可以类似地解释其他

数值变量的统计值。

接下来,再来看看数据集中离散型变量的描述性统计值:

# 离散型变量的统计描述,见表 2-4。

income.describe(include =[ 'object'])

Page 17: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

同离

变量

共有

年龄

#

i

#

p

#

f

#

i

i

#

i

i

#

p

如表

离散

量为

有 10

数据

龄和

# 导入

impo

# 设置

plt.

# 设置

fig,

# 绘制

incom

incom

# 绘制

incom

incom

# 显示

plt.

见图

表 2-4

值的

例,

0 50

据的分

每周

入绘图

rt m

置绘图

styl

置多图

axe

制不同

me.a

me.a

制不同

me['

me['

示图形

show

图 2-8

4所

的个

1名

分布

周工

图模块

matp

图风格

le.u

图形的

es =

同收入

age[

age[

同收入

'hou

'hou

w()

8。

示,

共有

名。

布形状

作小

plot

use(

的组合

= plt

入水平

inco

inco

入水平

urs-p

urs-p

得到

(un

有 16

状(

小时

lib.

'ggp

t.su

平下的

ome.

ome.

平下的

per-

per-

到的

nique

6 种

(如偏

数为

.pyp

plot

ubpl

的年龄

.inc

.inc

的周工

-wee

-wee

的是关

e)、

种不同

偏度

为例

plot

t')

lots

龄核密

come

come

工作小

ek']

ek']

关于

、出

同的

度、峰

,绘

as

(2,

密度图

==

==

小时数

[inc

[inc

于离散

出现频

的教育

峰度

绘制

plt

1)

' <

' >

数核密

come

come

表 2-

散变

频次

育水

度等)

各自

t

<=50K

>50K

密度图

e.in

e.in

-4

变量的

次最高

水平;

)可

自的

K'].

'].p

come

come

图 2

离散

的统

高的

3

可以通

分布

.plo

plot

e ==

e ==

2-8

散变量

统计值

的离散

万多

通过

布形

ot(k

le

t(ki

le

= '

= '

核密

量的统

值,

散值

多居

过可视

形状图

ind

egen

nd =

egen

<=50

>50K

密度曲

统计

包含

值(t

居民中

视化

图:

= '

nd =

= 'k

nd =

0K']

K'].

曲线

第 2

计描述

含每

op)

中,

化的方

kde

Tru

kde'

Tru

.plo

plot

每个变

高中

方法

', l

ue,

, la

ue,

ot(k

a

l

t(ki

a

l

变量

最高

中毕

法进行

labe

lin

abel

lin

kind

ax =

line

ind

ax =

line

从收入

量非缺

高频

毕业的

行展

el =

esty

l =

esty

d =

axe

styl

= '

axe

styl

入的

缺失

次数

的学

展现

'<=

yle

'>50

yle

'kde

es[1

le =

kde

es[1

le =

的预测

失观测

数(

学历是

,这

=50K

= '

0K',

= '

e',

1],

= '-

', l

1],

= '-

测分

测的

freq

是出

这里

K', a

-')

ax

--')

labe

lege

')

labe

lege

-')

分析开

的数量

q)。

现最

仅以

ax =

= a

)

el =

end

l =

end

开始

量(

最多

以被

= ax

axes

= '<

= T

'>5

= T

coun

受教

的;

调查

xes[

s[0]

<=50

rue,

50K'

rue,

| 1

nt)

教育

查居

0],

,

K',

,

,

,

17

育水

并且

居民

Page 18: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

18

['r

8

5万

特征

时数

数值

的差

#

r

#

r

#

r

#

r

#

r

rela

r

r

r

#

p

s

p

p

s

p

关系

水平

数多

| 从

如图

万美

征,即

数的

值型

同理

差异

# 构造

race

# 重设

race

# 变量

race

# 排序

race

# 构造

rela

atio

rela

rela

rela

# 设置

plt.

sns.b

plt.

plt.

sns.b

plt.

见图

左图

系下

平下

多,

从零

图 2-8

元的

即年

核密

变量

理,也

,进

造不同

= p

设行索

= r

量重命

.ren

.sor

造不同

tion

onshi

tion

tion

tion

置图框

figu

barp

show

figu

barp

show

图 2-9

图反映

,居

(如

这个

零开始

8所

的居

年龄偏

密度

量的

也可

进而

同收入

d.Da

索引

race

命名

name

rt_v

同收入

nshi

ip',

nshi

nshi

nshi

框比例

ure(

plot

w()

ure(

plot

w()

9。

映的

居民年

如白种

个应

始学

示,

民来

偏大

图,

分布

可以针

可以

入水平

ataF

e.re

e(co

value

入水平

ip =

,'in

ip =

ip.re

ip.so

例,并

fig

t(x=

fig

t(x=

的是相

年收

种人

应该是

学 Py

第一

来说

大的居

布形

针对

以发

平下各

Fram

set_

lumn

es(b

平下各

pd.

ncome

rel

enam

ort_

并绘图

size

"rac

size

"rel

相同

收入水

人或未

是抽

yth

一幅

,他

居民

明显

状,

对离散

现这

各种族

e(in

_ind

ns={

by =

各家庭

.Dat

e'])

lati

me(c

_val

e=(9

ce",

e=(9

lati

同的种

水平

未结

抽样导

on

幅图展

他们的

民人数

显,两

散型

这些

族人数

ncom

dex(

'ag

= ['

庭关系

taFr

).ag

ionsh

colum

lues

9,5)

y=

9,5)

ionsh

种族

平高低

结婚人

导致

数据

展现

的年

数要

两者

照上

型变量

离散

数的数

me.g

)

e':'

race

系人数

ame

ggreg

hip.

mns=

(by

)

"cou

)

hip"

族下,

低的

人群

致的差

据分

现的是

年龄几

要比年

者的分

上面

量,

散变

数据

roup

'cou

e','

数的数

(inc

gate

.res

={'a

= [

unts

", y

,居

的人数

群中

差异

分析与

是,

几乎

年龄

分布

的代

对比

量是

pby(

unts

coun

数据

come

e(np

set_

age'

're

s", h

y="co

图 2-9

居民年

数差

),

异(数

与挖

在不

乎呈现

龄偏小

布趋势

代码

比居

是否

(by =

'},

nts'

.gro

p.si

inde

:'co

lati

hue

ount

9 收

年收

差异

年收

数据

挖掘

不同

现正

小的

势非

稍做

居民的

影响

= ['

inp

'],

oupb

ze).

ex()

ount

ions

= '

ts",

收入水

收入水

。但

收入

据集中

同收入

正态分

的人数

非常相

做修

的收

响收

race

plac

asc

by(b

.loc

ts'}

ship

inc

hu

水平

水平

但无论

入低于

中年

入水

分布

数多

相似

修改即

收入水

收入水

e','

e=Tr

endi

y =

c[:,

, in

','c

ome'

e =

的对

平高低

论怎

于 5

年收入

水平下

布,而

多;第

似,并

即可

水平

水平

inc

rue)

ing=

'age

npla

coun

', d

'in

对比条

低的

怎么比

万美

入低

下,

而收

第二

并且

平高低

ome

=Fal

e'])

ace=T

nts'

data=

ncome

条形图

的人数

比较

美元

低于

年龄

收入低

二幅图

且出现

低在

']).

se,

True

], a

=rac

e',

数差

较,都

元的人

5 万

龄的

低于

图展

现局

在性别

agg

inp

e)

asce

ce)

dat

差异

都发

人数

万和

的核密

于 5万

展现了

局部峰

别、

rega

plac

endi

ta=r

;右

发现一

数都要

和高于

密度

万美

了不

峰值

ate(

e=Tr

ng=F

elat

右图

一个

要比

度分布

美元的

不同收

值。如

族状

(np.

rue)

Fals

tion

反映

个规律

比年收

5 万

布图

的居

收入

如果

状态

size

se,

nship

映的

律,

收入

万的

图,对

居民,

入水平

读者

、家

e).l

inpl

p)

是相

即在

高于

居民

对于

平下

者需

家庭

loc[

lace

相同

在某

于 5

民比

于年收

年龄呈

下,周

需要研

关系

:,'a

e=Tr

的家

某一个

万美

例大

收入

呈现

周工

研究

系等

age'

ue)

家庭

个相

美元

大致

入超

现右

工作

究其

等方

'])

庭成

相同

元的

致在

Page 19: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章 从收入的预测分析开始 | 19

75%:25%)。如果读者需要研究其他离散型变量与年收入水平的关系,可以稍稍修改上面的代码,

实现可视化的绘制。

2.2.3 数据建模

1. 对离散变量重编码

前面提到,由于收入数据集中有很多离散型变量,这样的字符变量是不能直接用于建模的,

需要对这些变量进行重编码,关于重编码的方法有多种,如将字符型的值转换为整数型的值、哑变

量处理(0-1 变量)、One-Hot 热编码(类似于哑变量)等。在本案例中,将采用“字符转数值”

的方法对离散型变量进行重编码,具体可以通过下面的代码实现:

# 离散变量的重编码,见表 2-5

for feature in income.columns:

if income[feature].dtype == 'object':

income[feature] = pd.Categorical(income[feature]).codes

income.head()

表 2-5 离散变量的数值化编码

表 2-5中的结果就是对字符型离散变量的重编码效果,所有的字符型变量都变成了整数型变量,

如 workclass、education、marital-status 等,接下来就基于这个处理好的数据集对收入水平 income

进行预测。

在原本的居民收入数据集中,关于受教育程度的有两个变量,一个是 education(教育水平),

另一个是 education-num(受教育时长),而且这两个变量的值都是一一对应的,只不过一个是字

符型,另一个是对应的数值型,如果将这两个变量都包含在模型中的话,就会产生信息的冗余;

fnlwgt变量代表的是一种序号,其对收入水平的高低并没有实际意义。故为了避免冗余信息和无意

义变量对模型的影响,考虑将 education变量和 fnlwgt变量从数据集中删除:

# 删除变量

income.drop(['education','fnlwgt'], axis = 1, inplace = True)

income.head()

见表 2-6。

Page 20: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

20 | 从零开始学 Python 数据分析与挖掘

表 2-6 数据集的前 5 行预览

表 2-6 中呈现的就是经处理“干净”的数据集,所要预测的变量就是 income,该变量是二元

变量,对其预测的实质就是对年收入水平的分类(一个新样本进来,通过分类模型,可以将该样本

分为哪一种收入水平)。

关于分类模型有很多种,如 Logistic 模型、决策树、K近邻、朴素贝叶斯模型、支持向量机、

随机森林、梯度提升树 GBDT模型等。本案例将对比使用 K近邻和 GBDT两种分类器,因为通常

情况下,都会选用多个模型作为备选,通过对比才能得知哪种模型可以更好地拟合数据。接下来就

进一步说明如何针对分类问题,从零开始完成建模的步骤。

2. 拆分数据集

基于上面的“干净”数据集,需要将其拆分为两个部分,一部分用于分类器模型的构建,另

一部分用于分类器模型的评估,这样做的目的是避免分类器模型过拟合或欠拟合。如果模型在训练

集上表现很好,而在测试集中表现很差,则说明分类器模型属于过拟合状态;如果模型在训练过程

中都不能很好地拟合数据,那说明模型属于欠拟合状态。通常情况下,会把训练集和测试集的比例

分配为 75%和 25%:

# 导入 sklearn包中的函数

from sklearn.model_selection import train_test_split

# 数据拆分

X_train, X_test, y_train, y_test = train_test_split(income.loc[:,'age':'native-country'],

income['income'], train_size = 0.75,

random_state = 1234)

print('训练数据集共有%d条观测' %X_train.shape[0])

print('测试数据集共有%d条观测' %X_test.shape[0])

out:

训练数据集共有 24420条观测

测试数据集共有 8141条观测

结果显示,运用随机抽样的方法,将数据集拆分为两部分,其中训练数据集包含 24 420 条样

本,测试数据集包含 8 141 条样本,下面将运用拆分好的训练数据集开始构建 K 近邻和 GBDT 两

种分类器。

3. 默认参数的模型构建

# 导入 K近邻模型的类

from sklearn.neighbors import KNeighborsClassifier

# 构建 K近邻模型

Page 21: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章 从收入的预测分析开始 | 21

kn = KNeighborsClassifier()

kn.fit(X_train, y_train)

print(kn)

out:

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',

metric_params=None, n_jobs=1, n_neighbors=5, p=2,

weights='uniform')

首先,针对 K近邻模型,这里直接调用 sklearn子模块 neighbors中的 KNeighborsClassifier类,

并且使用模型的默认参数,即让 K近邻模型自动挑选最佳的搜寻近邻算法(algorithm='auto')、使

用欧氏距离公式计算样本间的距离(p=2)、指定未知分类样本的近邻个数为 5(n_neighbors=5)

而且所有近邻样本的权重都相等(weights='uniform')。如果读者想了解更多有关 K近邻算法的理

论可以翻阅第 11章。

# 导入 GBDT模型的类

from sklearn.ensemble import GradientBoostingClassifier

# 构建 GBDT模型

gbdt = GradientBoostingClassifier()

gbdt.fit(X_train, y_train)

print(gbdt)

out:

GradientBoostingClassifier(init=None, learning_rate=0.1, loss='deviance',

max_depth=3, max_features=None, max_leaf_nodes=None,

min_samples_leaf=1, min_samples_split=2,

min_weight_fraction_leaf=0.0, n_estimators=100,

presort='auto', random_state=None, subsample=1.0, verbose=0,

warm_start=False)

其次,针对 GBDT模型,可以调用 sklearn子模块 ensemble中的 GradientBoostingClassifier类,

同样先尝试使用该模型的默认参数,即让模型的学习率(迭代步长)为 0.1(learning_rate=0.1)、

损失函数使用的是对数损失函数(loss='deviance')、生成 100棵基础决策树(n_estimators=100),

并且每棵基础决策树的最大深度为 3(max_depth=3),中间节点(非叶节点)的最小样本量为 2

(min_samples_split=2),叶节点的最小样本量为 1(min_samples_leaf=1),每一棵树的训练都不

会基于上一棵树的结果(warm_start=False)。如果读者想继续了解更多 GBDT相关的理论知识点,

可以参考第 14章。

如上 K近邻模型和 GBDT模型都是直接调用第三方模块,并且都是基于默认参数的模型构建,

虽然这个方法可行,但是往往有时默认参数并不能得到最佳的拟合效果。所以,需要不停地调整模

型参数,例如 K近邻模型设置不同的 K值、GBDT模型中设置不同的学习率、基础决策树的数量、

基础决策树的最大深度等。然后基于这些不同的参数值,验证哪种组合的参数会得到效果最佳的模

型,看似可以通过 for循环依次迭代来完成,但是效率会比较慢。一个好消息是,读者可以不用手

写 for循环,找到最佳的参数,在 Python的 sklearn模块中提供了网格搜索法,目的就是找到上面

提到的最佳参数。接下来,就带着大家使用 Python中的网格搜索法来完成模型的参数选择。

4. 模型网格搜索

同样,先对K近邻模型的参数进行网格搜索,这里仅考虑模型中 n_neighbors参数的不同选择。

Page 22: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

22 | 从零开始学 Python 数据分析与挖掘

执行脚本如下:

# K近邻模型的网格搜索法

# 导入网格搜索法的函数

from sklearn.grid_search import GridSearchCV

# 选择不同的参数

k_options = list(range(1,12))

parameters = {'n_neighbors':k_options}

# 搜索不同的 K值

grid_kn = GridSearchCV(estimator = KNeighborsClassifier(), param_grid = parameters, cv=10,

scoring='accuracy')

grid_kn.fit(X_train, y_train)

# 结果输出

grid_kn.grid_scores_, grid_kn.best_params_, grid_kn.best_score_

out:

([mean: 0.81478, std: 0.00641, params: {'n_neighbors': 1},

mean: 0.83845, std: 0.00702, params: {'n_neighbors': 2},

mean: 0.83698, std: 0.00852, params: {'n_neighbors': 3},

mean: 0.84521, std: 0.00977, params: {'n_neighbors': 4},

mean: 0.84201, std: 0.00817, params: {'n_neighbors': 5},

mean: 0.84771, std: 0.00842, params: {'n_neighbors': 6},

mean: 0.84431, std: 0.00694, params: {'n_neighbors': 7},

mean: 0.84558, std: 0.00746, params: {'n_neighbors': 8},

mean: 0.84476, std: 0.00688, params: {'n_neighbors': 9},

mean: 0.84640, std: 0.00552, params: {'n_neighbors': 10},

mean: 0.84529, std: 0.00487, params: {'n_neighbors': 11}],

{'n_neighbors': 6},

0.84770679770679769)

简单解释一下 GridSearchCV函数中的几个参数含义,estimator参数接受一个指定的模型,这

里为 K近邻模型的类;param_grid用来指定模型需要搜索的参数列表对象,这里是 K近邻模型中

n_neighbors参数的 11种可能值;cv是指网格搜索需要经过 10重交叉验证;scoring指定模型评估

的度量值,这里选用的是模型预测的准确率。

通过网格搜索的计算,得到三部分的结果,第一部分包含了 11种 K值下的平均准确率(因为

做了 10重交叉验证);第二部分选择出了最佳的 K值,K值为 6;第三部分是当 K值为 6时模型

的最佳平均准确率,且准确率为 84.78%。

接下来,对 GBDT模型的参数进行网格搜索,搜索的参数包含三个,分别是模型的学习速率、

生成的基础决策树个数和每个基础决策树的最大深度。具体执行代码如下:

# GBDT模型的网格搜索法

# 选择不同的参数

learning_rate_options = [0.01,0.05,0.1]

max_depth_options = [3,5,7,9]

n_estimators_options = [100,300,500]

parameters = {'learning_rate':learning_rate_options,'max_depth':max_depth_options,

'n_estimators':n_estimators_options}

grid_gbdt = GridSearchCV(estimator = GradientBoostingClassifier(), param_grid = parameters,

cv=10, scoring='accuracy')

grid_gbdt.fit(X_train, y_train)

Page 23: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章 从收入的预测分析开始 | 23

# 结果输出

grid_gbdt.grid_scores_, grid_gbdt.best_params_, grid_gbdt.best_score_

out:

([mean: 0.84267, std: 0.00727, params: {'max_depth': 3, 'learning_rate': 0.01, 'n_estimators':

100},

mean: 0.85393, std: 0.00826, params: {'max_depth': 3, 'learning_rate': 0.01, 'n_estimators':

300},

mean: 0.85950, std: 0.00743, params: {'max_depth': 3, 'learning_rate': 0.01, 'n_estimators':

500},

mean: 0.85135, std: 0.00817, params: {'max_depth': 5, 'learning_rate': 0.01, 'n_estimators':

100},

mean: 0.86241, std: 0.00818, params: {'max_depth': 5, 'learning_rate': 0.01, 'n_estimators':

300},

mean: 0.86900, std: 0.00772, params: {'max_depth': 5, 'learning_rate': 0.01, 'n_estimators':

500},

mean: 0.85389, std: 0.00726, params: {'max_depth': 7, 'learning_rate': 0.01, 'n_estimators':

100},

mean: 0.86941, std: 0.00946, params: {'max_depth': 7, 'learning_rate': 0.01, 'n_estimators':

300},

……

mean: 0.87133, std: 0.01022, params: {'max_depth': 9, 'learning_rate': 0.1, 'n_estimators':

100},

mean: 0.85811, std: 0.01004, params: {'max_depth': 9, 'learning_rate': 0.1, 'n_estimators':

300},

mean: 0.85442, std: 0.00941, params: {'max_depth': 9, 'learning_rate': 0.1, 'n_estimators':

500}],

{'learning_rate': 0.05, 'max_depth': 5, 'n_estimators': 300},

0.87506142506142504)

输出的结果与 K 近邻结构相似,仍然包含三个部分。限于篇幅的影响,上面的结果中并没有

显示所有参数的组合,从第二部分的结果可知,最佳的模型学习率为 0.05,生成的基础决策树个数

为 300棵,并且每棵基础决策树的最大深度为 5。这样的组合可以使 GBDT模型的平均准确率达到

87.51%。

6. 模型预测与评估

上文中,我们花了一部分的篇幅来介绍基于“干净”数据集的模型构建,下一步要做的就是

使用得到的分类器对测试数据集进行预测,进而验证模型在样本外的表现能力,同时,也可以从横

向的角度来比较模型之间的好坏。

通常,验证模型好坏的方法有多种。例如,对于预测的连续变量来说,常用的衡量指标有均

方误差(MSE)和均方根误差(RMSE);对于预测的分类变量来说,常用的衡量指标有混淆矩阵

中的准确率、ROC曲线下的面积 AUC、K-S值等。接下来,依次对上文中构建的四种模型进行预

测和评估。

7. 默认的 K近邻模型

# K近邻模型在测试集上的预测

kn_pred = kn.predict(X_test)

print(pd.crosstab(kn_pred, y_test))

# 模型得分

Page 24: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

24 | 从零开始学 Python 数据分析与挖掘

print('模型在训练集上的准确率%f' %kn.score(X_train,y_train))

print('模型在测试集上的准确率%f' %kn.score(X_test,y_test))

见表 2-7。

表 2-7 KNN 算法的混淆矩阵

<=50K >50K

<=50K 5637 723

>50K 589 1192

模型在训练集上的准确率 0.890500

模型在测试集上的准确率 0.838840

如上结果所示,第一部分是混淆矩阵,矩阵中的行是模型的预测值,矩阵中的列是测试集的

实际值,主对角线就是模型预测正确的数量(5637 和 1192),589 和 723 就是模型预测错误的数

量。经过计算,得到第二部分的结论,即模型在训练集中的准确率为 89.1%,但在测试集上的错误

率超过 16%(1-0.839),说明默认参数下的 KNN模型可能存在过拟合的风险。

模型的准确率就是基于混淆矩阵计算的,但是该方法存在一定的弊端,即如果数据本身存在

一定的不平衡时(正负样本的比例差异较大),一定会导致准确率很高,但并不一定说明模型就是

理想的。这里再介绍一种常用的方法,就是绘制 ROC曲线,并计算曲线下的面积 AUC值:

# 导入模型评估模块

from sklearn import metrics

# 计算 ROC曲线的 x轴和 y轴数据

fpr, tpr, _ = metrics.roc_curve(y_test, kn.predict_proba(X_test)[:,1])

# 绘制 ROC曲线

plt.plot(fpr, tpr, linestyle = 'solid', color = 'red')

# 添加阴影

plt.stackplot(fpr, tpr, color = 'steelblue')

# 绘制参考线

plt.plot([0,1],[0,1], linestyle = 'dashed', color = 'black')

# 往图中添加文本

plt.text(0.6,0.4,'AUC=%.3f' % metrics.auc(fpr,tpr), fontdict = dict(size = 18))

plt.show()

见图 2-10。

图 2-10 KNN算法的 ROC曲线

Page 25: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章 从收入的预测分析开始 | 25

图 2-10 中绘制了模型的 ROC 曲线,经计算得知,该曲线下的面积 AUC 为 0.865。如果读者

使用 AUC 来评估模型的好坏,那应该希望 AUC 越大越好。一般而言,当 AUC 的值超过 0.8 时,

基本上就可以认为模型比较合理。所以,基于默认参数的 K 近邻模型在居民收入数据集上的表现

还算理想。

8. 网格搜索的 K近邻模型

# 预测测试集

grid_kn_pred = grid_kn.predict(X_test)

print(pd.crosstab(grid_kn_pred, y_test))

# 模型得分

print('模型在训练集上的准确率%f' %grid_kn.score(X_train,y_train))

print('模型在测试集上的准确率%f' %grid_kn.score(X_test,y_test))

# 绘制 ROC曲线

fpr, tpr, _ = metrics.roc_curve(y_test, grid_kn.predict_proba(X_test)[:,1])

plt.plot(fpr, tpr, linestyle = 'solid', color = 'red')

plt.stackplot(fpr, tpr, color = 'steelblue')

plt.plot([0,1],[0,1], linestyle = 'dashed', color = 'black')

plt.text(0.6,0.4,'AUC=%.3f' % metrics.auc(fpr,tpr), fontdict = dict(size = 18))

plt.show()

见表 2-8。

表 2-8 网格搜索 KNN 算法的混淆矩阵

<=50K >50K

<=50K 5834 867

>50K 392 1048

模型在训练集上的准确率 0.882473

模型在测试集上的准确率 0.845351

见图 2-11。

图 2-11 网格搜索KNN算法的 ROC曲线

Page 26: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

26 | 从零开始学 Python 数据分析与挖掘

相比于默认参数的 K近邻模型来说,经过网格搜索后的模型在训练数据集上的准确率下降了,

但在测试数据集上的准确率提高了,这也是我们所期望的,说明优化后的模型在预测效果上更加优

秀,并且两者差异的缩小也能够降低模型过拟合的可能。再来看看 ROC曲线下的面积,网格搜索

后的 K近邻模型所对应的 AUC为 0.87,相比于原先的 KNN模型提高了一点。所以,从模型的稳

定性来看,网格搜索后的 K近邻模型比原始的 K近邻模型更加优秀。

10. 默认的 GBDT模型

# 预测测试集

gbdt_pred = gbdt.predict(X_test)

print(pd.crosstab(gbdt_pred, y_test))

# 模型得分

print('模型在训练集上的准确率%f' %gbdt.score(X_train,y_train))

print('模型在测试集上的准确率%f' %gbdt.score(X_test,y_test))

# 绘制 ROC曲线

fpr, tpr, _ = metrics.roc_curve(y_test, gbdt.predict_proba(X_test)[:,1])

plt.plot(fpr, tpr, linestyle = 'solid', color = 'red')

plt.stackplot(fpr, tpr, color = 'steelblue')

plt.plot([0,1],[0,1], linestyle = 'dashed', color = 'black')

plt.text(0.6,0.4,'AUC=%.3f' % metrics.auc(fpr,tpr), fontdict = dict(size = 18))

plt.show()

见表 2-9。

表 2-9 GBDT 算法的混淆矩阵

<=50K >50K

<=50K 5862 784

>50K 364 1131

模型在训练集上的准确率 0.869451

模型在测试集上的准确率 0.858985

见图 2-12。

图 2-12 GBDT算法的 ROC曲线

Page 27: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

第 2 章 从收入的预测分析开始 | 27

如上结果所示,集成算法 GBDT在测试集上的表现明显要比 K近邻算法优秀,这就是基于多

棵决策树进行投票的优点。该模型在训练集和测试集上的表现都非常好,准确率均超过 85%,而

且 AUC值也是前面两种模型中最高的,达到了 0.913。

11. 网络搜索的 GBDT模型

# 预测测试集

grid_gbdt_pred = grid_gbdt.predict(X_test)

print(pd.crosstab(grid_gbdt_pred, y_test))

# 模型得分

print('模型在训练集上的准确率%f' %grid_gbdt.score(X_train,y_train))

print('模型在测试集上的准确率%f' %grid_gbdt.score(X_test,y_test))

# 绘制 ROC曲线

fpr, tpr, _ = metrics.roc_curve(y_test, grid_gbdt.predict_proba(X_test)[:,1])

plt.plot(fpr, tpr, linestyle = 'solid', color = 'red')

plt.stackplot(fpr, tpr, color = 'steelblue')

plt.plot([0,1],[0,1], linestyle = 'dashed', color = 'black')

plt.text(0.6,0.4,'AUC=%.3f' % metrics.auc(fpr,tpr), fontdict = dict(size = 18))

plt.show()

见表 2-10。

表 2-10 网格搜索 GBDT 算法的混淆矩阵

<=50K >50K

<=50K 5842 667

>50K 384 1248

模型在训练集上的准确率 0.890336

模型在测试集上的准确率 0.870900

见图 2-13。

图 2-13 网格搜索GBDT算法的 ROC曲线

如上展示的是基于网格搜索后的 GBDT模型的表现,从准确率来看,是 4个模型中表现最佳

Page 28: 数据分析与挖掘概述 - tup.tsinghua.edu.cn · 和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。 所以广义的数据分析就包含

28 | 从零开始学 Python 数据分析与挖掘

的,该模型在训练集上的准确率接近 90%,同时,在测试集上的准确率也超过 87%;从绘制的 ROC

曲线来看,AUC的值也是最高的,超过 0.92。

不论是 K近邻模型,还是梯度提升树 GBDT模型,都可以通过网格搜索法找到各自的最佳模

型参数,而且这些最佳参数的组合一般都会使模型比较优秀和健壮。所以,纵向比较默认参数的模

型和网格搜索后的最佳参数模型,后者可能是比较好的选择(尽管后者可能会花费更多的运行时间);

横向比较单一模型和集成模型,集成模型一般会比单一模型表现优秀。

2.3 本章小结

本章解决的是一个分类问题的预测,通过实际的案例介绍了有关数据挖掘的重要流程,包括

数据的清洗、数据的探索性分析、模型构建和模型的评估。通过本章的学习,进一步加强对数据挖

掘流程的理解,以便读者在实际的学习和工作中能够按部就班地完成数据挖掘任务。