深入浅出数据科学

978-7-115-48126-9
作者: [美] 斯楠·奥兹德米尔(Sinan Ozdemir)
译者: 张星辰
编辑: 王峰松

图书目录:

详情

本书可以帮助读者把数学、编程和商业分析联系起来。通过学习这本书,读者有信心探究和解答复杂的数据科学问题,从抽象的原始的统计,发掘出切实可行的观点和想法。本书适合缺乏数学知识的编程人员,或者是拥有数学技能、想投身数据科学领域的人士阅读使用。

本书特色
《深入浅出数据科学》的目的是帮助你掌握数学、编程和商业分析的综合技能。通过本书,你将能够自信地提出并解答复杂的数据问题,从抽象和原始的统计信息发掘并完善可执行的想法。通过将数学和计算机编程技能相结合,你将踏上成为数据科学家的激动人心的旅程。
本书介绍了数据科学的全过程,包括数据准备、数据清洗,以及如何选择有效的数据挖掘策略和技巧,从而深入理解数据科学的方方面面。你将学到数学和统计学的核心知识,以及数据科学家和分析师经常使用的代码。你将了解机器学习,学会用常见的统计学模型分析稠密数据集,创建有说服力的可视化图表,并和他人交流分析结果。
从本书你将学习到:
理解数据科学的五个核心步骤
聪明地使用你的数据,仔细地处理它
填平数学和计算机编程之间的鸿沟
学会概率论、微积分,以及使用统计模型处理数据,得出切实有效的结果
生成并评估简单的机器学习模型
通过分析模型有效性指标,决定机器学习模型的质量
通过数据可视化向他人分享见解
理解机器学习模型,并使用机器学习模型进行预测,解决自己的问题 

图书摘要

版权信息

书名:深入浅出数据科学

ISBN:978-7-115-48126-9

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [美] 斯楠•奥兹德米尔(Sinan Ozdemir)

译    张星辰

责任编辑 王峰松

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright © 2016 Packt Publishing. First published in the English language under the title Principles of Data Science, ISBN 978-1-78588-791-8. All rights reserved.

本书中文简体字版由Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。

数据科学家是目前最热门的职业之一。本书全面介绍了成为合格数据科学家所需的必备知识、技能和工作流程,是一本内容全面的实用性技术图书。

本书分为13章,其中第1~3章介绍数据科学;第4~8章介绍数学知识,包括统计学和概率论;第9章介绍数据可视化;第10~12章介绍机器学习;第13章介绍案例。各个章节内容均由浅入深,同时通过案例和Python代码,使读者掌握实战技能。

本书适合有志于成为数据科学家的师生或业界新手,同时也适合经验丰富的职场老手参考。


Sinan Ozdemir是一名数据科学家、创业者和教育工作者。Sinan的学术生涯在约翰•霍普金斯大学(The Johns Hopkins University)渡过,主修数学专业。随后他从事教育事业,曾经在约翰•霍普金斯大学和General Assembly公司举办多次数据科学讲座。在此之后,他创立了旨在通过人工智能技术和数据科学力量帮助企业销售团队的创业公司Legion Analytics。

在完成Y Combinator创业加速器之后,Sinan的大部分时间都在经营这家快速成长的公司,同时也会制作一些数据科学教育资料。

我要感谢父母和姐姐对我的帮助,同时还要感谢我的导师们,包括约翰•霍普金斯大学的Pam Sheff博士和Sigma Chi兄弟会的Nathan Neal。

感谢Packt出版社给予我和大家分享数据科学原理的机会,我非常激动这个领域将在未来数年改变我们所有人的生活。


张星辰,北京荣之联科技股份有限公司BI 技术顾问,毕业于重庆邮电大学,具有5年数据相关工作经验,熟悉商业智能和数据可视化,通过了微软数据科学专业认证。


鲜思东,重庆邮电大学教授,硕士生导师,复杂系统智能分析与决策重庆市高校重点实验室副主任,中国商业统计学会理事。现任国际期刊《Advancements in Case Studies》编辑,担任《Knowledge-Based Systems》和《IEEE Transactions on Systems、Man and Cybernetics: Systems》等多个国际期刊的审稿人。

洪贤斌,西交利物浦大学、英国利物浦大学机器学习方向博士生,苏州谷歌开发者社区组织者。


Samir Madhavan有6年的数学科学实战经验,著有《Mastering Python for Data Science》一书。Samir曾是Mindtree公司反欺诈算法团队Aadhar的一员,参与了UID(Unique Identification)项目。此后,他作为首批员工加入Flutura Decision Sciences and Analytics公司,作为核心成员帮助团队壮大至数百人。在此期间,他利用大数据和机器学习技术帮助Flutura公司进行商业拓展。目前,他是总部设在波士顿的高科技医药公司Zapprx的数据分析团队负责人,帮助Zapprx打造数据驱动的产品,以便更好地服务客户。

Oleg Okun是机器学习专家,曾以作者和编辑身份参与4本图书的出版,以及多篇文章、会议论文的发表。Oleg的职业生涯超过25年,他活跃在白俄罗斯的学术界和工业界,也曾在芬兰、瑞士和德国工作过。Oleg的工作经验包括图片分析、指纹生物识别、生物信息、在线/离线营销分析和信用评分分析。

Oleg对机器学习和物联网(IoT)充满了热情,目前在德国汉堡工作。

我要向父母表达最深切的感谢,感谢他们为我做的一切。


本书的主题是数据科学。在过去几十年,这个领域的研究和应用都获得了飞速发展。作为一个快速发展的领域,数据科学正在吸引媒体和就业市场的关注。2015年,美国政府任命DJ Patil为史上第一任首席数据科学家。坦白讲,这一举动是对科技公司最近大举招募数据团队行为的效仿。数据科学技能受到广泛欢迎,其人才市场需求必将远远超过今天的就业市场。

这本书将力求弥合数学、编程和专业领域之间的差距。很多人是某一个(或者两个)领域的专家,但合理地使用数据科学需要同时精通以上3个领域。我们将深入讨论这3个领域并解决复杂的问题。我们将清洗、探索和分析数据,得出科学、准确的结论。我们还将利用机器学习和深度学习技术解决更加复杂的数据问题。

第1章:如何听起来像数据科学家。本章将介绍数据科学家常用的专业术语和解决的问题类型。

第2章:数据的类型。本章将介绍不同类型和尺度的数据,以及如何处理这些数据。从本章起,我们将介绍数据科学必备的数学知识。

第3章:数据科学的5个步骤。本章将介绍实施数据科学的5个基本步骤,包括数据探索和数据获取、数据建模、可视化分享等。本章会通过案例对每个步骤进行详细介绍。

第4章:基本的数学知识。本章将介绍微积分、线性代数等数学知识,并用案例介绍它们如何帮助数据科学家做出判断。

第5章:概率论入门:不可能,还是不太可能。本章将以初学者的视角介绍概率论的基本理论,以及如何利用概率论从随机世界中获取知识。

第6章:高等概率论。本章将尝试利用上一章介绍的概率论知识,比如贝叶斯推理,探索现实世界中隐藏的意义。

第7章:统计学入门。本章将使用统计推断法解决问题,包括基本的统计试验、正态分布和随机抽样等方法。

第8章:高等统计学。本章将使用假设检验、置信区间等方法对试验结果进行评价,学会正确理解p值和其他指标的含义。这些技能至关重要。

第9章:交流数据。本章将介绍相关性和因果关系如何影响我们对数据的理解,学会通过数据可视化和他人交流数据,分享数据科学分析结果。

第10章:机器学习精要:你的烤箱在学习吗。本章将介绍机器学习的定义,并通过真实案例介绍机器学习可以在何时、以何种方式被使用。本章还将介绍如何评价模型。

第11章:树上无预言,真的吗。本章将介绍更复杂的机器学习模型,比如决策树模型和贝叶斯预测模型,以解决更复杂的数据问题。

第12章:超越精要。本章将介绍数据科学中的一些神秘力量,包括偏差和方差。神经网络将作为一种流行的深度学习技术进行介绍。

第13章:案例。本章将通过一系列案例强化你对数据科学的理解。我们将通过预测股价、笔迹检测等案例,反复演练数据科学工作流的全过程。

本书使用Python代码演示所有案例。你需要一台安装了Python 2.7且有UNIX风格终端窗口的计算机(Linux/Mac/Windows)。我也推荐使用Anaconda,它包含了本书案例中使用的大多数Python包。

本书面向希望学习数据科学,并在各自领域中使用它的人。

读者需要有基本的数学基础(代数或概率论),能够阅读R/Python脚本以及伪码。读者不一定要有数据领域的经验,但必须对学习和使用本书所讲的技能具有热情,无论是对自己的数据集还是其他数据集。

本书运用了多种不同的文本格式,以便对相关信息进行区分。以下是部分文本格式和对它们的解释。

代码块的格式如下:

tweet = "RT @j_o_n_dnger: $TWTR now top holding for Andor, unseating $AAPL"
words_in_tweet = first_tweet.split(' ')    # list of words in tweet

当我想提醒你注意某段代码时,相关代码行和信息将被加粗:

for word in words_in_tweet:          # for each word in list
  if "$" in word:                    # if word has a "cashtag"
  print "THIS TWEET IS ABOUT", word # alert the user

 

 

警告或重要备注出现在这种类型的提示框。

 

 

提示和技巧出现在这种类型的提示框。


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书提供如下资源:

要获得以上配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

作者和编辑尽最大努力来确保书中内容的准确性,但难免还会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,搜索到本书页面,点击“提交勘误”,输入相关信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券,或者用于兑换样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们,或者到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/ submission即可)。

如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权利的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。社区创办于2015年8月,提供超过1000种图书、近千种电子书,以及众多技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


不管你从事哪个行业——IT、时尚、食品或者金融,数据都在影响着你的生活和工作。在本周的某个时刻,你也许会参与一场关于数据的讨论。新闻媒体正在越来越多地报道数据泄露、网络犯罪,以及如何利用数据窥视我们的生活。但为什么是现在?为什么今天这个时代是数据相关产业的温床?

在19世纪,世界处于工业时代(industrial age)。人类通过伟大的机械发明和工业探索世界。工业时代的领袖们,比如亨利·福特,认识到通过这些机器可以创造巨大的市场机会,赚取前所未有的利润。当然,工业时代有利也有弊。在我们将大量商品送到消费者手中时,人类也开始了和污染的斗争。

在19世纪,我们非常擅长制造大型机器。但到了20世纪,我们的目标是让机器变得更小、更快。工业时代已经结束,取而代之的是信息时代(information age)。为了更好地理解事物的运转情况,我们开始使用机器收集和存储我们自身与周围环境的各种信息(数据)。

从1940年开始,像ENIAC(被认为是最早的计算机之一)这样的机器被用来计算和运行之前从未计算过的数学方程、运行模型和模拟,如图1.1所示。

图1.1 ENIAC计算机

我们终于有了比人类更擅长运算数字的像样的实验室助手!和工业时代一样,信息时代也有利有弊。信息时代的好处是人类取得了科技发明的非凡成就,比如电视和移动电话;坏处虽然没有全球性污染那样严重,但仍然留给我们一个21世纪的难题——过多的数据。

是的,信息时代在数据收集领域的高速发展,让电子化数据的产量爆炸式增长!据估算,在2011年,我们产生了1.28×1012 GB的数据(好好想一下有多大吧)。仅仅1年之后,在2012年,我们产生了超过2.8×1012 GB的数据!这个数字只会继续爆炸或增长。预计2020年产生的数据量将达到4×1013 GB。每当我们发布推文,张贴脸书,用微软Word软件保存简历,或者用短信给妈妈发送一张照片,都促进了这个数字的增长。

我们不仅以前所未有的速度生产数据,我们消费数据的速度也在加快。在2013年,手机用户平均每月使用的流量在1GB以内。据估算,今天这一数字已经远超每月2GB。我们希望从数据中探寻的是洞察(insight),而不仅仅用于性格测试。数据就在那里,总有一些对我们有价值!肯定有!

我们拥有如此多的数据,而且正在生产更多数据,我们甚至制造了很多疯狂的小机器24×7不间断的收集数据,在21世纪,我们面对的真正问题是如何搞懂这些数据。先辈们在19世纪发明了机器,在20世纪生产和收集了数据,在数据时代(data age)则要从数据中探寻洞察和知识,让地球上每个人都受益。美国政府已新设立了“首席数据科学家(chief data scientist)”的职务。那些到现在还没有数据科学家的科技公司,比如Reddit,已经开始招募数据科学家。这样做的好处显而易见——用数据做精准的预测和模拟,可以让我们以前所未有的方式观察世界。

这听起来很不错,但究竟是什么意思呢?

本章我们将研究现代数据科学家们使用的专业术语。我们将学习贯穿全书的数据科学关键词和用语。在开始接触Python代码之前,我们还将讨论为什么使用数据科学,以及催生数据科学的3个重要领域:

在我们进行更深入的讨论之前,先熟悉一下本书将涉及的基本定义。数据科学领域让人激动或者讨厌的都是太年轻,以至于很多定义在教科书、新闻媒体和企业白皮书上各不相同。

以下对专业术语的定义较为通用,足够日常工作和讨论之用,也符合本书对数据科学原理的定位。

我们先从什么是数据(data)开始。给“数据”下定义可能有些可笑,但确实非常重要。当使用“数据”这个词时,我们指的是以有组织(organized)无组织(unorganized)格式聚集在一起的信息。

每当你打开Excel(或者其他电子制表软件)时,你面对的是等待输入有组织数据的空白行或列。这类程序并不能很好地处理无组织数据。虽然大部分时候我们处理的都是有组织数据,因为它最容易发现洞察,但我们并不畏惧原始的文本数据和处理无组织数据的各种方法。

数据科学是从数据中获取知识的艺术和科学。这个定义虽小,却非常准确地描述了这一宏大课题的真正目的!数据科学涉及的范围非常广,需要好几页纸才能列出全部内容(我确实尝试编写过)。

数据科学是关于如何处理数据、获取知识,并用知识完成以下任务的过程:

本书将讨论数据科学的各种方法,包括如何处理数据、探寻洞察,并利用这些洞察做准确的决策和预测。

数据科学也是利用数据获取之前未曾想到的新见解的科学。

举个例子,假设你和其他3个人坐在会议室,你们需要根据数据做出一个决定。目前已经有4种观点,你需要使用数据科学的方法提出第5个、第6个,甚至第7个观点。

数据科学不是取代人类大脑,而是和人类大脑一起工作。数据科学也不应该被认为是终极解决方案,它仅仅提供了一个富有见地的观点,也仅仅是一个观点而已,但它值得在会议桌上拥有一席之地。

很明显,我们在数据时代拥有过剩的数据。但为什么数据科学(data science)能够作为一个新词汇出现呢?我们过去使用的数据分析(data analysis)方法出了什么问题?首先,在数据时代,数据通过各种来源以各种形式被收集,且很多是无组织数据。巨大的数据量使得传统的人工方式已经无法在合理的时间内完成数据分析。

数据会缺失、不完整,甚至完全错误。很多时候,数据的尺度(scale)不同导致对数据难以进行对比。比如在分析二手汽车价格时,一个特征是汽车制造年份,另一个特征是汽车行驶里程数。只有进行数据清洗(本书将用大量篇幅对具讲解)之后,数据中蕴含的关系才会越来越明显,深埋在数兆行数据中的知识才能显露出来。数据科学的主要用途之一是使用清晰的方法和过程,发现并利用数据中蕴含的关系。

我们之前从历史的角度讨论了数据科学,下面我们用几分钟时间,通过一个简单的例子,讨论数据科学在当今商业中扮演的角色。

西格玛科技公司CEO Ben Runkle正在解决一个大问题。他的公司正在不断失去老客户,他不知道背后的原因,但必须尽快采取行动。同事告诉他,公司必须开发新功能和新产品,并巩固现有技术,这样才能降低流失率。为了保险起见,他请来了首席数据科学家Jessie Hughan博士。Hughan博士并不认为新产品和新功能能够挽救公司。相反,她在分析了历史客户服务记录后,向Runkle展示了最近几天的记录和令人吃惊的发现:

很明显,用户在使用现有UI/UX时遇到了麻烦,而不是因为新功能的缺失!Runkle和Hughan组织员工对UI/UX进行了重要改善,西格玛公司的销售额也达到了前所未有的高度。

当然,这个例子的分析过程过于简单,但它揭示了一个观点。我们喜欢将Runkle这样的人称为司机(driver)。今天,许多严重依靠直觉的CEO希望快速做出决定,并尝试所有的方案,直到找到答案。Hughan博士则具有分析能力。她和Runkle一样希望解决问题,但她的策略是从用户产生的数据中寻找答案,而不是依靠感觉。数据科学正是利用这样的分析能力,帮助“司机”做决定。

这两种思维方式在企业中都有用途。然而,统治着数据科学领域的是Hughan博士的思维方式——将公司的数据作为信息源,从中得出解决方案,并一直坚持下去。

一个常见的误解是,只有博士和天才们才能掌握数据科学背后的数学和编程知识。这绝对是个错误!理解数据科学需要从以下3个领域开始。

图1.2所示的韦恩图形象地展示了这3个领域的关系,数据科学是三者的交集。

编程技术可以让你构思和编写复杂的机器算法。数学和统计学知识可以让你对算法进行推理、评价和改善,以适应特殊情况。而领域知识则可以让你将以上结果在现实中发挥价值。

图1.2 韦恩图

虽然拥有以上3个技能中的两个已经可以让你足够聪明,但这仍然不够。试想你精通编程,并接受过正式的日间交易训练。你开发了一个自动交易系统,但由于缺乏数学知识而无法对算法的有效性进行评价,导致长期来看自动交易系统是赔本的。因此,只有当你同时拥有编程、数学和领域知识3个技能,才能真正应用数据科学。

你可能好奇什么是领域知识(domain knowledge)。它仅仅指工作中涉及的专业知识。如果让一个金融分析师分析心脏病数据,那么他很可能需要心脏病专家的帮助才能搞懂数字的含义。

数据科学是这3个领域的交叉地带。为了从数据中获取知识,我们需要利用计算机获取数据,理解模型背后的数学含义,以及最重要的——理解分析结果应用的场景,包括数据展示等。比如,假设我们创建了一个心脏病预测模型,那么是否需要创建一个PDF文档或APP应用程序,使得只需输入一些关键数字就能得到预测结果?以上是需要数据科学家回答的问题。

 

请注意,数学和编程的交集是机器学习(machine learning)。本书后半部分会十分详尽地讲解机器学习。在此之前,我们必须认识到,如果不能将模型和结果应用到具体的业务场景中,那么模型,包括机器学习算法,仅仅是电脑中的几行代码而已,毫无意义。

比如,你可能拥有最好的预测癌症的算法,根据历史数据算法预测的准确率高达99%,但如果不能让医生和护士方便地使用,那么算法就没有任何意义。

本书将深入讨论计算机程序和数学。领域知识则来自于数学科学实践和学习他人的分析案例。

很多人不喜欢听数学相关的东西,他们会附和着点点头,以掩饰对这个主题的不屑。本书将引导你学习数据科学必备的数学知识,特别是概率(probability)统计学(statistics),我们将用它们创建模型。

数据模型(data model)指数据元素之间有组织的、正式的关系,通常用来模拟现实世界的某个现象。

我们还会用数学公式表示变量间的关系。作为前数学家和现任数学教师,我理解学习这些内容的困难程度,并将尽最大的努力清晰地讲解所有内容。在数据科学的3个技能中,数学让我们拥有从一个行业跨到另一个行业的能力。掌握了数学理论,我们就可以将为时尚界打造的模型转变成金融模型。

案例:产卵鱼—幼鱼模型

在生物学中,我们使用“产卵鱼—幼鱼模型(spawner-recruit models)”和其他模型一起评价物种的健康程度。该模型描述了单位动物群体中含有的健康父母和新生后代间的关系。在图1.3中,我们可视化展示了三文鱼产卵鱼和幼鱼之间的关系,原始数据来自一个公开数据集。我们可以明显地看出两者之间存在某种程度的正相关(两个指标同时增长)。但如何才能量化这种关系呢?比如,已知种群中产卵鱼的数量,我们如何预测种群中幼鱼的数量呢?反之也一样。

通常来讲,模型允许我们通过一个变量得到另一个变量。比如:

幼鱼=0.5×产卵鱼+60

假设我们已知某三文鱼群中含有1.15产卵鱼(单位:千),那么根据以上公式,我们有:

幼鱼=0.5×1.15+60

幼鱼=60.575

这个结果有助于判断种群的健康变化。通过模型,我们可以观察两个变量之间的关系和变化趋势。

模型有很多种,比如概率模型(probabilistic model)统计模型(statistical model)。这些模型又都属于一个更大的范式——机器学习(machine learning)。它们的核心思想是利用数据找出最佳的模型,使得我们不再依赖人类的直觉,而是依赖数据做出判断。

图1.3 对产卵鱼—幼鱼模型的可视化

本例的目的是展示如何使用数学方程表示数据元素间的关系。事实上,这和我使用的三文鱼数据没有任何相关性。在本书中,我们还将研究营销资金、情绪数据、饭店点评等不同数据集,以便让你尽可能地接触不同的领域。

数学和代码是数据科学家得以居身幕后,将自身技能应用于任何地方的工具。

让我们说实话吧,你可能认为计算机比数据更酷。没关系,我不怪你。新闻中很少出现数学新闻,正如很少出现纯技术新闻一样。打开电视,你不会看到素数的最新理论,相反,你看到的是新款手机拍摄的照片比之前更好的报道。

计算机语言是关于如何和机器交流,让机器执行人类命令的语言。和书可以用多种语言写一样,计算机也有多种语言进行交流。很多计算机语言都有助于我们研究数据科学,比如Python、Julia和R。本书将专注Python。

 

请注意if语句的使用,它和你想要表达的意思完全一致,即当紧跟在if后的命题为真时,if语句下缩进的代码将被执行,如下所示。

由于print语句前有缩进,所以代码print"True!"隶属于if x + y == 15.3。这意味着print语句只有在x + y等于15.3的情况下才会被执行。

我们选择Python有很多理由,包括以下几个。

X = 5.8
Y = 9.5
  
X +Y == 15.3         # This is true!
 
X −Y == 15.3         # This is false!
if X + Y == 15.3:    # if the statement is true
 print "True!"       # print something!

最后一条是我们专注Python最重要的原因。Python内置的模块不仅功能强大,而且很容易安装。在学完本书前几章节后,你将熟悉以下模块。

Python练习

在深入学习Python之前,最好先熟悉一下必备的编程知识。

在Python中,我们用变量(variables)作为对象的占位符。我们重点关注以下几种变量的类型。

比如:3,6,99,−34,34,11111111。

比如:3.14159,2.71,−0.34567。

我们还需要理解一些基本的逻辑运算符。请牢记,这些运算符的计算结果是布尔型,即真(True)或假(False)。下面来看几个例子。

用Python编写代码时,我们使用井号(#)表示注释,注释不会被当作代码处理,仅作为用户阅读代码的参考。井号(#)右边的任何信息都是被执行的代码的注释。

案例:简单的Python代码

在Python中,我们使用空格(space)制表符(tab)表示隶属于其他行的代码。

列表类型变量可以保存不同数据类型的对象,比如变量my_list含有1个整型、1个浮点型、1个布尔型和1个文本型对象。

my_list = [1, 5.7, True, "apples"]

len(my_list) == 4 # 4 objects in the list

my_list[0] == 1 # the first object

my_list[1] == 5.7 # the second object

在以上代码中:

案例:分析一条推文

以下是更多的Python代码。在本例中,我们将分析一些含有股票价格信息的推文(本书中一个重要的案例是根据社交媒体情绪变化,预测股票价格的波动)。

tweet = "RT @robdv: $TWTR now top holding for
             Andor, unseating $AAPL"

words_in_tweet = tweet.split(' ') # list of words in tweet

for word in words_in_tweet:             # for each word in list
  if "$" in word:                       # if word has a "cashtag"
  print "THIS TWEET IS ABOUT", word     # alert the user

下面对以上代码片段逐条进行解释。

(1)用变量tweet存储推文信息(Python中的string类型):RT @robdv: $TWTR now top holding for Andor, unseating $AAPL。

(2)word_in_tweet变量用于对原始推文进行切分(将文字隔开)。如果输出该变量,你将看到以下内容:

['RT',
'@robdv:',
'$TWTR',
'now',
'top',
'holding',
'for',
'Andor,',
'unseating',
'$AAPL']

(3)接下来使用for循环,对文本列表进行迭代,逐个查看列表中的对象。

(4)然后用if语句,判断推文中的每一个词是否包含$符号(人们在推文中使用$表示股票行情)。

(5)如果if语句的运行结果为真(即推文中包含$符号),则输出该词。

这段代码的运行结果如下:

它们是这条推文中仅有的两个含有$符号的单词。

凡是本书中出现的Python代码,我会尽量解释清楚每一行代码的用途。

正如之前所说,领域知识(domain knowledge)主要是了解你的工作所涉及的特定领域的专业知识。如果你是分析股票市场数据的金融分析师,你就需要了解该行业的专业知识。如果你是准备报道世界发展指数的新闻工作者,那最好找一个该领域的专家进行咨询。本书将演示多个领域的案例——医学、营销和金融,甚至包括UFO!

但是,这是否意味着如果你不是医生,就不能分析医学数据呢?当然不是!卓越的数据科学家能将他们的技能应用在任何领域,包括他们不熟悉的领域。数据科学家可以适应新领域,并在分析完成后持续贡献价值。

领域知识中最重要的部分是演示能力。你的听众决定了演示的内容,你的分析结果仅仅是交流的工具。即使你预测市场趋势的方法准确率高达99.99%,但如果你的程序没有被采用,那它就没有任何价值。同样地,如果分析结果不适合使用场景,它也没有价值。

接下来,我们将定义更多的专业词汇。我猜你一定非常期待看到一些之前没有提及的数据科学术语,比如以下几个。

我们之前说机器学习是数学和编程的交叉领域。机器学习的正式定义是将计算机强大的性能和智能学习算法相结合,自动从数据中发现关系,并创建强大的模型。

提到模型,我们主要关注以下两类。

概率模型和统计模型都可以在计算机上运行,从这个角度看,它们也可以被看作机器学习。但实际上,机器学习算法从数据中发现关系的方式与它们有很大不同,因此我们才将以上三者的定义分开。我们将在随后的章节详细介绍概率模型和统计模型。

探索式数据分析关注数据清洗和可视化。在这一步,我们将无组织数据转换为有组织数据,同时填充缺失值,修复错误数据点。在数据探索过程中,我们将绘制各种图形,识别关键特征和关系,以便搭建数据模型。

图1.4并不严谨,仅用于展示各领域之间的关系。

图1.4 数据科学各领域分布图

数学、计算机和领域知识三者的结合,让数据科学拥有了强大的能力。通常情况下,单个人很难同时精通以上3个领域,这也是为什么很多公司组建了数据科学家团队,而不是只雇用一个人。下面让我们通过案例,了解数据科学的具体过程和产出。

社会保障声明对政府机构和填写它的个人都是巨大的麻烦。一些声明文件需要长达两年时间才能被完全处理,这太荒谬了!下面我们来看声明中含有哪些内容,如图1.5所示。

图1.5 社会保障声明模板

还好,大部分只是填空而已,填写人只需要一个接一个挨着填即可。我们可以想象政府工作人员每天一张一张地看这样的声明有多么辛苦,应该有更好的解决方法吧?

确实有!Elder research公司可以分析这些非结构化数据,并能够自动处理20%的社会保障表格。也就是说,计算机可以处理20%的手写表格,并给出处理意见。

不仅如此,第三方评估公司发现,计算机自动处理的准确率高于人工处理。换言之,计算机不仅可以处理20%的手写表格,而且平均来看比人工做得更好!

要解雇所有员工吗

在我即将收到一大堆批评数据科学从人类手中夺走工作的邮件之前,我必须提醒各位,计算机只能处理20%的表格,它在其余80%的表格面前表现得非常糟糕!这是因为计算机只擅长处理简单的表格。对于简单的表格,人类需要1分钟完成,而计算机只需要几秒钟。如果把节省的时间相加,每个工作人员平均每天将节省1小时!但是当书写者表达非常简略,或使用了生僻语法时,计算机将无法识别。

这个模型的优势在于:可以让工作人员将更多时间用在处理复杂表格或声明上,避免被工作量压垮。

 

请注意我对模型(model)一词的使用。模型指元素之间的关系。本例中,关系指手写文字或声明和是否被批准之间的关系。

本例使用的数据集记录了电视、广播和报纸3种营销渠道预算和销量之间的关系。我们的目的是找出营销渠道预算和销量之间的关系。数据集以行列结构存储,每一行代表一个销售区域,每一列代表对应类别的金额或数量。

 

通常情况下,数据科学家必须弄清楚数据集的单位(unit)和尺度(scale)。在本例中,电视、广播和报纸列对应的单位是“千美元”,销量的单位是“千部”,如图1.6所示。第1个区域在电视上花费了230 100美元,在广播上花费了38 800美元,在报纸上花费了69 200美元,销量是22 100部。

图1.6 广告预算和销量

如果我们画出每个变量和销量的关系:

import seaborn as sns
sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', kind='reg')

从图1.7可以看出,没有一个变量的所有数据点都逼近预测线,因此单个变量无法准确预测销量。比如,虽然电视(TV)营销费用看起来和销量(sales)具有明显的关系,但异常点也非常多。我们需要使用比“产卵鱼—幼鱼模型”更复杂的模型,用3个变量进行建模。

图1.7 广告预算图

这种类型的问题在数据科学中非常常见。我们试图识别影响产品销量的关键特征,如果能够分离出关键特征,就能够利用这种关系,调整营销费用的分配方式,实现销量的提升。

想找数据科学工作吗?太棒了,我可以帮你。在本例中,我将从网站上抓取1000个数据科学家的岗位描述(截至2016年1月),目的是帮你熟悉数据科学岗位描述中常见的关键词,如图1.8所示。

图1.8 数据科学家招聘信息列表

请注意第二家公司要求掌握核心的Python库,本书将会对这些库进行介绍。

import requests
# used to grab data from the web

from BeautifulSoup import BeautifulSoup
# used to parse HTML

from sklearn.feature_extraction.text import CountVectorizer
# used to count number of words and phrases (we will be using this
module a lot)

前两行imports代码用于从招聘网站中抓取数据,第三行import用于对文本进行计数。

texts = []
# hold our job descriptions in this list

for index in range(0,1000,10): # go through 100 pages of indeed
  page = 'https://www.indeed.com/jobs?q=data+scientist&start='+str(index)
  # identify the url of the job listings

  web_result = requests.get(page).text
  # use requests to actually visit the url

  soup=BeautifulSoup(web_result)
  # parse the html of the resulting page

  for listing in soup.findAll('span', {'class':'summary'}:
    # for each listing on the page

    texts.append(listing.text)
# append the text of the listing to our list

以上代码实现的功能是打开100个网页,抓取网页中的岗位描述信息。最重要的变量是texts,它存储了1 000个岗位描述。

type(texts) # == list

vect = CountVectorizer(ngram_range=(1,2), stop_words='english')
# Get basic counts of one and two word phrases

matrix = vect.fit_transform(texts)
# fit and learn to the vocabulary in the corpus

print len(vect.get_feature_names()) # how many features are there
# There are 11,293 total one and two words phrases in my case!!

我删除了部分代码,但你可以在本书的Github库中找到。运行后的结果如下:

experience 320
machine 306
learning 305
machine learning 294
techniques 266
statistical 215
team 197
analytics 173
business 167
statistics 159
algorithms 152
datamining 149
software 144
applied 141
programming 132
understanding 127
world 127
research 125
datascience 123
methods 122
join 122
quantitative 122
group 121
real 120
large 120

从以上分析结果,我们可以看出:

这个案例有很多值得关注的内容,但最重要的是数据科学岗位对应的关键词。不管是个人还是团队,真正让数据科学发挥威力的是数学、编程和领域知识三者的结合。

我在本章开始时提出了一个问题:数据科学带来了什么?数据科学不仅仅是建模、游戏和有趣。我们在追求更智能的机器和算法时一定付出了某种代价。在我们用创新方式并洞察数据时,一头“怪兽”也潜伏在阴影之中。我所说的“怪兽”既不是数学和编程的学习曲线,也不是数据盈余。工业时代的后遗症是人类和污染的斗争,信息时代的后遗症是过量的数据,那么数据时代的后遗症是什么呢?

数据时代可能导致某些邪恶事情的发生——利用大数据从事反人性活动的个体。

越来越多的人想要加入数据科学领域,其中大部分人没有数据或计算机学科的经验——至少表面上看这两个学科都非常重要。每位数据科学家平均要接触上百万条交友数据、推文、在线访问数据以锻炼自己的能力。

然而,如果缺乏对基本理论知识的了解和编程实践,缺少对领域知识的尊重,你将面临着一个对非常规现象过度简化建模的风险。

假设你想建立自动化销售渠道,准备通过一个简单的程序从LinkedIn上寻找简历中有以下关键字的人:

keywords = ["Saas", "Sales", "Enterprise"]

很棒,你很快就可以从LinkedIn上找到能够匹配关键字的人。但是,如果某人用“Software as a Service”而不是“Saas”,或者“enterprise”拼写错误(错别字经常发生,我打赌你也可以从本书中发现错别字),你该如何找出他们呢?这些人不应该仅仅因为数据科学家想走捷径而被忽视。程序员仅仅用以上3个词简化搜索,将导致公司丧失潜在的商业机会。

在下一章,我们将研究不同类型的数据,从自由格式文本,到高度结构化的行列结构数据。我们还将讨论不同数据类型适用的数学操作符,以及从数据类型中可以洞察的信息。


在第1章,我们简单介绍了什么是数据科学和为什么这个领域如此重要。下面我们将介绍数据的类型,主要包括以下主题:

我们将通过案例深入讨论每个主题,演示数据科学家如何观察和处理不同类型的数据。本章的目的是帮助你熟悉数据科学中的基本概念。

在数据科学领域,理解不同“味道”的数据非常重要。数据类型不仅决定了分析方法和可得出的结论,而且数据的结构化/非结构化、定量/定性属性也反映了现实世界中被测量对象的重要特征。

我们将研究以下3种最常见的分类方式:

在学习本章内容之前,首先需要理解我们对数据(data)一词的使用。在上一章,我将数据宽泛地定义为“数据是信息的集合”。这样做的原因是宽泛的定义对于我们将数据分为不同类型是有必要的。

其次,当我们讨论数据类型时,既可能指数据集某个特征列的数据类型,也可能指整个数据集的数据类型。我将给出清晰的说明。

和学习统计学、机器学习等有趣的内容比起来,学习数据类型好像没有什么价值。但毫不夸张地说,这是数据科学过程中最重要的步骤之一。

假设我们正在研究某个国家的选举结果。在人口数据集中有一列叫“种族”,为了节省存储空间,该列使用标识号代替种族信息。比如用数字7表示白人,用数字2代表亚裔美国人。如果分析师没有意识到7和2并不是传统意义上的数值,将在分析时犯下致命错误——根据7大于2,得出白人“大于”亚裔美国人的荒谬结论。

这一道理同样适用于数据科学。每当我们拿到一个数据集,总是迫不及待地进行数据探索,运用统计学模型,或者测试各种机器学习的算法,总是希望快速得到答案。然而,如果我们不了解分析对象的数据类型,很可能花费了巨大精力却错误地使用了一个并不适合该数据类型的模型。

因此,我建议拿到新数据集后先用1小时左右(通常会更少)对数据类型进行区分。

我们拿到数据集后,想知道的第一个答案是数据集是结构化,还是非结构化。这一步的答案将决定需要3天还是3周完成后续分析。

具体的判断方法如下(这是对第1章有组织和无组织数据定义的改写)。

以下几个例子可以帮助你更好地理解两者的区别。

通常情况下,结构化数据最容易处理和分析。事实上,大部分统计学模型和机器学习模型都只适用于结构化数据,而不能很好地应用在非结构化数据中。

既然行列结构数据最适合人和机器的分析,为什么我们还要研究非结构化数据呢?因为它太常见了!根据预测,世界上80%~90%的数据是非结构化数据,它们以各种形式存储在全球各地,是一个尚未被人类察觉的巨大数据源。

虽然数据科学家喜欢结构化数据,但也必须有能力处理日益庞大的非结构化数据。因为如果这个世界上90%的数据都是非结构化数据,这意味着世界上90%的信息都被揉捏在一个更难处理的格式中——推文、邮件、文献和服务器日志等。

既然大部分数据都是自由格式的非结构化数据,我们就需要使用一种叫“预处理(preprocessing)”的技术将其转化为结构化数据,以便做进一步的分析。下面我们将介绍把非结构化数据转换为结构化数据的常用方法。在下一章,我们将介绍数据预处理的更多细节。

当我们处理文本数据(通常被认为是非结构化)时,有很多方法可以将其转化为结构化格式。比如,使用以下描述文本特征的数据:

我将用以下推文作案例。当然,你也可以使用其他推文、Facebook帖子等文本。

This Wednesday morn, are you early to rise? Then look East. The Crescent Moon joins Venus & Saturn. Afloat in the dawn skies.

有必要再重复一遍,对以上推文做数据预处理非常重要!因为大多数机器学习算法都需要数值型数据(numerical data)

除此之外,通过数据预处理,我们还可以利用数据现有的特征生成新特征。比如,通过统计以上推文的字数或特殊符号生成的新特征。下面我们看看能从这段推文中提取哪些特征。

字数/短语数

我们可以通过字数或短语数对推文进行拆分。比如单词“this”在推文中出现了1次,以此类推。我们用结构化的格式表示这条推文,这样就把非结构化文本转换成行列格式,如表2.1所示。

表2.1 通过字数或短语数拆分推文

this

Wednesday

morn

are

this Wednesday

文本计数

1

1

1

1

1

为了进行以上转换,我们使用了上一章介绍的scikit-learn模块中的CountVectorizer方法。

特殊符号

我们还可以统计是否含有特殊符号,比如问号和感叹号。这些符号通常隐含着某种看法,但很难被发现。事实上,问号在以上推文中出现了1次,这意味着该推文给读者提出了一个问题。我们可以在刚才的表格中添加一列,如表2.2所示。

表2.2 添加特殊符号

this

Wednesday

morn

are

this Wednesday

文本计数

1

1

1

1

1

1

文本相对长度

这条推文有121个字符。

len("This Wednesday morn, are you early to rise? Then look East. The
Crescent Moon joins Venus & Saturn. Afloat in the dawn skies.")
# get the length of this text (number of characters for a string)

# 121

分析师发现推文的平均长度是30个字符。所以,我们可以增加一个叫“相对长度”的新特征,用来表示这条推文的长度相对平均推文长度的倍数。简单计算可知,这条推文是平均推文长度的4.03倍。

我们可以在刚才的表格中再新增一列,如表2.3所示。

表2.3 添加相对长度

this

Wednesday

morn

are

this Wednesday

相对长度

文本计数

1

1

1

1

1

1

4.03

文本主题

我们可以为推文添加相应主题,比如这条推文属于天文学,所以我们可以在刚才的表格中继续增加一列,如表2.4所示。

表2.4 添加主题

this

Wednesday

morn

are

this Wednesday

相对长度

主题

文本计数

1

1

1

1

1

1

4.03

天文学

以上我们展示了如何将一段文本转换为结构化、有组织的数据格式,以便进行数据探索和使用模型。

在Python中,计算推文长度和统计字数都非常简单,为文本分配主题则是唯一一个无法从原始文本中自动提取的新特征。幸运的是借助更先进的主题模型(topic models),我们能够从自然语言中提取和预测相关主题。

未来,快速识别数据集是结构化还是非结构化,将为你节省数小时甚至几天的工作时间。一旦你能够识别以上特征,下一步将是识别数据集中的每个独立特征。

当你问数据科学家“这个数据是什么类型?”时,他们通常假设你想知道的是定量数据还是定性数据,因为这是描述数据集特征最常用的一种方式。

大多数时候,当我们讨论定量数据时,通常指(并不总是)以行列结构存储的结构化数据集(因为我们假设非结构化数据没有任何特征)。这也是为什么数据预处理如此重要。

定量数据和定性数据的定义如下。

假设我们在分析一家坐落于某大城市的咖啡店数据,数据集有以下5个字段(特征)。

数据:咖啡店

以上特征都可以被归类为定量数据或定性数据,这一简单的区分意义非常重大。下面我们逐个进行分析。

咖啡店名称无法用数字表示,且咖啡店名称不能进行数学运算。

咖啡店的营业额可以用数字表示,且营业额支持简单的数学运算。比如将12个月的营业额相加可得到1年的营业额。

邮政编码有点复杂。虽然邮政编码通常用数字表示,但它是定性数据,因为邮政编码不符合定量数据的第二个要求——支持数学运算。两个邮政编码相加得到的是一个没有意义的数字,而不是一个新的邮政编码。

该指标可以用数字表示,且支持简单的数学运算——将每个月的平均客户数相加可得到全年的客户数。

我们假设这是一家只使用单一咖啡产地咖啡的小型咖啡馆,咖啡产地用国家名字(如埃塞俄比亚、哥伦比亚)而非数字表示。

两个重要提醒:

如果你在区分数据类型时遇到困难,那么在下决定之前,可以先问自己几个简单的问题。

这个方法应该可以帮助你区分大部分数据的定量/定性属性。

字段的定量/定性属性,决定了该列可以进行哪些分析。对于定量数据列,可以分析的内容有:

对于定性数据列,可以分析的内容有:

世界卫生组织发布了一个世界各国饮酒习惯的数据集。我们将使用Python和数据探索工具Pandas对该数据集进行分析。

import pandas as pd

# read in the CSV file 
drinks = pd.read_csv('data/drinks.csv')[1]

# examine the data's first five rows
drinks.head()         

以上3行代码的作用是:

 

注意:CSV文件传入的是整齐的行列结构数据,如图2.1所示。

图2.1 行列结构数据

在本例中,我们有6列不同的数据。

我们首先来看定性数据continent列。我们可以使用Pandas计算该定性特征列的基本汇总统计指标。此处使用describe()方法,该方法首先判断字段的定性/定量属性,然后给出基本统计信息。如下所示:

drinks['continent'].describe()

>> count    193
>> unique     5
>> top       AF
>> freq      53

以上结果显示世界卫生组织收集的数据来自5个不同的洲,在193个观测值中,AF(非洲)最高频出现了53次。

如果我们在定量数据中使用同样的方法,将得到不同的结果:

drinks['beer_servings'].describe()

>> mean     106.160622
>> min        0.000000
>> max      376.000000

以上结果显示,这些国家和地区的人均啤酒消费量是106.2升,其中消费量最少是0,最高的是376升。

定量数据还可以继续细分为离散型(discrete)数据连续型(continuous)数据。它们的定义如下。

比如,掷骰子的点数属于离散型,因为骰子的点数只有6个值。咖啡馆的人数属于离散型,因为人数不能用无理数和负数表示。

比如,体重可以是68千克,也可以是89.66千克,注意小数点,所以体重是连续型数据。人或建筑物的高度也属于连续型,因为取值可以是任意大小的小数。温度和时间同样属于连续型。

[1] 译者注:原书代码为pd.read_csv('https://raw.githubusercontent.com/sinanuozdemir/principles_of_data_ science/master/data/chapter_2/drinks.csv'),但由于该url地址无效,故替换为本地文件。

目前为止,我们已经在本章介绍了结构化数据和非结构化数据的区别,以及定量和定性数据的特征。这些看似简单的区分,将对后续的分析产生重大影响。在进入本章下半部分之前,请允许我对以上内容做一个简单的总结。

数据既可以是结构化的,也可以是非结构化的。换言之,数据既可以是有组织的行列结构格式,也可以是在分析前必须进行预处理的自由格式。如果数据是结构化的,我们可以进一步分析数据集每一列的定量/定性属性。简单地说,分析该列是否是数字格式,是否支持数学运算。

在本章的下半部分,我们将研究数据的4个尺度。对于每一个尺度,我们将运用更加复杂的数学运算规则。作为回报,我们将对数据有更好的理解和直觉。

通常情况下,结构化数据的每一列都可以被归为以下4个尺度中的一个。这4个尺度分别是:

(1)定类尺度(nominal level)。

(2)定序尺度(ordinal level)。

(3)定距尺度(interval level)。

(4)定比尺度(ratio level)。

随着尺度的深入,数据的结构化特征也将越来越多,也更有利于分析。每个尺度都有适用于自身的测量数据中心(the center of the data)的方法。比如,我们平时用来做数据中心的平均值,其实仅适用于特定尺度的数据。

第一个尺度是定类尺度,主要指名称或类别数据,如性别、国籍、种类和啤酒的酵母菌种类等。它们无法用数字表示,因此属于定性数据。以下是一些例子。

作为定性数据,定类尺度数据不能进行数学运算,如加法或除法,因为得到的结果是无意义的。

适用的数学运算

虽然定类尺度数据不支持基本的数学运算,但等式和集合隶属关系除外。如下所示。

测度中心

测度中心(measure of center)是一个描述数据趋势的数值,有时也被称为数据平衡点(balance point)。常见的测度中心有平均值、中位数和模。

定类尺度数据通常用模(mode)作为测度中心。比如,对于世界卫生组织的酒精消费量数据,出现次数最多的州是Africa,因此Africa可以作为continent列的测度中心。

由于定类尺度数据既不能排序,也无法相加,因此中位数和平均值不能作为它的测度中心。

定类尺度数据有何特征

定类尺度数据通常是用文字表示的自然分类数据。这类数据在翻译成各国文字时,可能会出现缺失,甚至有被拼写错误的情况。

然而,定类尺度数据却非常重要,我们必须仔细思考能够从中得到何种见解。仅仅依靠测度中心——模,我们无法得出观测对象平均值的任何结论。这很正常,因为平均值不适用于此类数据!从下一个尺度开始,我们才能对观测数据使用数学运算。

定类尺度数据无法按任何自然属性进行排序,这极大限制了定类尺度数据可使用的数学运算符。定序尺度数据则为我们提供了一个等级次序,换言之,提供了一个可以对观测值进行排序的方法。然而,它仍不支持计算两个观测值间的相对差异。也就是说,虽然我们能够对观测值进行排序,但观测值间相加或相减得到的结果仍然没有意义。

案例

李克特量表(Likert)是最常见的定序尺度数据。当我们用1~10填写满意度调查问卷时,生成的结果正是定序尺度数据。调查问卷答案必须介于1~10,并可以被排序,比如8分比7分好,9分比3分好。

然而,各个数字之间的差异并没有实际意义。比如7分和6分的差异是1分,2分和1分的差异也是1分,但两个1分的含义却可能完全不同。

适用的数学运算

和定类尺度数据相比,定序尺度数据支持更多的数学运算。除了继承定类尺度的数学运算之外,还支持以下两种数学运算:

“排序”指数据本身具有的自然顺序,然而有些时候还需要一些技巧。比如对于可见光谱——红、橙、黄、绿、蓝、靛蓝和紫色,自然排序规则是随着光的能量和其他属性的增加,从左至右排序,如图2.2所示。

图2.2 自然排序规则

然而,艺术家如果有特殊需求,还可以用另一种排序规则,比如基于颜料用量对上述颜色进行排序。虽然新的排序规则会改变颜色顺序,但比排序规则本身更重要的是保持排序规则的一致性。

“比较”是定序尺度数据支持的另一个新运算符。对于定类尺度数据,度量值间的比较没有意义,比如一个国家“天然”比另一个国家好,演讲中某一段“天然”比另一段糟糕。但是对于定序数据,我们则可以对度量值进行比较,比如调查问卷中的7分比1分好。

测度中心

定序尺度通常用中位数(median),而不是平均值(mean/average)表示测度中心,因为定序尺度数据不支持除法。当然,我们也可以使用定类尺度中介绍的模作为测度中心。

下面我们通过一个例子介绍中位数的用法。

假设你刚刚完成一份关于员工满意度的调查问卷,问题是“用1~5分为你当前的工作幸福程度打分”,以下是调研结果:

5, 4, 3, 4, 5, 3, 2, 5, 3, 2, 1, 4, 5, 3, 4, 4, 5, 4, 2, 1, 4, 5, 4,
3, 2, 4, 4, 5, 4, 3, 2, 1

下面使用Python计算以上数据的中位数。很多人认为平均值也可以作为测度中心,这是不正确的,因为两个变量相减或相加得到的值无任何意义,比如4分减去2分,差异的2分没有任何意义,所以数学运算得出的平均值也没有任何意义。

import numpy

results = [5, 4, 3, 4, 5, 3, 2, 5, 3, 2, 1, 4, 5, 3, 4, 4, 5, 4, 2, 1,
4, 5, 4, 3, 2, 4, 4, 5, 4, 3, 2, 1]

sorted_results = sorted(results)
print sorted_results
'''
[1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 5, 5, 5, 5, 5, 5, 5]
'''
print numpy.mean(results) # == 3.4375
print numpy.median(results) # == 4.0

不难发现,中位数4.0作为测度中心不仅是合理的,也让调查问卷结果变得更加直观。

简单回顾

目前为止,我们已经讨论了一半的数据尺度。

在定类尺度中,我们处理的对象通常是无序的、不支持数学运算的文本(有时候也有数字)。在定序尺度中,我们处理的对象通常是有自然顺序的、支持排序的文本或数字。

请区分下面几个例子的定类尺度和定序尺度类型。

终于到了更有意思的定距尺度。对于定距尺度数据,我们可以用均值和其他更复杂的数学公式描述数据。这是定类尺度和定距尺度最大的差异,也是唯一的差异。

定距尺度数据可以进行有意义的减法运算。

案例

温度是最常见的定距尺度数据。假设得克萨斯的温度是37.78℃,土耳其伊斯坦布尔的温度是26.67℃,那么得克萨斯比伊斯坦布尔高11.11℃。相对于调查问卷案例,这个例子允许的数学运算显然更多。

另外,虽然调查问卷数据看起来好像也属于定距尺度数据(因为使用1~5表示满意度),但是请牢记,两个分数的差没有任何意义!正因为如此,调查问卷数据才不属于定距尺度。

适用的数学运算

我们可以使用低一级尺度的所有运算符(排序、比较等),以及下面两个新运算符:

通过以上两个新运算符,我们可以用全新的视角观察数据。

测度中心

对于定距尺度数据,我们依然可以用中位数和模来表示数据的测度中心,但更加准确的方法是用算术平均值(arithmetic mean),通常简称为“均值(mean)”。回想一下均值的定义,均值要求我们对所有的观测值求和。由于定类和定序尺度数据不支持加法运算,因此均值对这两个尺度没有意义。只有定距尺度及以上尺度的数据,均值才有意义。

下面我们通过一个例子介绍均值的用法。

假设某冰箱保存着制药公司的疫苗,以下是该冰箱每小时的温度值(华氏度):

31, 32, 32, 31, 28, 29, 31, 38, 32, 31, 30, 29, 30, 31, 26

继续用Python计算以上数据的均值和中位数。

import numpy
temps = [31, 32, 32, 31, 28, 29, 31, 38, 32, 31, 30, 29, 30, 31, 26]
print numpy.mean(temps)    # == 30.73
print numpy.median(temps)  # == 31.0

中位数和平均值非常接近,都在31℉(−0.56℃)左右。然而疫苗的存放标准要求是:

请勿将疫苗置于29℉(−1.67℃)之下!

我们注意到冰箱温度有两次低于29℉(−1.67℃),但你认为这不足以对疫苗产生不利影响。下面我们使用变差测度(measure of variation)判断冰箱状态是否正常。

变差测度

变差测度是之前没有出现过的内容。我们知道测度中心的重要性,但在数据科学中,了解数据分布的广度也同样重要,描述这一现象的度量叫作变差测度。你可能听说过标准差(standard deviation),并且直到现在还处于统计学课程给你造成的轻微创伤后精神压力症(PTSD)。但由于变差测度的概念太重要了,所以有必要对它进行简单说明。

变差测度(比如标准差)是一个描述数据分散程度的数字。变差测度和测度中心是描述数据集最重要的两个数字。

标准差

标准差是定距尺度和更高尺度数据中应用最为广泛的变差测度。标准差可以被理解为“数据点到均值点的平均距离”。虽然这一描述在技术上和数学定义上都不严谨,但却有助于我们理解标准差的含义。计算标准差的公式可以被拆分为以下步骤:

(1)计算数据的均值;

(2)计算数据集中的每一个值和均值的差,并将其平方;

(3)计算第(2)步的平均值,得到方差;

(4)对第(3)步得到的值开平方,得到标准差。

注意,以上每一步计算的均值都是算术平均值。

以温度数据集为例,我们使用Python计算数据集的标准差。

import numpy

temps = [31, 32, 32, 31, 28, 29, 31, 38, 32, 31, 30, 29, 30, 31, 26]

mean = numpy.mean(temps) # == 30.73

squared_differences = []
# empty list o squared differences

for temperature in temps:
    difference = temperature - mean
# how far is the point from the mean

   squared_difference = difference**2
   # square the difference

   squared_differences.append(squared_difference)
   # add it to our list

   average_squared_difference = numpy.mean(squared_differences)
   # This number is also called the "Variance"

standard_deviation = numpy.sqrt(average_squared_difference)
# We did it!

print standard_deviation # == 2.5157

通过以上代码,我们计算出数据集的标准差是2.5左右。这意味着平均来看,每一个数据点和平均温度31℉(−0.56℃)之间的距离是2.5℉(相当于1.38℃)。因此,冰箱温度在未来将下降至29℉(−1.67℃)以下。

 

计算标准差时,没有直接使用数据点和平均值的差,而是将差值平方后使用。这样做是为了突出离群值(outliers)——那些明显远离平均值的数据点。

变差度量非常清晰地描述了数据的离散程度。当我们需要关心数据范围和波动情况时,这一指标显得尤为重要。

定距尺度和下一尺度之间的区别并不是十分明显。定距尺度数据没有自然的起始点或者自然的零点。比如,零摄氏度并不意味着没有温度。

我们终于开始讨论定比尺度。定比尺度支持的数学运算在4个尺度中最全面和强大。除了之前提到的排序和减法之外,定比尺度支持使用乘法和除法。听起来仿佛没必要小题大做,但这却彻底改变了我们观察此类数据的方法。

案例

由于华氏度(Fahrenheit)和摄氏度(Celsius)缺少自然零点,因此属于定距尺度。开氏温标(Kelvin)却自豪地拥有自然零点。开氏温标为0时意味着没有任何热量,不随人为因素改变,我们可以有科学依据地说200开氏温度是100开氏温度的两倍。

银行账户金额也是定比尺度。“银行账户金额为零”和“2万美元是1万美元的两倍”这两种说法都是成立的。

 

一些人认为华氏度和摄氏度同样有自然零点,原因是开氏温标可以转换为华氏度和摄氏度。然而,由于转换后的华氏度和摄氏度会出现负数,所以并不存在自然零点。

测度中心

算术平均值对定比尺度仍然有效,同时还增加一种叫几何平均值(geometric mean)的新均值类型。后者在定比类型中并不经常使用,但仍然值得提及,它是指n个观察值连乘积的n次方根。

比如,对于冰箱温度数据,我们可以通过以下方式计算几何平均值:

import numpy

temps = [31, 32, 32, 31, 28, 29, 31, 38, 32, 31, 30, 29, 30, 31, 26]

num_items = len(temps)
product = 1.

for temperature in temps:
    product *= temperature

geometric_mean = product**(1./num_items)

print geometric_mean # == 30.634

几何平均值非常接近之前计算的算术平均值和中位数。但是请记住,这种情况并不经常发生。我们会在后面的统计学章节中用更多篇幅做出解释。

定比尺度的几个问题

虽然定比尺度新增了很多数学运算符,但由于存在一个重要前提,导致定比尺度的适用范围受到限制。这个基本前提是:

 

定比尺度数据通常是非负数(non-negative)。

试想如果我们允许负数的存在,那么一些比率很可能丧失含义。比如在银行账户案例中,假设允许账户金额为负数,那么以下比率将不具有任何意义:

我们可以人为地改变数据结构。比如,虽然理论上不能计算定序尺度数据1~5的平均值,但这并不能妨碍一些统计学家用它观察数据集。

数据归属的层次必须在开始分析之前确定好。如果用算术平均值和标准差等工具分析定序数据,作为数据科学家,你就必须意识到潜在的风险。因为如果继续把这个错误的假设作为分析的基础依据,就将遇到很多问题。比如,错误的假设定序数据具有整除性。

正确理解数据类型是数据科学最重要的组成部分。这一步必须在数据分析开始之前进行,因为数据类型决定了可使用的分析方法。

任何时候拿到一个新的数据集,你需要首先回答的3个问题是:

比如,数据是否以行列结构存储?

比如,数据是数字格式还是文本格式,它们代表数量吗?

比如,数据是定类、定序、定距还是定比尺度?

以上问题的答案不仅影响着你对数据的理解,还将决定下一步的分析步骤。它们决定了可以使用的图形类型,以及如何使用数据模型。有时候,为了得到更多的信息,我们必须将数据由一种类型转换为另一种类型。在接下来的章节,我们将学习如何处理和分析不同类型的数据。

本书结束时,你将不仅熟悉各个尺度的数据,还将掌握如何处理和分析各个尺度的数据。


相关图书

高级算法和数据结构
高级算法和数据结构
数据素养
数据素养
云数据中心网络架构与技术(第2版)
云数据中心网络架构与技术(第2版)
数亦有道 Python数据科学指南
数亦有道 Python数据科学指南
Jupyter入门与实战
Jupyter入门与实战
Jupyter数据科学实战
Jupyter数据科学实战

相关文章

相关课程