1、可重复研究和产品化 学术界和产业界的数据科学家都需要和其他人交流,交流的载体可能是:1.论文、报告、幻灯片等文档形式;2.也可能是客户端软件、远程系统等产品形式。引言 特点:普通文档的分析过程和写文档的过程是分开的;分析结果需要通过粘贴图表再排版来完成。弊端:容易出错有时候分析结果更新后,最终文档上的图表可能会忘记更新;难以重复数据分析的过程无法体现在最终结果中,研究结果难以被其他人重复。普通文档的特点与弊端分析报告与数据产品简介可重复研究数据产品的设计与开发目录555分析报告与数据产品简介 对于自动化的分析过程,如果展现结果的主体是分析报告,通过一些交互式的方法把代码和文字排版形成文档,这种
2、方式一般称为自动化报告自动化报告。如果展现结果的主体是信息系统,一般称为数据产品数据产品,在系统中通过不同的模板展示不同的分析结果。分析报告与数据产品简介 自动化报告以排版系统作为工具。在数据科学应用中,常用的排版系统有:Office 系列工具、LATEX、Markdown 使用Word 或者可以很容易地生成下图格式的文档分析报告示例自动化报告的常见框架 美国微软公司于1982 年在DEC 的CP/M 操作系统上推出了电子表格程序MultiPlan;1983 年基于DOS 操作系统推出了文字处理软件Word;1985 年微软公司在苹果的Macintosh系统发布的Excel 电子表格和Word
3、 文字处理软件获得了广大的用户。微软公司Office系列工具 1990 年微软推出Office1.0,集成了Word 1.1、Excel 2.0 和PowerPoint 2.0。从此以后,这三个软件成了Office 工具的标配,也成了具有最广泛用户基础的排版工具。微软产品Office系列工具1在Windows 系统中,通过快捷键“Alt+F11”可以调出开发环境。Office系列工具 基于VBA的自动化示例:1.更新数值更新数值:一份文档中的某个数值需要按月更新,可以基于VBA在每次更新时从数据库中获取最新的数值,然后定位到这个数值的位置,通过VBA中的Office对象来替换原先的数值,操作完
4、之后保存即可。2.“撰写撰写”文档文档:完全由程序来控制Word、Excel或者PowerPoint中的内容。这种写文档的方式不是Office的常规使用方式,失去了Office工具所见即所得的便利性,但在需要频繁更新大量固定格式报告的场景下,通过程序来生成文档大大降低工作量且不易出错。Office系列工具 在实际的工作中,研究者也可以不直接使用VBA,而是基于R和Python等数据科学工具利用Office接口来操纵文档,实现相同的自动化报告功能。1.R中可以使用 officer 包操作Word和PowerPoint,使用 xlsx 包操作Excel;2.Python中可以使用 python-d
5、ocx、openpyxl、python-pptx来分别操作Word、Excel和PowerPoint。这些包可以很方便地将Office文档中的元素转化成R或者Python中的对象,从而将分析的结果和报告文档关联起来,实现自动化的报告。Office系列工具 TEX:是一个非常受欢迎的科技文排版系统,由Donald E.Knuth 于1977年开始开发;其初衷是创造以排版文章及数学公式为目标的计算机程序。LATEX:最初由 Leslie Lamport 开发,现在由Frank Mittelbach 维护;是系统上的一个宏集,使用 程序作为排版引擎;它使用一个预先定义好的专业版面,可以帮助作者高质量
6、地排版和打印作品。用户可以开源地获取不同版本的 工具集。对于环境中的书籍而言,充当了图书设计者设计者的角色,而 则相当于排版者排版者。文学化编程 LATEX提供了专业的版面设计专业的版面设计,可以使一份文档看起来就像印刷品一样。的一大特色是可以方便地排版数学公式,用户只需要学一些声明文档逻辑结构的命令即可,而不必纠结于文档中的版式细节。通过简单的命令可以很容易地生成像脚注、引用、目录和参考文献等复杂的结构。和Word等所见即所得的排版工具不同,主要的工作环境是基于命令的文档编辑器,用户可以专注于内容的创作,而无需在意最终的格式,等到编辑完成,再编译出最终的文档。文学化编程 Knuth于1992
7、年出版了Literate Programming,提出了文学化编程文学化编程这一经典的编程范式。简单来理解,把文字和程序混合在一起并能编译出最终的格式化文档就是文学化编程。由于提供了排版和编程的完美框架,基于平台的工具也成了实现文学化编程的首选。文学化编程 在数据科学里,R和Python是最主流的分析工具。knitr是一个能够支持多种排版环境和编程语言的R包,可以在 环境中运行R、Python和Julia。Python环境下的Jupyter也可以支持代码和文字的混排,但不属于严格意义上的文学化编程工具,因为其代码块主要基于顺序结构运行,无法实现完全自由的组织。在很多应用场景下,研究者不需要完全
8、灵活的文学化编程,只需要实现基础的代码块(或者代码运行结果)与文档混合排版即可2。2也就是普通的自动化报告的功能。文学化编程 基于LATEX的报告体系是一个很好的选择:1.LATEX既可以得到美观的数学公式;2.又可以在PDF格式的输出文件中包含矢量图;3.在学术论文、专业报告、科学类书籍中有着广泛的应用。文学化编程 Office文档文档:可以所见即所得地快速编辑,修改细节容易且使用便利;但由于结构化能力不足,对于一些大型文档(比如书籍)和结构化要求比较高的文档来说,排版很繁琐而且痛苦;Office文档需要依赖于系统中的微软软件,在互联网上不方便移植。LATEX:是一种极其强大而灵活的排版语言
9、,结构化功能很强;但其学习成本比较高,初学者入门比较困难。如果人们需要一个轻量级的结构化、标记式的排版语言,可以得到简单清爽的版式结果,那么Markdown是一个很好的选择。Markdown简介 Markdown的创始人为John Gruber 和 Aaron Swartz。它有如下特点:易读写易读写:允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档;格式转换格式转换:结合Pandoc等工具可以自动转成 和Word格式;编辑器众多编辑器众多:多种文本编辑器都可以用来编辑 Markdown 文件,如Windows记事本、Notepad+、Sublime等;
10、应用广泛应用广泛:越来越多的网站(例如Github)都可以直接支持Markdown格式的文档,很多技术型的博客甚至书籍也开始使用Markdown进行网页或者书籍的排版。Markdown简介 在Markdown中可以通过一些简单的标记表示排版的元素。常见的标题层级、列表、程序代码、图形等,可基于以下标签来实现:标题#表示一级标题。有几个#表示几级标题。列表 *开头表示无序列表,换行加Tab 键表示下一级项目。类似1.开头的项目表示有序列表。代码 以Tab 符或者至少四个空格开始的行表示程序代码。图形 例如!Foo(http:/ 数据产品数据产品是抽象程度更高的数据分析结果形态,在形式上也更加标准
11、化,通常以信息系统的形式来体现。下图是典型的数据产品界面,用户通常通过互联网来访问。在系统中,不同的功能模块对应不同的界面,每一个界面都可以类比于一份自动化报告。数据产品示例数据产品简介 在数据产品界面中可以选择特定的日期,下方的数据表和词云图就会实时更新,从而实现了交互。这种交互性体现在两个方面:1.首先,通过选择框选择时间后页面会和后台的服务器交互,实现数据的更新,体现在页面上是结果的更新,这是前端界面和后端服务之间的交互;2.其次,页面上的图形控件本身就能交互,基于JavaScript 技术可以实现很多动态交互的效果,比如在词云图中,鼠标移到某个具体的词上,会自动显示其频数。数据产品简介
12、 对于一个数据产品,用户能看到的前端界面可能会非常简单,但其后台的技术框架 往往较为复杂。一个分析型的信息系统通常具有如图所示的三层结构:分析型系统架构示例数据产品简介 第一层是数据存储层数据存储层,在数据科学的应用场景中,数据的来源非常丰富:有各种传统信息系统中结构化的数据库;也有文本数据、图像数据等非结构化数据源;还有来自实验室的各类研究数据;以及来自互联网的舆情口碑数据。这些数据可能存在于不同的数据库、云平台、应用软件、文件、网络中,按照数据仓库的流程,通常使用ETL(抽取、转换、加载)的方式将所有数据汇总到一个中央的数据仓库或者云平台中,从而作为数据产品的统一数据源。分析型系统架构 第
13、二层是模型算法层模型算法层,针对不同的应用场景,具体的模型算法也会有差异。一般来说可以分为:统计模型 机器学习算法 人工智能算法 最优化方法 BI分析引擎 这些模型和算法可以在不同的技术环境中实现,数据科学中常用R和Python。有些对性能要求高的算法还会使用C/C+和FORTRAN来实现,在云平台上也会选用Spark等并行框架,在人工智能中还会使用TensorFlow、MXNet、PyTorch等深度学习框架。分析型系统架构 第三层是应用层应用层,直接体现在系统模块的开发上,通常属于软件工程的任务,和数据科学的核心工作有所不同。常用的技术环境有Java、PHP等;比较主流的形式是Web平台;
14、也有很多数据产品是通过手机APP甚至微信小程序来实现。在不同的行业里都会有不同的应用形式,满足的功能也千差万别,但最终都是从系统层面实现数据的应用。分析型系统架构272727可重复研究 可重复研究(可重复研究(Reproducible Research)是一个学术上的概念,指的是研究结果可以重现,通常要求研究的过程透明和开源。研究者除了提供最终的论文或者研究报告以外,还要提供数据及分析代码,这样可以帮助其他研究者快速地重现研究结果。需要将数据获取、数据整理、数据分析、结果展现等步骤内容全部整合到一份文档中;最好的方式就是一份自动化的报告,但是需要能包含所有分析和处理的细节;进行文学化编程时的方
15、案就成了首选。可重复研究 knitr是基于R的动态报告系统,可以灵活地嵌入到 和 Markdown等格式的文档中。其运行代码产生的图形、表格等输出结果都可以很方便地转化成文档中的元素,最后和文档一起编译出来,实现完美的文学化编程。Knitr的应用 以Markdown为例,可以新建一个后缀名为.Rmd 的文本文件。将以下内容复制到该文件中,形成一个 knitr 和Markdown 混排的脚本:混排脚本Knitr的应用 如果使用RStudio作为工作环境,打开.Rmd 格式的文件后,会自动识别出 knitr 的格式,并进行语法高亮显示。此外工具栏会自动出现“Knit”的按键,如图:RStudio
16、运行knitrKnitr的应用 点击红圈中的“Knit”图标后,它会调用knitr包先将文件转为纯Markdown格式,形成md后缀文件,再自动转为HTML文档,转换后会预览到效果。点击save as可将此文档保存为一个包含了所有结果的HTML文件。上面代码生成的网页结果如图:Markdown 与R 代码混编结果Knitr的应用 在RStudio中可以直接使用“Ctrl+Alt+i”组合键来增加一个R代码区块,或者点击工具中的“Insert R”也是同样的效果。代码块中除了R以外,还支持其他语言的高亮显示,如果安装了reticulate包,还可以自动执行Python。Rmd文档可以生成HTML
17、文件用于网络展示。研究者也可以利用knitr中的pandoc函数将md文档转为Word文档和文档。在RStudio中也可以通过“Knit”图标旁边的选择框来选择生产的文档格式。Knitr的应用knitr包还提供了丰富的参数,比如只高亮显示代码,不在R中执行,可以设置参数 eval 为 FALSE,如下所示:只高亮显示代码Knitr的应用 常用的knitr参数可以参考以下列表:include,是否将代码和结果集成显示在输出中。eval,是否执行代码段。echo,是否显示原代码。results,如何显示代码结果,markup 表示显示R的输出内容,hide表示隐藏R的输出内容,asis 表示原样显
18、示。warning,是否显示代码结果中的警告。error,是否显示代码结果中的报错。message,是否显示代码结果中的信息。tidy,是否进行代码整理。prompt,是否显示提示符。Knitr的应用 Jupyter Notebook 简称 Jupyter,是Python环境下的一个交互式笔记本,支持运行 40 多种编程语言,包括R和Julia。其前身是IPython Notebook,内置了一个名为ipython的交互式命令解析器(Shell),比默认的 Python Shell 更强大,可以支持变量自动补全,自动缩进,还支持 Bash Shell命令,包含了许多很有用的功能和函数。在命令行
19、通过第三方包的方式即可安装 jupyter包:安装jupyter包Jupyter的应用 同样在命令行运行以下命令,将会自动开启Jupyter 服务器,并通过浏览器弹出网页版的控制台。开启Jupyter 服务器 界面如图,会自动显示当前路径下的.ipynb 文件。如果通过工具栏新建并保存后,也会自动生成.ipynb 文件。Jupyter 启动界面Jupyter的应用 打开某个.ipynb 格式的笔记本之后,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示出来,如图:Jupyter 应用示例Jupyter的应用 默认的运行方式是交互式脚本,不用考虑排版格式。在工具栏将默
20、认的“代码”模式改成“Markdown”模式后就可以实现类似 knitr 功能的可重复研究,在Markdown的环境下可以排版,还支持 风格的公式。需要注意的是:Jupyter的主要功能还是交互式的编程环境,可以实时显示程序运行结果,非常方便调试且无需编译。虽然其可以和Markdown整合实现一定程度的可重复研究,但是代码块无法灵活地移动,也不支持复杂的格式设置,所以不算是文学化编程,也很少用来进行要求严格的排版工作。Jupyter的应用404040数据产品的设计与开发 将建模、计算、分析的过程用文档体现,是数据科学家的常见工作方式。George E.P.Box曾说过“All models a
21、re wrong,but some are useful”。没有完美的模型,只有适合现实的模型。在实际应用中,如果能了解一些系统设计与开发的流程,是能够基于产品思维来通盘考虑的。可以避免研究者在建模过程中钻牛角尖,在节约时间的同时得到更好的效果。以R下的Shiny为例,介绍系统开发的基本流程和思路。数据产品的设计与开发 Shiny是RStudio公司的产品,包括一个轻量级的Web服务器和一个开发客户端。客户端以R包的形式提供,完全在R环境中运行,基于R进行开发。作为开发环境的R包也内置了一个供测试使用的小型服务端,在R中启用后可通过本地浏览器(比如IE或者Chrome)来访问这个应用。如果需要
22、向远程的用户提供服务,必须安装单独的Web服务器。目前服务器只支持Linux系统,开源版具备了大部分常用功能,付费版还增加了权限控制等功能。Shiny基础 对于普通用户来说,在Windows或Mac系统上基于R包开发Shiny项目就已经足够,可以完整地实现产品开发设计的流程。用户可以基于自己的电脑来演示这个项目;把项目直接复制到安装了Shiny服务器的Linux电脑,可向远程提供服务。Shiny是一个完全基于R的Web应用框架,开发者只需要懂R即可,不需要任何HTML、CSS、JavaScript知识就可以独立开发Web应用。Shiny基础 使用R内置的faithful数据集,描述了美国黄石公
23、园“老忠实”间歇泉的喷发时间和等待时间。使用hist 函数对其喷发时间做直方图:示例代码及结果Shiny应用示例 可以使用Shiny把这个图做成数据产品中的界面,用一个选择框来设置参数breaks,希望当改变参数值的时候能看到图形实时地变化。这是一个简单的需求,但可以代表所有类似信息系统的交互机制。用最简单的架构来描述,需要两个层级两个层级:其一是前端,是用户可以直接看到并操作的前面;其二是后端服务器,能根据用户的选择来触发新的计算并更新前端的结果。这个过程在Shiny中可以很容易地实现。Shiny应用示例 首先需要使用Shiny中的函数编写前端和服务器的工作代码,在Shiny的框架中,需要创
24、建名为“ui.R”和“server.R”的脚本文件3,将其存入某个文件夹中。该文件夹名即为该Shiny应用名,例如“simple”。假设该文件夹的路径为“D:92simple”,那么打开R之后,运行以下代码就可以启动这个项目:启动项目代码3可以创建普通的.txt 文本,将后缀名改为.R 即可。Shiny应用示例 执行完成后,R的控制台将会挂起,同时通过系统默认的浏览器弹出一个网页,如下图。在该网页中可以通过选择框来选择参数。参数改变后,下方的图形会实时地改变,这就实现了一个最简单的数据产品。Shiny 示例Shiny应用示例 UI是用户界面(User Interface)的简称,其开发的过程就
25、是组合各种前端控件的过程5。在 bootstrapPage函数里,通过逗号来隔开各种前端控件,从而实现界面的设计。5真实场景下的UI 开发是一门技术和艺术,涉及到用户体验和美学,我们使用Shiny 进行简单开发的时候可以直接使用默认的配置,不用纠结细节。Shiny应用示例ui.R“ui.R”脚本的代码如下所示,所有的程序都包含在由Shiny提供的shinyUI函数中,然后嵌入一个 Bootstrap前端框架。这是当前前端开发中非常常用的框架,基于HTML、CSS、JavaScript技术实现。Shiny提供了bootstrapPage来直接实现。ui.RShiny应用示例ui.R 这个例子的代
26、码中包含了selectInput和 plotOutput这两个控件,分别表示选择框和普通图形输出,默认以上下排列的方式显示6。这两个控件都以函数的形式被调用。本例对选择框selectInput:命名为“nbreaks”,通过参数inputId来设置。这个参数是用来和服务端交互的唯一ID;参数label设置显示在该选择框上方的文字标签;参数choices设置该选择框的候选项,以向量的形式传入;参数selected设置默认的选项,如果省略这个参数的话,会默认选择choices参数中的第一个元素。同理,对普通图形输出plotOutput:命名为“plot1”,通过参数outputId来设置,也用来和
27、服务端交互。6如果需要进行复杂的布局,可以使用fluidRow 和column 等函数进行排版,此处不详述。Shiny应用示例ui.R“server.R”脚本的代码如下所示,服务端通过定义一个shinyServer函数来实现各项功能。该函数默认包含了两个参数input和output,用来和前端交互,无需修改。所有的功能模块通过对output中的元素定义函数的方式来实现。server.RShiny应用示例server.R“ui.R”通过outputId为“plot1”的普通图形输出模块来显示图形,在“server.R”中定义“output$plot1”即可。普通图形输出模块plotOutput在
28、服务端对应renderPlot函数,在其中生产的图像可以实时地显示在plotOutput的输出位置。renderPlot中包含的代码描述了一个正常的R绘图过程,绘图的结果会显示在前端的网页中。将选择框selectInput与hist函数的breaks参数绑定,在代码中通过input$nbreaks即可关联inputId为“nbreaks”的选择框的值,从而实现了前端输入与服务端计算之间的交互。Shiny应用示例server.R 以上演示了一个完整的前后端交互的数据产品的开发过程。在Shiny中除了选择框selectInput以外,还包含了以下常用的输入控件:numericInput,数值输入框
29、;textInput,文本输入框;dateInput,时间输入框;checkboxInput,单选框;checkboxGroupInput,复选框;sliderInput,滑动条。此外,除了默认的plotOutput与renderPlot这对普通图形输出模块以外,很多基于htmlwidgets技术的第三方包都提供了相应的输入输出方式,一般都会采用以“Output”和以“render”开头的命名方式。Shiny应用示例server.R 舆情系统示例:在该系统中,包含了一个“舆情监测”模块,鼠标点击后可以展开。使用者点击“情感走势”可以看到一个动态气泡图的界面,如图。舆情系统示例动态交互的数据产品
30、 对于该产品框架的UI 模块,通过下面的代码片段进行简单介绍。代码示例动态交互的数据产品 tabItem 是shinydashboard 中各模块的单位,对应图中的“情感走势”模块。fluidRow将页面分成了不同的行:本例中包含了两行,用逗号隔开。fluidRow内部可以分列,用column来指定列,每一行可以有多个列,用逗号隔开。在column 中可以保护前端控件,本例中第一行是plotlyOutput图形模块,第二行是sliderInput滑动输入条。plotlyOutput 来自于plotly 包,是强大的开源图表库plotly.js 的R 接口。Plotly.js 是一个JavaSc
31、ript 图表库,集合了20 种图表类型,包括3D 图表、常用统计图形和SVG 地图,都能实现动态交互的效果。plotly 包还有个特殊的功能,就是可以使用ggplot 的语法把图形直接转化成plotly.js 的动态效果。动态交互的数据产品 用户使用plotly 包可以在完全不了解JavaScript 语法和数据结构的前提下绘制动态图形,非常方便。该包还提供了plotlyOutput 和renderPlotly 函数用来和Shiny 交互,舆情系统示例里就实现了一个散点图:该图的横轴表示某一天正面情感的新闻所占的比例,纵轴表示负面情感的新闻所占的比例,散点的直径表示当日新闻总数,构成气泡图;
32、在图形下方加上一个时间轴,随着时间的变化,气泡图发生变化;上述过程实现动态的效果,名为动态气泡图。该示例中,使用sliderInput 滑动输入条作为输入,用户拖动到某个日期后,服务端的程序自动计算出当天的相关数值,并实时地更新plotlyOutput 的结果,于是实现了动态气泡图。动态交互的数据产品 本节以动态气泡图为例介绍了一个交互式的可视化案例,这也是数据产品的常见形式。在Shiny 的框架下结合plotly 包可以实现大部分的常用统计图形的动态交互形式。此外还有一些受欢迎的第三方包可以配合使用,比如wordcloud2 包的词云图、leaflet包的动态地图、DT包的动态表格、rglwidget 的3D 图形等。动态交互的数据产品