Python数据分析与挖掘实战(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-22 07:23:06

点击下载

作者:张良均

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python数据分析与挖掘实战(第2版)

Python数据分析与挖掘实战(第2版)试读:

前言

为什么要写这本书

LinkedIn通过对全球超过3.3亿用户的工作经历和技能进行分析后得出,在目前炙手可热的25项技能中,数据挖掘人才需求排名第一。那么数据挖掘是什么呢?

数据挖掘是从大量数据(包括文本)中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此,数据挖掘已成为企业保持竞争力的必要方法。

与国外相比,我国信息化程度仍不算高,企业内部信息也不完整,零售、银行、保险、证券等行业对数据挖掘的应用还不太理想。但随着市场竞争的加剧,各行业对数据挖掘技术的需求越来越强烈,可以预计,未来几年各行业的数据分析应用一定会从传统的统计分析发展到大规模的数据挖掘应用。在大数据时代,数据过剩、人才短缺,数据挖掘专业人才的培养将离不开专业知识和职业经验积累。所以,本书注重数据挖掘理论与项目案例实践相结合,让读者获得真实的数据挖掘学习与实践环境,更快、更好地学习数据挖掘知识并积累职业经验。

总的来说,随着云时代的来临,大数据技术将具有越来越重要的战略意义。大数据已经渗透到每一个行业和业务职能领域,逐渐成为重要的生产要素,人们对于海量数据的运用将预示着新一轮生产率增长和消费者盈余浪潮的到来。大数据分析技术将帮助企业用户在合理的时间内攫取、管理、处理、整理海量数据,为企业经营决策提供积极帮助。大数据分析作为数据存储和挖掘分析的前沿技术,广泛应用于物联网、云计算、移动互联网等战略性新兴产业。虽然目前大数据在国内还处于初级阶段,但是其商业价值已经显现出来,特别是有实践经验的大数据分析人才更是各企业争夺的焦点。为了满足日益增长的大数据分析人才需求,很多高校开始尝试开设不同程度的大数据分析课程。“大数据分析”作为大数据时代的核心技术,必将成为高校数学与统计学专业的重要课程之一。第2版与第1版的区别

本书在第1版的基础上进行了代码与内容的全方位升级。在代码方面,将整书代码由Python 2升级至Python 3.6。在内容方面,对

基础篇

和实战篇均做了升级。

基础篇具体升级内容如下。

·第1章增加了章节的引言;修改了1.5节中对TipDM开源数据挖掘建模平台的介绍。

·第2章修改了2.4节中对配套附件的说明。

·第3章增加3.2节所有图形绘制的代码。

·第4章修改了4.1.1节中对牛顿插值法原理的描述。

·第5章修改了5.1.3节中对逻辑回归模型的评价和相关解释;5.2.4节中更新了图5-17。

实战篇具体升级内容如下。

·第6章为原书第13章,新增了对Lasso回归方法、灰色预测算法、SVR算法原理的介绍;将原书的神经网络算法改为SVR算法;删除增值税预测模型、营业税预测模型、企业所得税预测模型、个人所得税预测模型和政府性基金收入预测模型的内容;修改了拓展思考。

·第7章增加了章节的引言;7.2.2节增加了分布分析;7.2.3节增加了RFM模型的介绍;7.2.4节增加了客户分群雷达图的绘制代码。

·新增“第8章商品零售购物篮分析”一章。

·第9章增加了章节的引言;9.2.2节增加了数据预处理的Python实现代码;9.2.3节中将原书的支持向量机算法改为决策树算法。

·第10章增加了章节的引言;原书的“10.2.1数据抽取”改为“10.2.1数据探索分析”,并增加了有无水流和水流量属性的探索分析;10.2.2节增加了属性构造的Python实现代码,原书数据清洗的内容移到属性构造中实现。

·第11章为原书第12章,增加了章节的引言;11.2.3节删除了网页排名的内容;11.2.5节优化了基于协同过滤算法的Python实现代码,新增了模型评价的代码,并修改了模型评价的描述。

·第12章为原书第15章,增加了章节的引言;删除原书“15.2.1评论数据采集”的内容;12.2.1节优化了预处理的方法,并增加了Python实现代码;12.2.2节优化了分词的方法,并增加了Python实现代码;“12.2.3构建模型”修改了情感倾向分析的描述,增加了寻找最优主题数的内容,以及相关的Python实现代码。

·删除原书“第6章电力窃漏电用户自动识别”“第8章中医证型关联规则挖掘”“第11章应用系统负载分析与磁盘容量预测”“第14章基于基站定位数据的商圈分析”这4章。

此外,本版本还额外增加了提高篇,即“第13章基于Python引擎的开源数据挖掘建模平台(TipDM)”,基于开源数据挖掘建模平台(TipDM)实现案例,不仅能够帮助企业建立自己的数据挖掘平台,而且能辅助编程能力较弱的读者更好地理解案例。本书特色

本书作者从实践出发,结合大量数据挖掘工程案例及教学经验,以真实案例为主线,深入浅出地介绍了数据挖掘建模过程中的有关任务:数据探索、数据预处理、分类与预测、聚类分析、时序预测、关联规则挖掘、智能推荐、偏差检测等。因此,本书的编排以解决某个应用的挖掘目标为前提,先介绍案例背景,提出挖掘目标,再阐述分析方法与过程,最后完成模型构建。在介绍建模的过程中同时穿插操作训练,把相关的知识点嵌入相应的操作过程中。为方便读者轻松获取真实的实验环境,本书使用大家熟知的Python语言对样本数据进行处理,以进行挖掘建模。

为了帮助读者更好地使用本书,本书提供配套的原始数据文件、Python程序代码,读者可以从“泰迪杯”数据挖掘挑战赛网站(http://www.tipdm.org/tj/1615.jhtml)免费下载。为方便教师授课,本书还提供了PPT课件,教师可到网址http://www.tipdm.org/tj/840.jhtml咨询获取。本书适用对象

开设数据挖掘课程的高校的教师和学生。

目前,国内不少高校将数据挖掘引入本科教学中,在数学、计算机、自动化、电子信息、金融等专业开设了数据挖掘技术的相关课程,但这一课程的教学仍然主要限于理论介绍。单纯的理论教学过于抽象,学生理解起来往往比较困难,教学效果也不甚理想。本书提供的基于实战案例和建模实践的教学,能够使师生充分发挥互动性和创造性,理论联系实际,使师生获得最佳的教学效果。

·需求分析及系统设计人员。

这类人员可以在理解数据挖掘原理及建模过程的基础上,结合数据挖掘案例完成精确营销、客户分群、交叉销售、流失分析、客户信用记分、欺诈发现、智能推荐等数据挖掘应用的需求分析和设计。

·数据挖掘开发人员。

这类人员可以在理解数据挖掘应用需求和设计方案的基础上,结合本书提供的基于第三方接口快速完成数据挖掘应用的编程实现。

·从事数据挖掘应用研究的科研人员。

许多科研院所为了更好地管理科研工作,纷纷开发了适应自身特点的科研业务管理系统,并在使用过程中积累了大量的科研信息数据。但是,这些科研业务管理系统一般没有对数据进行深入分析,对数据所隐藏的价值也没有充分挖掘利用。科研人员需要利用数据挖掘建模工具及有关方法论来深挖科研信息的价值,从而提高科研水平。

·关注高级数据分析的人员。

业务报告和商业智能解决方案对有关人员了解过去和现在的状况是非常有用的。同时,数据挖掘的预测分析解决方案还能使这类人员预见未来的发展状况,让他们所在的机构能够先发制人,而不是处于被动。因为数据挖掘的预测分析解决方案将复杂的统计方法和机器学习技术应用到数据之中,通过预测分析技术来揭示隐藏在交易系统或企业资源计划(ERP)、结构数据库和普通文件中的模式和趋势,从而为这类人员的决策提供科学依据。如何阅读本书

本书共13章,分为基础篇、实战篇、提高篇。基础篇介绍了数据挖掘的基本原理;实战篇介绍了一些真实案例,通过对案例深入浅出的剖析,使读者在不知不觉中获得数据挖掘项目经验,同时快速领悟看似难懂的数据挖掘理论;提高篇介绍了一个基于Python引擎的开源数据挖掘建模平台,通过平台去编程、拖曳式的操作,向读者展示了平台流程化的思维,使读者加深对数据挖掘流程的理解。读者在阅读过程中,应充分利用随书配套的案例建模数据,借助相关的数据挖掘建模工具,通过上机实验,快速理解相关知识与理论。

基础篇(第1~5章)

第1章的主要内容是数据挖掘基础;第2章对本书所用到的数据挖掘建模工具Python语言进行了简明扼要的说明;第3~5章对数据挖掘的建模过程,包括数据探索、数据预处理及挖掘建模的常用算法与原理进行了介绍。

实战篇(第6~12章)

重点对数据挖掘技术在金融、航空、零售、能源、制造和电商等行业的应用进行了分析。在案例结构组织上,本书是按照先介绍案例背景与挖掘目标,再阐述分析方法与过程,最后完成模型构建的顺序进行的,在建模过程关键环节,穿插程序实现代码。最后通过上机实践,加深对案例应用中的数据挖掘技术的理解。

提高篇(第13章)

重点讲解了基于Python引擎的开源数据挖掘建模平台(TipDM)的使用方法,先介绍了平台每个模块的功能,再以航空公司客户价值分析案例为例,介绍如何使用平台快速搭建数据分析与挖掘工程,展示平台去编程化、流程化的特点。勘误和支持

我们已经尽最大努力避免在文本和代码中出现错误,但是由于水平有限,编写时间仓促,书中难免出现一些疏漏和不足的地方。如果你有更多的宝贵意见,欢迎在泰迪学社微信公众号回复“图书反馈”进行反馈。更多有关本系列图书的信息可以在“泰迪杯”数据挖掘挑战赛网站(http://www.tipdm.org/tj/index.jhtml)查阅。张良均基础篇

第1章 数据挖掘基础

第2章 Python数据分析简介

第3章 数据探索

第4章 数据预处理

第5章 挖掘建模第1章 数据挖掘基础

当今社会,网络和信息技术开始渗透到人类日常生活的方方面面,产生的数据量也呈现出指数型增长的态势。现有数据的量级已经远远超越了目前人力所能处理的范畴。如何管理和使用这些数据逐渐成为数据科学领域中一个全新的研究课题。1.1 某知名连锁餐饮企业的困惑

国内某餐饮连锁有限公司(以下简称T餐饮)成立于1998年,主要经营粤菜,兼具湘菜、川菜等菜系。至今已经发展成为在国内具有一定知名度、美誉度,多品牌、立体化的大型餐饮连锁企业。该公司拥有员工1000多人,拥有16家直营分店,经营总面积近13000平方米,年营业额近亿元。旗下各分店均坐落在繁华市区主干道,雅致的装潢,配之以精致的饰品、灯具、器物,菜品精美,服务规范。

近年来,餐饮行业面临较为复杂的市场环境,与其他行业一样,餐饮企业也遇到了原材料成本升高、人力成本升高、房租成本升高等问题,这也使得整个行业的利润率急剧下降。人力成本和房租成本的上升是必然趋势,如何在保持产品质量的同时提高企业效率,成为T餐饮急需解决的问题。从2000年开始,T餐饮通过加强信息化管理来提高效率,目前已上线的管理系统包括以下几个:(1)客户关系管理系统

该系统详细记录了每位客人的喜好,为顾客提供个性化服务,满足客户的个性化需求。通过客户关怀,提高客户的忠诚度。比如,企业能随时查询今天哪位客人过生日或其他纪念日,根据客人的价值分类给予相应关怀,如送鲜花、生日蛋糕、寿面等。通过本系统,还可对客户行为进行深入分析,包括客户价值分析、新客户分析与发展,并根据其价值情况将有关信息提供给管理者,为企业提供决策支持。(2)前厅管理系统

该系统通过掌上电脑无线点菜方式,改变了传统“饭店点菜、下单、结账,一支笔、一张纸,服务员来回跑的局面”,可以快速完成点菜过程。通过厨房自动送达信息,服务员不需要再手写点菜单,写菜速度加快,同时传菜部也轻松不少,菜单会通过电脑自动打印出来,降低差错率,也不存在厨房人员看不清服务员字迹而出现错误的问题。(3)后厨管理系统

信息化技术可实现后厨与前厅无障碍沟通,客人菜单可瞬间传到厨房。服务员只需点击掌上电脑的发送键,客人的菜单即被传送到收银管理系统中,由系统的电脑发出指令,设在厨房等处的打印机立即打印出相应的菜单,然后厨师按单做菜。与此同时,收银台也打印出一张同样的菜单放在客人桌上,作为客人查询及结账凭据,使客人清楚消费明细。(4)财务管理系统

该系统完成销售统计、销售分析、财务审计,实现对日常经营销售的管理。通过报表,企业管理者很容易掌握前台的销售情况,从而实现对财务的控制。通过表格和图形可以显示餐厅的销售情况,如菜品排行榜、日客户流量、日销售收入分析等;统计每天的出菜情况,可以了解哪些是滞销菜,哪些是畅销菜,从而了解顾客的品位,有针对性地制定一套既适合餐饮企业发展又能迎合顾客品位的菜肴体系和定价策略。(5)物资管理系统

该系统主要完成对物资的进销存管理,实际上就是一套融采购管理(入库、供应商管理、账款管理)、销售(通过配菜卡与前台销售联动)、盘存为一体的物流管理系统。对于连锁企业,还涉及统一配送管理等。

通过以上信息化的建设,T餐饮已经积累了大量的历史数据,那么有没有一种方法可以帮助企业从这些数据中洞察商机,提升价值?在同质化的市场竞争中,如何找到市场中以前并不存在的“漏”和“缺”?1.2 从餐饮服务到数据挖掘

企业经营的目的之一就是盈利,而餐饮企业盈利的核心就是其菜品和顾客,也就是其提供的产品和服务对象。企业经营者每天都在想推出什么样的菜系和种类会吸引更多的顾客,顾客的喜好究竟是什么,在不同的时段是不是有不同的菜品畅销,当把几种不同的菜品组合在一起推出时是不是能够得到更好的效果,未来一段时间菜品原材料应该采购多少……

T餐饮的经营者想尽快解决这些疑问,既能使自己的菜品更加符合现有顾客的口味,吸引更多的新顾客,又能根据不同的情况和环境转换自己的经营策略。T餐饮在经营过程中,通过分析历史数据,总结出以下一些行之有效的经验:

1)在点餐过程中,由有经验的服务员根据顾客特点进行菜品推荐,一方面可提高菜品的销量,另一方面可减少客户点餐的时间和频率,提升用户体验。

2)根据菜品历史销售情况,综合考虑节假日、气候和竞争对手等影响因素,对菜品销量进行预测,以便于餐饮企业提前准备原材料。

3)定期对菜品销售情况进行统计,分类统计出好评菜和差评菜,为促销活动和新菜品推出提供支持。

4)根据就餐频率和消费金额对顾客的就餐行为进行评分,筛选出优质客户,定期回访并送去关怀。

上述措施的实施都依赖于企业已有业务系统中保存的数据,但是目前要想从这些数据中挖掘有关产品和客户的特点以及能够产生价值的规律还得更多地依赖于管理人员的个人经验。如果有一套工具或系统,能够从业务数据中自动或半自动地发现相关的知识和解决方案,这将极大地提高企业的决策水平和竞争能力。这样从数据中“淘金”,从大量数据(包括文本)中挖掘出隐含的、未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程,就是数据挖掘。它是利用各种分析工具在大量数据中寻找规律和发现模型与数据之间关系的过程,是统计学、数据库技术和人工智能技术的综合。

这种分析方法可避免“人治”的随意性,避免企业管理仅依赖个人领导力而带来的风险和不确定性,从而实现精细化营销与经营管理。1.3 数据挖掘的基本任务

数据挖掘的基本任务包括利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业的竞争力。

对餐饮企业而言,数据挖掘的基本任务是从餐饮企业采集各类菜品销量、成本单价、会员消费、促销活动等内部数据,以及天气、节假日、竞争对手及周边商业氛围等外部数据,之后利用数据分析手段,实现菜品智能推荐、促销效果分析、客户价值分析、新店选点优化、热销/滞销菜品分析和销量趋势预测,最后将这些分析结果推送给餐饮企业管理者及有关服务人员,为餐饮企业降低运营成本、提升盈利能力、实现精准营销、策划促销活动等提供智能服务支持。1.4 数据挖掘建模过程

从本节开始,将以餐饮行业的数据挖掘应用为例,详细介绍数据挖掘的建模过程,如图1-1所示。图1-1 餐饮行业数据挖掘建模过程1.4.1 定义挖掘目标

针对具体的数据挖掘应用需求,首先要明确本次的挖掘目标是什么,系统完成后能达到什么样的效果。因此,我们必须分析应用领域(包括应用中的各种知识和应用目标),了解相关领域的有关情况,熟悉背景知识,弄清用户需求。要想充分发挥数据挖掘的价值,必须要对数据挖掘目标有清晰明确的认识,即决定到底想干什么。

针对餐饮行业的数据挖掘应用,可定义如下挖掘目标:

1)实现动态菜品智能推荐,帮助顾客快速发现自己感兴趣的菜品,同时确保推荐给顾客的菜品也是餐饮企业期望顾客消费的菜品,实现餐饮消费者和餐饮企业的双赢。

2)对餐饮客户进行细分,了解不同客户的贡献度和消费特征,分析哪些客户是最有价值的、哪些是最需要关注的,对不同价值的客户采取不同的营销策略,将有限的资源投放到最有价值的客户身上,实现精准化营销。

3)基于菜品历史销售情况,综合考虑节假日、气候和竞争对手等影响因素,对菜品销量进行趋势预测,方便餐饮企业准备原材料。

4)基于餐饮大数据,优化新店选址,并对新店潜在顾客的口味偏好进行分析,以便及时进行菜式调整。1.4.2 数据取样

在明确了数据挖掘的目标后,接下来就需要从业务系统中抽取一个与挖掘目标相关的样本数据子集。抽取数据的标准:一是相关性,二是可靠性,三是有效性,而不是动用全部企业数据。通过数据样本的精选,不仅能减少数据处理量,节省系统资源,而且使我们想要寻找的规律能更好地突显出来。

进行数据取样,一定要严把质量关。在任何时候都不能忽视数据的质量,即使是从一个数据仓库中进行数据取样,也不要忘记检查数据质量如何。因为数据挖掘是要探索企业运作的内在规律性,原始数据有误,就很难从中探索其规律。若真的从中探索出什么“规律性”,再依此去指导工作,则很可能会对相关决策造成误导。若从正在运行的系统中进行数据取样,更要注意数据的完整性和有效性。

衡量取样数据质量的标准包括:资料完整无缺,各类指标项齐全;数据准确无误,反映的都是正常(而不是异常)状态下的水平。

对获取的数据可再从中作抽样操作。抽样的方式多种多样,常见的方式如下:

1)随机抽样:在采用随机抽样方式时,数据集中的每一组观测值都有相同的被抽取的概率。如按10%的比例对一个数据集进行随机抽样,则每一组观测值都有10%的机会被取到。

2)等距抽样:如果按5%的比例对一个有100组观测值的数据集进行等距抽样,则有100/5=20个数据被取到,那么等距抽样方式是取第20、40、60、80组这和第100组这5组观测值。

3)分层抽样:在这种抽样操作中,首先将样本总体分成若干层次(或者说分成若干个子集)。每个层次中的观测值都具有相同的被选用的概率,但对不同的层次可设定不同的概率。这样的抽样结果通常具有更好的代表性,进而使模型具有更好的拟合精度。

4)按起始顺序抽样:这种抽样方式是从输入数据集的起始处开始抽样。抽样的数量可以给定一个百分比,或者直接给定选取观测值的组数。

5)分类抽样:在前述几种抽样方式中,并不考虑抽取样本的具体取值。分类抽样则依据某种属性的取值来选择数据子集,如按客户名称分类、按地址区域分类等。分类抽样的选取方式就是前面所述的几种方式,只是抽样以类为单位。

基于1.4.1节定义的针对餐饮行业的数据挖掘目标,需从客户关系管理系统、前厅管理系统、后厨管理系统、财务管理系统和物资管理系统中抽取用于建模和分析的餐饮数据,主要包括的内容如下:

·餐饮企业信息:名称、位置、规模、联系方式、部门、人员以及角色等。

·餐饮客户信息:姓名、联系方式、消费时间、消费金额等。

·餐饮企业菜品信息:菜品名称、菜品单价、菜品成本、所属部门等。

·菜品销量数据:菜品名称、销售日期、销售金额、销售份数。

·原材料供应商资料及商品数据:供应商姓名、联系方式、商品名称、客户评价信息。

·促销活动数据:促销日期、促销内容以及促销描述等。

·外部数据:如天气、节假日、竞争对手以及周边商业氛围等数据。1.4.3 数据探索

前面所叙述的数据取样,多少带有人们对如何实现数据挖掘目的的先验认识而进行操作的。当我们拿到一个样本数据集后,它是否达到我们原来设想的要求、其中有没有什么明显的规律和趋势、有没有出现从未设想过的数据状态、属性之间有什么相关性、它们可分成怎样的类别……这都是要首先探索的内容。

对所抽取的样本数据进行探索、审核和必要的加工处理,能保证最终的挖掘模型的质量。可以说,挖掘模型的质量不会超过抽取样本的质量。数据探索和预处理的目的是保证样本数据的质量,从而为保证模型质量打下基础。

针对1.4.2节采集的餐饮数据,数据探索主要包括异常值分析、缺失值分析、相关分析、周期性分析等,详见第3章。1.4.4 数据预处理

当采样数据维度过大时,如何进行降维处理、缺失值处理等都是数据预处理要解决的问题。

由于采样数据中常常包含许多含有噪声、不完整甚至不一致的数据,对数据挖掘所涉及的数据对象必须进行预处理。那么如何对数据进行预处理以改善数据质量,并最终达到完善数据挖掘结果的目的呢?

针对采集的餐饮数据,数据预处理主要包括数据筛选、数据变量转换、缺失值处理、坏数据处理、数据标准化、主成分分析、属性选择、数据规约等,有关介绍详见第4章。1.4.5 挖掘建模

样本抽取完成并经预处理后,接下来要考虑的问题是:本次建模属于数据挖掘应用中的哪类问题(分类、聚类、关联规则、时序模式或智能推荐)?选用哪种算法进行模型构建?

这一步是数据挖掘工作的核心环节。针对餐饮行业的数据挖掘应用,挖掘建模主要包括基于关联规则算法的动态菜品智能推荐、基于聚类算法的餐饮客户价值分析、基于分类与预测算法的菜品销量预测、基于整体优化的新店选址。

以菜品销量预测为例,模型构建是对菜品历史销量,综合考虑节假日、气候和竞争对手等采样数据轨迹的概括,它反映的是采样数据内部结构的一般特征,并与该采样数据的具体结构基本吻合。模型的具体化就是菜品销量预测公式,公式可以产生与观察值有相似结构的输出,这就是预测值。1.4.6 模型评价

从1.4.5节的建模过程会得出一系列的分析结果,模型评价的目的之一就是从这些模型中自动找出一个最好的模型,另外就是要根据业务对模型进行解释和应用。

对分类与预测模型和聚类分析模型的评价方法是不同的,具体评价方法详见第5章相关章节的介绍。1.5 常用数据挖掘建模工具

数据挖掘是一个反复探索的过程,只有将数据挖掘工具提供的技术和实施经验与企业的业务逻辑和需求紧密结合,并在实施过程中不断磨合,才能取得好的效果。下面简单介绍几种常用的数据挖掘建模工具。(1)SAS Enterprise Miner

Enterprise Miner(EM)是SAS推出的一个集成数据挖掘系统,允许使用和比较不同的技术,同时还集成了复杂的数据库管理软件。它通过在一个工作空间(Workspace)中按照一定的顺序添加各种可以实现不同功能的节点,然后对不同节点进行相应的设置,最后运行整个工作流程(Workflow),便可以得到相应的结果。(2)IBM SPSS Modeler

IBM SPSS Modeler原名Clementine,2009年被IBM收购后对产品的性能和功能进行了大幅度改进和提升。它封装了最先进的统计学和数据挖掘技术来获得预测知识,并将相应的决策方案部署到现有的业务系统和业务过程中,从而提高企业的效益。IBM SPSS Modeler拥有直观的操作界面、自动化的数据准备和成熟的预测分析模型,结合商业技术可以快速建立预测性模型。(3)SQL Server

Microsoft的SQL Server集成了数据挖掘组件——Analysis Servers,借助SQL Server的数据库管理功能,可以无缝集成在SQL Server数据库中。SQL Server 2008提供了决策树算法、聚类分析算法、Naive Bayes算法、关联规则算法、时序算法、神经网络算法、线性回归算法等9种常用的数据挖掘算法。但是其预测建模的实现是基于SQL Server平台的,平台移植性相对较差。(4)Python

Python是一种面向对象的解释型计算机程序设计语言,它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程。但是Python并不提供专门的数据挖掘环境,它提供众多的扩展库,例如,以下3个十分经典的科学计算扩展库:NumPy、SciPy和Matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能,Scikit-learn库中包含很多分类器的实现以及聚类相关算法。正因为有了这些扩展库,Python才能成为数据挖掘常用的语言,也是比较适合数据挖掘的语言。(5)WEKA

WEKA(Waikato Environment for Knowledge Analysis)是一款知名度较高的开源机器学习和数据挖掘软件。高级用户可以通过Java编程和命令行来调用其分析组件。同时,WEKA也为普通用户提供了图形化界面,称为WEKA Knowledge Flow Environ-ment和WEKA Explorer,可以实现预处理、分类、聚类、关联规则、文本挖掘、可视化等功能。(6)KNIME

KNIME(Konstanz Information Miner)是基于Java开发的,可以扩展使用WEKA中的挖掘算法。KNIME采用类似数据流(Data Flow)的方式来建立分析挖掘流程。挖掘流程由一系列功能节点组成,每个节点有输入/输出端口,用于接收数据或模型、导出结果。(7)RapidMiner

RapidMiner也叫YALE(Yet Another Learning Environment),提供图形化界面,采用类似Windows资源管理器中的树状结构来组织分析组件,树上每个节点表示不同的运算符(Operator)。YALE提供了大量的运算符,包括数据处理、变换、探索、建模、评估等各个环节。YALE是用Java开发的,基于WEKA来构建,可以调用WEKA中的各种分析组件。RapidMiner有拓展的套件Radoop,可以和Hadoop集成起来,在hadoop集群上运行任务。(8)TipDM开源数据挖掘建模平台

TipDM数据挖掘建模平台是基于Python引擎、用于数据挖掘建模的开源平台。它采用B/S结构,用户不需要下载客户端,可通过浏览器进行访问。平台支持数据挖掘流程所需的主要过程:数据探索(相关性分析、主成分分析、周期性分析等),数据预处理(特征构造、记录选择、缺失值处理等),构建模型(聚类模型、分类模型、回归模型等),模型评价(R-Squared、混淆矩阵、ROC曲线等)。用户可在没有Python编程基础的情况下,通过拖曳的方式进行操作,将数据输入输出、数据预处理、挖掘建模、模型评估等环节通过流程化的方式进行连接,以达到数据分析挖掘的目的。1.6 小结

本章从一个知名餐饮企业经营过程中存在的困惑出发,引出数据挖掘的概念、基本任务、建模过程及常用工具。

如何帮助企业从数据中洞察商机、提取价值,这是现阶段几乎所有企业都关心的问题。通过发生在身边的案例,由浅入深地引出深奥的数据挖掘理论,让读者在不知不觉中感悟到数据挖掘的非凡魅力。本案例也将贯穿到后续第3~5章的理论介绍中。第2章 Python数据分析简介

Python是一门简单易学且功能强大的编程语言。它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程。Python优雅的语法和动态类型,再结合它的解释性,使其在大多数平台的许多领域成为编写脚本或开发应用程序的理想语言。

要认识Python,首先得明确一点:Python是一门编程语言。这就意味着,至少原则上来说它能够完成MATLAB能够做的所有事情(大不了从头开始编写),而且大多数情况下,相同功能的Python代码会比MATLAB代码更加简洁易懂;而另一方面,因为它是一门编程语言,所以它能够完成很多MATLAB不能做的事情,如开发网页、开发游戏、编写爬虫来采集数据等。

Python以开发效率著称,致力于以最短的代码完成同一个任务。Python通常为人诟病的是它的运行效率,而Python还被称为“胶水语言”,它允许我们把耗时的核心部分用C/C++等更高效率的语言编写,然后由它来“黏合”,这在很大程度上已经解决了Python的运行效率问题。事实上,在大多数数据任务上,Python的运行效率已经可以媲美C/C++语言了。

本书则致力于讲述用Python进行数据挖掘这一部分功能,而这部分功能,仅仅是Python强大功能中的冰山一角。随着NumPy、SciPy、Matplotlib、pandas等众多程序库的开发,Python在科学领域占据了越来越重要的地位,包括科学计算、数学建模、数据挖掘,甚至可以预见,未来Python将会成为科学领域编程语言的主流。图2-1和图2-2是一些编程语言的使用排行榜,它们可以证明Python越来越受欢迎。[1]图2-1 2015年6月TIOBE编程语言排行榜(每月更新一次)图2-2 近年来天文学论文中所涉及的编程语言的趋势(根据ADS中[2]的论文致谢所提及的编程语言次数而制作)[1] Programming Community Index:http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html。[2] 天文科研中的Python:http://qosmology.org/python-in-astronomy-research/。2.1 搭建Python开发平台

Python可应用于多种平台,包括Windows、Linux和Mac OS X等,并且拥有诸多的版本,搭建Python开发平台时需要谨慎选择平台和对应的版本。2.1.1 所要考虑的问题

Python官网:https://www.python.org/。

搭建Python开发平台有几个问题需要考虑:第一个问题是选择什么操作系统,是Windows还是Linux?第二个问题是选择哪个Python版本,是Python 2.x还是Python 3.x?首先来回答后一个问题。Python 3.x是对Python 2.x的一个较大的更新,可以认为Python 3.x什么都好,就是它的部分代码不兼容Python 2.x的代码。

其次,就是选择操作系统的问题,主要是在Windows和Linux之间选择。Python是跨平台的语言,因此脚本可以跨平台运行,然而不同的平台运行效率也是不同的,一般来说Linux系统下的运行速度会比Windows系统快,特别是对于数据分析和挖掘任务。此外,在Linux系统下搭建Python环境相对来说容易一些,很多Linux发行版自带了Python程序,并且在Linux系统下更容易解决第三方库的依赖问题。当然,Linux系统的操作门槛较高,入门的读者可以先在Windows系统下熟悉操作,然后再考虑迁移到Linux系统下。2.1.2 基础平台的搭建

基础平台搭建的第一步是Python核心程序的安装,我们将分别介绍Windows系统和Linux系统下的安装。后面再介绍一个Python的科学计算发行版——Anaconda。1.Windows系统下安装Python

在Windows系统下安装Python比较容易,直接到官方网站下载相应的msi安装包来安装即可,和一般软件的安装无异,在此不再赘述。安装包还分32位和64位版本,请读者自行选择适合的版本。2.Linux系统下安装Python

大多数Linux发行版,如CentOs、Debian、Ubuntu等,都已经自带了Python 2.x的主程序,但Python 3.x版本的主程序需要自行另外安装。3.Anaconda

安装Python核心程序只是第一步,为了实现更丰富的科学计算功能,还需要安装一些第三方扩展库,这对于一般读者来说可能显得比较麻烦,尤其是在Windows系统下还可能出现各种错误。幸好,已经有人专门将科学计算所需要的模块都编译好了,然后打包以发行版的形式供用户使用。Anaconda就是其中一个常用的科学计算发行版。

Anaconda的特点如下:

1)包含了众多流行的科学、数学、工程、数据分析的Python包。

2)完全开源和免费。

3)额外的加速、优化是收费的,但对于学术用途可以申请免费的License。

4)全平台支持:Linux、Windows、Mac;支持Python 2.6、Python 2.7、Python 3.3、Python 3.4,可自由切换。

因此,推荐初级读者(尤其是使用Windows系统的读者)安装此Python发行版。读者只需要到官方网站下载安装包安装即可,官网网址:https://www.anaconda.com/。

安装好Python后,只需要在命令窗口输入Python就可以进入Python环境,Python 3.6.1在Windows系统下的启动界面如图2-3所示。图2-3 Python 3.6.1在Windows系统下的启动界面2.2 Python使用入门

此处对Python的基本使用做一个简单的介绍。限于篇幅,本文不可能详细讲解Python的使用,只是针对本书涉及的数据挖掘案例所用到的代码进行基本讲解。如果读者是初步接触Python,并且使用Python的目的就是数据挖掘,那么相信本节的介绍对你来说是比较充足的了。如果读者需要进一步了解Python,或者需要运行更加复杂的任务,那么请读者自行阅读相应的Python教程。2.2.1 运行方式

本节示例代码使用的Python版本为Python 3.6。运行Python代码有两种方式:一种方式是启动Python,然后在命令窗口下直接输入相应的命令;另一种方式就是将完整的代码写成.py脚本,如hello.py,然后在对应的路径下通过python hello.py执行,hello.py脚本中的代码如下:# hello.pyprint('Hello World!')

脚本的执行结果如图2-4所示。图2-4 Hello.py脚本执行结果

在编写脚本的时候,可以添加适当的注释。在每一行中,可以用井号“#”来添加注释,添加单行注释的方法如下:a = 2 + 3 # 这句命令的意思是将2+3的结果赋值给a

如果注释有多行,可以在两个“'''”(三个英文状态单引号)之间添加注释内容,添加多行注释的方法如下:a = 2 + 3'''这里是Python的多行注释。这里是Python的多行注释。'''

如果脚本中带有中文(中文注释或者中文字符串,中文字符串要在前面加u),那么需要在文件头注明编码,并且还要将脚本保存为utf-8编码格式,注明编码的方法如下:# -*- coding: utf-8 -*print('世界,你好!')2.2.2 基本命令1.基本运算

初步认识Python时,可以把它当作一个方便的计算器来看待。读者可以打开Python,试着输入代码清单2-1所示的命令。

代码清单2-1 Python基本运算a = 2a * 2a ** 2

代码清单2-1所示的命令是Python几个基本运算,第一个命令是2赋值运算,第二个命令是乘法运算,最后一个命令是幂运算(即a),这些基本上是所有编程语言通用的。不过Python支持多重赋值,方法如下:a, b, c = 2, 3, 4

这句多重赋值命令相当于如下命令:a = 2b = 3c = 4

Python支持对字符串的灵活操作,如代码清单2-2所示。

代码清单2-2 Python字符串操作s = 'I like python's + ' very much' # 将s与' very much'拼接,得到'I like python very much's.split(' ') # 将s以空格分割,得到列表['I', 'like', 'python']2.判断与循环

判断和循环是所有编程语言的基本命令,Python的判断语句格式如下:if 条件1: 语句2elif 条件3: 语句4else: 语句5

需要特别指出的是,Python一般不用花括号{},也没有end语句,它用缩进对齐作为语句的层次标记。同一层次的缩进量要一一对应,否则会报错。下面是一个错误的缩进示例,如代码清单2-3所示。

代码清单2-3 错误的缩进if a==1: print(a) # 缩进两个空格else: print('a不等于1') # 缩进三个空格

不管是哪种语言,正确的缩进都是一个优雅的编程习惯。

相应地,Python的循环有while循环和for循环,while循环如代码清单2-4所示。

代码清单2-4 while循环s,k = 0,0while k < 101: # 该循环过程就是求1+2+3+...+100 k = k + 1 s = s + kprint(s)

for循环如代码清单2-5所示。

代码清单2-5 for循环s = 0for k in range(101): # 该循环过程也是求1+2+3+...+100 s = s + kprint(s)

这里我们看到了in和range语法。in是一个非常方便而且非常直观的语法,用来判断一个元素是否在列表/元组中;range用来生成连续的序列,一般语法为range(a,b,c),表示以a为首项、c为公差且不超过b-1的等差数列,如代码清单2-6所示。

代码清单2-6 使用range生成等差数列s = 0if s in range(4): print('s在0, 1, 2, 3中')if s not in range(1, 4, 1): print('s不在1, 2, 3中')3.函数

Python用def来自定义函数,如代码清单2-7所示。

代码清单2-7 自定义函数def add2(x): return x+2print(add2(1)) # 输出结果为3

与一般编程语言不同的是,Python的函数返回值可以是各种形式,可以返回列表,甚至返回多个值,如代码清单2-8所示。

代码清单2-8 返回列表和返回多个值的自定义函数def add2(x = 0, y = 0): # 定义函数,同时定义参数的默认值 return [x+2, y+2] # 返回值是一个列表def add3(x, y): return x+3, y+3 # 双重返回a, b = add3(1,2) # 此时a=4,b=5

有时候,像定义add2()这类简单的函数,用def来正式地写个命名、计算和返回显得稍有点麻烦,Python支持用lambda对简单的功能定义“行内函数”,这有点像MATLAB中的“匿名函数”,如代码清单2-9所示。

代码清单2-9 使用lambda定义函数f = lambda x : x + 2 # 定义函数f(x)=x+2g = lambda x, y: x + y # 定义函数g(x,y)=x+y2.2.3 数据结构

Python有4个内建的数据结构——List(列表)、Tuple(元组)、Dictionary(字典)以及Set(集合),它们可以统称为容器(Container),因为它们实际上是一些“东西”组合而成的结构,而这些“东西”可以是数字、字符、列表或者是它们之间几种的组合。通俗来说,容器里边是什么都行,而且容器里边的元素类型不要求相同。1.列表/元组

列表和元组都是序列结构,它们本身很相似,但又有一些不同的地方。

从外形上看,列表与元组存在一些区别是。列表是用方括号标记的,如a=[1,2,3],而元组是用圆括号标记的,如b=(4,5,6),访问列表和元组中的元素的方式都是一样的,如a[0]等于1,b[2]等于6,等等。刚刚已经谈到,容器里边是什么都行,因此,以下定义也是成立的:c = [1, 'abc', [1, 2]]'''c是一个列表,列表的第一个元素是整型1,第二个是字符串'abc',第三个是列表[1, 2]'''

从功能上看,列表与元组的区别在于:列表可以被修改,而元组不可以。比如,对于a=[1,2,3],那么语句a[0]=0,就会将列表a修改为[0,2,3],而对于元组b=(4,5,6),语句b[0]=1就会报错。要注意的是,如果已经有了一个列表a,同时想复制a,并命名为变量b,那么b=a是无效的,这时候b仅仅是a的别名(或者说引用),修改b也会修改a。正确的复制方法应该是b=a[:]。

跟列表有关的函数是list,跟元组有关的函数是tuple,它们的用法和功能几乎一样,都是将某个对象转换为列表/元组,如list('ab')的结果是['a','b'],tuple([1,2])的结果是(1,2)。一些常见的与列表/元组相关的函数如表2-1所示。表2-1 与列表/元组相关的函数

此外,作为对象来说,列表本身自带了很多实用的方法(元组不允许修改,因此方法很少),如表2-2所示。表2-2 列表相关的方法

最后,不能不提的是“列表解析”这一功能,它能够简化我们对列表内元素逐一进行操作的代码。使用append函数对列表元素进行操作,如代码清单2-10所示。

代码清单2-10 使用append函数对列表元素进行操作a = [1, 2, 3]b = []for i in a: b.append(i + 2)

使用列表解析进行简化,如代码清单2-11所示。

代码清单2-11 使用列表解析进行简化a = [1, 2, 3]b = [i+2 for i in a]

这样的语法不仅方便,而且直观。这充分体现了Python语法的人性化。在本书中,我们将会较多地用到这样简洁的代码。2.字典

Python引入了“自编”这一方便的概念。从数学上来讲,它实际上是一个映射。通俗来讲,它也相当于一个列表,然而它的“下标”不再是以0开头的数字,而是自己定义的“键”(Key)。

创建一个字典的基本方法如下:d = {'today':20, 'tomorrow':30}

这里的today、tomorrow就是字典的“键”,它在整个字典中必须是唯一的,而20、30就是“键”对应的值。访问字典中元素的方法也很直观,如代码清单2-12所示。

代码清单2-12 访问字典中的元素d['today'] # 该值为20d['tomorrow'] # 该值为30

要创建一个字典,还有其他一些比较方便的方法来,如通过dict()函数转换,或者通过dict.fromkeys来创建,如代码清单2-13所示。

代码清单2-13 通过dict或者dict.fromkeys创建字典dict([['today', 20], ['tomorrow', 30]]) # 也相当于{'today':20, 'tomorrow':30}dict.fromkeys(['today', 'tomorrow'], 20) # 相当于{'today':20, 'tomorrow':20}

很多字典相关的函数和方法与列表相同,在这里就不再赘述了。3.集合

Python内置了集合这一数据结构,这一概念跟数学上的集合的概念基本上是一致的,它跟列表的区别在于:①它的元素是不重复的,而且是无序的;②它不支持索引。一般我们通过花括号{}或者set()函数来创建一个集合,如代码清单2-14所示。

代码清单2-14 创建集合s = {1, 2, 2, 3} # 注意2会自动去重,得到{1, 2, 3}s = set([1, 2, 2, 3]) # 同样地,它将列表转换为集合,得到{1, 2, 3}

集合具有一定的特殊性(特别是无序性),因此集合有一些特别的运算,如代码清单2-15所示。

代码清单2-15 集合运算a = t | s # t和s的并集b = t & s # t和s的交集c = t – s # 求差集(项在t中,但不在s中)d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)

在本书中,集合这一对象并不常用,所以这里仅仅简单地介绍一下,并不进行详细的说明,如果读者会进一步使用集合这一对象,请自行搜索相关教程。4.函数式编程

函数式编程(Functional programming)或者函数程序设计又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。简单来讲,函数式编程是一种“广播式”编程,通常是结合前面提到的lambda定义函数用于科学计算中,会显得简洁方便。

在Python中,函数式编程主要由几个函数的使用构成:lambda、map、reduce、filter,其中lambda前面已经介绍过,主要用来自定义“行内函数”,所以现在我们逐一介绍后面3个。(1)map函数

假设有一个列表a=[1,2,3],要给列表中的每个元素都加2得到一个新列表,利用前面已经谈及的列表解析,我们可以这样写,如代码清单2-16所示。

代码清单2-16 使用列表解析操作列表元素b = [i+2 for i in a]

而利用map函数我们可以这样写,如代码清单2-17所示。

代码清单2-17 使用map函数操作列表元素b = map(lambda x: x+2, a)b = list(b) # 结果是[3, 4, 5]

也就是说,我们首先要定义一个函数,然后再用map命令将函数逐一应用到(map)列表中的每个元素,最后返回一个数组。map命令也接受多参数的函数,如map(lambda x,y:x*y,a,b)表示将a、b两个列表的元素对应相乘,把结果返回新列表。

也许有的读者会有疑问:有了列表解析,为什么还要有map命令呢?其实列表解析虽然代码简短,但是本质上还是for命令,而Python的for命令效率并不高,而map函数实现了相同的功能,并且效率更高,原则上来说,它的循环命令是C语言速度的。(2)reduce函数

reduce有点像map,但map用于逐一遍历,而reduce用于递归计算。在Python 3.x中,reduce函数已经被移出了全局命名空间,被置于fuctools库中,使用时需要通过from fuctools import reduce引入reduce。先给出一个例子,这个例子可以算出n的阶乘,如代码清单2-18所示。

代码清单2-18 使用reduce计算n的阶乘from fuctools import reduce # 导入reduce函数reduce(lambda x,y: x*y, range(1, n+1))

其中range(1,n+1)相当于给出了一个列表,元素是1~n这n个整数。lambda x,y:x*y构造了一个二元函数,返回两个参数的乘积。reduce命令首先将列表的头两个元素作为函数的参数进行运算,然后将运算结果与第三个数字作为函数的参数,然后再将运算结果与第四个数字作为函数的参数……依此递推,直到列表结束,返回最终结果。如果用循环命令,那就要写成代码清单2-19所示的形式。

代码清单2-19 使用循环命令计算n的阶乘s = 1for i in range(1, n+1): s = s * i(3)filter

顾名思义,它是一个过滤器,用来筛选列表中符合条件的元素,如代码清单2-20所示。

代码清单2-20 使用filter筛选列表元素b = filter(lambda x: x > 5 and x < 8, range(10))b = list(b) # 结果是[6, 7]

使用filter首先需要一个返回值为bool型的函数,如上述“lambda x:x>5 and x<8”定义了一个函数,判断x是否大于5且小于8,然后将这个函数作用到range(10)的每个元素中,如果为True,则“挑出”那个元素,最后将满足条件的所有元素组成一个列表返回。

当然,上述filter语句,也可以使用列表解析,如代码清单2-21所示。

代码清单2-21 使用列表解析筛选b = [i for i in range(10) if i > 5 and i < 8]

它并不比filter语句复杂。但是要注意,我们使用map、reduce或filter,最终目的是兼顾简洁和效率,因为map、reduce或filter的循环速度比Python内置的for循环或while循环要快得多。2.2.4 库的导入与添加

前面我们已经讲述了Python基本平台的搭建和使用,然而仅在默认情况下它并不会将所有的功能加载进来。我们需要把更多的库(或者叫作模块、包等)加载进来,甚至需要安装第三方扩展库,以丰富Python的功能,实现我们的目的。1.库的导入

Python本身内置了很多强大的库,如数学相关的math库,可以为我们提供更加丰富且复杂的数学运算,如代码清单2-22所示。

代码清单2-22 使用math库进行数学运算import mathmath.sin(1) # 计算正弦math.exp(1) # 计算指数math.pi # 内置的圆周率常数

导入库的方法,除了直接“import库名”之外,还可以为库起一个别名,如代码清单2-23所示。

代码清单2-23 使用别名导入库import math as mm.sin(1) # 计算正弦

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载