作者:刘顺祥
出版社:清华大学出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
从零开始学Python数据分析与挖掘试读:
前言
为什么写这本书随着大数据时代的演进,越来越多的企业在搜集数据的同时,也开始关注并重视数据分析与挖掘的价值,因为他们正尝到这项技术所带来的甜头。例如,通过该技术可以帮助企业很好地认识其用户的画像特征,为用户提供个性化的优质服务,进而使用户的忠诚度不断提升;通过该技术提前识别出不利于企业健康发展的“毒瘤”用户(如黄牛群体、欺诈群体等),进而降低企业不必要的损失;通过该技术可以为企业实现某些核心指标的判断和预测,进而为企业高层的决策提供参考依据等。企业对数据分析与挖掘技术的重视就意味着对人才的重视,这就要求希望或正在从事数据相关岗位的人员具备该技术的理论知识和实战能力。
Python作为大数据相关岗位的应用利器,具有开源、简洁易读、快速上手、多场景应用以及完善的生态和服务体系等优点,使其在数据分析与挖掘领域中的地位显得尤为突出。基于Python可以对各种常见的脏数据完成清洗、绘制各式各样的统计图形,并实现各种有监督、无监督和半监督的机器学习算法的落地,在数据面前做到游刃有余,所以说Python是数据分析与挖掘工作的不二之选。根据多家招聘网站的统计,几乎所有的数据分析或挖掘岗位都要求应聘者掌握至少一种编程语言,其中就包括Python。
纵观国内的图书市场,关于Python的书籍还是非常多的,它们主要偏向于工具本身的用法,如关于Python的语法、参数、异常处理、调用以及开发类实例等。但是基于Python的数据分析与挖掘书籍并不是特别多,关于这方面技术的书籍更多的是基于R语言等工具。本书将通过具体的实例讲解数据的处理和可视化技术,同时也结合数据挖掘的理论知识和项目案例讲解10种常用的挖掘算法。
2015年9月,笔者申请了微信公众号,取名为“数据分析1480”,目前已经陆续更新了近200篇文章。一方面是为了将自己所学、所知记录下来,作为自己的知识沉淀;另一方面是希望尽自己的微薄之力,将记录下来的内容分享给更多热爱或从事数据分析与挖掘事业的朋友。但是公众号的内容并没有形成系统的知识框架,在王金柱老师的鼓励和支持下才开始了本书的写作,希望读者能够从中获得所需的知识点。本书的内容
本书一共分为三大部分,系统地介绍数据分析与挖掘过程中所涉及的数据清洗与整理、数据可视化以及数据挖掘的落地。
第一部分(第1~3章)介绍有关数据分析与挖掘的概述以及Python的基础知识,并通过一个有趣的案例引入本书内容的学习。本部分内容可以为初学Python的朋友奠定基础,进而为后续章节的学习做准备。
第二部分(第4~6章)涉及numpy模块的数值计算、Pandas模块的数据清洗与整理以及Matplotlib模块的可视化技术。本部分内容可以为数据预处理过程中的清洗、整理以及探索性分析环节提供技术支撑。
第三部分(第7~16章)一共包含10种数据挖掘算法的应用,如线性回归、决策树、支持向量机、GBDT等,使用通俗易懂的术语介绍每一个挖掘算法的理论知识,并借助于具体的数据项目完成算法的实战。本部分内容可以提高热爱或从事数据分析相关岗位朋友的水平和技能,也可以作为数据挖掘算法落地的模板。
本书每一章都有对应的数据源和完整代码,代码均包含具体的中文注释,读者可以在笔者的github网站https://github.com/SnakeLiu/Python-Data-Aanalysis-and-Miner下载,或者在百度网盘https://pan.baidu.com/s/18REQ_J057i7KL7ivBCX-cw(密码:xt4i)下载。勘误和支持
由于笔者水平有限,书中难免会出现不当的地方,欢迎专家和读者朋友给予批评和指正。可以通过下方的途径联系并反馈建议:● 即时通信:添加个人微信(lsx19890717)或者QQ(1029776077),及时反馈问题。● 公众号:添加个人微信公众号“数据分析1480”,可参与后台互动。● 电子邮箱:发送邮件至lsxxx2011@163.com。致谢
特别感谢清华大学出版社的王金柱老师,感谢他的热情相邀和宝贵建议,是他促成了本书的完成,同时他专业而高效的审阅也使本书增色不少。感谢参与本书封面设计的王翔老师、责任校对闫秀华老师,以及其他背后默默支持的出版工作者,在他们的努力和付出下,保证了本书的顺利出版。
最后,感谢我的家人和朋友,尤其是我的妻子许欣女士,是她在我写书期间把家里的一切整理得有条不紊,对我的照顾更是无微不至,才使我能够聚精会神地完成本书全部内容的撰写。刘顺祥(Sim Liu)2018年8月于上海第1章数据分析与挖掘概述
马云曾说“中国正迎来从IT时代到DT时代的变革”,DT就是大数据时代。随着移动互联网的发展,人们越来越感受到技术所带来的便捷,同时企业也将搜集到越来越多与用户相关的数据,包括用户的基本信息、交易记录、个人喜好、行为特征等。这些数据就相当于隐藏在地球深处的宝贵资源,企业都想从数据红利中分得一杯羹,进而推进企业重视并善加利用数据分析与挖掘相关的技术。
本章将以概述的形式介绍数据分析和挖掘相关的内容,通过本章的学习,你将了解如下几方面的知识点:● 数据分析与挖掘的认识;● 数据分析与挖掘的几个应用案例;● 数据分析与挖掘的几方面区别;● 数据分析与挖掘的具体操作流程;● 数据分析与挖掘的常用工具。1.1 什么是数据分析和挖掘
随着数据时代的蓬勃发展,越来越多的企事业单位开始认识到数据的重要性,并通过各种手段进行数据的搜集。例如,使用问卷调查法获取用户对产品的评价或改善意见;通过每一次的实验获得产品性能的改良状况;基于各种设备记录空气质量状况、人体健康状态、机器运行寿命等;通过网页或APP记录用户的每一次登录、浏览、交易、评论等操作;基于数据接口、网络爬虫等手段获取万维网中的公开数据;甚至是企业间的合作实现多方数据的共享。企事业单位花费人力、物力获取各种数据的主要目的就是通过数据分析和挖掘手段实现数据的变现,否则囤积的数据就是资源的浪费。
数据分析和挖掘都是基于搜集来的数据,应用数学、统计、计算机等技术抽取出数据中的有用信息,进而为决策提供依据和指导方向。例如,应用漏斗分析法挖掘出用户体验过程中的不足之处,从而进一步改善产品的用户流程;利用AB测试法检验网页布局的变动对交易转化率的影响,从而确定这种变动是否有利;基于RFM模型实现用户的价值分析,进而针对不同价值等级的用户采用各自的营销方案,实现精准触达;运用预测分析法对历史的交通数据进行建模,预测城市各路线的车流量,进而改善交通的拥堵状况;采用分类手段,对患者的体检指标进行挖掘,判断其所属的病情状况;利用聚类分析法对交易的商品进行归类,可以实现商品的捆绑销售、推荐销售等营销手段。应用数据分析和挖掘方法,让数据产生价值的案例还有很多,这里就不一一枚举了,所以只有很好地利用数据,它才能产生价值,毫不夸张地说,大部分功劳都要归功于数据分析和挖掘。1.2 数据分析与挖掘的应用领域
也许读者也曾自我发问——学会了数据分析和挖掘技术,可以从事哪些行业的相关工作呢?在笔者看来,有数据的地方就有用武之地。现在的数据充斥在各个领域,如庞大的互联网行业,包含各种电商平台、游戏平台、社交平台、中介类平台等;金融行业,包含银行、P2P、互联网金融等;影响国计民生的教育、医疗行业;各类乙方数据服务行业;传统行业,如房地产、餐饮、美容等。这些行业都需要借助数据分析和挖掘技术来指导下一步的决策方向,以下仅举3个行业应用的例子,进一步说明数据分析和挖掘的用武之地。1.2.1 电商领域——发现破坏规则的“害群之马”
移动互联网时代下,电商平台之间的竞争都特别激烈,为了获得更多的新用户,往往会针对新用户发放一些诱人的福利,如红包券、满减券、折扣券、限时抢购优惠券等,当用户产生交易时,就能够使用这些券减免一部分交易金额。电商平台通过类似的营销手段一方面可以促进新用户的获取,增添新鲜血液;另一方面也可以刺激商城的交易,增加用户的活跃度,可谓各取所需的双赢效果。
然而,某些心念不正的用户为了从中牟取利益,破坏大环境下的游戏规则。某电商数据分析人员在一次促销活动的复盘过程中发现交易记录存在异常,于是就对这批异常交易作更深层次的分析和挖掘。最终发现这批异常交易都有两个共同特点,那就是一张银行卡对应数百个甚至上千个用户id,同时,这些id自始至终就发生一笔交易。暗示了什么问题?这说明用户很可能通过廉价的方式获得多个手机号,利用这些手机号去注册APP成为享受福利的多个新用户,然后利用低价优势买入这些商品,最后再以更高的价格卖出这些商品,这种用户我们一般称为“黄牛”。
这些“害群之马”的行为至少给电商平台造成两方面的影响,一是导致真正想买商品的新用户买不到,因为有限的福利或商品都被这些用户抢走了;二是虚增了很多“薅羊毛”的假用户,因为他们很可能利用完新用户的福利资格后就不会再交易了。如果没有数据分析与挖掘技术在互联网行业的应用,就很难发现这些“害群之马”,企业针对“害群之马”对游戏规则做了相应的调整,从而减少了不必要的损失,同时也挽回了真实用户的利益。1.2.2 交通出行领域——为打车平台进行私人订制
打车工具的出现,改变了人们的出行习惯,也改善了乘车的便捷性,以前都是通过路边招手才能搭乘出租车,现在坐在家里就可以完成一对一的打车服务。起初滴滴、快滴、优步、易到等打车平台,为了抢占市场份额,不惜花费巨资补贴给司机端和乘客端,在一定程度上获得了用户的青睐,甚至导致用户在短途出行中都依赖上了这些打车工具。然而随着时间的推移,打车市场的格局基本定型,企业为了自身的利益和长远的发展,不再进行这种粗放式的“烧钱”运营手段。
当司机端和乘客端不再享受以前的福利待遇时,在一定程度上影响了乘客端的乘车频率和司机端的接单积极性。为了弥补这方面的影响,某打车平台利用用户的历史交易数据,为司机端和乘客端的定价进行私人订制。
例如,针对乘客端,通过各种广告渠道将折扣券送到用户手中,一方面可以唤醒部分沉默用户(此时的折扣力度会相对比较高),让他们再次回到应用中产生交易,另一方面继续刺激活跃用户的使用频率(此时的折扣力度会相对比较低),进而提高用户的忠诚度。针对司机端,根据司机在平台的历史数据,将其接单习惯、路线熟悉度、路线拥堵状况、距离乘客远近、天气变化、乘客乘坐距离等信息输入到逻辑模型中,可以预测出司机接单的概率大小。这里的概率在一定程度上可以理解为司机接单的意愿,概率越高,说明司机接单的意愿越强,否则意愿就越弱。当模型发现司机接单的意愿比较低时,就会发放较高的补贴给司机端,否则司机就会获得较少的补贴甚至没有补贴。如果不将数据分析与挖掘手段应用于大数据的交通领域,就无法刺激司机端和乘客端的更多交易,同时,也会浪费更多的资金,造成运营成本居高不下,影响企业的发展和股东的利益。1.2.3 医疗健康领域——找到最佳医疗方案
众所周知,癌症的产生是由于体内某些细胞的DNA或RNA发生了病变,这种病变会导致癌细胞不断地繁殖,进而扩散至全身,最终形成可怕的肿瘤。早在2003年,乔布斯在一次身体检查时发现胰腺处有一块阴影,医生怀疑是一块肿瘤,建议乔布斯马上进行手术,但乔布斯选择了药物治疗。遗憾的是,一年后,医生从乔布斯的身体检查中发现可怕的癌细胞已经扩散到了全身,认为乔布斯的生命即将走到人生的终点。
乐观的乔布斯认为还可以有治疗的希望,于是花费几十万美元,让专业的医疗团队将自己体内的DNA与历史肿瘤DNA样本进行比对,目的就是找到符合肿瘤病变的DNA。这样,对于乔布斯体内的DNA来说就有了病变与正常的标签,然后基于这个标签构建分类算法。当正常DNA出现病变特征时,该算法就能够准确地找出即将病变的DNA,从而指导医生及时地改变医疗方案和寻找有效的药物。最终,使得原本即将走到终点的生命,延续了八年时间,正是这短短的八年,让乔布斯一次次地创造了苹果的辉煌。如果没有数据分析与挖掘在医疗行业的应用,也许就没有现在的苹果。1.3 数据分析与挖掘的区别
从广义的角度来说,数据分析的范畴会更大一些,涵盖了数据分析和数据挖掘两个部分。数据分析就是针对搜集来的数据运用基础探索、统计分析、深层挖掘等方法,发现数据中有用的信息和未知的规律与模式,进而为下一步的业务决策提供理论与实践依据。所以广义的数据分析就包含了数据挖掘的部分,正如读者在各招聘网站中所看见的,对于数据分析师的任职资格中常常需要应聘者熟练使用数据挖掘技术解决工作中的问题。从狭义的角度来说,两者存在一些不同之处,主要体现在两者的定义说明、侧重点、技能要求和最终的输出形式。接下来阐述这几个方面的差异。● 从定义说明出发:数据分析采用适当的统计学方法,对搜集来的数据进行描述性分析和探索性分析,并从描述和探索的结果中发现数据背后存在的价值信息,用以评估现状和修正当前的不足;数据挖掘则广泛交叉数据库知识、统计学、机器学习、人工智能等方法,对搜集来的数据进行“采矿”,发现其中未知的规律和有用的知识,进一步应用于数据化运营,让数据产生更大的价值。● 从侧重点出发:数据分析更侧重于实际的业务知识,如果将数据和业务分开,往往会导致数据的输出不是业务所需,业务的需求无法通过数据体现,故数据分析需要两者的紧密结合,实现功效的最大化;数据挖掘更侧重于技术的实现,对业务知识的熟练度并没有很高的要求,如何从海量的数据中发现未知的模式和规律,是数据挖掘的目的所在,只有技术过硬,才能实现挖掘项目的落地。● 从掌握的技能出发:数据分析一般要求具备基本的统计学知识、数据库操作技能、Excel报表开发和常用可视化图表展现的能力,就可以解决工作中的分析任务;数据挖掘对数学功底和编程能力有较高的要求,数学功底是数据挖掘、机器学习、人工智能等方面的基础,没有好的数学功底,在数据挖掘领域是走不远的,编程能力是从数据中发现未知模式和规律途径,没有编程技能,就无法实现算法的落地。● 从输出的结果出发:数据分析更多的是统计描述结果的呈现,如平均水平、总体趋势、差异对比、数据转化等,这些结果都必须结合业务知识进行解读,否则一组数据是没有任何实际意义的;数据挖掘更多的是模型或规则的输出,通过模型或规则可对未知标签的数据进行预测,如预测交通的畅通度(预测模型)、判别用户是否响应某种营销活动(分类算法);通过模型或规则实现智能的商业决策,如推荐用户可能购买的商品(推荐算法)、划分产品所属的群类(聚类算法)等。
为了读者更容易理解和区分两者之间的差异,这里将上面描述的四方面内容做一个简短的对比和总结,如表1-1所示。表1-1 数据分析与挖掘对比1.4 数据挖掘的流程
本书将安排10个章节的内容来讲解具体的数据挖掘算法和应用案例,故需要对数据挖掘的具体流程做一个详细的说明。这里的流程可以理解为数据挖掘过程中的规范,只有熟悉了这些具体的规范,才可以在数据挖掘过程中做到游刃有余。首先通过图1-1中的金字塔了解数据挖掘中具体的操作步骤。图1-1 数据挖掘步骤1.4.1 明确目标
前面讲了几个有关数据分析和数据挖掘在电商行业、交通领域和医疗健康方面的案例,体现了数据分析与挖掘的重要性。你可能非常期待数据分析与挖掘在工作中的应用,先别急,在实施数据挖掘之前必须明确自己需要解决的问题是什么,然后才可以有的放矢。
这里通过三个实际的案例来加以说明数据挖掘流程中的第一步,即明确目标:● 在餐饮行业,可能都会存在这方面的痛点,即如何调整中餐或晚餐的当班人数,以及为下一餐准备多少食材比较合理。如果解决了这个问题,那么对于餐厅来说既可以降低人工成本,又可以避免食材的浪费。● 当前互联网经济下的消费信贷和现金信贷都非常流行,对于企业来说可以达到“以钱赚钱”的功效,对于用户来说短期内可以在一定程度上减轻经济压力,从而实现两端的双赢。但是企业会面临给什么样的用户放发信贷的选择,如果选择正确了,可以赚取用户的利息,如果选择错误了,就得赔上本金。所以风险控制(简称“风控”)尤其重要,如果风控做得好,就能够降低损失,否则就会导致大批“坏账”甚至是面临倒闭。● 对于任何一个企业来说,用户的价值高低决定了企业可从用户身上获得的利润空间。用户越忠诚、价值越高,企业从用户身上获取的利润就越多,反之利润就越少。所以摆在企业眼前的重大问题就是如何提升用户的生命价值。1.4.2 数据搜集
当读者明确企业面临的痛点或工作中需要处理的问题后,下一步就得规划哪些数据可能会影响到这些问题的答案,这一步就称为数据的搜集过程。数据搜集过程显得尤为重要,其决定了后续工作进展的顺利程度。接下来继续第一步中的例子,说明这三个案例中都需要搜集哪些相关的数据。1.餐饮相关● 食材数据:食材名称、食材品类、采购时间、采购数量、采购金额、当天剩余量等。● 经营数据:经营时间、预定时间、预定台数、预定人数、上座台数、上座人数、上菜名称、上菜价格、上菜数量、特价菜信息等。● 其他数据:天气状况、交通便捷性、竞争对手动向、是否为节假日、用户口碑等。2.金融授信● 用户基本数据:姓名、性别、年龄、受教育水平、职业、工作年限、收入状况、婚姻状态、借贷情况、房产、汽车等。● 刷卡数据:是否有信用卡、刷卡消费频次、刷卡缴费规律、刷卡金额、是否分期、是否逾期、逾期天数、未偿还金额、信用额度、额度使用率等。● 其他数据:信用报告查询记录、电话核查记录、银行存款、社交人脉、其他APP数据等。3.影响用户价值高低● 会员数据:性别、年龄、教育水平、会员等级、会员积分、收入状况等。● 交易数据:用户浏览记录、交易商品、交易数量、交易频次、交易金额、客单价、最后交易时间、偏好、下单与结账时差等。● 促销数据:用户活动参与度、优惠券领取率、优惠券使用率、购买数量、购买金额等。● 客服数据:实时沟通渠道数量、用户沟通次数、用户疑问响应速度、疑问解答率、客户服务满意度等。1.4.3 数据清洗
为解决企业痛点或面临的问题,需要搜集相关的数据。即使数据搜集上来,也必须保证数据“干净”,因为数据质量的高低将影响最终结果的准确性。通常都有哪些“不干净”的数据会影响后面的建模呢?针对这些数据都有哪些解决方案呢?这里不妨做一个简要的概述。● 缺失值:由于个人隐私或设备故障导致某些观测在维度上的漏缺,一般称为缺失值。缺失值的存在可能会导致模型结果的错误,所以针对缺失值可以考虑删除法、替换法或插值法解决。● 异常值:异常值一般指远离正常样本的观测点,它们的存在同样会影响模型的准确性,故可以考虑删除法或单独处理法。当然某些场景下,异常值是有益的,例如通过异常值可以筛选出钓鱼网站。● 数据的不一致性:主要是由于不同的数据源或系统并发不同步所导致的数据不一致性,例如两个数据源中数据单位的不一致(一个以元为单位,另一个以万元为单位);系统并发不同步导致一张电影票被多个用户购买。针对这种情况则需要不同数据源的数据更新(SQL)或系统实现同步并发。● 量纲的影响:由于某些模型容易受到不同量纲的影响,因此需要通过数据的标准化方法将不同量纲的数据进行统一处理,如将数据都压缩至0~1的范围。● 维度灾难:当采集来的数据包含上百乃至成千上万的变量时,往往会提高模型的复杂度,进而影响模型的运行效率,故需要采用方差分析法、相关系数法、递归特征消除法、主成分分析法等手段实现数据的特征提取或降维。1.4.4 构建模型“万事俱备,只欠建模”!据不完全统计,建模前的数据准备将占整个数据挖掘流程80%左右的时间,可谓“地基不牢,地动山摇”。接下来,在数据准备充分的前提下,需要考虑企业面临的痛点或难题可以通过什么类型的挖掘模型解决。● 对于餐饮业需要预测下一餐将有多少消费者就餐的问题,可以归属于预测类型的挖掘模型。如基于整理好的餐饮相关数据使用线性回归模型、决策树、支持向量机等实现预测,进而为下一顿做好提前准备。● 对于选择什么样的用户放发信贷问题,其实就是判断该用户是否具有良好信用的特征,属于分类类型的挖掘模型。例如,基于Logistic模型、决策树、神经网络等完成用户的分类,为选择优良用户提供决策支持。● 对于用户的价值分析,不再具有现成的标签,故无法使用预测或分类类型的模型解决,可以考虑无监督的聚类类型模型,因为“物以类聚,人以群分”。例如,使用K均值模型、DBSCAN、最大期望EM等实现不同价值人群的划分。1.4.5 模型评估
到此阶段,已经完成了数据挖掘流程中的绝大部分工作,并且通过数据得到解决问题的多个方案(模型),接下来要做的就是从这些模型中挑选出最佳的模型,主要目的就是让这个最佳的模型能够更好地反映数据的真实性。例如,对于预测或分类类型的模型,即使其在训练集中的表现很好,但在测试集中结果一般,则说明该模型存在过拟合的现象,需要从数据或模型角度做进一步修正。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的图形化界面完成数据分析或挖掘的工作内容。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 本章小结
本章主要站在读者的角度,回答了有关数据分析与挖掘的定义、应用的领域、两者的差异、实际的操作流程和常用的落地工具,同时,通过一个个小案例来说明数据分析和挖掘在实际应用中的价值体现,让读者对其拥有足够的重视。通过本章的学习,希望读者能够对数据分析与挖掘有一个清晰的认识,进而为后续章节的学习做铺垫。第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系统,分别介绍各自的安装方法,以便读者按步操作。首先你需要到Anoconda官网(https://www.anaconda.com/download/)下载对应系统的Anoconda工具。注意,本书是基于Python 3的应用,所以你需要下载Python 3.X的Anoconda。2.1.1 基于Windows系统安装
步骤01 从官网中下载好Windows版本的Anoconda后,双击该软件并进入安装向导,并单击“Next”按钮,如图2-1所示。图2-1 安装引导页
步骤02 进入阅读“License Agreement”窗口,单击“I Agree”按钮。
步骤03 推荐选择“Just Me (recommended)”,如果选择的是“All Users”,就需要Windows的管理员权限。
步骤04 选择目标路径用于Anodonda工具的安装,并单击“Next”按钮,如图2-2所示。图2-2 选择安装路径
步骤05 建议不添加Anoconda到环境变量中,因为它可能会影响到其他软件的正常运行,故选择将Python3.×作为Anoconda的默认版本。单击“Install”按钮,进入安装环节,如图2-3所示。图2-3 设置环境变量页
步骤06 大概5分钟就可以完成安装,单击“Finish”按钮即可,如图2-4所示。图2-4 安装成功页2.1.2 基于Mac系统安装
步骤01 从官网中下载好Mac版本的Anoconda后,双击该软件,进入Anoconda的安装向导,单击“Continue”按钮。
步骤02 进入“Read Me”窗口,继续单击“Continue”按钮。
步骤03 进入阅读“License”窗口,勾选“I Agree”,并单击“Continue”按钮。
步骤04 进入“Destination Select”窗口,推荐选择“Install for me only”,并单击“Continue”按钮,如图2-5所示。图2-5 目标选择页
步骤05 进入“Installation Type”窗口,推荐默认设置(将Anoconda安装在主目录下),无须改动安装路径,单击“Install”按钮,进入安装环节,如图2-6所示。图2-6 安装类型页
步骤06 经过几分钟,即完成整个安装流程,如图2-7所示。图2-7 安装成功页
当然,如果你不习惯在Mac系统中使用图形化的安装方式,也可以通过命令行的方式完成Anoconda的安装(以Anaconda3-5.0.1版本为例),具体步骤如下:
步骤01 同样需要通过官网下载好Mac版本的Anoconda,并将其放在桌面。
步骤02 打开终端,输入“bash Anaconda3-5.0.1-MacOSX-x86_64.sh”。
步骤03 接下来会提示阅读“条款协议”,只需按一下回车键即可。
步骤04 滑动滚动条到协议底部,输入“Yes”。
步骤05 提示“按下回车键”接受默认路径的安装,接下来继续输入“Yes”,进入安装环节。
步骤06 最终完成安装,并提示“Thank you for installing Anaconda!”。
注意,关闭终端,重启后安装才有效。2.1.3 基于Linux系统安装
步骤01 从官网中下载好Linux版本的Anoconda,并将其放在桌面。
步骤02 打开终端,输入“bash Anaconda3-5.0.1-Linux-x86_64.sh”。
步骤03 接下来会提示阅读“条款协议”,只需按一下回车键即可。
步骤04 滑动滚动条到协议底部,输入“Yes”。
步骤05 提示“按下回车键”接受默认路径的安装,接下来继续输入“Yes”。
步骤06 最终完成安装,并提示“Thank you for installing Anaconda3!”。
注意,关闭终端,重启后安装才有效。2.2 基于Python的案例实战2.2.1 数据的预处理
1994年Ronny Kohavi和Barry Becker针对美国某区域的居民做了一次人口普查,经过筛选,一共得到32 561条样本数据。数据中主要包含了关于居民的基本信息以及对应的年收入,其中年收入就是本章中需要预测的变量,具体数据指标和含义见表2-1。表2-1 美国某区域居民基本数据集
基于上面的数据集,需要预测居民的年收入是否会超过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 变量缺失概览
表2-2显示,居民的收入数据集中有3个变量存在数值缺失,分别是居民的工作类型、职业和国籍。缺失值的存在一般都会影响分析或建模的结果,所以需要对缺失数值做相应的处理。
缺失值的处理一般采用三种方法:一是删除法,即将存在缺失的观测进行删除,如果缺失比例非常小,则删除法是比较合理的,反之,删除比例比较大的缺失值将会丢失一些有用的信息;二是替换法,即使用一个常数对某个变量的缺失值进行替换,如果缺失的变量是离散型,则可以考虑用众数替换缺失值,如果缺失的变量是数值型,则可以考虑使用均值或中位数替换缺失值;三是插补法,即运用模型方法,基于未缺失的变量预测缺失变量的值,如常见的回归插补法、多重插补法、拉格朗日插补法等。
由于收入数据集中的3个缺失变量都是离散型变量,这里不妨使用各自的众数来替换缺失值: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'])表2-4 离散变量的统计描述
如表2-4所示,得到的是关于离散变量的统计值,包含每个变量非缺失观测的数量(count)、不同离散值的个数(unique)、出现频次最高的离散值(top)和最高频次数(freq)。以受教育水平变量为例,一共有16种不同的教育水平;3万多居民中,高中毕业的学历是出现最多的;并且一共有10 501名。
数据的分布形状(如偏度、峰度等)可以通过可视化的方法进行展现,这里仅以被调查居民的年龄和每周工作小时数为例,绘制各自的分布形状图:
见图2-8。图2-8 核密度曲线
如图2-8所示,第一幅图展现的是,在不同收入水平下,年龄的核密度分布图,对于年收入超过5万美元的居民来说,他们的年龄几乎呈现正态分布,而收入低于5万美元的居民,年龄呈现右偏特征,即年龄偏大的居民人数要比年龄偏小的人数多;第二幅图展现了不同收入水平下,周工作小时数的核密度图,很明显,两者的分布趋势非常相似,并且出现局部峰值。如果读者需要研究其他数值型变量的分布形状,按照上面的代码稍做修改即可。
同理,也可以针对离散型变量,对比居民的收入水平高低在性别、种族状态、家庭关系等方面的差异,进而可以发现这些离散变量是否影响收入水平:
见图2-9。图2-9 收入水平的对比条形图
左图反映的是相同的种族下,居民年收入水平高低的人数差异;右图反映的是相同的家庭成员关系下,居民年收入水平高低的人数差异。但无论怎么比较,都发现一个规律,即在某一个相同的水平下(如白种人或未结婚人群中),年收入低于5万美元的人数都要比年收入高于5万美元的人数多,这个应该是抽样导致的差异(数据集中年收入低于5万和高于5万的居民比例大致在75%:25%)。如果读者需要研究其他离散型变量与年收入水平的关系,可以稍稍修改上面的代码,实现可视化的绘制。2.2.3 数据建模1.对离散变量重编码
前面提到,由于收入数据集中有很多离散型变量,这样的字符变量是不能直接用于建模的,需要对这些变量进行重编码,关于重编码的方法有多种,如将字符型的值转换为整数型的值、哑变量处理(0-1变量)、One-Hot热编码(类似于哑变量)等。在本案例中,将采用“字符转数值”的方法对离散型变量进行重编码,具体可以通过下面的代码实现:表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。表2-6 数据集的前5行预览
表2-6中呈现的就是经处理“干净”的数据集,所要预测的变量就是income,该变量是二元变量,对其预测的实质就是对年收入水平的分类(一个新样本进来,通过分类模型,可以将该样本分为哪一种收入水平)。
关于分类模型有很多种,如Logistic模型、决策树、K近邻、朴素贝叶斯模型、支持向量机、随机森林、梯度提升树GBDT模型等。本案例将对比使用K近邻和GBDT两种分类器,因为通常情况下,都会选用多个模型作为备选,通过对比才能得知哪种模型可以更好地拟合数据。接下来就进一步说明如何针对分类问题,从零开始完成建模的步骤。2.拆分数据集
基于上面的“干净”数据集,需要将其拆分为两个部分,一部分用于分类器模型的构建,另一部分用于分类器模型的评估,这样做的目的是避免分类器模型过拟合或欠拟合。如果模型在训练集上表现很好,而在测试集中表现很差,则说明分类器模型属于过拟合状态;如果模型在训练过程中都不能很好地拟合数据,那说明模型属于欠拟合状态。通常情况下,会把训练集和测试集的比例分配为75%和25%:
结果显示,运用随机抽样的方法,将数据集拆分为两部分,其中训练数据集包含24 420条样本,测试数据集包含8 141条样本,下面将运用拆分好的训练数据集开始构建K近邻和GBDT两种分类器。3.默认参数的模型构建
首先,针对K近邻模型,这里直接调用sklearn子模块neighbors中的KNeighborsClassifier类,并且使用模型的默认参数,即让K近邻模型自动挑选最佳的搜寻近邻算法(algorithm='auto')、使用欧氏距离公式计算样本间的距离(p=2)、指定未知分类样本的近邻个数为5(n_neighbors=5)而且所有近邻样本的权重都相等(weights='uniform')。如果读者想了解更多有关K近邻算法的理论可以翻阅第11章。
其次,针对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参数的不同选择。执行脚本如下:
简单解释一下GridSearchCV函数中的几个参数含义,estimator参数接受一个指定的模型,这里为K近邻模型的类;param_grid用来指定模型需要搜索的参数列表对象,这里是K近邻模型中n_neighbors参数的11种可能值;cv是指网格搜索需要经过10重交叉验证;scoring指定模型评估的度量值,这里选用的是模型预测的准确率。
通过网格搜索的计算,得到三部分的结果,第一部分包含了11种K值下的平均准确率(因为做了10重交叉验证);第二部分选择出了最佳的K值,K值为6;第三部分是当K值为6时模型的最佳平均准确率,且准确率为84.78%。
接下来,对GBDT模型的参数进行网格搜索,搜索的参数包含三个,分别是模型的学习速率、生成的基础决策树个数和每个基础决策树的最大深度。具体执行代码如下:
输出的结果与K近邻结构相似,仍然包含三个部分。限于篇幅的影响,上面的结果中并没有显示所有参数的组合,从第二部分的结果可知,最佳的模型学习率为0.05,生成的基础决策树个数为300棵,并且每棵基础决策树的最大深度为5。这样的组合可以使GBDT模型的平均准确率达到87.51%。5.模型预测与评估
上文中,我们花了一部分的篇幅来介绍基于“干净”数据集的模型构建,下一步要做的就是使用得到的分类器对测试数据集进行预测,进而验证模型在样本外的表现能力,同时,也可以从横向的角度来比较模型之间的好坏。
通常,验证模型好坏的方法有多种。例如,对于预测的连续变量来说,常用的衡量指标有均方误差(MSE)和均方根误差(RMSE);对于预测的分类变量来说,常用的衡量指标有混淆矩阵中的准确率、ROC曲线下的面积AUC、K-S值等。接下来,依次对上文中构建的四种模型进行预测和评估。6.默认的K近邻模型 # K近邻模型在测试集上的预测 kn_pred = kn.predict(X_test) print(pd.crosstab(kn_pred, y_test)) # 模型得分 print('模型在训练集上的准确率%f' %kn.score(X_train,y_train)) print('模型在测试集上的准确率%f' %kn.score(X_test,y_test))
见表2-7。表2-7 KNN算法的混淆矩阵 模型在训练集上的准确率0.890500 模型在测试集上的准确率0.838840
如上结果所示,第一部分是混淆矩阵,矩阵中的行是模型的预测值,矩阵中的列是测试集的实际值,主对角线就是模型预测正确的数量(5637和1192),589和723就是模型预测错误的数量。经过计算,得到第二部分的结论,即模型在训练集中的准确率为89.1%,但在测试集上的错误率超过16%(1-0.839),说明默认参数下的KNN模型可能存在过拟合的风险。
模型的准确率就是基于混淆矩阵计算的,但是该方法存在一定的弊端,即如果数据本身存在一定的不平衡时(正负样本的比例差异较大),一定会导致准确率很高,但并不一定说明模型就是理想的。这里再介绍一种常用的方法,就是绘制ROC曲线,并计算曲线下的面积AUC值:
见图2-10。图2-10 KNN算法的ROC曲线
图2-10中绘制了模型的ROC曲线,经计算得知,该曲线下的面积AUC为0.865。如果读者使用AUC来评估模型的好坏,那应该希望AUC越大越好。一般而言,当AUC的值超过0.8时,基本上就可以认为模型比较合理。所以,基于默认参数的K近邻模型在居民收入数据集上的表现还算理想。
试读结束[说明:试读内容隐藏了图片]