Author Archive for 写长城的诗

电影爱好者的R函数

作为一个伪影迷,经常纠结一些电影该不该下,要不要看。毕竟吾生也有涯而片源无涯。还好可以去豆瓣一类的地方看看大家的评分择优录用。去豆瓣查分需要登录网站搜索再鼠标点点点,如果要查好几部电影就有点费事儿。其实可以用R写个函数,先抓取相应的网页,再筛选返回需要的分值。这样在R里头就可以批量查分了,恩,走起来。

library(RCurl)
library(XML)
movieScore <- function(x) {
stopifnot(is.character(x))
# 提交搜索豆瓣表单
search <- getForm("http://movie.douban.com/subject_search", search_text = x)
searchweb <- htmlParse(search)
# 解析搜索结果页面
resnodes <- getNodeSet(searchweb, "//div[@id='wrapper']//table[1]//a")
if (is.null(resnodes))
return(NULL) else resurl <- xmlGetAttr(resnodes[[1]], name = "href")
# 得到影片页面后第二次解析
resweb <- getURL(resurl, .encoding = "UTF-8")
content <- htmlParse(resweb, encoding = "UTF-8")
resnodes <- getNodeSet(content, "//div[@id='interest_sectl']//p[@class='rating_self clearfix']//strong")
namenodes <- getNodeSet(content, "//div[@id='content']//h1//span")
# 得到影片评分
score <- xmlValue(resnodes[[1]])
name <- xmlValue(namenodes[[1]])
return(list(name = name, score = score))
}

看看天机这部大烂片多少分。

movieScore("天机")
## $name
## [1] "天机·富春山居图"
##
## $score
## [1] "2.9"

抓网页比较慢,豆瓣为人民群众着想提供了API,我们也可以使用API来调取分数,函数也比较简单。

library(RCurl)
library(XML)
library(RJSONIO)
movieScoreapi <- function(x) {
api <- "https://api.douban.com/v2/movie/search?q={"
url <- paste(api, x, "}", sep = "")
res <- getURL(url)
reslist <- fromJSON(res)
name <- reslist$subjects[[1]]$title
score <- reslist$subjects[[1]]$rating$average
return(list(name = name, score = score))
}
movieScoreapi("僵尸世界大战")
## $name
## [1] "僵尸世界大战"
##
## $score
## [1] 7.5

有了这个查分函数,我们可以在R中批量查阅电影评分了。但是豆瓣对于频繁的访问会有限制,对于没有认证的API使用是每分钟10次,超过就会暂时封IP。对于网页抓取,肖楠在第六次R会议上有个很棒的演讲,有兴趣的同学可以去统计之都看看。

实现可重复的统计slides

制作幻灯片是数据分析师的必备技能之一,优秀的slides对外可以忽悠住客户,对内可以震慑住领导。精良的slides要秀外慧中,有逻辑有内容,还要有外形有风格。达到这种标准并不容易。在过去,你可能使用office中的ppt来做传统意义的幻灯片,将图片和代码费力的copy到一张张的slides上去,然后到处找模板。但这种方式已经凹特了。

在HTML5的发展背景下,已经出现了大批以网页形式的slides框架,例如:Google IO 2012\HTML5 slides\HTML5 Rocks\Shower\Deck.js这个名单可以很长。而这里只是其中六种演示框架的介绍。在这些slides框架下,你只需要懂一点点web知识,将图片和数据嵌入到一个html模板中,就可以生成一个动态可交互的slides。

实际上对于统计分析的slides,有一种工具可以使我们的制作效率更高。这就是谢益辉的knitr包。knitr像一把钥匙,打开了可重复统计报告的大门,同时也打开了通向html的大门。可以使R代码、运算结果和分析文字自然的融为一体,能自由的输出为LaTex、Markdown或者是Html。在借助knitr打通了这些奇经八脉之后,可以惊奇的发现,knitr可以将以上所有东西粘在一起,有助于实现可重复的统计分析幻灯片。

以后的工作流应该是这样的:数据分析的过程和结果均存放在rmd文件中,可根据不同需要转换为pdf或是html,当需要制作slides的时候,只要将生成的html进行一点加工,加入一些js/css效果即可生成美观炫目的slides。目前已经有很多这类现成的例子,例如coursera的公开课data analysis就是使用了这种slides来讲解R和数据分析。作者利用的是名为slidify的R包,直接从rmd文档生成html5的slides页面,非常推荐各位去下载来研究一下。

slidify使用的默认框架是io2012,比较淡雅朴素,另一种比较炫目的框架是reveal.js,这里有一个例子值得参考下。这份slides的原码可以在此找到。这份slides是使用reports包来生成的,基本流程如下:

install.packages(“reports”)
library(reports)
presentation(‘example’)
setwd(‘~/example’)
reveal.js()

安装reports包后使用presentation建立一个目录,这个目录会在当前R工具目录下自动生成,之后用户在目录下的rmd文件中编辑内容,保存后生成html文件,最后使用reveal.js函数生成slides,你会在reveal.js目录下找到index.html,就是最终的文件。由于reports包的瑕疵问题,在reveal.js前一步你可能需要手动切换一下工作目录。而且最好是再手动编辑一下index.html文件,以完全自定义实现reveal.js的各种特效。笔者也做了一个简单的slides可以看一看。关于reveal.js的完整资料看这里。 

相比reports包,slidify要显得稳定些,使用方法也类似,但它还放在github上,所以要用devtools包来下载它:

install_github(“slidify”, “ramnathv”)
install_github(“slidifyLibraries”, “ramnathv”)
library(slidify)
author(‘example’)
slidify(‘index.Rmd’)

加载slidify后使用author,它会自动在当前工作目录下建立example目录,并打开index.Rmd文档,供用户编辑,当然在写slides的时候需要遵从一定的格式才会让它识别。写完之后使用slidify即可生成网页。目前slidify支持的框架不多,但在开发版本中已经支持了包括reveal.js在内的很多框架了,所以尽请期待吧。

初学D3的感觉

简单来讲有如下三点感受:

  • D3很强大
  • D3并不容易学
  • 学会D3并不等于学会了可视化

一山还有一山高,在翻过ggplot2这座山后,发现还有D3这座珠穆朗玛。ggplot2已经非常好了。能够实现The Grammar of Graphics的精义,有很丰富的对象和灵活的自由度,但这都还不够,因为ggplot2只能够生成静态的图形。如果你只需要写一篇分析报告,那么ggplot2是足够的。但如果你想让数据在网页上飞翔,就需要D3做为翅膀。

D3和ggplot2的共同点在于都可以实现数据到图形元素的映射,但D3更为底层一些。它的优点在于:

  • 用D3进行可视化,你只需要一个浏览器+编辑器就可以完成工作,并不需要其它环境,也便于分享。
  • 灵活性强,它可以很好的利用现有的web技术 HTML, CSS, SVG,操纵页面的任何一个对象,和数据绑定,无中生有的生成svg元素,进而由浏览器渲染成图形。
  • 它也能利用现有浏览器上可以实现的js函数,实现和用户的即时交互。
  • 此外,大量的文档和案例提供了很好的学习资源。

底层也意味着用它来绘图不是一蹴而就的事情。D3并不是一个图表库,例如它没有任何一个函数可以直接画出箱线图出来。它只是javaScript的一个函数库,你需要考虑到各个方面,操很多心,费很多步骤才能画出一个简单的图形。当然现在已经有了很多基于D3的库,例如Vega,在R里面也有clickme包可以将数据直接转为D3。不过对于D3,知道的越多越好,例如HTML,CSS,SVG,DOM,JavaScript。

可以这样来描述一下D3的特点:D3是一个组装生产线,这个生产线首先要放在一个车间里面,这个车间就是HTML。其次生产线上要有元件进来用以组装,有两种主要元件分别是数据和svg元素,D3首先读取json,csv,tsv格式文件,然后将数据和body内的svg元素属性绑定,组装的结果是一个新的HTML页面,最后的任务就是交给浏览器去展现数据特征。而D3这个生产线应该如何运转,则依赖于工程师头脑中的生产工艺或方法。

D3是一种可视化的工具,它本身并不能告诉你如何实现一个优秀的可视化。正如同拿着青釭剑的夏侯恩,并不能击败常山赵子龙。学会了D3,只是学会了将数据摆放到屏幕上,但什么样的摆放方式才是美的,有效的。这还需要更多可视化的理论学习和实践。

数据可视化本身不是目的,目的在于传送数据中隐藏的信息。人类不善于直接解读数据。但人类的视觉系统善于阅读图形,并从中搜寻模式。可视化就是将数据编码成图形,再由其它人读取图形,解码信息。这种可视化实际上是一种对已知数据进行解释性可视化的过程,一种讲故事的方式,这种情况下用D3是很适合的。而另一种探索性可视化,是对未知数据的描述,讲故事的人本身不晓得数据中有什么玄机,此时用D3就不大合适了,而应该换用快速的绘图工具。不过总而言之,学习D3是值得的,正如同学习R一样,谢益辉曾说:使用R将迫使你深入的理解统计,而使用D3也有同样的效果,使D3它将迫使你成为真正的可视化大师。

正所谓:内修于心,外显于形。

其它:
学习D3的预备资料:
http://www.w3school.com.cn/
www.codecademy.com
学习D3的几种入门材料:
http://code.hazzens.com/d3tut/lesson_0.html
http://www.dashingd3js.com/table-of-contents
http://ofps.oreilly.com/titles/9781449339739/

R连接MySQL数据库方法备忘

R语言连接数据库可以利用数据库的存贮能力和R的计算能力,起到取长补短的效果。之前我们也说过了如何在R中使用SQL,很多教材上也提到了连接MySQL的方法,但是在安装上还需要注意一些细

R语言玩转资产组合计算

以前都是用MATLAB或是EXCEL给学生讲资产组合的计算问题,实际R语言也可以做一样的事情。资产组合要解决的问题并不复杂,即给定一个可选的资产集合,要从中选择出一个最优组合,使其收益…

灰色模型的R代码

最近帮朋友写了一个灰色模型GM(1,1)的R实现,参考网上现有的matlab代码,比较容易就可以弄出来。下面是具体过程,主函数是GM(),建立的模型是一个S3类,搭配两个自定义的泛型函数print和plot