作者:(美)罗切斯特(Rochester,E.)
出版社:机械工业出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
Clojure数据分析秘笈试读:
前言
数据无处不在!随着数据变得越来越普遍,人们利用数据的愿望也愈发强烈。数据中隐藏着很多有价值的信息,如潜在的购买者、用户的浏览模式、人口统计信息等。只要能够发现数据中的信息,就会获得对事物深刻的认知并且做出更明智的决策。
本书会帮助你做到这一点。
Clojure编程语言会帮上忙。Clojure由Rich Hickey于2007年首次发布,是Lisp语言大家庭的一员,因此它继承了Lisp语言所特有的功能性和灵活性。Clojure也是一门函数式编程语言,因此Clojure程序简单易懂。另外,Clojure在并发和并行编程方面表现突出,在分析数据时,它的所有这些特性会促使这一过程变得更加简单迅速。
许多强大的库进一步提升了Clojure在数据分析方面的实用性。Incanter提供了处理数据并执行统计分析的实用环境;Cascalog是覆盖Hadoop和Cascading技术的一个简单易用的包装器。最后,在准备发布结果时,ClojureScript(一个可以生成JavaScript的Clojure实现)可以帮助以有效且有说服力的方式对数据进行可视化。
此外,Clojure运行在Java虚拟机(JVM)上,因此为Java编写的库也可以用于Clojure。这使得Clojure可以非常高效地解决大多数领域的问题。
希望本书可以为你提供分析数据过程中所需要的工具和技术。
本书主要内容
第1章涉及如何从不同种类数据源中读入数据,这些数据源有CSV文件、网页和链接语义网数据。
第2章提供标准化数据、修正拼写错误以及使用大数据集的策略和实现。把数据塑造成一种可供使用的形式是数据分析的一个重要阶段,但这一过程经常被忽视。
第3章包含Clojure的并发特性和如何通过这些特性简化程序。
第4章包含通过Clojure的并行处理能力提高处理数据的速度。
第5章包含在Hadoop和Cascading库上使用Cascalog处理分布在多台计算机上的大量数据。该章介绍的最后一个方法使用Pallet在亚马逊EC2服务上执行一个简单的分析。
第6章介绍使用Incanter数据集的基础知识。数据集是Incanter使用的核心数据结构,理解它们是高效使用Incanter的基础。
第7章包含在数据分析中用到的一系列统计处理过程和测试。其中一些很简单,例如生成汇总统计。其他的可能更复杂些,例如执行线性回归和使用本福德定律审计数据。
第8章讲解如何配置Clojure以便与Mathematica和R交互。它们都是强大的数据分析系统,有时可能需要使用它们。该章将展示如何使这些分析系统一起工作,以及这些工具交互时我们可以完成的任务。
第9章包含更多高级的机器学习技术。在该章中,我们将主要使用Weka的机器学习库,以及讨论如何使用它和其中内置的数据结构,另外还将展示机器学习算法的一些方法。
第10章将展示如何在Incanter中生成图和进行可视化。对于探索和研究数据来说这些很重要,同时对于发布和展示结果来也非常重要。
第11章将展示如何安装一个简单的网页应用来展现数据分析的发现。该章将介绍利用强大的D3可视化库的一些方法。
阅读本书需要做的准备
学习本书需要使用Java Development Kit(JDK)软件,可以从http://www.oracle.com/technetwork/java/javase/downloads/index.html下载获得。JDK是在Java平台上运行和开发程序的必需品。
Leiningen2是另外一个需要用到的软件,可以从https://github.com/technomancy/leiningen下载安装。Leiningen2是用来管理Clojure项目和其他依赖的一个工具。很快它将成为Clojure社区事实上的标准项目管理工具。
全书会使用许多其他Clojure和Java库,包括Clojure本身。当需要这些库的时候,可以通过Leiningen下载。
同时还需要一款文本编辑器,或者集成开发环境(Integrated Development Environment,IDE)。如果你已经有一款自己喜欢使用的文本编辑器,那么可以直接使用。在使用自己喜欢的开发环境时,推荐浏览http://dev.clojure.org/display/doc/Getting+Started中的提示和插件。如果你没有偏好,建议考虑使用带有Counterclockwise的Eclipse,安装指导可以在http://dev.clojure.org/display/doc/Getting+Started+with+Eclipse+and+Counterclockwise中找到。
这就是本书需要的全部软件。然而,在全书中的有些地方,有一些方法会使用其他的软件。例如在第8章中,与Mathematica相关的内容很显然会使用Mathematica,同样与R相关的内容会用到R。但是这些软件不会在书中的其他部分用到,并且对这些方法是否感兴趣可能取决于你是否安装了这些软件。
本书读者对象
本书是为熟悉Clojure语言并且想将其应用在数据分析过程中的程序员和数据科学家准备的。本书并不是Clojure教程(现在已经有很多介绍Clojure的优秀著作),因此读者需要对Clojure这门语言熟悉,但不必是Clojure语言方面的专家。
排版约定
在本书中,你会发现用以区分内容的不同文本样式。下面是这些样式的例子和含义说明。
当需要读者注意代码块中的特定部分时,相关的行或者项目会设置为加粗显示。
所有命令行的输入或者输出都按以下方式展示:
新术语和重要词汇会以加粗的形式展示。
示例代码下载
你可以从http://www.packtpub.com上你的账户中下载购买的所有Packt书籍中的示例代码文件。如果你通过其他渠道购书,可以访问//www.packtpub.com/support并注册,我们会通过邮件直接将这些文件发送给你。
勘误表
尽管我们尽最大努力来保证内容的准确性,但错误不可避免还会出现。如果在书中发现错误(可能是文字或者代码错误),请告知我们。这样一来,你可以帮助其他读者免受错误干扰,并帮助改进本书后续的版本。如果发现错误,请通过访问http://www.packtpub.com/submit-errata,点击errata submission form链接,输入错误详情向我们报告错误。一旦你的勘误验证通过,我们将采纳你的提交的意义,然后将勘误上传到我们的网站上,或者加入对应主题的勘误栏目下现存的勘误列表中。任何现存的勘误表都可以从http://www.packtpub.com/support上点击浏览。
问题
当你有关于本书任何方面的问题时,请通过questions@packtpub.com联系,我们会尽最大努力解决它。
关于技术审校者
Jan Borgelin是一位拥有超过10年软件开发经验的技术怪才。曾在企业软件领域不同职位工作,现在担任BA集团有限公司(芬兰一家IT咨询公司)CEO和高级咨询师。在过去的两年里,他参与了函数式编程语言的开发工作并对Clojure很感兴趣。
Thomas A.Faulhaber,Jr.是Infolace的负责人(www.infolace.com,旧金山一家咨询公司)。Infolace帮助从初创业型公司到国际品牌公司的客户将原始数据转换为信息并将信息转换为行动。在Thomas的职业生涯中,他曾参与开发高性能TCP/IP系统、大规模科学可视化系统、能源交易系统等。
在Clojure和Incanter的最早期阶段,他就成为其贡献者和使用者。Clojure与其生态系统(包括代码和人)的能力是Thomas的一个重要贡献。
Charles Norton有超过25年的编程经验,涉及领域从工厂自动化应用和固件到网络中间件,现在是波士顿地区政府的一名程序员和应用专家。他维护并开发了一系列支持金融、健康保险和供水设施管理的软件应用。这些系统由多种语言实现,其中也包括Clojure。
Miki Tebeka有超过10年的软件开发经验。他开发了多种产品,从新闻交易系统的汇编程序和链接器到云架构。他现在就职于Adconion,该公司每月处理超过60亿个事件。在他闲暇的时间里,他是多个开源社区的活跃者。第1章导入分析数据1.1 引言
如果没有大量数据是无法进行数据分析的,因此任何项目的第一步都是评估有什么样的数据和需要什么样的数据。一旦知道需要什么样的数据,就要想办法得到它。
本章和本书中的许多方法使用Incanter(http://incanter.org/)导入数据并规定使用Incanter数据集。Incanter是Clojure中完成统计分析和图形化显示的库,其作用类似于R。Incanter可能并不适用于所有任务(后面将使用Weka库进行聚类和机器学习),但它仍是在Clojure中进行数据分析的重要工具。本章介绍如何收集数据和使数据适用于Clojure。首先来看一下如何创建一个新的项目。我们将从以逗号分隔值(Comma-Separated Value,CSV)的简单数据格式开始,然后学习使用JDBC从关系数据库中读取数据。最后考虑更复杂的数据源,例如从网络上抓取的数据和链接数据(RDF)。1.2 新建项目
本书将用到许多第三方库和外部依赖包,因此需要一款下载并记录它们的工具,也需要一款工具用于搭建环境并启动交互式终端解释器(REPL),以便查看代码或者执行程序。
可以使用Leiningen(http://leiningen.org/)完成这项工作,它已经成为标准的自动打包和管理系统。1.2.1 准备工作
访问Leiningen官方网站(http://leiningen.org/)并下载lein脚本,执行该脚本会下载Leiningen所需的JAR文件。安装说明很清晰,整个安装过程比较简单。1.2.2 具体实现
用lein new命令生成一个新项目,将项目名称作为参数传入:
现在你会发现一个名为getting-data的子目录,其中将包含getting-data.core命名空间和测试用的桩程序。下载样例代码
你可以从http://www.packtpub.com你的账户中下载购买的所有Packt书籍中的样例代码文件。如果你通过其他渠道购书,可以访问http://www.packtpub.com/support并注册,这些文件会通过邮件直接发送给你。1.2.3 实现原理
新建项目目录下有一个名为project.clj的文件,这个文件中包含关于该项目的元数据信息:项目名、版本和许可。文件中也包含代码需要使用的依赖列表。该文件中所使用的规范允许在Maven仓库目录和Clojure库目录(Clojars,https://clojars.org/)搜索下载项目的依赖包。
在每种方法的准备部分,都可以从这个文件的:dependencies部分看到项目需要列出的库。1.3 将CSV数据读入Incanter数据集
以逗号分隔值(CSV)是最简单的数据格式之一,并且这种数据格式应用非常普遍。Excel可以直接读写CSV文件,而且多数数据库也可以。由于CSV文件就是无格式的文本,因此使用任何编程语言都很容易生成或者访问它。1.3.1 准备工作
首先,确保加载了正确的库。Leiningen(https://github.com/technomancy/leiningen)的项目文件project.clj file应该包含以下依赖(也可以使用更新的版本):
另外,在REPL或者代码文件中,包含以下代码:
最后,我将包含以下数据的文件命名为data/small-sample.csv。
这个文件可以从http://www.ericrochester.com/clj-data-analysis/data/small-sample.csv下载,还有一个带有标题行的版本,可以从http://www.ericrochester.com/clj-data-analysis/data/small-sample-header.csv下载。1.3.2 具体实现
1.使用incanter.io/read-dataset函数。
2.如果CSV文件中有标题行,在调用read-dataset函数时应包含:header true。1.3.3 实现原理
通过Clojure和Incanter可以使许多普通工作变得简单,下面是一个很好的例证。
读入外部数据(在本例中来自CSV文件),并将其加载到Incanter数据集中。在Incanter中,一个数据集就是一张表,类似于电子表格中的一个表单或者数据库中的表。每一列包含一个数据域,每一行包含一条数据。有些列包含字符串数据(本例中所有列都是字符串数据),有些列包含日期或者数值数据。如果一列包含数值数据,Incanter会自动将其检测出来并将其转换为Java中的int或者double数据格式。Incanter解决了导入数据过程中遇到的许多令人头疼的问题。1.3.4 更多信息
如果你不想涉及Incanter,比如当你不想添加依赖时,使用data.csv也是比较简单的(https://github.com/clojure/data.csv)。后续的章节中会使用这个库,例如2.8节。1.3.5 参阅
·第6章1.4 将JSON数据读入Incanter数据集
另一个越来越流行的数据格式是JavaScript Object Notation(JSON,详见http://json.org/)。与CSV相似,JSON也是无格式的文本,因此程序容易处理。它提供了相对于CSV文件关于数据的更多信息,但是代价是更冗长。JSON格式允许用更复杂的方式使数据结构化,例如层次结构或者序列层次结构。
由于JSON是比CSV更完善的数据模型,因此使用时可能需要转换数据。在这种情况下,可以将感兴趣的信息取出,在传入Incanter之前精简嵌入的映射。然而这种方法仅用于处理相当简单的数据结构。1.4.1 准备工作
首先,在Leiningen的project.clj文件中包含以下依赖:
在REPL解释器或程序中使用下列库:
还需要一些数据。为此,将下面的内容存入data/small-sample.json文件:
这个文件可以从http://www.ericrochester.com/clj-data-analysis/data/small-sample.json下载得到。1.4.2 具体实现
一旦完成所有准备工作后,只需要在REPL解释器下执行一条命令:1.4.3 实现原理
和所有的Lisp语言相似,Clojure通常采用从内层到外层、从右到左的方式读取数据。接下来详细说明。clojure.core/slurp将读入文件内容并以字符串的形式返回。对于非常大的文件来说这明显不是个好主意,但是对小文件来说却很实用。clojure.data.json/read-json从slurp中得到数据,将其以JSON格式进行解析,并返回本地的Clojure数据结构。在本例中,它返回一个由向量组成的映射。maps.incanter.core/to-dataset读入一个映射序列,然后返回Incanter数据集。这将会使用映射中的键作为列名并将数据值转换成矩阵。事实上,to-dataset可以接收许多不同的数据结构。在REPL解释器上尝试(doc to-dataset)命令,或者登录http://data-sorcery.org/contents/查看Incanter文档中的详细内容。1.5 使用Incanter读入Excel数据
前面已经见识过Incanter如何使一些常见的数据处理任务变得非常简单。读入一张Excel电子表格是另外一个这样简单的例子。1.5.1 准备工作
首先,确保Leiningen的project.clj文件包含正确的依赖:
并且,确保已经在REPL解释器或脚本中加载了以下包:
然后找到要使用的Excel电子表格。这里这个文件命名为data/small-sample-header.xls,可以从http://www.ericrochester.com/clj-data-analysis/data/small-sample-header.xls下载这个文件。1.5.2 具体实现
现在,需要做的只是调用incanter.excel/read-xls:1.6 从JDBC数据库读取数据
从关系型数据库中读入数据仅比从Excel中复杂一点,并且大多数外部编译主要涉及连接数据库。
幸好有人贡献了在JDBC之上的Clojure包,这个包使得使用数据库简单许多。本例将从SQLite数据库(http://www.sqlite.org/)中加载一个数据表。1.6.1 准备工作
首先,在Leiningen project.clj文件中列明依赖。还需要引入数据库驱动库。在本例中,所使用的是org.xerial/sqlite-jdbc。
然后,在REPL解释器或脚本文件中加载模块:
最后,得到数据库连接信息。我的数据存放在SQLite数据库文件data/small-sample.sqlite中。该文件可以从http://www.ericrochester.com/clj-data-analysis/data/small-sample.sqlite下载得到。1.6.2 具体实现
加载数据的过程并不复杂,通过使用包装器程序会将这个过程变得更简单。
1.创建一个函数,参数为数据库连接映射和表名,返回值为从表中得到的数据集:
2.使用适合数据库的连接参数定义一个数据库映射:
3.使用db和表名作为标志或字符串调用load-table-data。1.6.3 实现原理
load-table-data函数使用clojure.java.jdbc/with-connection建立了一个数据库连接。它创建了一个用以查询表中传入的所有域的SQL查询。然后,使用clojure.java.jdbc/with-query-results获取结果。每一行结果都是列名与值的映射序列。这个序列通过incanter.core/to-dataset装入数据集中。1.6.4 更多信息
使用JDBC连接不同的数据库系统并不是一项困难的工作,但是取决于希望连接什么数据库。Oracle在http://docs.oracle.com/javase/tutorial/jdbc/basics/有关于使用JDBC的教程,clojure.java.jdbc库的文档(http://clojure.github.com/java.jdbc/)中有一些有用的信息。如果你想知道特定数据库系统的连接字符串是什么样子的,可以在网上找到列表。http://www.java2s.com/Tutorial/Java/0340__Database/AListofJDBCDriversconnectionstringdrivername.htm包含主要数据库系统的驱动。1.7 将XML数据读入Incanter数据集
一类非常常用的数据格式是XML,人们对其褒贬不一。但在某种情况下,几乎所有人都不得不处理它。Clojure可以使用Java的XML库,但它也有自己的包,这个包提供了一种在Clojure中使用XML的更自然的方式。1.7.1 准备工作
首先,在Leiningen project.clj文件中引入以下依赖:
在REPL解释器或者程序中使用以下库:
然后找到数据文件,将它命名为data/small-sample.xml,内容格式如下:
可以从http://www.ericrochester.com/clj-data-analysis/data/small-sample.xml下载该数据文件。1.7.2 具体实现
1.本方法中的方案稍有些复杂,因此将之包装成一个函数。
2.用下面的方式调用函数:1.7.3 实现原理
本方法按以下顺序处理XML:
1.解析XML数据文件。
2.利用解析树抽取数据节点。
3.将节点转换成代表数据的映射序列。
4.最后,将其转换至Incanter数据集。
load-xml-data实现了这个过程。其中包括三个参数:输入文件名、传入解析完成的XML的根节点并返回第一个数据节点的函数,以及传入一个数据节点并返回下个数据节点或空值(如果其后没有节点)的函数。
试读结束[说明:试读内容隐藏了图片]