Quantcast
Channel: 数据科学中的R和Python
Viewing all 85 articles
Browse latest View live

抓取网页数据的几种套路

$
0
0

没有数据就没有乐趣。有的数据提供者心肠很好,会直接给出txt或是csv文档。这个时候我们可以直接在R里头用read.table()函数把数据读进来。

有的时候我们需要的数据在网页上以一个表格呈现,例如前面文章遇到过的地震数据。此时可以用XML包中的readHTMLTable()函数读取数据,后续再配合一些字符串处理一般就OK了。

如果你对R不大熟悉,抓取这些表格也有更方便的法子,就是利用Chrome的扩展。有两个扩展值得推荐使用:一个扩展叫作table capture,它会自动找出网页中的若干表格,你只需选择所需的那个将其拷贝到剪贴板即可,然后再用下面的命令就可以读入到R中。
data <- read.table('clipboard',T)

另一个扩展叫作scraper。先选择你所需要的部分内容,然后右键选择scraper similar也能抓取表格,不过它会存到一个google doc中去。在天朝这玩意儿不大方便。

有些数据不是以表格方式出现的,例如用XML或是JSON方式储存的数据。在R中都有对应的包来处理。下面的示例即是用XML包来处理XML数据。在此之先你需要有一点关于XML和XPath的知识,首先处理的对象是这样一个页面:http://www.w3schools.com/xml/plant_catalog.xml
library(XML)
xml.url <- "http://www.w3schools.com/xml/plant_catalog.xml"
# 解析xml页面
xmlfile <- xmlTreeParse(xml.url)
# 观察对象属性
class(xmlfile)
# 获取根结点
xmltop <- xmlRoot(xmlfile)
# 用xmlValue函数获取叶结点处的值
xmlValue(xmltop[[1]][[1]])
xmlValue(xmltop[['PLANT']][['COMMON']])
# xmlSApply类似于sapply函数,取出第一个子结点中的所有叶结点值
xmlSApply(xmltop[[1]],xmlValue)
# 进一步可以取出所有子结点中的叶结点值
plantcat <- xmlSApply(xmltop,function(x) xmlSApply(x, xmlValue))
# 将数据转为数据框
plantcat_df <- data.frame(t(plantcat),row.names=NULL)
plantcat_df[1:5,1:4]
有时候会遇到更为复杂的XML页面,此时的节点内含有参数值。如果要获取这些数据则需要使用getNodeSet()函数配合xmlValue()函数。当遇到更为复杂的数据,那我们只能用readLines读进来,再用字符串函数配合正则表达式来加以处理了。
参考资料:
http://www.omegahat.org/RSXML/Tour.pdf
http://www.stat.berkeley.edu/~statcur/Workshop2/Presentations/XML.pdf

使用GitHub进行版本控制的傻瓜方法

$
0
0

不论是团队合作还是单打独斗,代码和文档的版本控制是数据极客不可缺少的工具。高阶极客能随心所欲的用 linux终端+Git+编辑器完成这类任务。但是对于像本人一样的Git入门者来讲,图形工具还是略微让人心安一点。我们下面就来示例,用RStudio结合GitHub for Windows来完成这项任务。

首先你需要在GitHub中建立一个帐号,然后安装上述两种软件。试着登录GitHub for Windows看是否正常。此时你的本地库和远程库应该都是空的。之后在RStuio中点击新建项目,以后这个项目中的代码都会同步到远程代码库中。


输入项目名称为example,或是你想要的名字。要注意项目要放在GitHub目录下面,也就是GitHub的本地库所在目录。

建立好新项目后RStudio会自动转到新工作目录下,然后可以开始写一个R函数,存放到GitHub\example目录下面。

在GitHub for Windows中,将example文件夹拖到loacl中建立本地代码库。

双击本地库example进行本地提交,必须要填写注释内容,之后点击commit。再点击publish,就可以上传到远程代码库上了。

此时就可以在https://github.com网站中看见你的代码了。

在后面修改也很容易,修改代码后在GitHub for Windows中进行commit,然后点击sync同步即可。从GitHub上复制别人的代码只需要clone in windows就可以了。RStudio也有直接提交到GitHub的功能,但我没有尝试成功,所以借助GitHub for Windows来做,也是很方便的。

这里可以看到本人博客上用到的所有代码。请各位多多指教。Git还有其它妙用,各位可以参看下面的连接,随文附上几本Git的教程,也帮助大家更进一步的学习用好Git。

参考连接:
http://rstudio.org/docs/version_control/overview
Git详解之一:Git起步
参考教程:
git community book
git-magic
ProGit中文版

用Parallel和foreach包玩转并行计算

$
0
0

众所周知,在大数据时代R语言有两个弱项,其中一个就是只能使用单线程计算。但是在2.14版本之后,R就内置了parallel包,强化了R的并行计算能力。parallel包实际上整合了之前已经比较成熟的snow包和multicore包。前者已经在之前的文章中介绍过了,而后者无法在windows下运行,所以也就先不管了。parallel包可以很容易的在计算集群上实施并行计算,在多个CPU核心的单机上,也能发挥并行计算的功能。我们今天就来探索一下parallel包在多核心单机上的使用。

parallel包的思路和lapply函数很相似,都是将输入数据分割、计算、整合结果。只不过并行计算是用到了不同的cpu来运算。下面的例子是解决欧拉问题的第14个问题

# 并行计算euler14问题
# 自定义函数以返回原始数值和步数
func <- function(x){
n = 1
raw<- x
while(x > 1){
x <- ifelse(x%%2==0,x/2,3*x+1)
n = n + 1
}
return(c(raw,n))
}
 
library(parallel)
# 用system.time来返回计算所需时间
system.time({
x <- 1:1e6
cl <- makeCluster(4)# 初始化四核心集群
results <- parLapply(cl,x,func)# lapply的并行版本
res.df <- do.call('rbind',results)# 整合结果
stopCluster(cl)# 关闭集群
})
# 找到最大的步数对应的数字
res.df[which.max(res.df[,2]),1]
 
上例中关键的函数就是parLapply,其中三个参数分别是集群对象、输入参数和运算函数名。我们最后算出的结果是837799。

foreach包是revolutionanalytics公司贡献给R开源社区的一个包。它能使R中的并行计算更为方便。与sapply函数类似,foreach函数中的第一个参数是输入参数,%do%后面的对象表示运算函数,而.combine则表示运算结果的整合方式。 下面的例子即是用foreach来完成前面的同一个任务。如果要启用并行,则需要加载doParallel包,并将%do%改为%dopar%。这样一行代码就能方便的完成并行计算了。

library(foreach)
# 非并行计算方式,类似于sapply函数的功能
x <- foreach(x=1:1000,.combine='rbind') %do% func(x)
 
# 启用parallel作为foreach并行计算的后端
library(doParallel)
cl <- makeCluster(4)
registerDoParallel(cl)
# 并行计算方式
x <- foreach(x=1:1000,.combine='rbind') %dopar% func(x)
stopCluster(cl)

下面的例子是用foreach函数来进行随机森林的并行计算。我们一共要生成十万个树来组合成一个随机森林,每个核心负责生成两万五千个树。最后用combine进行组合。

# 随机森林的并行计算
library(randomForest)
cl <- makeCluster(4)
registerDoParallel(cl)
rf<- foreach(ntree=rep(25000,4),
.combine=combine,
.packages='randomForest') %dopar%
randomForest(Species~.,data=iris, ntree=ntree)
stopCluster(cl)

并行不仅可以在建模时进行,也可以在数据整理阶段进行。之前我们提到过的plyr包也可以进行并行,前提是加载了foreach包,并且参数.parallel设置为TURE。当然不是所有的任务都能并行计算,而且并行计算前你需要改写你的代码。

参考资料:
http://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf
http://cran.r-project.org/web/packages/foreach/vignettes/foreach.pdf
http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf

Economist风格的统计绘图

$
0
0
《Economist》(经济学人)是一份由伦敦经济学人报纸有限公司出版的杂志,于1843年9月由詹姆士·威尔逊创办。杂文章写得机智,幽默,有力度,严肃又不失诙谐,并且注重于如何在最小的篇幅内告诉读者最多的信息。杂志主要关注政治和商业方面的新闻,但是每期也有一两篇针对科技和艺术的报导,以及一些书评。从2012年1月28日的那一期杂志开始,《经济学人》杂志开辟了中国专栏,为有关中国的文章提供更多的版面。

杂志不仅文章内容精彩,排版和图片也非常具有特色。其中的统计图片均是以蓝色为基调,简洁而大气。如果你想绘制出这种风格的统计图,现在也很简单了。只需要使用R语言中大名鼎鼎的ggplot2包,以及Jeffrey Arnold新开发的ggthemes包,就能轻易的实现了。

ggthemes包还不能从CRAN库中安装,所以需要从github上下载原始文档,编译成zip本地安装包,最后在R中进行安装加载就可以使用了。如果你已经安装了Rtools,也可以使用devtools包中的install_github()函数来直接安装github上的R包。

下面就是用ggplot2+ggthemes包作的一个小例子,其中重要的就是要用到theme_economist()和scale_color_economist()这两个函数来实现economist风格的统计图。很简单吧!ggthemes包中还有其它主题可供使用,慢慢研究。


p <- ggplot(data=mpg, mapping=aes(x=cty,y=hwy))
p + geom_point(aes(color=factor(year)),
alpha=0.5,position = "jitter")+
stat_smooth()+
theme_economist() + scale_color_economist()+
labs(title = '汽车型号与油耗',
y = '每加仑高速公路行驶距离',
x = '每加仑城市公路行驶距离',
colour = '年份')

在R语言中使用SQL

$
0
0

数据分析经常需要从外部获得数据。很多情况下数据存放在关系型数据库中。一般我们可以用SQL来提取需要的数据,存为文本再由R来读入。这种方式结合了数据库的储存能力和R的分析能力,速度也非常快。但是如果要形成一套可重复性的自动工作流程,则可以将R与外部数据库连接,直接在R中操作数据库,并生成最终结果,这也是一种可行的方法。

在R中连接数据库需要安装其它的扩展包,根据连接方式不同我们有两种选择:一种是ODBC方式,需要安装RODBC包并安装ODBC驱动。另一种是DBI方式,可以根据已经安装的数据库类型来安装相应的驱动。因为后者保留了各数据库原本的特性,所以个人比较偏好用DBI连接方式。有下面这几种主要的包提供了DBI连接:RMySQL,RSQLite,ROracle,RPostgreSQL。由名字看得出它们分别对应了几种主流的数据库。

这几种数据库中SQLite是一个轻量级的数据库,完全免费,使用方便,不需要安装,无须任何配置,也不需要管理员。如果只需要本地单机操作,用它来配合R来存取数据是非常方便的。下面来看看R中操作SQLite数据库的示例。

从零开始:
1、下载SQLite,它是一个单独的执行文件,并且是在命令行下操作。如果不习惯可以安装sqlitebrowser之类的GUI。先把它放到一个文件夹中,例如sqlite。

2、在sqlite中执行sql脚本,建立一个数据库。先下载脚本文件放到同一个文件夹中,然后执行下面的。现在文件夹中应该有train.db这个数据库文件了。这里是两个sql脚本的下载地址:地址1地址2
.read Scheme.sql
.read Data.sql
.backup train.db

3、在R中安装RSQlite包
install.packages('RSQlite')

4、加载RSQlite包,建立连接后用SQL读取数据
library(RSQLite)
# 建立连接,注意数据库类型和文件地址
con <- dbConnect('SQLite', dbname='d:/sqlite/train.db')
# 观察数据库中有三个数据表格
dbListTables(con)
# 观察其中一个表的字段
dbListFields(con, 'Apply')
# 写一段SQL语句,来选取需要的数据
sql <- "select sName, GPA, decision ,cName
           from Student, Apply
           where Student.sID = Apply.sID
             and sizeHS < 1000 and major = 'CS'  and cName = 'Stanford'"
# 将选取的数据存入到data中,同时显示出来
(data <- dbGetQuery(con, sql))
# 关闭数据库连接
dbDisconnect(con)

R中还有一个有趣的sqldf包,它可以让你用SQL来操作dataframe,这种功能能让会R的人能练习SQL,会SQL的人能练习R。最后介绍一个非常好的数据库视频教程一本教材,对于初学SQL的人会非常有帮助。

参考资料:
《R in a Nutshell》

果壳中的R第二版新鲜出炉

$
0
0

《R in Nutshell》是O'REILLY公司出版的果壳系列图书之一。该系列图书的特点是知识覆盖面广,讲解全面细致,索引、参考资料以及进一步阅读都包括在内,是非常难得的桌头参考书籍。 《R in Nutshell》也继承了该系列的特点,从简单的R入门知识、R语法、数据整理和可视化,到统计回归、机器学习均有涉及,还包括了代码优化、生物计算和Hadoop的相关内容。

之前统计之都团队正组织翻译出版此书,不过英文第二版正酝酿出来,所以翻译工作暂时停下来。近日在网上看到英文第二版终于出来了,抽时间翻看一下,发现改进不少。特地搬到网盘上供各位下载

相对于第一版来说,新版本增加了两个完整的章节,即ggplot2绘图和Hadoop。这样使可视化部分终于完整的包括了基本绘图、Lattice包和ggplot2包。而且在大数据背景下,hadoop相关知识的引入也称得上是与时俱进。

新版本还修改完善部分代码,并重新安排了篇章结构。例如原来的第11章high-performance改写后成为了第24章optimizing R progrmas。

此外还增加了一些热门R包的介绍,例如plyrreshape。在回归模型中则增加了弹性网glmnet。这样总页数从原来第一版的636增加到第二版的722。

总而言之,有此书在手则基本不需要其它的R语言资料了。不过对于新人仍建立先选用较薄的入门小册子。例如《R for beginners》和《R导论》,它们都有中文版。

参加上海第五届R会议的PPT和代码

$
0
0
上海的这次R会议来了很多知名公司和嘉宾,参与听众反应也非常热烈。感觉比北京的要好一些哦。而我只不过讲了一些业余玩的东东,附上本次演讲的PPT代码

用Shiny包快速搭建基于R的交互网页应用

$
0
0

RStudio是我最喜欢用的R语言IDE,其开发团队最近又推出了一个新的产品,即Shiny包。它的作用是快速搭建基于R的交互网页应用。使得那些对代码不熟悉的人士在工作中也可以应用统计模型。对于R和web的交互,之前已经有一些相关的包,例如:rApache, Rhttpd, Rack, Rook。不过这些工具都需要开发者不仅要熟悉R,还要熟悉网页编程语言(html,CSS,JS)。而Shiny包的特点在于不需要了解网页语言,可以用纯R来搭建。生成的网页应用是动态交互,而且是即时更新的。Shiny还提供了现成组件方便快速在网页上展示数据、图表和模型,的确是非常的炫。本例将用ggplot2包来绘制iris数据集的散点图,并将图形放到网页中。

首先安装Shiny包:
options(repos=c(RStudio='http://rstudio.org/_packages', getOption('repos')))
install.packages('shiny')


再写两个R代码文件:
一个是负责前端的ui.R,另一个是负责后端的server.R。

ui.R的代码如下:
library(shiny)
library(ggplot2)
 
dataset <- iris
 
shinyUI(pageWithSidebar(
 
headerPanel("鸢尾花的数据展示"),
sidebarPanel(
 
selectInput('x','X',names(dataset)),
selectInput('y','Y',names(dataset)[2]),
selectInput('color','Color',c('None',names(dataset))),
 
checkboxInput('smooth','Smooth')
),
 
mainPanel(
plotOutput('plot')
)
))

server.R的代码如下:
library(shiny)
library(ggplot2)
 
shinyServer(function(input, output){
 
output$plot <- reactivePlot(function(){
 
p <- ggplot(dataset, aes_string(x=input$x, y=input$y)) + geom_point()
 
if(input$color != 'None')
p <- p +
aes_string(color=input$color) +
theme(legend.position="top")
 
if(input$smooth)
p <- p +
geom_smooth() +
theme(legend.position="top")
 
print(p)
 
}, height=400)
 
})

将这两个代码文件存放到同一个文件夹下,例如我是放在在"d:/rspace/shinyapp"。

最后在控制台下运行:

library(shiny)
runApp("d:/rspace/shinyapp")

之后R会自动打开系统默认的浏览器,并展示出如下的界面。




Shiny包的缺点:
在部署分享方面,Shiny包只能在本地浏览器展示应用。如果要分享给其它人的话,需要将R代码传到网盘或打包分发,而对方也需要使用runApp命令来进行本地展示。RStudio团队正在开发Shiny服务器构架,让使用者仅需要一个浏览器和网址就可以运行网页应用。不过这将是一个收费的服务。

更多示例和帮助信息,请参看:http://www.rstudio.com/shiny/

三门问题的模拟

$
0
0

有一个著名的蒙提霍尔问题,亦称为三门问题(英文:Monty Hall problem),大致出自美国的电视游戏节目Let's Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)。这个游戏的玩法是:参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,知道门后情形的节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?

这条问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起网络上一阵热烈的讨论。有人认为概率还是1/3,不用换。有人认为概率增大为1/2,可以换。实际上,如果严格按照上述的条件的话,赢得汽车的正确机率是2/3。我们可以用一种极端的方法来考虑,如果有100扇门,主持人打开了998扇空门,你换不换呢?显然是要换的。

还有许多概率推理的方法可以获得正确答案。但我们有计算机和R,让我们来写个小程序模拟一下嘛。

# 坚持不换的策略
n <- 0
for( i in1:10000){
door <- c(1,2,3)
chance <- sample(door,1)
select <- sample(door,1)
if(chance == select){
n <- n + 1
}
}
print(n/10000)
 
# 坚持换的策略
n <- 0
door <- c(1,2,3)
for( i in1:10000){
chance <- sample(door,1)
select <- sample(door,1)
remove<- ifelse(chance==select,
sample(setdiff(door,chance),1),
setdiff(door,c(chance,select)))
reselect <- setdiff(door,c(select,remove))
if(chance == reselect){
n <- n + 1
}
}
print(n/10000)
模拟结果分别是0.33和0.66,与理论结果一致。一个很简单的模拟,证明了一个略有麻烦的问题。

参考资料:
wikipedia
Data_Analysis_with_Open_Source_Tools

新书推荐:数据之魅

$
0
0

在amazon书店里头,如果将统计类和数据挖掘类书籍除外的话,还真没有一本正经八百讲数据分析的书。不过《Data Analysis with Open Source Tools》倒是填补了这个空白。一般说到数据分析,可能要么是概念和公式推导居多,要么是软件教程和计算代码居多,这本书的写作风格和内容则大不一样,作者是以一种诚恳的态度在和你聊数据分析的事情,而不是以一种教科书的形式讲技术细节。它的重点在于作者的行业经验和心得。该书提出了很多很好的行业见解,而且知识覆盖范围极广,甚至包括了一些数据建模和BI的东西,不然也不会号称是程序员和数据科学家的指南手册了。


整书分为四个部分:
第一部分谈数据的展现,即一般意义上的统计图形。
第二部分谈利用数据帮助推断和建模,提到了统计检验、量纲分析、分布、最小二乘等内容。
第三部分谈对数据的计算和挖掘,提到模拟、聚类、主成份分析。
第四部分谈数据的分析应用,提到商业智能、时间价值等经济概念、预测算法以及一些经验之谈。

这本书在导论中就谈到了一些有趣而重要的观点,例如:
Simple is better than complex
Understanding is more important than technique
Think more, work less.....

这些话和数据分析的业界共识是一样的,也就是说数据分析本身不能解决问题。需要有正确的行业理解来提出正确的问题,然后以此来构建合适的指标收集数据,在理解问题和数据的基础上,再谈算法的选择和结果的解读。问题、数据、模型是三位一体的。甚至有时候数据和算法都不是最重要的,因为在我们世界中,有一些重要的东西是无法测量的。

当然这本书也不是十全十美,因为想谈太多的东西,所以写得不会很细,好在每章后面都有推荐进一步阅读书目。而且目标读者是一些缺乏统计背景的程序员,所以统计知识有些初级,编排有些随意。在软件方面,我本来以为它会详细介绍的,其实它只是蜻蜓点水,比较杂乱,要是能只专注一两种软件就好了。

尽管如此,仍然是值得花时间看看这本导论性质的书。最后,如果你的时间真的不多,只看导论和附录就很有收获了。附录中对数据分析的软件和所需技能的评论真得很棒。而且各位也知道,我所推荐的书都是读过的,质量还是有保证的。

连接在此

如何批量处理文本文件

$
0
0
最近数据堂为了弄数据挖掘比赛提供了一批用户行为日志数据。对于以前没玩过的数据,我是特别的好奇。处理这批文本文件确实花了不少时间。数据以不同的日期作文件夹分别存放,每个文件夹中又有近一千个文本文件,每个文件都是一个用户的行为日志。为了分析这些数据,首先需要将这两万个文本文件读入R中,再用字符串函数进行处理成结构化的数据。处理方法如下:
library(stringr)
setwd('D:\\kaggle\\tang\\data')
data<- read.table('data.csv',T,sep=',')
 
# 读入文档地址
path <- 'D:\\kaggle\\tang\\data\\behavior'
dir.name <- dir('D:\\kaggle\\tang\\data\\behavior')
doc.name <- list()
fre <- numeric()
for(i in1:length(dir.name)){
doc.name[[i]]<- dir(paste(path,dir.name[i],sep='\\'))
fre[i]<- length(doc.name[[i]])
}
dir<- rep(dir.name,fre)
doc.name <-unlist(doc.name)
file.name <- character()
for( i in1:length(dir)){
file.name[i]<- paste(path,dir[i],doc.name[i],sep='\\')
}
 
# 建立抽取主函数,返回列表
data.get <- function(file.name){
#获取文本
temp <- readLines(file.name,encoding='UTF-8')
if(length(temp)<=2)return(NA)
# 用户编号
id <- str_match(file.name,"[A-Z0-9]{32}")
# 调查日期
day <- str_match(file.name,"\\d+-\\d+-\\d+")
# 开机时点
clock <-str_sub(str_match(file.name,'_\\d{2}-'),2,3)
# 切分转换文本函数
trans <- function(x){
res <- unlist(str_split(x,"\\[=\\]|<=>"))
# res <- str_extract(x, "[^<=>]+\\.[a-z]+")
return(res)
}
# 将文本切开转为列表
result <- lapply(temp,trans)
 
# 开机时长
opentime <- as.numeric(result[[1]][2])
# 先进行时间分析,由于有的信息不是按顺序排列,所以要按时点重排
# 时点抽取
time<- unlist(lapply(result[-c(1:2)],function(x) x[2]))
time<- as.numeric(time)
# 时点排序,然后重排result列表
new.res <- result[-c(1:2)][order(time)]
 
# 返回用户使用的程序向量
prog <- unlist(lapply(new.res,function(x) x[4]))
# 各程序使用时间
time<- unlist(lapply(new.res,function(x) x[2]))
time<- as.numeric(time)
time[length(time)+1]<- opentime
time<- diff(time)
 
prog.time <- data.frame(prog=prog,time=time)
progtime <- dcast(prog.time,prog~.,sum,value.var='time')
names(progtime)<- c('program','time')
 
# 使用的软件个数
numofsoft <- nrow(progtime)
# 真实使用时长
realtime <- sum(progtime$time,na.rm=T)
return(list(id=as.character(id),day=as.character(day),
clock = as.numeric(clock),opentime=opentime,
numofsoft = numofsoft,
realtime= realtime,progtime=progtime))
}
所有的文件名都已经存在file.name变量中,用上面建立好的函数data.get来提取第一份文件中的信息 
> data.get(file.name[[1]])
$id
[1]"0143692D264FD906F10B8ECAB0F139D1"
 
$day
[1]"2012-05-07"
 
$clock
[1]12
 
$opentime
[1]7771
 
$numofsoft
[1]9
 
$realtime
[1]7610
 
$progtime
program time
1 360chrome.exe 1237
2 360leakfixer.exe 3
3 360Safe.exe 12
4 360sd.exe 20
5 explorer.exe 510
6 iexplore.exe 5473
7 liveupdate.exe 6
8 popup_QQ.exe 44
9 QQ.exe 305

决策树之三国争霸

$
0
0

决策树是一种简洁实用的数据挖掘方法。在R中通常可以用rpart包和party包来实现两种算法的决策树。最近著名的C4.5决策树算法的升级版本C5.0已经可以在官网下载到。对于这三种决策树算法,本文来做一个预测效果的简单对比。

对比用的数据集是C50包中自带的churn数据,它是用来预测顾客流失的数据集,其中样本量为3333个,变量数为20个。为不平衡数据,没有缺失值存在。对比基本步骤是用10重交叉检验,将数据随机分为10份,用9份训练决策树,用1份来检验结果。循环后求出10个预测准确度的均值。然后在外面再套一个100次大循环,产生三个决策树算法各100个准确率。最后绘制为提琴图,从图中可以观察到C5.0的表现最好,而party次之,rpart的效果最差。在本例实验中最大的差距虽然不过0.02,但如果放在kaggle的数据挖掘比赛中,就相当于是一百位名次的差距了。

生成代码如下:
library(C50)
library(rpart)
library(party)
library(reshape2)
library(ggplot2)
data(churn)
rate.c <- rate.r <-rate.p<- rep(0,100)
for(j in1:100){
num <- sample(1:10,nrow(churnTrain),replace=T)
res.c <- res.r <-res.p<- array(0,dim=c(2,2,10))
for( i in1:10){
train <- churnTrain[num!=i,]
test <- churnTrain[num==i,]
 
model.c <- C5.0(churn~.,data=train)
pre <- predict(model.c,test[,-20])
res.c[,,i]<- as.matrix(table(pre,test[,20]))
 
model.p <-ctree(churn~.,data=train)
pre <- predict(model.p,test[,-20])
res.p[,,i]<- as.matrix(table(pre,test[,20]))
 
model.r <- rpart(churn~.,data=train)
pre <- predict(model.r,test[,-20],type='class')
res.r[,,i]<- as.matrix(table(pre,test[,20]))
}
table.c <- apply(res.c,MARGIN=c(1,2),sum)
rate.c[j]<- sum(diag(table.c))/sum(table.c)
 
table.p <- apply(res.p,MARGIN=c(1,2),sum)
rate.p[j]<- sum(diag(table.p))/sum(table.p)
 
table.r <- apply(res.r,MARGIN=c(1,2),sum)
rate.r[j]<- sum(diag(table.r))/sum(table.r)
}
data<- data.frame(c50=rate.c,rpart=rate.r,party=rate.p)
data.melt <- melt(data)
 
p <- ggplot(data.melt,aes(variable,value,color=variable))
p + geom_point(position='jitter')+
geom_violin(alpha=0.4)

C5.0算法相对于C4.5有如下几点改进:
  • 速度显著加快
  • 内存使用减少
  • 生成树模型更为简洁
  • 支持boosting方法
  • 支持加权和成本矩阵
  • 支持变量筛选
此外C50包中也有丰富的设置参数:包括设置boost次数、全局剪枝和模糊阀值设置。有兴趣的朋友不妨一试。

推荐两本python书

$
0
0
python虽然不是专门的数据分析工具,但是它的库超多。随着数据分析相关各种库的日益完善,也可以用它来处理一些数据方面的工作,特别在数据预处理方面。这门书号称是数据分析,实际上大部分就是讲的数据处理。介绍了用numpy, pandas等库来实施数据读入、清理、转换、合并等工作。不得不说,pandas的语法真的和R好象啊。不过分析方面没有什么很出彩的地方了。
上面这本是个小册子,专门讲了numpy和scipy两个库,特别还介绍了scikit的一些机器学习用法,值得看一下吧。
连接1连接2

来玩玩QQ群的数据

$
0
0
上周COS论坛上有位老兄发布了一个关于QQ群的数据,正好拿来玩玩。这批数据并不复杂,只有两列,一列是用户名,一列是用户发言时间,不过从这批数据中仍然可以得出一些好玩的东西,且让本人一一道来。



先对数据进行整理,然后以时间维度进行数据汇集,观察各周的发言分布情况。可以看到周一和周日聊天不多,难道说是周一大家都比较安心上班?下图是对不同的时间段进行数据汇集,观察是白天上班的时间聊天比较多,下午4、5点下班前形成高峰。

然后还可以根据用户名来汇集发言频数,获得发言最多前十大用户
用户频数
7cha181498
6cha43761209
4cha38751079
8cha083691
4cha698528
1cha65314438
acha@vip.qq.com372
2cha1350
5cha80296
3cha4233294


此外,若用户在一天之内有发言,则视为活跃,下面是计算出来的活跃天数的十大用户。


6cha4376160
4cha3875147
7cha18109
acha@vip.qq.com89
4cha69887
2cha177
8cha08374
1cha45758
1cha5900253
8cha0850


再来观察每天的发言次数变化,可见QQ群在2012年初讨论热烈,而在最近几个月则趋于平淡,末日准备中?
观察每天活跃用户变化,最多一次达到40人,而一般都是在10人左右。
当某天活跃人数增加的话,发言数也会增加吗?  是的,是有这个情况。
前十大发言最多用户我们暂称为十大话唠,这十大的日内发言情况如何?平行坐标图可以观察到他们的QQ群发言习性。
之前的时间划分是按天来计算,下面将时间窗口划分得更细一些,如果两个发言间相隔30分钟,则认为一次群讨论结束,另一次新的群讨论开始(这个思路是听R会议上肖嘉敏说的)。下面按照群讨论来观察数据。将数据按讨论来分组,得到719次群讨论。然后可以根据一次群讨论为时间单位为观察发言次数和参与用户,这和前面的计算是差不多的,就不再重复。好玩的地方在于,可以根据用户是否参与同一次群讨论来建立他们之间的关联程度。从下面社交图可看到,6cha4376和4cha3875的关系最为密切,有基情?(我用igraph画图总是不如人家好看啊,唉,有没人教教我)
代码如下,请多批评

# 数据读入
data<- read.csv('qq.csv',T,stringsAsFactors=F)
data<- data[-nrow(data),]# 最后一行有问题,删除
 
library(stringr)
library(plyr)
library(lubridate)
library(ggplot2)
library(reshape2)
library(igraph)
 
# 数据整理
# 将字符串中的日期和时间划分为不同变量
temp1 <- str_split(data$time,' ')
result1 <- ldply(temp1,.fun=NULL)
names(result1)<- c('date','clock')
 
#分离年月日
temp2 <- str_split(result1$date,'/')
result2 <- ldply(temp2,.fun=NULL)
names(result2)<- c('year','month','day')
 
# 分离小时分钟
temp3 <- str_split(result1$clock,':')
result3 <- ldply(temp3,.fun=NULL)
names(result3)<- c('hour','minutes')
 
# 合并数据
newdata <- cbind(data,result1,result2,result3)
 
# 转换日期为时间格式
newdata$date <- ymd(newdata$date)
 
# 提取星期数据
newdata$wday <- wday(newdata$date)
 
# 转换数据格式
newdata$month <- ordered(as.numeric(newdata$month))
newdata$year <- ordered(newdata$year)
newdata$day <- ordered(as.numeric(newdata$day))
newdata$hour <- ordered(as.numeric(newdata$hour))
newdata$wday <- ordered(newdata$wday)
 
# 关于时间的一元描述
# 观察时间相关各变量的频数分布
# 周一和周日聊天不多,难道说是周一要安心上班?
qplot(wday,data=newdata,geom='bar')
# 白天上班的时间聊天比较多嘛,下午形成高峰。
qplot(hour,data=newdata,geom='bar')
 
# 关于用户的频度描述
# 前十大发言最多用户
user <- as.data.frame(table(newdata$id))
user <- user[order(user$Freq,decreasing=T),]
user[1:10,]
topuser <- user[1:10,]$Var1
 
# 活跃天数计算
# 将数据展开为宽表,每一行为用户,每一列为日期,对应数值为发言次数
flat.day <- dcast(newdata,id~date,length,value.var='date')
flat.mat <- as.matrix(flat.day[-1])#转为矩阵
# 转为0-1值,以观察是否活跃
flat.mat <- ifelse(flat.mat>0,1,0)
# 根据上线天数求和
topday <- data.frame(flat.day[,1],apply(flat.mat,1,sum))
names(topday)<- c('id','days')
topday <- topday[order(topday$days,decreasing=T),]
# 获得前十大活跃用户
topday[1:10,]
 
# 观察每天的发言次数
# online.day为每天的发言次数
online.day <- sapply(flat.day[,-1],sum)
tempdf <- data.frame(time=ymd(names(online.day )),online.day )
qplot(x=time,y=online.day ,ymin=0,ymax=online.day ,
data=tempdf,geom='linerange')
ggsave('2.png')
# 观察到有少数峰值日,看超过200次发言以上是哪几天
names(which(online.day>200)
 
#根据flat.day数据观察每天活跃用户变化
# numday为每天发言人数
numday <- apply(flat.mat,2,sum)
tempdf <- data.frame(time=ymd(names(numday)),numday)
qplot(x=time,y=numday,ymin=0,ymax=numday,
data=tempdf,geom='linerange')
ggsave('3.png')
#直方图观察
qplot(x=numday,data=tempdf,geom='histogram')
 
# 当某天登录人数增加的话,发言数也会增加吗?
tempdf <- data.frame(time=ymd(names(online.day )),people=numday,
speech=online.day)
 
qplot(x=people,y=speech ,
data=tempdf,geom=c('point','smooth'))
 
# 再观察十强选手的日内情况
flat.hour <- dcast(newdata,id~hour,length,value.var='hour',
subset=.(id %in% topuser))
# 平行坐标图
hour.melt <- melt(flat.hour)
p <- ggplot(data=hour.melt,aes(x=variable,y=value))
p + geom_line(aes(group=id,color=id))+
theme_bw()+
opts(legend.position = "none")
 
# 连续对话的次数,以三十分钟为间隔
newdata$realtime <- strptime(newdata$time,'%Y/%m/%d %H:%M')
# 时间排序有问题,按时间重排数据
newdata2 <- newdata[order(newdata$realtime),]
# 将数据按讨论来分组
group<- rep(1,11279)
for(i in2:11279){
d <- as.numeric(difftime(newdata2$realtime[i],
newdata2$realtime[i-1],
units='mins'))
if( d <30){
group[i]<- group[i-1]
}else{group[i]<- group[i-1]+1}
}
barplot(table(group))
 
# 得到719多组对话
newdata2$group <- group
 
# igraph进行十强之间的网络分析
# 建立关系矩阵,如果两个用户同时在一次群讨论中出现,则计数+1
newdata3 <- dcast(newdata2, id~group,sum,
value.var='group',
subset=.(id %in% topuser))
newdata4 <- ifelse(newdata3[,-1]> 0,1,0)
rownames(newdata4)<- newdata3[,1]
relmatrix <- newdata4 %*% t(newdata4)
# 很容易看出哪两个人聊得最多,6cha4376和4cha3875,有基情?
deldiag <- relmatrix-diag(diag(relmatrix))
which(deldiag==max(deldiag),arr.ind=T)
 
# 根据关系矩阵画社交网络画
g <- graph.adjacency(relmatrix,weighted=T,mode='undirected')
g <-simplify(g)
V(g)$label<-rownames(relmatrix)
V(g)$degree<- degree(g)
layout1 <- layout.fruchterman.reingold(g)
egam <- 10*E(g)$weight/max(E(g)$weight)
egam <- (log(E(g)$weight)+1) / max(log(E(g)$weight)+1)
V(g)$label.cex <- V(g)$degree / max(V(g)$degree)+ .2
V(g)$label.color <- rgb(0,0,.2,.8)
V(g)$frame.color <- NA
E(g)$width <- egam
E(g)$color <- rgb(0,0,1, egam)
plot(g,layout=layout1)

新书推荐:脏数据手册

$
0
0

当你学完一本数据分析软件教程,在电脑上做完了所有的练习题,志得意满地准备去处理实际问题时候,你会被真实世界的“脏数据”所震惊。例如那些随处可见的缺失和格式不一的数据会让分析工作举步维艰,但脏数据的陷阱远不止这些。初入数据江湖的白板青年很需要一本江湖经验手册来帮助成长,而《Bad Data Handbook》正好满足了这种需要。

该书由十九位江湖高手合力联手写成,作者包括了数据分析领域的数据科学家和统计学、物理学、经济学的学术专家,他们分享了自己在处理非常规数据问题的经验和技巧。例如对数据进行分析前的观察测试,如何处理棘手的表格数据,应付各种编码问题,进行网页数据抓取,处理文本数据,以及一些数据质量控制的方法。这些秘诀在一般的传统教科书上是难以见到的。正所谓江湖险恶,要行走数据江湖则必看此书。

2012年的学习、工作和生活

$
0
0
在《英雄志》里面,沉毅木讷的伍定远一直到35岁才跳出公门、踏入江湖,由此获得一系列的奇遇、成长和体验,这番际遇让人感慨。既然2012的玛雅末日没有来,就将过去一年发生的事情在第200篇博文中简单梳理一下。

学习:

最初的博客只是一个粗糙的读书笔记,但仍得到了许多同好的鼓励。赞扬的力量是强大的,于是越发的用心,花了很多时间去读去写去钻研。学习的体会可以总结为四句笨办法:精选资料,反复阅读,归纳笔记,动手操练。2012年大体上钻研了四个方面:数据挖掘、R语言、Python、数据库和SQL。

数据挖掘的算法学了一些皮毛,也知道怎么使用R的一些包,但是还需练习更底层的实现。参加了Coursera的很多公开课,但只有Machine Learning算是拿到最后的成绩,其它的都没有时间跟完进度,所谓贪多嚼不烂。R方面的书已经看得不少了,代码也敲了一些,但其实还是有一些不理解的地方,还需要深入系统的总结,2013年应该会有更进一步的成果。Python断断续续玩了半年,目前还只能用它折腾点小东西,整体感觉很好玩,应该会坚持下去。SQL的话目前工作需要用到,处理速度的确很快,不过它的思维方式和R还真是很有一些不一样,不是太感冒。

五月份和十一月份分别参加了两次R会议,见到了神交已久的统计之都各位高手,也从他们那里学到了很多东西。六月份参加了Supstat办的统计夏令营,这是我第一次参加商业培训,有点小紧张,整体还算圆满顺利。这些会议中我发现很多人都是用LaTeX来做PPT,见贤思齐嘛,回头就买了本LaTeX学习大全,日夜操练。目前正式的成果就是用LaTeX帮老婆作了一份简历,应该可以震慑住一些HR吧。

工作:

写博客的收获不止是知识,还能认识很多朋友,并在职业道路上得到他们的支持和帮助。芒果的S君是最早给我博客好评的,很是鼓舞啊。三月份的时候到上海见到了他本人和同乡L君,聊了很多,也开始了解这一行业。

八月份时候便下定决心要离开所谓的“舒适生活圈”,进入数据江湖冒险。当时还在微博上发了一个贴,原文比较煽情:“早上醒来,如系统自检一样,我知道了我是谁,我从哪来,要到哪去,心情便沉了下去。我希望今后的人生历程变得不一样,所以我想换一份工作。能和数据有关,能用到R语言更好。”

通过微博和朋友们的帮助获得了一些面试机会,因为地域、经验、专业、能力等等原因,蛮多想去的地方都没能如愿。这个过程有困扰、有磨练,也有思考和提高。最后,机会大门还是给我留了一条缝,这样我最终得以从事数据挖掘和R有关的工作,也算是从一档起步了。

生活:

2012年生活中最大的变化就是结婚了,当年达尔文曾用17页纸写下了有关结婚的系统思考。因为结婚会带来收益:例如拥有终身伴侣,避免孤独。结婚也会有成本:放弃了一定程度上的自由。两个人的生活当然会比一个人来得复杂和琐碎,这样看来是否结婚也是可以定量计算的。在我计算很长时间之后,终于让我找到了最后的稳定解,没有留下白卷。

还是用2012读书收获的一句话来结束吧:“要让宿命的人生变得有趣,就尽可能地多走几条路;要让荒谬的人生变得有意义,就不妨细细地体味每一过程的悲欢痛快,结局如何也就无关紧要了。”对我来说,新一年的生活就好象鲁滨逊踏上荒岛,虽然手中只有一把板斧,心中也无所畏惧,因为我将由此获得一系列的奇遇、成长和体验。

2013我们一起进步!

浅谈ROC曲线

$
0
0
机器学习中很常见的一个大类就是二元分类器。很多二元分类器会产生一个概率预测值,而非仅仅是0-1预测值。我们可以使用某个临界点(例如0.5),以划分哪些预测为1,哪些预测为0。得到二元预测值后,可以构建一个混淆矩阵来评价二元分类器的预测效果。所有的训练数据都会落入这个矩阵中,而对角线上的数字代表了预测正确的数目,即True Positive+True Nagetive。同时可以相应算出TPR(真正率或称为灵敏度)和TNR(真负率或称为特异度)。我们主观上希望这两个指标越大越好,但可惜二者是一个此消彼涨的关系。除了分类器的训练参数,临界点的选择,也会大大的影响TPR和TNR。有时可以根据具体问题和需要,来选择具体的临界点。


如果我们选择一系列的临界点,就会得到一系列的TPR和TNR,将这些值对应的点连接起来,就构成了ROC曲线。ROC曲线可以帮助我们清楚的了解到这个分类器的性能表现,还能方便比较不同分类器的性能。在绘制ROC曲线的时候,习惯上是使用1-TNR作为横坐标,TPR作为纵坐标。下面来看看如何在R语言中绘制ROC曲线。
# 做一个logistic回归,生成概率预测值
model1 <-glm(y~.,data=newdata,family='binomial')
pre <-predict(model1,type='response')
# 将预测概率prob和实际结果y放在一个数据框中
data<-data.frame(prob=pre,obs=newdata$y)
# 按预测概率从低到高排序
data<-data[order(data$prob),]
n <-nrow(data)
tpr<- fpr <-rep(0,n)
# 根据不同的临界值threshold来计算TPR和FPR,之后绘制成图
for(i in1:n){
threshold <-data$prob[i]
tp <-sum(data$prob > threshold &data$obs ==1)
fp <-sum(data$prob > threshold &data$obs ==0)
tn <-sum(data$prob < threshold &data$obs ==0)
fn <-sum(data$prob < threshold &data$obs ==1)
tpr[i]<- tp/(tp+fn)# 真正率
fpr[i]<- fp/(tn+fp)# 假正率
}
plot(fpr,tpr,type='l')
abline(a=0,b=1)
R中也有专门用来绘制ROC曲线的包,例如常见的ROCR包,它不仅可以用来画图,还能计算ROC曲线下面积AUC,以评价分类器的综合性能,该数值取0-1之间,越大越好。
library(ROCR)
pred <- prediction(pre,newdata$y)
performance(pred,'auc')@y.values #AUC值
perf <- performance(pred,'tpr','fpr')
plot(perf)
ROCR包画图函数功能比较单一,笔者比较偏好使用功能更强大的pROC包。它可以方便比较两个分类器,还能自动标注出最优的临界点,图看起来也比较漂亮。
library(pROC)
modelroc <- roc(newdata$y,pre)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE,grid=c(0.1,0.2),
grid.col=c("green","red"), max.auc.polygon=TRUE,
auc.polygon.col="skyblue", print.thres=TRUE)

用XLConnect包操控Excel表格

$
0
0

作为一个R迷,为什么要去捣鼓XLS文件?其实这种需求场景很多的啦,比如其它部门的同事有批量的Excel文件要处理,或者家里一把手的直接命令。Excel里面已经有不少函数可以处理数据了,包括简单的矩阵运算以及透视表什么的,但归根到底它还是需要鼠标点来点去,伤手腕啊。为了保护右手我们要提倡用代码控制一切需要鼠标的动作。高级的Excel玩家可能会用VBA去做自动处理,更高明的玩家则跳出三界外,从外部来控制单位格数据的输入输出。

R语言中有很多包可以处理表格文档,包括最为通用的RODBC包,XLConnect包也是操控Excel文档的利器,功能很丰富。使用该包的前提是要安装好Java,还要在环境变量里搞好设置。之后就可以安装加载包了。我们可以将表格文档看做是数据输入和输出端,R则是中间的运算单元。二者主要是通过数据框格式和工作表单元格进行交换。下面来看将iris数据框写入和读取的示例(其实是翻译的官方文档)。

从层级上来看,Excel文档数据有三个级别,分别是文档(file)、工作表(sheet)、区域(region)。所以从R写入数据也有几个步骤。

# 读取或创建一个XLSX文件,此步相当于建立一个连接
xls <- loadWorkbook('test.xlsx',create=TRUE)
# 创建工作表
createSheet(xls,name='namesheet')
# 写入数据
writeWorksheet(xls,iris,'nameshee',
startRow=1,startCol=1,# 数据出现的左上角位置
header=TRUE)
# 存入硬盘,直到此步方才有文档生成
saveWorkbook(xls)

上面四个步骤是新建文档、新建工作表、写入数据、最后存盘。如果要写入数据的同时创建好区域名称,则在第三步有所不同。
# 创建区域名
createName(xls,name='nameregion',
formula='namesheet!$C$5',#区域的左上角单元格位置
overwrite=TRUE)
# 写入数据
writeNamedRegion(xls,iris,name='nameregion')

读取文档则简单的多

xls <- loadWorkbook('test.xlsx',create=TRUE)
data<- readWorksheet(xls,'namesheet',
startRow=1, startCol=1,
endRow=0,endCol=0,#取0表示自动判断
header=TRUE)
上面读写文档都有多个步骤,如果想一步到位,也有相应的快捷函数。比较好玩的是还可以往Excel中插入图片。我们可以先利用R的绘图能力,建立好一张图片,例如叫作iris.png,再向表格中的区域位置插入图片。
xls <- loadWorkbook('test.xlsx',create=TRUE)
addImage(xls,'iris.png',name='nameregion',originalSize=TRUE)
saveWorkbook(xls)
使用demo(addImage)可以查看详细的演示过程。

那些奇葩的R函数

$
0
0

看别人的代码会遇到一些奇葩的函数,一般的教程上很少提到,但却有很好的用处,这类函数基本上分布在base以及utils包中,下面将它们略为归纳一下,以备后用。

1,文件执行:
在用R生成一个PDF文档后,如果想去打开它,你可能会在文件夹里找到再点开。再或者我们想调用系统中的其它程序来做点事情,可能要打开cmd敲点命令。实际上这都可以在R内部完成。举例来说用pandoc转换na.md成docx再打开它。
system('pandoc d:\\rspace\\na.md -o d:\\rspace\\na.docx')
shell.exec('d:\\rspace\\na.docx')

2,网络浏览:
browseURL:浏览某个指定的网页
download.file:下载网络文件到本地

3,文件操作
dir.create:新建一个文件夹
list.dirs:显示目录下的文件夹
list.files:显示目录下的文档
file.create:文档创建
file.exists:判断文档是否存在
file.remove:文档删除
file.rename:重命名
file.append:文档添加
file.copy:文档复制
file.symlink(from, to)
file.show:显示文档内容
file.info:显示文档信息
file.edit:编辑文档
zip: 压缩文件
unzip: 解压缩文件

4,运算进度条
在一个大循环运算时,如果可以看到目前的进度是比较方便的,txtProgressBar和setTxtProgressBar函数可以帮助做到这一点,下面是内置的一个小例子:

testit <- ...="..." function="function" p="p" x="sort(runif(20)),">{
    pb <- p="p" txtprogressbar="txtprogressbar">    for(i in c(0, x, 1)) {Sys.sleep(0.5); setTxtProgressBar(pb, i)}
    Sys.sleep(1)
    close(pb)
}
testit()

->->

如何学习数据科学

$
0
0

本文翻译自一篇博客文章,作者是一名软件工程师,他描述了在五年时间内学习数据科学的经历和心得,他的学习途径包括了自学(书籍、博客、小项目),课程学习,教学讨论,会议交流和工作实践。

一、入门

1)自学(2 - 4个月)

自学是起步的关键。两年前,我和几个同事组成了一个研究小组,讨论统计202课程的学习材料。这让我感觉很兴奋,并由此开始数据分析的学习研究。研究小组有5名成员,但最后只有2个人选择去更深入地研究这个领域(数据科学并不适合每一个人)。

  • 学习基本的统计知识:统计202课程是非常合适的入门资料
  • 学习一种统计工具:作为一个菜鸟,我用了3个月的时间埋头学习R语言,R学起来非常有趣。(为什么要学习R?
  • 解决一些好玩的小问题:好奇心是数据科学的关键。如果你对国家的经济问题,犯罪统计,体育成绩等感兴趣的话,去收集数据并开始回答你的问题吧。
  • 学习Unix工具:我选择了O'Reilly出版的数据之魅作为学习材料。
  • 学习SQL和脚本语言:我了解的有Java,Ruby和SQL。 Python也在我的名单上。


有很多的培训材料可以在网上找到:


2)课堂训练(9 - 12个月)

如果你想认真提高这项技能,那就选择一门课程,严肃的对待它。斯坦福大学提供了很优秀的课程。


二、聚焦

1)集中所有精力

  • 当我迷上了数据科学时,我发现只花20%的时间是不够的,这需要花100%的时间,所以我会去发现并解决工作中出现的所有和数据相关的问题(大数据分析,医疗保健,零售分析,优化问题)。

2)着手有趣的问题

  • 把学习目标和个人兴趣放在一起。解决有趣的问题,同时学习新的技术是很有用的。例如我对零售,医疗保健和体育数据分析很有兴趣。

3)加速学习:


4)了解业务领域知识
我很幸运,有机会接触到内部和外部的数据科学家,他们帮助我理解他们处理数据问题的方法。我从他们身上学到的“假设驱动的数据分析”,而不是“盲目加蛮力数据分析”的重要性。重点是理解的业务领域问题,然后再尝试从数据中提取有意义的见解。这使我了解一些运营,零售,旅游及物流收入管理和医疗行业。 “纽约时报”近日发表文章,强调有必要为直觉。

3、有用的数据科学读物


4、对我感觉没多大用的东西

  • 学习多个统计工具:一年前,我开始有一些SAS编程的工作要求,我学了一个月左右的SAS,但没什么效果。主要的原因是学习惯性,而且我喜欢用R.我真的没有需要去学习另一种统计工具。R虽然不是完美的,但将R和其他我熟悉的软件工具结合,我可以解决所有数据的科学问题。因此,我的建议是,如果你已经知道了SAS,STATA,MATLAB,SPSS,STATISTICA,非常好,坚持下去。但是,如果你正在学习一种新的统计工具,那就选择R吧。
  • 公开课程:我试图用Coursera来自定进度学习,但对我来说,这不是有效的。我需要有压力,有学分的正式课程。
  • 过多的学习量:需要注意工作与生活的平衡。今年早些时候,我试图同时学习多门困难的课程,我很快就意识到这么干没什么好处。

Viewing all 85 articles
Browse latest View live