星期三, 二月 29, 2012

R语言编程入门之五:向量化运算


和matlab一样,R语言以向量为基本运算对象。也就是说,当输入的对象为向量时,对其中的每个元素分别进行处理,然后以向量的形式输出。R语言中基本上所有的数据运算均能允许向量操作。不仅如此,R还包含了许多高效的向量运算函数,这也是它不同于其它软件的一个显著特征。向量化运算的好处在于避免使用循环,使代码更为简洁、高效和易于理解。本文来对apply族函数作一个简单的归纳,以便于大家理解其中的区别所在。

所谓apply族函数包括了apply,sapply,lappy,tapply等函数,这些函数在不同的情况下能高效的完成复杂的数据处理任务,但角色定位又有所不同。

星期二, 二月 28, 2012

R语言编程入门之四:字符串处理


尽管R语言的主要处理对象是数字,而字符串有时候也会在数据分析中占到相当大的份量。特别是在文本数据挖掘日趋重要的背景下,在数据预处理阶段你需要熟练的操作字符串对象。当然如果你擅长其它的处理软件,比如Python,可以让它来负责前期的脏活。

获取字符串长度:nchar()能够获取字符串的长度,它也支持字符串向量操作。注意它和length()的结果是有区别的。

字符串粘合:paste()负责将若干个字符串相连结,返回成单独的字符串。其优点在于,就算有的处理对象不是字符型也能自动转为字符型。

星期一, 二月 27, 2012

R语言编程入门之三:输入与输出


如同ATM机一样,你首先得输入银行卡,才能输出得到钞票。数据分析也是如此,输入输出数据在分析工作中有重要的地位。下面对R语言中一些重要的输入输出函数进行小结,而其它的函数请参考官方指南

1 读取键盘输入
如果只有很少的数据量,你可以直接用变量赋值输入数据。若要用交互方式则可以使用readline()函数输入单个数据,但要注意其默认输入格为字符型。scan()函数中如果不加参数则也可以用来手动输入数据。如果加上文件名则是从文件中读取数据。

2 读取表格文件
读取本地表格文件的主要函数是read.table(),其中的file参数设定了文件路径,注意路径中斜杠的正确用法(如"C:/data/sample.txt"),header参数设定是否带有表头。sep参数设定了列之间的间隔方式。该函数读取数据后将存为data.frame格式,而且所有的字符将被转为因子格式,如果你不想这么做需要记得将参数stringsAsFactors设为FALSE。与之类似的函数是read.csv()专门用来读取csv格式。

星期六, 二月 25, 2012

在Twitter上你应该关注谁?

社交媒体中的数据挖掘是当今比较热门的领域之一。各平台公司都想从用户的数据中寻找其偏好特征,提供个性化的服务。其中一种服务就是在微博平台中向用户推荐值得关注的对象名单。如果用户已经使用了一段时间的服务并关注了一些对象,那么有一种简单思路可以为其提供更多的关注对象。

俗语说:人以群分,物以类聚。朋友之间基本上是臭味相投的,再进一步延伸,朋友的朋友也应该能成为新的朋友。那么进行推荐服务的方法可以这样来实现:先找出用户已经关注朋友的名单,再进一步找出每个朋友所关注的对象,再根据频数作为推荐的权重。下面我们用Twitter为例用R语言来实现这种思路。

星期五, 二月 24, 2012

用R实现生命游戏(Game of Life)


生命游戏是英国数学家John Horton Conway在1970年发明的细胞自动机(cellular automaton)。它最初于1970年10月在《科学美国人》杂志中出现。生命游戏是在一个二维矩形世界中,这个世界中的每个方格居住着一个细胞。细胞的生命状态只有活着或死亡两种。细胞在下一个时刻的生死取决于相邻八个方格中活着细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。

其中一种较为丰富的设定有如下四条:
  • 若相邻的存活细胞数少于2,则细胞死于寂寞
  • 若相邻的存活细胞数多于3,则细胞死于拥挤
  • 若相邻的存活细胞数为2或3,则细胞继续存活
  • 若相邻的存活细胞数正好为3,死亡的细胞得到复活

R语言编程入门之二:对象和类


R是一种基于对象(Object)的语言,所以你在R语言中接触到的每样东西都是一个对象,一串数值向量是一个对象,一个函数是一个对象,一个图形也是一个对象。基于对象的编程(OOP)就是在定义类的基础上,创建与操作对象。

对象中包含了我们需要的数据,同时对象也具有很多属性(Attribute)。其中一种重要的属性就是它的类(Class),R语言中最为基本的类包括了数值(numeric)、逻辑(logical)、字符(character)、列表(list),在此基础上构成了一些复合型的类,包括矩阵(matrix)、数组(array)、因子(factor)、数据框(dataframe)。除了这些内置的类外还有很多其它的,用户还可以自定义新的类,但所有的类都是建立在这些基本的类之上的。

星期三, 二月 22, 2012

R语言编程入门之一:导论


简单来讲,编程是借助计算机来解决某个问题。学习编程的就是训练我们解决问题的能力。有这样一种说法:在未来,不会编程的人即是文盲。

1 为什么要学习R编程
大部分情况下解决某些问题还需要依赖一些事实或数据,结合数据分析的框架和计算工具来帮助我们决策和判断。这时候R语言编程就会派上用场。例如从大的方面来看,投资方要决定在何处建立风力发电场,就需要采集天气数据加以建模分析,评估各项目方案。从小的方面来看,个人是否应该购买某个理财产品,你需要获取过去的市场信息,模拟未来可能的变化,计算该项资产未来的期望收益和标准差。所以说学习R编程就是学习在数据环境中解决问题,从中磨练技术、锻炼智力,还能得到满足的快感。

  • 学会R编程,才能理解高手的代码,并从中领会其用意并成为真正的高手。
  • 学会R编程,才能深入了解函数背后的理论,从而进一步解决从未有过的新问题。

星期二, 二月 21, 2012

新书推荐:大数据时代的工具集


该书简要介绍了60多种大数据相关的工具,从NoSQLMapReduce,以及各种机器学习和可视化工具。初看这本书封面的时候很容易被唬住,以为又是O'Reilly出的一本大作。实际上它只是一本超薄的小册子,或者更准确的说,是一篇超长的文章。对于业界专家来讲,这本书可能不值一晒,但对于想跨进Big Data大门的初学者,此书还是有一些参考价值。至于在哪可以得到这本书,你懂的。

星期日, 二月 19, 2012

关于Jeremy Lin的twitter词云

标签云或词云(word cloud)是关键词的视觉化描述,用于汇总用户生成的标签或一个网站的文字内容。word cloud实际上是将文档包含的词汇频率表进行了可视化。这些词汇的重要程度主要通过改变字体大小或颜色来表现。这项技术常用于具体化、形象化一些热门话题或文本内容。好吧,闲话少说,趁着Jeremy Lin的热度尚在,我们来看看在推特上人们谈到他的时候会提到哪些关键的词汇。

星期六, 二月 18, 2012

数字显微镜下的林书豪

现在网络上最为炙手可热的人物恐怕就是NBA新星林书豪(Jeremy Lin)了,但是俗话说:不怕不识货,就怕货比货。这位初生牛犊与其它NBA巨星相比,到底有多么优秀?还有多少差距?还是让数字来说话吧。首先从这里下载2011-2012NBA赛季的球员数据,该数据中共有四百位球员,取得分最多的前一百位球员,将其数据拷贝到Excel中,并将林同学的数据添加在最后,删除了所属球队和排名之后我们得到了一个CSV数据文件。数据中的变量说明附后。

第一步:我们先画出这些变量的相关系数图,以剔除一些冗余的变量,从下图可看到深兰色方块即表示两组数据间有较强正相关,那么我们只需取其中一组数据即可,例如TRB(篮板总数)就可以代替ORB/DRB/BUK。由此我们提取MP/FGA/FGP/X3PP/FT/FTP/TRB/AST/STL/PF/TOV/PTS这12个变量作进一步处理。

星期三, 二月 15, 2012

用ggplot2包绘制风向风速玫瑰图

风向风速玫瑰图(wind rose)是气象学家常用的图形工具,描述了在一个特定的地点,其风速和风向是如何分布的。风向风速图实际上是一种条形图的扩展,它使用网格化的极坐标系统,用不同的方位来汇集风向及其频数,频率最大的方位,表示该风向出现次数最多。并且还用不同的颜色带来区别风速的大小。在本例中我们首先使用ggplot2包来绘制如下的风向风速图,再用专门工具进行示例。

星期二, 二月 14, 2012

如何绘制蜡烛图并添加自定义指标

股票分析中的蜡烛图和技术指标并非什么神奇的东西。指标只不过是过去历史数据的一种函数。再复杂的函数,其输入变量都是过去已经发生的事情。而过去发生的事情,未来不一定重复。所以在学术界,对于股票价格的走势大多是以带漂移项的随机过程来建模。其中重要的因素就是随机因子对于价格的冲击。

如果你用一个蒙特卡罗仿真构建一个虚拟的股票趋势,那些迷信技术分析的人看到了或许就会跑过来问你这支股票的代码。技术指标虽然没什么预测的能力,但技术指标可以告诉我们已经发生的事情,所以有时候需要绘制蜡烛图,可能还需要添加一些自定义的指标。R语言中的quantmod包是一个非常强悍的金融计算包,它可以帮助股票分析人员进行定量化交易的研发、测试和部署。有兴趣的同学可以参见它的官方网站,不过作者似乎很长时间没有更新了。另外,邓一硕在其博客中也对quantmod包作了很完整的总结,除了关键的交易系统建模部分。

如何分析twitter中包含的投资者情绪


投资者情绪(investor sentiment)是反映投资者心理的重要因素,它是一种反映投资者的投资意愿或预期的市场人气指标,对证券市场的运行和发展有很大的影响。以往对投资者情绪指数的衡量主要通过两种方式,一个是通过问卷调查等方式直接测量,另一个是通过分析有关交易数据来间接测量。

随着社会化媒体的盛行,Twitter上的推文也可以被看作是一种情绪指标。英国伦敦基金公司Derwent Capital Markets就利用Twitter上发表的推文,统计大众情绪来预测股市走势,在2011年全球市场低迷之中,还能维持1.85%报酬率,领先S&P500指数。

星期日, 二月 12, 2012

数据挖掘中的九种错误


1 只关注训练数据
训练样本之外的数据才是真正重要的。安德森医疗中心的研究人员在十年前使用神经网络来检测癌症。相对于训练样本,他们的检验样本表现不佳,但还算不错的。但他们认为应该加大神经网络的训练时间,结果检验样本的表现比以前更为糟糕。这就是一个很典型的过度拟合的案例。避免过度拟合的重要手段是保留数据。一些有用的方法包括:自举法(bootstrap)、多重交叉检验(cross-validation)、刀切法(jackknife)、留一法(leave-one-out)。

2 只依赖一种技术
有句老话说:如果你手里只有一把锤子,那么看任何东西都象是一个钉子。在不同的问题背景下,模型的效果是不同的,你必须有一整套工具才能从中选择一种最优的。对同一个问题,至少你得比较新旧两种方法的优劣。相对于专业知识和数据的优良性,单一的建模技术不一定能解决很大问题。John Elder等人在1997年用五种算法对六类数据集进行了比较研究,结果发现没有一种算法能够通吃所有的数据。所以说,一把钥匙开一把锁。

星期六, 二月 11, 2012

用twitteR包对中文推特用户的抽样分析


社会化媒体的信息量巨大,一向是数据分析的热门领域。Twitter作为最为火爆的微博网站吸引了大量用户,也蕴含了大量信息。Twitter的数据信息其实包括两个部分,一个是发推内容,一个是发推用户。本文希望对中文twitter用户的情况进行一些粗浅的分析,算是抛砖引玉。

较早的时候就有人作过Twitter中文用户调查,它是以问卷的形式收集了500人的数据,得出了一些有趣的结论。本例则是希望利用twitteR包获取更多中文Twitter用户样本加以分析。首先遇到的第一个问题就是如何分辨出中文用户,笔者是从这篇博文获得启发,思路就是先从一位中文推特界的大佬入手,那么其粉丝应该基本上就是中文用户了。本例中选择的对象是“连岳”(lianyue),他的粉丝数达到了八万人。可能会问为何不选有十二万粉丝的“艾未未”?因为他比较国际化一些,其粉丝有不少是外国友人。

星期五, 二月 10, 2012

用图形和颜色来表现相关关系

进行数据分析建模首先要了解变量间的关系。对于连续数据来说,散点图可能是最为有效的一种工具。散点图通常对两组连续数据比较合适,如果是多元数据,那么可以使用散点图矩阵(ScatterMatrix)来两两展示数据相关关系。

R语言中包含了各种不同版本的散点图函数,魏太云在这篇文章里就对这些函数进行了讲解举例,如果需要更完整的文档,可以参考R官方站的一份关于多元数据可视化的资料。还可参考笔者之前的博文。但我们在这里希望用图形和颜色来表现这种相关关系,而非散点图矩阵。用到的R语言包是corrgram包和ellipse包。

星期四, 二月 09, 2012

想欢乐一下吗?试试在R里面玩数独

数独(Sudoku)一词来自日语,意思是“单独的数字”。它是一种填数字游戏,最初由十八世纪的瑞士数学家欧拉发明的。1984年日本益智杂志将其加以改良,并增加了难度,还为它取了新名字称做“数独”。1997年,一位爱尔兰人无意中在日本发现这个游戏,并编写了一个计算机程序来自动生成完整的数独方阵。2004年年底,伦敦《时报》开辟了数独专栏,之后,世界各国数十家日报相继开辟专栏来介绍数独。专门介绍这种娱乐的杂志和一本又一本的书籍如雨后春笋般涌现,相关的比赛,网站和博客等等,也接二连三地冒出来。

R语言拥有数千种扩展包,除了提供数据分析之外还有各种千奇百怪的功能。其中就包括了sudoku包,它的主要功能包括生成数独问题、解数独、玩数独,还可以进行导入和导出。

星期二, 二月 07, 2012

使用snow包实现双核心并行计算


在数据挖掘和机器学习领域有许多的算法需要强大的计算能力,如果对大数据进行运算操作,那么其工作量之大使单个CPU核心难以承受负荷。目前的个人计算机已经具备有多个核心,如果采用并行计算将任务分解到多个核心上运行就能大大减少计算时间。进一步还可以将多台计算机组合成计算集群(Cluster)则能使之具备组合金刚般的运算能力。

目前已经有多个R语言扩展包专注于高性能运算,弥补了R本身单核心作业的弱点。其中snow(Simple Network of Workstations)是R语言中最流行的并行编程包于2003年推出,本文将尝试用snow来运算K均值聚类

星期日, 二月 05, 2012

用R语言计算微积分

R语言是一个优秀的统计计算环境,但它能计算微积分吗?回答是:这个可以有。虽然在这方面R比不上Mathmatica或是Matlab,不太复杂的问题仍然能解决。以下图为例,我们希望计算两个简单问题,一个是sin函数在x=4处的导数。另一个问题是计算sin(x)在0到pi之间的曲线下面积。

星期六, 二月 04, 2012

利用RStudio Server在浏览器中运行R语言

RStudio是一个非常优秀的R语言IDE。在之前的博文中也介绍过它。 RStudio除了在各种系统中有桌面版本外还有Server版,它可以装载在linux主机上,用户可以通过浏览器远程登录使用R进行数据分析。笔者在之前也曾经折腾过好几回都没成功,不过今天运气不错居然实现了。

安装流程:
第一步:你得有一台装有linux的计算机作服务器,首先在终端中装载R语言
$ sudo apt-get install r-base

星期五, 二月 03, 2012

新书推荐:R之地狱神曲



《R inferno》并不算新书,它在2011年就推出了免费电子版,在2012年进行改版后推出了纸质版。但在它的网站上仍然可以下载到完整的PDF文档。

星期三, 二月 01, 2012

从Twitter招聘信息看R语言的重要性

随着大数据时代的到来,对于数据科学和R语言的人才需求日渐旺盛。前段时间美国总统Obama在招募竞选团队时就提供了数据分析的职位,并要求具有R语言的技能。著名的网络公司Twitter最近发布了一则招聘信息,寻找数据科学家或分析师,以帮助他们从大数据中获取信息。从招聘要求中,我们可以看到业界对于数据科学和R语言的态度。如果你想在将来从事数据科学事业,这些信息也能帮助你了解自己需要哪些方面的技能。Twitter的招聘信息如下:

关于工作的描述:
我们正在寻找干劲十足的人来帮助我们从Twitter的大规模数据中提取内容。作为分析团队中的数据科学家,你将使用统计分析和数据挖掘技术来帮助我们更好地理解用户,确定是否应该推出新功能,并衡量整个组织是否成功。你应该热衷于寻找数据中的知识,并使用定量分析方法来回答复杂的问题。