星期四, 六月 28, 2012

用ggmap包进行地震数据的可视化

最近又发现了一个比较好玩的包ggmap。从名字上可以猜测出来,它的作用就是将ggplot2和map相结合。这样R语言用户能方便的获取各种静态地图数据,并在其基础上使用强大的ggplot绘图工具。ggmap包整合了四种地图资源,分别是Google、OpenStreetMaps、Stamen和Cloudmade。为了演示ggmap的作用,本例是从地震信息网获取最近一周的地震数据,得到其经纬度,然后以散点形式绘制在google地图上,另外也显示地震发生的密度估计。这个思路本质上和之前的一篇博文是一致的,但用ggmap包实现起来更为简单。

星期三, 六月 27, 2012

如何用R来处理图片


做为“会电脑”的人,除了“友情”帮别人装系统杀杀毒之外,时常会承担一些图片处理的活。也就是对一些照片施加缩放、旋转、裁剪之类的事情。这类小事自然无需动用photoshop这种庞然大物了。在R语言中就有一个很好玩的biOps包,它可以很方便的进行各类图片处理操作。而且用程序来处理图片有一个天然的优势,就是很容易进行批量处理和自动化处理。下面以本人的头像机器人瓦利来做一些简单的示范。

# 加载扩展包
library(biOps) 
# 读取本地的图像文件,观察到此图像是399*399像素的rgb图片
x <-  readJpeg("d:\\xccds.jpg")
print(x)
# 先尝试缩放操作,后面的参数是缩放的比例,可以采用四种方式进行插值,这里用的是最近邻法
plot(imgScale(x,1.3,1.3,interpolation='nearestneighbor'))
#之后进行柔化降噪,此处采用的是中位数滤镜
plot(imgBlockMedianFilter(x,5))



星期二, 六月 19, 2012

ggplot的图形组合与添加jpeg文档的方法


最近有位朋友问了一个关于ggplot2作图的问题。涉及到多个图形组合的问题,所以还是费了一些时间来解决,自己也从中学习了一些新东西。顺手将这个画图的过程扔上来当作一篇博文吧。下图就是最后的结果。画这个图有几个障碍,一个是二维散点的置信椭圆,另一个是一维直方图的边缘显示。解决的方法是用ellipse包来生成置信椭圆数据,并且用gridExtra包来组合多个图形,还要用opts来去除图例标注的显示。

星期日, 六月 17, 2012

初次尝试igraph包


igraph是为了进行社会网络分析而创建的一个包。与R语言中同类包相比,它的速度更快,而且函数命令与图形展现更为丰富。它可以处理有向网络和无向网络,但无法处理混合网络。igraph中的函数非常多,本文只是初步的介绍如何创建图形,并提供一些简单的例子。
# 可以使用最基本的graph函数,用向量作为参数来创建图形,之后用plot绘制出结果
library(igraph)
g1 <- graph( c(0,1, 1,2, 2,3, 3,4))
plot(g1,layout=layout.circle(g1))

# 也可以画出一些特殊结构的图形,例如下面的星形图
g2 <- graph.star(10, mode = "in")
plot(g2,layout=layout.fruchterman.reingold(g2))

星期六, 六月 16, 2012

基于模型的决策树


线性模型是很常用的一类建模方法,它可以用于回归和分类问题。但有时候用全体数据来建模并不理想,这是因为数据内部存在一些局部特性。例如我们要考虑教育对收入的影响程度,那么对于不同的性别,这个影响程度可能也是不同的。所以我们会将数据先进行分割,然后对每个组分别进行回归建模。这种模型和分割相结合的方法又称为基于模型的递归分割算法(model-based recursive partitioning algorithm)。这个工作可以通过手工分组或加入虚拟变量来做,更方便的是利用party包中的mob函数来完成。
mob函数算法的基本步骤如下:
  • 对所有数据构建线性模型
  • 根据不同的分割变量,评价模型参数的不稳定性。选择某个分割变量使模型参数不稳定性最大。
  • 计算分割变量的分割点
  • 将数据根据上述结果分成两个子集
  • 重复上面的步骤

下面的算例来自于faraway包中的psid数据集,其中我们关注的是不同性别的组中,教育对收入的影响。
library(party)
data(psid, package = "faraway")
mod1 <- mob(sqrt(income) ~ educ | sex, data = psid)
plot(mod1)
plot of chunk unnamed-chunk-1
可以观察到男性组别中,教育对收入的影响显然要更大一些。mob函数也可以处理两分类变量,下面的算例来自于mlbench包中的PimaIndiansDiabetes2数据集,其中我们关注的是对糖尿病风险的影响因素。
data(PimaIndiansDiabetes2, package = "mlbench")
data <- na.omit(PimaIndiansDiabetes2[, -c(4, 5)])
mod2 <- mob(diabetes ~ glucose | pregnant + pressure + mass + pedigree + 
    age, data = data, model = glinearModel, family = binomial())
plot(mod2)
plot of chunk unnamed-chunk-2
从上图可以观察到,首先将数据根据体重变量mass进行了分组。在体重较轻的一组即结点2中,糖尿病发病风险较低,但随着血糖浓度glucose的增加,风险也在急剧增加。在结点4中表示了体重较大但年龄小于30的人群,糖尿病发病风险整体上升。而结点5中表示了体重较大且年龄大于30的人群,糖尿病发病风险达到最大,随着血糖浓度的增加,风险也在逐步增加。
参考资料:
http://cran.r-project.org/web/packages/party/vignettes/MOB.pdf
顺便说下,本文是采用knitr包+markdown+Rstudio生成html后,贴在博客上的,语法高亮木有了,整体效果不算很好。

星期四, 六月 14, 2012

成为优秀的数据挖掘者所需要的七条建议



这七条建议是数据挖掘领域的资深专家Dean Abbott在一个访谈中提到的部分内容,原文可以参见这里

1、在数据挖掘项目中最为重要的是清晰的定义问题。将商业目标与合适的数据分析技术相匹配并不是一件容易的事情。所以项目首要任务就是明确问题和目标变量。

2、不去试图代替业务专家。业务专家拥有专门业务领域的知识,他可以帮助你理解数据的意义。数据挖掘者本身并不能给出商业方案。其作用在于将数据信息处理成有意义的结构,然后使业务专家做出更好的商业决策。

3、单独一个模型无法把握全局。每个模型都会提供一个不同的视角,所以我们需要将多个学习器加以组合,使我们对数据的把握更为全面。

4、决策树是一种贪婪算法。决策树模型的结果可能会欺骗你,因为分枝一旦确定就不能再回头修改。而随机森林是决策树的组合算法,从而弥补了这种贪婪的特性。

5、归纳有时候对数据是不公平的。计算平均数等统计量有时候是有用的,但也会有欺骗性,所以将数据可视化永远是必要的步骤。

6、没有什么能击败时间。管理人士需要提供数据分析师充足的时间资源。时间可以发酵灵感,有时候在不经意间,你能构想出解决问题的处理方法。

7、何时停手并没有一定之规。一般来讲,如果建立的模型表现一致,就可以说已经从数据中获得了足够的东西。有时候你还得考虑项目所剩的时间和其它资源,以决定何时终止挖掘。毕竟数据挖掘的边际报酬是递减的,你需要考虑到进一步实施挖掘工作的回报问题。

星期日, 六月 10, 2012

基于密度的聚类分析

聚类分析是一种无监督学习方法,目的是捕获数据的自然结构,从而将数据划分为有意义的组。聚类分析还可以用来对大数据进行预处理,为进一步的数据挖掘工作起到压缩和降维的作用。在前面的文章中我们已经谈到了K均值聚类和凝聚层次聚类。K均值聚类使用非常广泛,作为最为古老的聚类方法,它的算法非常简单,而且速度很快。但是其缺点在于它不能识别非球形的簇。我们可以用一个简单的例子来观察K均值聚类的弱点。

我们先构造一些人为数据,它是基于sin函数和cos函数构成的两组点。如果我们用传统的K均值聚类,结果如下图所示。其聚类结果是不理想的,因为它不能识别非球形的簇。

星期四, 六月 07, 2012

北上广三地的空气质量抽样比较


从前看《龙文鞭影》里的小故事,印象中有“秦宓论天”这么一个典故。在莫谈国事的天朝,“天”乃是肉食者的禁脔,草民无权过问,茶馆里只能谈天气。但最近不仅不能谈“天”,据说连“天气”也不能谈了。所谓越是禁止的就越有破禁的快感。今天就来专门谈一谈天气。武汉的天气我们已经谈过,本文就来干涉下上海、北京和广州三地的天气内政,焦点即是这三个城市的空气质量情况。

我们的思路是从Twitter上采集空气质量数据,由于美国上海领事馆目前只公布了不到700条信息,所以我们只采集了660条,该数据是每小时公布一次,也就得到了最近约一个月的数据。我们的重点是AQI(Air Quality Index)数字。关于AQI的解释可以看这里。 收集的数据发现有少量是缺失值,这可能是仪器故障、爆表或是人员失误。而且广州领事馆发布的数据有不少格式不符的。数据收集之后进行了预处理,以转成容易处理的数据框格式。然后我们绘制了小提琴图,以观察不同城市的AQI数据,数值越大表明空气质量越差。

星期二, 六月 05, 2012

降维中的特征选择


在数据挖掘过程中,高维数据是非常棘手的研究对象。特别是在文本挖掘、图像处理和基因数据分析中,维度过高使很多学习器无法工作或效率降低,所以降维也是数据预处理过程的一项必要任务。降维大致有两大类别,一类是从原始维度中提取新的维度,例如主成分分析或因子分析,再或者是奇异值分解或是多维标度分析。另一类是从原始维度中选择一些子集,即称为特征选择(Feature Selection),或者叫作最佳子集选择。特征选择本质上继承了Occam's razor的思想,从一组特征中选出一些最有效的特征,使构造出来的模型更好。

进行特征选择的好处在于:
  • 避免过度拟合,改进预测性能
  • 使学习器运行更快,效能更高
  • 剔除不相关的特征使模型更为简单,容易解释

星期五, 六月 01, 2012

红楼梦文本折腾纪要


虽然对红学一无所知,对文本挖掘只是“略懂”,但并不妨碍我们勇于折腾的生活方式。上周参加了第五届R会议,学到不少好东西,其中一个就是中文分词的工具。当然要找个对象来折腾一下啦。本次的黑手就伸向了被人蹂躏无数次的小说《红楼梦》。

折腾的思路基本上就是:1、将文本按章回划分。2、按章回获取某些统计量,看能否区别前八十回和后四十回。3、中文分词后以空间向量模型方法构造词条-文档关系矩阵。4、计算文档间距离后用多维标度方法降到二维展现120回的散点图形。

先从网上扒拉下一个纯文本的文档,也不知道什么版本。先用记事本打开后转成UTF8格式,然后在R中读入资料。此时的存储格式是list格式,list的每一个元素是文本中的一段。首先找出文本的章节划分点,然后计算出每一章节的段落数。下图即是这120回的段落数条形图,似乎在后四十回段落数量较少,而且趋于稳定,不如前八十回变化大。对二者作一个wilcox检验,证实了数量较少的显著性。同时用置换检验也证实了这一点。