高等数学是什么中R¹,R²,是什么意思

今年年初开始接触R语言,自学兼修课,学了一个学期,暑期在某上市互联网公司找了一份纯粹用R语言工作的的数据分析实习,现在应该可以说熟练掌握R语言了。我的学习路径如下:&br&&ol&&li&名师指导——学习coursera公开课;&/li&&li&&p&巨人肩膀——浏览技术博客+几本入门书籍;&/p&&/li&&li&&p&社区帮助——很多牛人只是比你更善用搜索引擎;&/p&&/li&&li&&p&三人行——找到一个一起学习的小伙伴;&/p&&/li&&li&&p&实践实践实践——用R完成Assignments,做助研,找一份数据分析实习。&/p&&/li&&/ol&&p&&b&一.公开课推荐&/b&。&/p&&p&公开课首推&a href=&///?target=http%3A//coursera.Org& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&coursera.Org&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&上约翰.霍普金大学的数据科学系列课程。该系列完全使用R作为分析工具,轻松引领你从R的初学者转变为R的开发者。&/p&&blockquote&&p&该系列课程包含如下几门课。&/p&&p&1.《数据科学家的工具箱》&/p&&p&该课程主要介绍了数据科学家常用的一些工具。包括R、 RStudio、 Git 、Github ,这里强烈推荐RStudio,作为R的一个集成开发环境(IDE), 它可以在Latex、 PDF、 markdown、 html 中游刃有余,并且是个强大的Literate Programming 工具。除了以上提及的强大工具之外,还介绍了数据的类型、数据分析的方法过程、以及数据科学的一些知识点。&/p&&p&2.《R语言程序开发》&/p&&p&主要内容包括:1)R概述,R的数据类型和对象,数据的读写操作;2)R中的控制流,函数式编程,作用域,时间数据类型;3)循环函数,检查代码漏洞的方法;4)数据模拟实现,代码风格规范。&/p&&p&3.《获取和整理数据》&/p&&p&完成这门课程将获得技能:1)从各种资源获取数据;2)数据清洗的原则;3)数据整理的工具与技巧。&/p&&p&4.《探索性数据分析》&/p&&p&完成这门课程将收获:1)运用R中的base,lattice,ggplot2等绘图系统进行数据的可视化展示;2)对不用类型的数据运用基本的数据展示原则创造丰富多样的分析图;3)基于特定问题出发,运用探索高维数据的统计技巧,创造多维度数据的可视化方式。&/p&&p&5.《可重复性研究》&/p&&p&通过这门课程,你将学会:1)使用Rmarkdown撰写文档;2)在分析报告中嵌入R代码;3)用knitr等相关工具编译Rmarkdown文档;4)进行可重复性的数据分析研究。&/p&&p&6.《统计推断》&/p&&p&这门课主要介绍统计推断的基础。可以收获:1)统计推断的概览;2)进行统计推断的模型假设;3)复杂统计推断的技巧。&/p&&p&7.《回归模型》&/p&&p&这门课教会学生:1)如何进行拟合线性模型,如何进行残差分析;2)进一步探索如何引入哑变量解决特殊的模型设定问题;3)介绍广义线性模型,特别是Poisson回归和Logistic回归。&/p&&p&8.《实用机器学习》&/p&&p&完成这门课将收获:1)经典机器学习算法;2)如何应用多种机器学习工具;3)如何对真实数据进行模型评估和预测。&/p&&p&9.《数据产品开发》&/p&&p&内容涵盖:1)如何创造统计产品以进行交互式探究;2)重点学习如何探究不确定性的统计结果;3)如何创造Shiny应用,以及数据产品相关的R扩展包。&/p&&/blockquote&&p&&b&二.技术博客和书籍推荐&/b&&/p&&ul&&li&R-bloggers:&a href=&///?target=http%3A//www./& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&R-bloggers | R news and tutorials contributed by (573) R bloggers&i class=&icon-external&&&/i&&/a&&/li&&li&R and Data Mining: &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/people/xiao-kai-93& class=&internal&&肖凯&/a&老师的个人博客:&a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&,肖凯老师推荐了十几本R参考书。&br&&/li&&li&书籍:《R语言实战》,《R语言编程艺术》,《机器学习——实用案例解析》,《ggplot2数据分析与图形艺术》,这些书都有中文版。&/li&&/ul&&b&三.社区帮助&/b&&br&&p&l R自带的帮助文档;&/p&&br&&p&l R Journal: &a href=&///?target=http%3A//journal.r-project.org/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Welcome. The R Journal&i class=&icon-external&&&/i&&/a&,对研究某个包非常有帮助;&/p&&p&l 一个神奇的网站:&a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&,牛人聚集,99.9%的R问题都可以在上面找到你想要的答案;&/p&&p&&/p&&p&l R Mailing List: &a href=&///?target=https%3A//stat.ethz.ch/mailman/listinfo/r-help%3B& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&stat.ethz.ch/mailman/li&/span&&span class=&invisible&&stinfo/r-&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&l Talk Stats: &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Statistics Help @ Talk Stats Forum&i class=&icon-external&&&/i&&/a&;&/p&&p&l Google,善用英文搜索;&/p&&p&&b&四.小伙伴&/b&&/p&&p&找到一个志同道合的同学一块学习,一块在coursera上刷Assignments,互相帮助检查代码,互相督促看书敲实例代码进度,比较容易坚持下去,在此,感谢&a href=&/people/hetallian& class=&internal&&hetal链&/a&。&/p&&p&&b&五.实践实践实践&/b&&/p&&p&我在学校选修了两门R数据分析相关的课程,并且给老师做研究助理,用R完成老师布置的编程任务,学以致用,非常高效率。暑期的时候找了一份数据分析实习,实践两个月,对代码的规范化和可重用性的重要性有了更深刻的理解。&/p&&br&&p&------------------------------------------------------------------------------------------------------------------------&/p&&p&&b&更新:&/b&&/p&&p&最近才刚开始在知乎答题,没想到会有这么多的人点赞,真的非常感谢大家的认同。评论区有的同学反馈了几个问题,在这里罗列并补充说明一下。&/p&&ol&&li&公开课很boring,你居然刷完了?&/li&&li&没有统计学基础,可以按这个路径学习R吗?&/li&&li&刷个课就能找着数据分析实习?&/li&&/ol&对于问题1,我非常认同,其实我也没有刷完整个系列。主要是因为进度太慢,内容太少,并且我是统计专业出身,课程的很多内容我已经有了一定的把握。但是,我认真的刷完了第2门和第8门,完成了相应的Assignments。我相信这个系列课程对欠缺一定的统计学基础的同学一定会更有帮助。&p&对于问题2,我的回答是“definitely yes!”.&/p&&p&对于问题3,我想这位同学应该没有仔细看完整个答案。我虽然是用一个学期从开始接触到掌握,但是花的时间也还挺多的。其中,花时间最多的时候是给老师做助研,研究一些R的新奇功能,以及一些R包源码。另外,我用R完成了四门课的小论文(报告)的编程。&/p&&p&突然想到在Quara上曾浏览到的一个回答:&a href=&///?target=https%3A///How-is-Hadley-Wickham-able-to-contribute-so-much-to-R-particularly-in-the-form-of-packages& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How is Hadley Wickham able to contribute so much to R, particularly in the form of packages?&i class=&icon-external&&&/i&&/a&有一定基础的同学我觉得是可以借鉴学习的。&/p&&p&Hadley大神是这样回答的(我想谁是Hadely应该不用解释了吧(●'?'●)):&/p&&blockquote&&ul&&li&&b&Writing&/b&. I have worked really hard to build a solid writing habit - I try and write for 60-90 minutes every morning. It's the first thing I do after I get out of bed. I think writing is really helpful to me for a few reasons. First, I often use my writing as a reference - I don't program in C++ every day, so I'm constantly referring to @&a href=&///?target=http%3A//adv-r.had.co.nz/Rcpp.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Rcpp&i class=&icon-external&&&/i&&/a&
every time I do. Writing also makes me aware of gaps in my knowledge and my tools, and filling in those gaps tends to make me more efficient at tackling new problems.&/li&&li&&b&Reading&/b&. I read a &i&lot&/i&. I follow about 300 blogs, and keep a pretty close eye on the R tags on Twitter and &b&Stack Overflow&/b&. I don't read most things deeply - the majority of content I only briefly skim. But this wide exposure helps me keep up with changes in technology, interesting new programming languages, and what others are doing with data. It's also helpful that if when you're tackling a new problem you can recognise the basic name - then googling for it will suggest possible solutions. If youdon't know the name of a problem, it's very hard to research it.&/li&&li&&b&Chunking&/b&. Context-switching is expensive, so if I worked on many packages at the same time, I'd never get anything done. Instead, at any point in time, most of my packages are lying fallow, steadily accumulating issues and ideas for new feature. Once a critical mass has accumulated, I'll spend a couple of days on the package.&/li&&li&Finally, it's hard to over-emphasise the impact that working full-time on R makes. Since I've left Rice, I now &b&spend well over 90% of my work time thinking about and programming in R&/b&. This has a compounding effect because as I built better tools (cognitive and computational) it becomes even easier to build new tools. I can create a new package in seconds, and I have many techniques on-hand (in-brain) for solving new problems.&/li&&/ul&&/blockquote&我觉得R的入门门槛是比较低的,即使你没有编程基础,只要你集中一段时间(几个月?)投入,你应该就能享受到它带给你的便利。但是,要想成为一个R开发者,是需要持续的付出一定的时间和精力的。
今年年初开始接触R语言,自学兼修课,学了一个学期,暑期在某上市互联网公司找了一份纯粹用R语言工作的的数据分析实习,现在应该可以说熟练掌握R语言了。我的学习路径如下: 名师指导——学习coursera公开课;巨人肩膀——浏览技术博客+几本入门书籍;社区…
&img src=&/50/v2-b4e9cb7e13b58dbc8b46_b.jpg& data-rawwidth=&427& data-rawheight=&240& class=&origin_image zh-lightbox-thumb& width=&427& data-original=&/50/v2-b4e9cb7e13b58dbc8b46_r.jpg&&&p&&b&本章概要:&/b&文章内容讲解了两个绘图包,lattice包和ggplot2包,以及怎样如何进行交互式图型的rCharts包。每个内容我会列举一个案例,当然不可能学习完绘图包中的所有内容和使用交互式图形的全部方法,我会列举一种我认为简单和适用的交互式图形的方法和使用包的大致思路。&/p&&p&&b&一、lattice包&/b&&/p&&p&此包受欢迎是因为它能够绘制网络图形,网格图形能够展示变量的分布或变量之间的关系,每幅图代表一个或多个变量的各个水平。&/p&&img src=&/v2-896c3e2dcdfab16cc7a03_b.jpg& data-caption=&& data-rawwidth=&1022& data-rawheight=&498& class=&origin_image zh-lightbox-thumb& width=&1022& data-original=&/v2-896c3e2dcdfab16cc7a03_r.jpg&&&img src=&/v2-1661db1eac6ca6f1ba00a8be_b.jpg& data-caption=&& data-rawwidth=&1009& data-rawheight=&311& class=&origin_image zh-lightbox-thumb& width=&1009& data-original=&/v2-1661db1eac6ca6f1ba00a8be_r.jpg&&&img src=&/v2-28dd1a0e8c5df390c98aa7c27cb67044_b.jpg& data-caption=&& data-rawwidth=&1029& data-rawheight=&332& class=&origin_image zh-lightbox-thumb& width=&1029& data-original=&/v2-28dd1a0e8c5df390c98aa7c27cb67044_r.jpg&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&library(lattice)
str(Titanic)
barchart(Titanic)
barchart(Titanic,layout=c(4,1),auto.key=TRUE)#添加图例
barchart(Titanic,layout=c(4,1),auto.key=TRUE,scales=list(x=&free&))#调整刻度
&/code&&/pre&&/div&&img src=&/v2-c75fa1dbaff6bf79ab5580_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-c75fa1dbaff6bf79ab5580_r.jpg&&&img src=&/v2-87dc971126aacf528b9d7b4f53614e83_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-87dc971126aacf528b9d7b4f53614e83_r.jpg&&&img src=&/v2-2c352c96fbe466fc72caa57add1f00c9_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-2c352c96fbe466fc72caa57add1f00c9_r.jpg&&&p&通过选择lattice包中不同的函数和函数表达式,设定函数选项来展示出你想要的图形。&/p&&p&在一个或多个其他变量的条件下,网络图形可以展示某个变量的分布与其他变量间的关系。&/p&&p&&b&二、ggplot2包&/b&&/p&&p&1、data加载数据、aes坐标轴的变量、geom创建点、线、条、箱线图、阴影区域、point点、smooth线、lab横轴、纵轴、标题名称,添加的每一个元素都有他的参数。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&library(ggplot2)
ggplot(data=mtcars, aes(x=wt, y=mpg)) +
geom_point(pch=17, color=&blue&, size=2) +
geom_smooth(method=&lm&, color=&red&, linetype=2) +
labs(title=&Automobile Data&, x=&Weight&, y=&Miles Per Gallon&)
&/code&&/pre&&/div&&img src=&/v2-a6a9a916d6e9a3bed4fc4d4ff43e9d20_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-a6a9a916d6e9a3bed4fc4d4ff43e9d20_r.jpg&&&p&2、分组绘图,在一个图形中展示两组或多组观察结果。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#将数据集中的变量转换成因子
data(mtcars)
mtcars$am &- factor(mtcars$am, levels=c(0,1),
labels=c(&Automatic&, &Manual&))
mtcars$vs &- factor(mtcars$vs, levels=c(0,1),
labels=c(&V-Engine&, &Straight Engine&))
mtcars$cyl &- factor(mtcars$cyl)
#绘制分组图
library(ggplot2)
ggplot(data=mtcars, aes(x=hp, y=mpg,
shape=cyl, color=cyl)) +
geom_point(size=3) +
facet_grid(am~vs) +
labs(title=&Automobile Data by Engine Type&,
x=&Horsepower&, y=&Miles Per Gallon&)
&/code&&/pre&&/div&&img src=&/v2-0d181afeac586dd644cfdf_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-0d181afeac586dd644cfdf_r.jpg&&&p&3、geom_图形类型可以绘制出你想要的任意图形,每个图形都有自己的参数。&/p&&img src=&/v2-8edabb23fdbeeba_b.jpg& data-caption=&& data-rawwidth=&1000& data-rawheight=&496& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-8edabb23fdbeeba_r.jpg&&&p&例如:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&data(singer, package=&lattice&)
ggplot(singer, aes(x=height)) + geom_histogram()
ggplot(singer, aes(x=voice.part, y=height)) + geom_boxplot()
&/code&&/pre&&/div&&img src=&/v2-c34efdbdcd2dd1bd29ba1a94_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-c34efdbdcd2dd1bd29ba1a94_r.jpg&&&img src=&/v2-68c812dafa3_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-68c812dafa3_r.jpg&&&img src=&/v2-f2d55a442a1_b.jpg& data-caption=&& data-rawwidth=&1058& data-rawheight=&475& class=&origin_image zh-lightbox-thumb& width=&1058& data-original=&/v2-f2d55a442a1_r.jpg&&&img src=&/v2-d907a7b4b8a05a5fc0c025fd37f7bac2_b.jpg& data-caption=&& data-rawwidth=&1043& data-rawheight=&185& class=&origin_image zh-lightbox-thumb& width=&1043& data-original=&/v2-d907a7b4b8a05a5fc0c025fd37f7bac2_r.jpg&&&p&&br&&/p&&p&示例:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&data(Salaries, package=&car&)
library(ggplot2)
ggplot(Salaries, aes(x=rank, y=salary)) +
geom_boxplot(fill=&cornflowerblue&,
color=&black&, notch=TRUE)+
geom_point(position=&jitter&, color=&blue&, alpha=.5)+
geom_rug(side=&l&, color=&black&)
&/code&&/pre&&/div&&img src=&/v2-3d90de154ecc1a73f79f27_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-3d90de154ecc1a73f79f27_r.jpg&&&p&从此图中可以看到三种职位工资的高低、工资方差和异常点。&/p&&p&图形组合:你可以结合任何你想组合的图形已达到更加清晰的展现信息的图形。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&library(ggplot2)
data(singer, package=&lattice&)
ggplot(singer, aes(x=voice.part, y=height)) +
geom_violin(fill=&lightblue&) +
geom_boxplot(fill=&lightgreen&, width=.2)
&/code&&/pre&&/div&&img src=&/v2-a048b15cfa85dc0d9b6a98c7db351351_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-a048b15cfa85dc0d9b6a98c7db351351_r.jpg&&&p&4、分组&/p&&p&aes()函数负责分配变量。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&data(Salaries, package=&car&)
library(ggplot2)
ggplot(data=Salaries, aes(x=salary, fill=rank)) +
geom_density(alpha=.3)
&/code&&/pre&&/div&&img src=&/v2-7dacc6c37e513d3b3c39d979d5b1aab2_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-7dacc6c37e513d3b3c39d979d5b1aab2_r.jpg&&&p&分多组&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank,
shape=sex)) + geom_point()
&/code&&/pre&&/div&&img src=&/v2-85b86fd310b9d13baab33a_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-85b86fd310b9d13baab33a_r.jpg&&&p&参数position的展示:&/p&&img src=&/v2-bb85ba9ee0a08ef800abdca_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-bb85ba9ee0a08ef800abdca_r.jpg&&&img src=&/v2-fcb7bb79f7d6190_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-fcb7bb79f7d6190_r.jpg&&&img src=&/v2-9d57f77ecbec_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-9d57f77ecbec_r.jpg&&&p&y轴数量是错误的,应该是比例,通过y=&proportion&参数到labs()函数来解决。&/p&&p&5、刻面&/p&&p&前面学习的分组是将变量间的关系组合到一副图中,尚若你想将图形分别展示出来,可以使用一下参数。&/p&&img src=&/v2-1ca5ac6ea0bbb4d49d69b7_b.jpg& data-caption=&& data-rawwidth=&1040& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&1040& data-original=&/v2-1ca5ac6ea0bbb4d49d69b7_r.jpg&&&p&例如:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&data(singer, package=&lattice&)
library(ggplot2)
ggplot(data=singer, aes(x=height)) +
geom_histogram() +
facet_wrap(~voice.part, nrow=4)
&/code&&/pre&&/div&&img src=&/v2-bc226dfdd28ae26c15d92_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-bc226dfdd28ae26c15d92_r.jpg&&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&library(ggplot2)
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank,
shape=rank)) + geom_point() + facet_grid(.~sex)
&/code&&/pre&&/div&&img src=&/v2-e764ac1dce9d9ff1244d6_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-e764ac1dce9d9ff1244d6_r.jpg&&&p&6、添加光滑曲线&/p&&img src=&/v2-7c8df2f23f70aaae2b4e6_b.jpg& data-caption=&& data-rawwidth=&1028& data-rawheight=&297& class=&origin_image zh-lightbox-thumb& width=&1028& data-original=&/v2-7c8df2f23f70aaae2b4e6_r.jpg&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&data(Salaries, package=&car&)
library(ggplot2)
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth() + geom_point()
&/code&&/pre&&/div&&img src=&/v2-87ff5fb161daac5f1867081_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-87ff5fb161daac5f1867081_r.jpg&&&p&按性别拟合二次多项式回归:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary,
linetype=sex, shape=sex, color=sex)) +
geom_smooth(method=lm, formula=y~poly(x,2),
se=FALSE, size=1) +
geom_point(size=2)
&/code&&/pre&&/div&&img src=&/v2-058e86426dbf9f39cad74f_b.jpg& data-caption=&& data-rawwidth=&609& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&609& data-original=&/v2-058e86426dbf9f39cad74f_r.jpg&&&p&7、修改ggplot2图形的外观&/p&&p&1、坐标轴&/p&&img src=&/v2-6274dee135debe1b55dd2138_b.jpg& data-caption=&& data-rawwidth=&1013& data-rawheight=&241& class=&origin_image zh-lightbox-thumb& width=&1013& data-original=&/v2-6274dee135debe1b55dd2138_r.jpg&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&scale_x_discrete(breaks=c(&AsstProf&, &AssocProf&, &Prof&),
labels=c(&Assistant\nProfessor&,
&Associate\nProfessor&,
&Full\nProfessor&)) +
scale_y_continuous(breaks=c(5, 0000),
labels=c(&$50K&, &$100K&, &$150K&, &$200K&))
&/code&&/pre&&/div&&p&2、图例&/p&&p&通常能自动生成图例,但你也可以自己设置,比如选择位置和图例大小,如果想删除图例,可以legend.position=&none&。当更改图例的标题时,可以通过将fill=&mytitle&加到labs()函数中来改变标题。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&labs(title=&Faculty Salary by Rank and
Gender&,x=&&, y=&&,fill=&Gender&) +theme(legend.position=c(.1,.8))
&/code&&/pre&&/div&&p&3、标尺&/p&&p&scale_fill_brewer()函数来预先指定分得清的颜色集。&/p&&p&4、主题&/p&&p&theme()函数中的选项可以让我们调整字体、背景、颜色和网格线等。主题可以使用一次,&/p&&p&也可以保存起来应用到多个图中。&/p&&p&5、多重图&/p&&p&多重图的使用方法与基础安装包中的方法不同,他需要重新安装软件包。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&install.packages(&gridExtra&)
data(Salaries, package=&car&)
library(ggplot2)
p1 &- ggplot(data=Salaries, aes(x=rank)) + geom_bar()
p2 &- ggplot(data=Salaries, aes(x=sex)) + geom_bar()
p3 &- ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) + geom_point()
library(gridExtra)
grid.arrange(p1, p2, p3, ncol=3)
&/code&&/pre&&/div&&p&8、保存图形&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
ggsave(file=&mygraph.pdf&)
&/code&&/pre&&/div&&p&&b&三、交互式图形(rCharts包)&/b&&/p&&p&交互式图形的方式有很多,但这次只学习一种。&/p&&p&首先不能直接在R中安装,安装步骤如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&require(devtools)
install_github('rCharts', 'ramnathv')
&/code&&/pre&&/div&&p&案例:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&library(rCharts)
names(iris) = gsub(&\\.&, &&, names(iris))
rPlot(SepalLength ~ SepalWidth | Species, data = iris, color = 'Species', type = 'point')
&/code&&/pre&&/div&&p&此代码生成的图片由于是交互式的,以此无法用图片的形式保存。&/p&&p&案例2:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&hair_eye = as.data.frame(HairEyeColor)
rPlot(Freq ~ Hair | Eye, color = 'Eye', data = hair_eye, type = 'bar')
&/code&&/pre&&/div&&p&案例3:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&hair_eye_male &- subset(as.data.frame(HairEyeColor), Sex == &Male&)
n1 &- nPlot(Freq ~ Hair, group = &Eye&, data = hair_eye_male, type = &multiBarChart&)
&/code&&/pre&&/div&&p&执行以上代码会出现精彩的结果。&/p&&p&如何对上述结果呈现给他人,这里牵涉到shiny包,具体如何操作我还没有学会。&/p&
本章概要:文章内容讲解了两个绘图包,lattice包和ggplot2包,以及怎样如何进行交互式图型的rCharts包。每个内容我会列举一个案例,当然不可能学习完绘图包中的所有内容和使用交互式图形的全部方法,我会列举一种我认为简单和适用的交互式图形的方法和使用…
&img src=&/50/v2-3a6becae0a40e9de9e4def_b.jpg& data-rawwidth=&480& data-rawheight=&318& class=&origin_image zh-lightbox-thumb& width=&480& data-original=&/50/v2-3a6becae0a40e9de9e4def_r.jpg&&&p&
金州勇士队的当家球星库日天,以一手逆天的三分球,撼动了NBA几十年来,改变了NBA靠巨星单打带动角色球员这一传统模式。今天我就通过R语言来分析一下,小学生的三分球到底强在哪里,谁又能够阻止要放学的小学生。&/p&&p&
首先我分析的数据来自kaggle的shot_log数据,数据内容是14-15赛季各个球队球员投篮的数据。&/p&&p&
主要指标是:&/p&&p&
player_name 球员名称&/p&&p&
MATCHUP 比赛日期及对阵双方&/p&&p&
SHOT_NUMBER 第几次投篮&/p&&p&
PERIOD 第几节(篮球比赛共4节 每节12分钟)&/p&&p&
PTS_TYPE 得分类型,2分球还是三分球&/p&&p&
SHOT_RESULT 是否命中&/p&&p&
CLOSEST_DEFENDER 最近的防守人&/p&&img src=&/50/v2-bb889a12bda7bb84a9cb1f15_b.png& data-rawwidth=&1339& data-rawheight=&441& class=&origin_image zh-lightbox-thumb& width=&1339& data-original=&/50/v2-bb889a12bda7bb84a9cb1f15_r.png&&&p&&br&&/p&&p&&br&&/p&&h2&三分命中数&三分命中率&/h2&&p&首先我要算出库日天的三分球在联盟处于什么水平,考量指标是三分球命中数和三分球命中率。三分球命中率可以根据三分球命中数和三分球投出数量,根据每个球员进行统计。&/p&&p&三分球出手数:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&shot3ptsum&-shotdata %&%
+ filter(PTS_TYPE==3) %&%
+ group_by(player_name) %&%
+ summarise(n())
&/code&&/pre&&/div&&p&三分球命中数:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&shot3ptmade&- shotdata %&%
+ filter(PTS_TYPE==3 ,SHOT_RESULT==&made&) %&%
+ group_by(player_name)%&%
+ summarise(made_count=n())%&%
+ arrange(desc(made_count))
&/code&&/pre&&/div&&p&将两个表合并,通过除法计算出命中率。得出一个结论,小学生不仅三分出手次和命中数冠绝联盟,水花兄弟的出手数和命中数冠绝联盟。&/p&&img src=&/50/v2-affab1b0e9b3cdd39245e_b.png& data-rawwidth=&406& data-rawheight=&375& class=&content_image& width=&406&&&p&水花兄弟果然三分吊打全联盟。&/p&&img src=&/50/v2-cade1a_b.png& data-rawwidth=&580& data-rawheight=&329& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&/50/v2-cade1a_r.png&&&p&&br&&/p&&p&那么考核一下命中率呢?好像命中率不是前10,以下就排到第二十位了。可以问题是前面的球员出手次数忒少了吧。&/p&&img src=&/50/v2-8abaa4cc28ba991f0fe38a_b.png& data-rawwidth=&413& data-rawheight=&491& class=&content_image& width=&413&&&p&然后我剔除了命中次数低于联盟平均水平的记录,根据命中数和命中率拉了一个散点图。x轴是命中数,y轴是命中率。&/p&&p&&br&&/p&&img src=&/50/v2-d4c8e7fb2f_b.png& data-rawwidth=&590& data-rawheight=&252& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&/50/v2-d4c8e7fb2f_r.png&&&p&我库在最右侧,保持最高命中数,而且命中率也是前5。细心的朋友一定看到了顶上有个突出点,没错!那就是今年加盟骑士的凯尔科沃尔。今年总决赛中,投丢了关键三分,詹皇即使拉来了联盟三分稳如狗的科沃尔,也没能摁住勇士的MVP组合。&/p&&p&&br&&/p&&img src=&/50/v2-c58646fc69bba665f60b73b_b.png& data-rawwidth=&550& data-rawheight=&345& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&/50/v2-c58646fc69bba665f60b73b_r.png&&&p&&br&&/p&&h2&&b&末节平均命中三分数&/b&&/h2&&p&那么我要搞事情了,科沃尔是比库里更好的三分投手吗?看数据上,虽然科沃尔少投了很多三分,但是命中率比库里高很多。那么我们还有什么指标能对比两者的三分球表现吗?&/p&&p&没错就是第几节的得分效率!科沃尔和库里在末节的得分对比,更能体现一个三分投手对球队的贡献。&/p&&p&筛选出末节三分命中数,&b&我库是平均命中1.57次 ,科沃尔是1.24次&/b&&/p&&p&// 库里计算代码 &/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&shot3pt4made&- shotdata %&%
filter(PTS_TYPE==3 ,SHOT_RESULT==&made&,PERIOD==4,player_name==&stephen curry&) %&%
group_by(player_name,GAME_ID)%&%
summarise(made_count=n())%&%
arrange(desc(made_count))
& View(shot3pt4made)
& mean(shot3pt4made$made_count)
[1] 1.578947
&/code&&/pre&&/div&&p&// 科沃尔计算代码&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&shot3pt4made&- shotdata %&%
filter(PTS_TYPE==3 ,SHOT_RESULT==&made&,PERIOD==4,player_name==&kyle korver&) %&%
group_by(player_name,GAME_ID)%&%
summarise(made_count=n())%&%
arrange(desc(made_count))
& mean(shot3pt4made$made_count)
[1] 1.242424
&/code&&/pre&&/div&&p&当然科沃尔末节得分要比库里多,原因是勇士吊打对手次数太多了,基本上很多第四节库里都不用打了。。。。。。。&/p&&p&&br&&/p&&h2&库里的三分命中率走势&/h2&&p&
先看结果,我库命中率随着比赛进程进步,越投越准了,看着那几个高于60%命中率的比赛,真心对手肯定有日了狗了的感觉。。。&/p&&img src=&/50/v2-ca1bfcfb0edad5c6e862257_b.png& data-rawwidth=&668& data-rawheight=&445& class=&origin_image zh-lightbox-thumb& width=&668& data-original=&/50/v2-ca1bfcfb0edad5c6e862257_r.png&&&p&根据先前计算的命中率,根据比赛进行统计计算即可。&/p&&p&&br&&/p&&img src=&/50/v2-304ab7bdbd307d85fc3c9_b.png& data-rawwidth=&385& data-rawheight=&224& class=&content_image& width=&385&&&p&然后就是画图,就得到上面的结果咯。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ggplot(curry3ptstat,aes(x=id,y=per))+
geom_point()+
geom_smooth()+
&/code&&/pre&&/div&&p&可怕的不光是投的多,还是越投岳准。。。&/p&&p&&br&&/p&&h2&谁能阻止小学生放学?&/h2&&p&哈哈哈,你以为今年骑士引进罗斯是巧合?他是14-15年限制库日天最好的人!&/p&&p&库日天在罗斯面前投丢了14个三分,第二位是当年雷霆弹簧人伊巴卡。这两人一内一外是能让库日天投丢三分最多的人!&/p&&img src=&/50/v2-a9fe3a5275_b.png& data-rawwidth=&268& data-rawheight=&301& class=&content_image& width=&268&&&p&代码&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&curryShot&- shotdata %&%
+ filter(player_name==&stephen curry&) %&%
+ group_by(CLOSEST_DEFENDER)
+ summarise(Count=n()) %&%
+ left_join(curryMissShot,by=&CLOSEST_DEFENDER&) %&%
+ mutate(per=missedCount/Count*100)
&/code&&/pre&&/div&&p&然后欧文走了,罗斯已经不是当年的罗斯了,今年詹皇的球队还是没有什么球员能够有效的限制小学生放学了。。&/p&&img src=&/50/v2-b52fcb3fab71c16cb6794d0_b.jpg& data-rawwidth=&450& data-rawheight=&550& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&/50/v2-b52fcb3fab71c16cb6794d0_r.jpg&&&p&&br&&/p&&p&下次希望能够分析我的大KD,最后KD镇楼。&/p&&p&&br&&/p&&img src=&/50/v2-cbd8f2dad1ac_b.jpg& data-rawwidth=&502& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&502& data-original=&/50/v2-cbd8f2dad1ac_r.jpg&&&p&&/p&&p&&/p&
金州勇士队的当家球星库日天,以一手逆天的三分球,撼动了NBA几十年来,改变了NBA靠巨星单打带动角色球员这一传统模式。今天我就通过R语言来分析一下,小学生的三分球到底强在哪里,谁又能够阻止要放学的小学生。 首先我分析的数据来自kaggle的shot_log数据…
&img src=&/50/v2-_b.jpg& data-rawwidth=&638& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&638& data-original=&/50/v2-_r.jpg&&第一次参加Kaggle竞赛,选择了入门级的“泰坦尼克号生存预测”。最近在coursera上学习吴恩达的机器学习课程,这个竞赛能够帮助熟悉机器学习的一些基本概念,突然有了一种connecting dots的感觉,废话不多说,下面进入正题~&p&&b&1. 竞赛内容&/b&&/p&&p&通过训练数据集分析出什么类型的人更可能幸存,并预测出测试集中的乘客是否生还。&/p&&p&这项竞赛属于机器学习中的二元分类问题。&/p&&p&&b&2. 赛前准备&/b&&/p&&p&在自己实践之前,先在Kaggle上学习了一些教程,推荐教程如下:&/p&&a href=&/?target=https%3A///mrisdal/exploring-survival-on-the-titanic& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Exploring Survival on the Titanic&i class=&icon-external&&&/i&&/a&&br&&p&还参考了另一篇文章:&/p&&a href=&/?target=http%3A///ml/classification/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&机器学习(二) 如何做到Kaggle排名前2%&i class=&icon-external&&&/i&&/a&&p&大致有了思路之后,开始导入数据进行实践。&/p&&p&&b&3. 理解数据&/b&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&train&-read.csv(file.choose(),stringsAsFactors = FALSE)&/span&
&span class=&go&&test&-read.csv(file.choose(),stringsAsFactors = FALSE)&/span&
&span class=&go&&data&-bind_rows(train,test)&/span&
&span class=&go&&train.row&-1:nrow(train)&/span&
&span class=&go&&test.row&-(1+nrow(train)):nrow(data)&/span&
&span class=&go&&str(data)&/span&
&/code&&/pre&&/div&&ul&&li&PassengerId: 乘客的ID,对预测没有用处&/li&&li&Survived:1代表幸存,2代表遇难,转换为factor方便后续分析&/li&&li&Pclass:可代表乘客的社会经济状况:1代表Upper,2代表Middle,3代表Lower&/li&&li&Name:除包含姓名外,还包含Title相关信息&/li&&li&Sex:性别,转换为factor方便后续分析&/li&&li&Age:年龄&/li&&li&SibSp:兄弟姐妹及配偶的个数&/li&&li&Parch:父母或子女的个数&/li&&li&Ticket:船票号&/li&&li&Fare:船票价格&/li&&li&Cabin:舱位&/li&&li&Embarked:登船口岸,转换为factor方便后续分析&/li&&/ul&&p&&b&4. 缺失值&/b&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&sapply(data,function(x) sum(is.na(x)))&/span&
&span class=&go&&sapply(data,function(x) sum(x==&&))&/span&
&/code&&/pre&&/div&&p&查看NA和空值的情况&b&:&/b&&/p&&img src=&/50/v2-a307addf0d1c3e0ffa782591_b.jpg& data-rawheight=&215& data-rawwidth=&682& class=&origin_image zh-lightbox-thumb& width=&682& data-original=&/50/v2-a307addf0d1c3e0ffa782591_r.jpg&&&ul&&li&Survived有418个缺失值是由于测试集的原因,是正常的&/li&&li&Fare有1个缺失值&/li&&li&Age有263个缺失值&/li&&li&Cabin有1014个缺失值&/li&&li&Embarked有2个缺失值&/li&&/ul&&p&由于Age缺失值较多,需要通过其他的变量来预测,暂时不进行缺失值的填补,先进行特征抽取。&/p&&p&&b&5. 特征工程&/b&&/p&&p&都说数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。我们需要通过探索数据,利用先验知识,从数据中总结出特征。关于什么是特征工程,这篇文章 &a href=&/question/& class=&internal&&特征工程到底是什么? - 知乎&/a& 做了详细的解释。&/p&&p&&b&1)特征处理和抽取&/b&&/p&&p&&b&a. Survived变量:转换数据类型&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&data$Survived&-factor(data$Survived)
&/code&&/pre&&/div&&p&&b&b. PClass变量:转换数据类型,探索与Survived的关系&/b&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&data$Pclass&-factor(data$Pclass)&/span&
&span class=&go&&ggplot(data = data[1:nrow(train),],mapping = aes(x=Pclass,y=..count..,fill=Survived))+&/span&
&span class=&go&&
geom_bar(stat = &count&,position = &dodge&)+&/span&
&span class=&go&&
xlab(&Pclass&)+&/span&
&span class=&go&&
ylab(&Count&)+&/span&
&span class=&go&&
ggtitle(&How Pclass impacts survival&)+&/span&
&span class=&go&&
geom_text(stat = &count&,aes(label=..count..),position = position_dodge(width = 1),vjust=-.6)+&/span&
&span class=&go&&
theme_few()&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-cfda137b53b701f98dcdd2b8_b.jpg& data-rawheight=&666& data-rawwidth=&1352& class=&origin_image zh-lightbox-thumb& width=&1352& data-original=&/50/v2-cfda137b53b701f98dcdd2b8_r.jpg&&可见,Pclass为1的大部分幸存,Pclass为2的接近一半幸存,Pclass为3的小部分幸存&/p&&p&&b&c. Name变量:将变量中有关Title的信息抽取出来&/b&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&data$Title&-sapply(data$Name,FUN = function(x){trimws(strsplit(x,split = &[,.]&)[[1]][2])})&/span&
&span class=&go&&data$Title[data$Title %in% c(&Mme&,&Mlle&)]&-&Mlle&&/span&
&span class=&go&&data$Title[data$Title %in% c(&Capt&,&Don&,&Major&,&Sir&)]&-&Sir&&/span&
&span class=&go&&data$Title[data$Title %in% c(&Dona&,&Lady&,&the Countess&,&Jonkheer&)]&-&Lady&&/span&
&span class=&go&&data$Title&-factor(data$Title)&/span&
&span class=&go&&ggplot(data = data[1:nrow(train),],mapping = aes(x=Title,y=..count..,fill=Survived))+&/span&
&span class=&go&&
geom_bar(stat = &count&,position = &stack&)+&/span&
&span class=&go&&
xlab(&Title&)+&/span&
&span class=&go&&
ylab(&Count&)+&/span&
&span class=&go&&
ggtitle(&How Title impacts Survival&)+&/span&
&span class=&go&&
geom_text(stat = &Count&,aes(label=..count..),position = position_stack(vjust = 0.5))+&/span&
&span class=&go&&
theme_few()&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-17be6de5aabf2_b.jpg& data-rawheight=&666& data-rawwidth=&1361& class=&origin_image zh-lightbox-thumb& width=&1361& data-original=&/50/v2-17be6de5aabf2_r.jpg&&可见,Title为Mrs和Miss的幸存率比较大,为Mr的幸存率比较小&/p&&p&&b&d. Sex变量:转换数据类型,探索与Survived的关系&/b&&br&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&data$Sex&-factor(data$Sex)&/span&
&span class=&go&&ggplot(data = data[1:nrow(train),],mapping = aes(x=Sex,y=..count..,fill=Survived))+&/span&
&span class=&go&&
geom_bar(stat = &count&,position = &dodge&)+&/span&
&span class=&go&&
xlab(&Sex&)+&/span&
&span class=&go&&
ylab(&Count&)+&/span&
&span class=&go&&
ggtitle(&How Sex impacts Survival&)+&/span&
&span class=&go&&
geom_text(stat = &count&,aes(label=..count..),position = position_dodge(width = 1),vjust=-.5)+&/span&
&span class=&go&&
theme_few()&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-ceeb76a59eeba297b9bab680_b.jpg& data-rawheight=&663& data-rawwidth=&1358& class=&origin_image zh-lightbox-thumb& width=&1358& data-original=&/50/v2-ceeb76a59eeba297b9bab680_r.jpg&&可见,女性的幸存率远远大于男性&/p&&p&&b&e. Age变量:探索与Survived的关系&/b&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&ggplot(data = data[(!is.na(data$Age)) & row(as.matrix(data[,&Age&]))&=891,],aes(x=Age,color=Survived))+&/span&
&span class=&go&&
geom_line(aes(label=..count..),stat = &bin&,binwidth=5,na.rm = TRUE)+&/span&
&span class=&go&&
labs(title=&How Age impacts Survival&,x=&Age&,y=&Count&,fill=&Survived&)&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-517f1c79abc125a3f9699213_b.jpg& data-rawheight=&663& data-rawwidth=&1361& class=&origin_image zh-lightbox-thumb& width=&1361& data-original=&/50/v2-517f1c79abc125a3f9699213_r.jpg&&可见,未成年人的幸存率要远远高于青壮年&/p&&p&&b&f. SibSp变量:探索与Survived的关系&/b&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&ggplot(data = data[1:nrow(train),],mapping = aes(x=SibSp,y=..count..,fill=Survived))+&/span&
&span class=&go&&
geom_bar(stat = &count&,position = &dodge&)+&/span&
&span class=&go&&
xlab(&SibSp&)+&/span&
&span class=&go&&
ylab(&Count&)+&/span&
&span class=&go&&
ggtitle(&How SibSp impacts Survival&)+&/span&
&span class=&go&&
geom_text(stat = &count&,aes(label=..count..),position = position_dodge(width = 1),vjust=-.5)+&/span&
&span class=&go&&
theme_few()&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-813ade5ed039d0b486f2df68fe3d0916_b.jpg& data-rawheight=&661& data-rawwidth=&1351& class=&origin_image zh-lightbox-thumb& width=&1351& data-original=&/50/v2-813ade5ed039d0b486f2df68fe3d0916_r.jpg&&可见,SibSp为1或2的乘客幸存率最高&/p&&p&&b&g. Parch变量:探索与Survived的关系&/b&&br&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&ggplot(data = data[1:nrow(train),],mapping = aes(x=Parch,y=..count..,fill=Survived))+&/span&
&span class=&go&&
geom_bar(stat = &count&,position = &dodge&)+&/span&
&span class=&go&&
xlab(&Parch&)+&/span&
&span class=&go&&
ylab(&Count&)+&/span&
&span class=&go&&
ggtitle(&How Parch impacts Survival&)+&/span&
&span class=&go&&
geom_text(stat = &count&,aes(label=..count..),position = position_dodge(width = 1),vjust=-.5)+&/span&
&span class=&go&&
theme_few()&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-b0e0f45136ade0c8138e_b.jpg& data-rawheight=&665& data-rawwidth=&1348& class=&origin_image zh-lightbox-thumb& width=&1348& data-original=&/50/v2-b0e0f45136ade0c8138e_r.jpg&&可见,Parch为1到3的乘客幸存率最高&br&&/p&&p&&b&h. FamilySize变量:新增变量,探索与Survived的关系&/b&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&data$FamilySize&-data$Parch+data$SibSp+1&/span&
&span class=&go&&ggplot(data = data[1:nrow(train),],mapping = aes(x=FamilySize,y=..count..,fill=Survived))+&/span&
&span class=&go&&
geom_bar(stat = &count&,position = &dodge&)+&/span&
&span class=&go&&
xlab(&FamilySize&)+&/span&
&span class=&go&&
ylab(&Count&)+&/span&
&span class=&go&&
ggtitle(&How FamilySize impacts Survival&)+&/span&
&span class=&go&&
geom_text(stat = &count&,aes(label=..count..),position = position_dodge(width = 1),vjust=-.5)+&/span&
&span class=&go&&
theme_few()&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-bbee2b079cf31_b.jpg& data-rawheight=&660& data-rawwidth=&1360& class=&origin_image zh-lightbox-thumb& width=&1360& data-original=&/50/v2-bbee2b079cf31_r.jpg&&可见,FamilySize为2到4的乘客幸存率最高&br&&/p&&p&&b&i. Fare变量:探索与Survived的关系&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ggplot(data = data[(!is.na(data$Fare)) & row(as.matrix(data[,&Fare&]))&=891,],aes(x=Fare,color=Survived))+
geom_line(aes(label=..count..),stat = &bin&,binwidth=5,na.rm = TRUE)+
labs(title=&How Fare impacts Survival&,x=&Fare&,y=&Count&,fill=&Survived&)
&/code&&/pre&&/div&&p&&img src=&/50/v2-dd9a4fa07be5f3c3e39533_b.jpg& data-rawheight=&660& data-rawwidth=&1362& class=&origin_image zh-lightbox-thumb& width=&1362& data-original=&/50/v2-dd9a4fa07be5f3c3e39533_r.jpg&&可见,票价越高幸存率越高&/p&&p&&b&j. Embarked变量:探索与Survived的关系&/b&&br&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&ggplot(data = data[1:nrow(train),],mapping = aes(x=Embarked,y=..count..,fill=Survived))+&/span&
&span class=&go&&
geom_bar(stat = &count&,position = &dodge&)+&/span&
&span class=&go&&
xlab(&Embarked&)+&/span&
&span class=&go&&
ylab(&Count&)+&/span&
&span class=&go&&
ggtitle(&How Embarked impacts Survival&)+&/span&
&span class=&go&&
geom_text(stat = &count&,aes(label=..count..),position = position_dodge(width = 1),vjust=-.5)+&/span&
&span class=&go&&
theme_few()&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-5cb76bdb83efaf_b.jpg& data-rawheight=&661& data-rawwidth=&1360& class=&origin_image zh-lightbox-thumb& width=&1360& data-original=&/50/v2-5cb76bdb83efaf_r.jpg&&可见,Embarked为C或NA的幸存率最高&/p&&p&&b&k. 填补缺失值&/b&&/p&&p&Fare只有1个缺失值,采取中位数填补法&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&data$Fare[is.na(data$Fare)]&-median(data$Fare,na.rm = TRUE)&/span&
&/code&&/pre&&/div&&p&Embarked有2个缺失值,先将这两个缺失值对应的乘客信息选取出来&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&data[is.na(data$Embarked),c(&PassengerId&,&Pclass&,&Fare&,&Embarked&)]&/span&
&/code&&/pre&&/div&&p&发现Pclass都为1,Fare都为80。&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&ggplot(data = data[data$Embarked!=&&,],aes(x=Embarked,y=Fare,fill=Pclass))+&/span&
&span class=&go&&
geom_boxplot()+&/span&
&span class=&go&&
geom_hline(aes(yintercept=80),color=&red&,linetype=&dashed&,lwd=2)+&/span&
&span class=&go&&
theme_few()&/span&
&/code&&/pre&&/div&&p&&img src=&/50/v2-d4ea0df4854caed8907f0b_b.jpg& data-rawheight=&664& data-rawwidth=&1354& class=&origin_image zh-lightbox-thumb& width=&1354& data-original=&/50/v2-d4ea0df4854caed8907f0b_r.jpg&&发现Embarked为C的Pclass属于1的Fare中位数正好是80,所以将缺失值填补为C&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&data$Embarked[c(62,830)]&-&C&&/span&
&span class=&go&&data$Embarked&-factor(data$Embarked)&/span&
&/code&&/pre&&/div&&p&Cabin的缺失值较多,目前来看对预测没有什么意义,先忽略。&/p&&p&最后就是要预测填补Age的缺失值,这里用到了决策树方法,先看一下已有年龄的分布:&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&hist(data$Age[!is.na(data$Age)],freq = F,main = &Age Distribution&)&/span&
&/code&&/pre&&/div&&img src=&/50/v2-1fe1af281ad49ff11e128a_b.jpg& data-rawheight=&651& data-rawwidth=&1350& class=&origin_image zh-lightbox-thumb& width=&1350& data-original=&/50/v2-1fe1af281ad49ff11e128a_r.jpg&&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&age.model&-rpart(Age~Pclass+Sex+SibSp+Parch+Fare+Embarked+Title+FamilySize,data = data[!is.na(data$Age),],method = &anova&)&/span&
&span class=&go&&data$Age[is.na(data$Age)]&-predict(age.model,data[is.na(data$Age),])&/span&
&span class=&go&&hist(data$Age,freq = F,main = &Age Distribution&)&/span&
&/code&&/pre&&/div&&p&至此,特征都处理抽取结束,接下来就要进行特征选择。&/p&&p&&b&2)特征选择&/b&&/p&&p&在以上操作中我们尽可能多地抽取特征,但过多地特征会造成冗余,产生过拟合问题,因此我们需要对特征进行筛选。这里采用最简单的相关性分析。&/p&&p&在上一篇实践分享 &a href=&/p/& class=&internal&&Kaggle数据分析实践--优秀员工为何离职 - 知乎专栏&/a& 中也提到了相关性分析,这里再补充一下:&/p&&p&相关性分析是衡量两个变量之间的线性关系,数值在[-1.0,1.0]之间。数值越接近0,说明两个变量越线性不相关。&/p&&p&最终,选取了如下变量,开始建模。&/p&&p&&b&6. 建模&/b&&/p&&p&这里用的模型是随机森林,一开始使用的是random forest,后来换了cforest,发现排名有提升。关于两者的区别,可以参考这篇文章:&a href=&/?target=http%3A///articles/fIVf63E& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【R语言进行数据挖掘】决策树和随机森林 - 推酷&i class=&icon-external&&&/i&&/a&&/p&&div class=&highlight&&&pre&&code class=&language-rconsole&&&span&&/span&&span class=&go&&set.seed(102)&/span&
&span class=&go&&model&-cforest(Survived~Pclass+Title+Sex+Age+SibSp+Parch+FamilySize+Fare+Embarked,data=data[train.row,],controls = cforest_unbiased(ntree=2000,mtry=3))&/span&
&span class=&go&&prediction&-predict(model,data[test.row,],OOB=TRUE,type = &response&) &/span&
&span class=&go&&output&-data.frame(PassengerId=test$PassengerId,Survived=prediction)&/span&
&span class=&go&&write.csv(output,file = &Prediction1.csv&,row.names = FALSE)&/span&
&/code&&/pre&&/div&&p&这里应该还要做模型验证的,但由于还不是很懂这部分的知识,暂时略过了。&/p&&p&最终将预测结果上传,Kaggle排名还不错,不过也是深度模仿的结果~&/p&&p&&img src=&/50/v2-7abd40b2e75c79b95303c60_b.png& data-rawheight=&768& data-rawwidth=&1148& class=&origin_image zh-lightbox-thumb& width=&1148& data-original=&/50/v2-7abd40b2e75c79b95303c60_r.png&&这次实践花了较长时间,很多概念也是第一次碰到,查阅了不少文章,希望在以后的实践中能够灵活运用~&/p&
第一次参加Kaggle竞赛,选择了入门级的“泰坦尼克号生存预测”。最近在coursera上学习吴恩达的机器学习课程,这个竞赛能够帮助熟悉机器学习的一些基本概念,突然有了一种connecting dots的感觉,废话不多说,下面进入正题~1. 竞赛内容通过训练数据集分析出…
&img src=&/50/v2-ebcc286bc04_b.jpg& data-rawwidth=&500& data-rawheight=&416& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/50/v2-ebcc286bc04_r.jpg&&&h2&&b&工欲善其事,必先利其器&/b&&/h2&&h2&&i&gōng
qì&/i&&/h2&&img src=&/v2-a7a87a96df65135dde02ddea_b.png& data-rawwidth=&602& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&602& data-original=&/v2-a7a87a96df65135dde02ddea_r.png&&&p&&br&&/p&&img src=&/v2-cda0f2aa4efda09c5d80e_b.png& data-rawwidth=&645& data-rawheight=&844& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&/v2-cda0f2aa4efda09c5d80e_r.png&&&p&&br&&/p&&img src=&/v2-ed469c3fba780d96d75c088fb3afe8e4_b.png& data-rawwidth=&664& data-rawheight=&834& class=&origin_image zh-lightbox-thumb& width=&664& data-original=&/v2-ed469c3fba780d96d75c088fb3afe8e4_r.png&&&p&&br&&/p&&img src=&/v2-90eb9f5d040ecdde840a5_b.png& data-rawwidth=&686& data-rawheight=&830& class=&origin_image zh-lightbox-thumb& width=&686& data-original=&/v2-90eb9f5d040ecdde840a5_r.png&&&p&&br&&/p&&img src=&/v2-7b783c3db9f2d460ddd80f90ff813f8f_b.png& data-rawwidth=&606& data-rawheight=&163& class=&origin_image zh-lightbox-thumb& width=&606& data-original=&/v2-7b783c3db9f2d460ddd80f90ff813f8f_r.png&&&p&&br&&/p&&img src=&/v2-ea5ade341cfbec3eadd6359_b.png& data-rawwidth=&706& data-rawheight=&656& class=&origin_image zh-lightbox-thumb& width=&706& data-original=&/v2-ea5ade341cfbec3eadd6359_r.png&&&p&&br&&/p&&img src=&/v2-8fede91b1c47c3cf9bce_b.png& data-rawwidth=&667& data-rawheight=&622& class=&origin_image zh-lightbox-thumb& width=&667& data-original=&/v2-8fede91b1c47c3cf9bce_r.png&&&p&&/p&
工欲善其事,必先利其器gōng yù shàn qí shì,bì xiān lì qí qì
&img src=&/50/v2-31e5b9ada1c416be1b8ed_b.jpg& data-rawwidth=&510& data-rawheight=&339& class=&origin_image zh-lightbox-thumb& width=&510& data-original=&/50/v2-31e5b9ada1c416be1b8ed_r.jpg&&&p&你是不是也学了很久R语言的却还没有完完整整的把数据分析的整个流程走一遍。&/p&&p&跟着本文操作练习也许会是个不错的开始。&br&&/p&&p&看完本文你将了解到:&/p&&p&1. 如何用R语言进行数据分析&/p&&p&2. 数据分析师的主要工作流程&br&&/p&&p&3. 如何参加Kaggle比赛&/p&&br&&p&======================&/p&&br&&h1&引言&/h1&&p&本文采用Kaggle中比较知名的数据集Titanic Machine
Learning from Disaster作为分析数据源。&u&分析目的是根据训练集预测部分乘客在沉船事件中是否会存活?&/u&&/p&&p&当然不是问你Jack &Rose ^_^&/p&&p&该数据集被评为五大最适合数据分析练手项目之一。&a href=&/?target=https%3A///blog/2014/11/data-science-projects-learn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Five data science projects to learn data science&i class=&icon-external&&&/i&&/a&&/p&&p&说明:本文除了细微处有所改动外,主体部分翻译借鉴自Megan L. Risdal文章。&/p&&p&本文的基本按照数据分析的整个流程进行:&br&&/p&&br&&ul&&li&&b&数据清洗&/b&&br&&/li&&li&&b&特征工程&/b&&br&&/li&&li&&b&缺失值&/b&&br&&/li&&li&&b&模型设计与预测&/b&&br&&/li&&/ul&&br&&p& 下面具体看来&/p&&p&=======================&/p&&h1&数据导入与概览&/h1&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 加载相应包
library('ggplot2') # 可视化
library('ggthemes') # 可视化
library('scales') # 可视化
library('dplyr') # 数据处理
library('mice') # 缺失值填补
library('randomForest') # 建模
&/code&&/pre&&/div&&p& 加载完毕后,先将数据导入&/p&&p&【为了保证文章的可读性,部分代码运行结果以图片形式贴出】&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&train &- read.csv('train.csv', stringsAsFactors = F)
&- read.csv('test.csv', stringsAsFactors = F)
#初步观察数据
# 检查数据
str(train)
head(train)
head(test)
&/code&&/pre&&/div&&img src=&/v2-bcbf884e77d4dad528ec4dc_b.png& data-rawwidth=&511& data-rawheight=&226& class=&origin_image zh-lightbox-thumb& width=&511& data-original=&/v2-bcbf884e77d4dad528ec4dc_r.png&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#可以看到,除了Survived字段不同外,其他字段均相同。合并训练集与测试集,为下一步数据清洗做准备
&- bind_rows(train, test)
summary(full)
&/code&&/pre&&/div&&br&&p&合并后的数据除了生存情况(Survived)中缺失值NA有418个(需要预测的),年龄(Age)中缺失值有263个,船票费用(Fare)中缺失值有1个。&/p&&p&目前,我们已经对变量,变量类型,及其前几个取值情况有了初步的了解。
我们知道:我们有1309 个观测,其中训练集891个,测试集418个。 我们的目标是要预测生存情况(Survived)——因变量 可供使用的自变量11个&/p&&p&其各个变量对应的含义列示如下&/p&&img src=&/v2-30d1dd7f39cf781eba16c77_b.png& data-rawwidth=&674& data-rawheight=&558& class=&origin_image zh-lightbox-thumb& width=&674& data-original=&/v2-30d1dd7f39cf781eba16c77_r.png&&&p&-------------------------------&br&&/p&&h1&数据清洗&/h1&&p&&b&&u&a. 观察姓名变量&/u&&/b&&/p&&p&首先,我注意到在乘客名字(Name)中,有一个非常显著的特点:&b&乘客头衔&/b&每个名字当中都包含了具体的称谓或者说是头衔,将这部分信息提取出来后可以作为非常有用一个新变量,可以帮助我们预测。此外也可以用乘客的姓代替家庭,生成家庭变量。下面开始着手操作!&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 从乘客名字中提取头衔
full$Title &- gsub('(.*, )|(\\..*)', '', full$Name)
# 查看按照性别划分的头衔数量?
table(full$Sex, full$Title)
&/code&&/pre&&/div&&img src=&/v2-634fbf3aba0cd91c83c377ac601feca1_b.png& data-rawwidth=&1109& data-rawheight=&238& class=&origin_image zh-lightbox-thumb& width=&1109& data-original=&/v2-634fbf3aba0cd91c83c377ac601feca1_r.png&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 对于那些出现频率较低的头衔合并为一类
rare_title &- c('Dona', 'Lady', 'the Countess','Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer')
# 对于一些称呼进行重新指定(按含义) 如mlle, ms指小姐, mme 指女士
full$Title[full$Title =='Mlle']&- 'Miss'
full$Title[full$Title =='Ms'] &- 'Miss'
full$Title[full$Title =='Mme']&- 'Mrs'
full$Title[full$Title %in% rare_title]
&- 'Rare Title'
# 重新查看替换后的情况
table(full$Sex, full$Title)
&/code&&/pre&&/div&&img src=&/v2-90fa5eb2c04_b.png& data-rawwidth=&687& data-rawheight=&105& class=&origin_image zh-lightbox-thumb& width=&687& data-original=&/v2-90fa5eb2c04_r.png&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 最后从乘客姓名中,提取姓氏
full$Surname &- sapply(full$Name, function(x) strsplit(x, split = '[,.]')[[1]][1])
&/code&&/pre&&/div&&p&我们有
唯一姓氏. 有时间的话可以通过发掘乘客姓氏之间的联系,也许会有意外发现,这里就先不做深入探讨了.&/p&&p&&u&&b&b.家庭情况是否会影响生存结果&/b&&b&?&/b&&/u&&/p&&p&目前为止我们已经处理完乘客姓名这一变量,并从其中提取了一些新的变量。 下一步考虑衍生一些家庭相关的变量 首先,生成家庭人数&b&family size&/b& 这一变量。可以基于已有变量SubSp和Parch(具体含义参照上面)&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 生成家庭人数变量,包括自己在内
full$Fsize &- full$SibSp + full$Parch + 1
# 生成一个家庭变量:以姓_家庭人数 格式
full$Family &- paste(full$Surname, full$Fsize, sep='_')
# 使用 ggplot2 绘制家庭人数与生存情况之间的关系
ggplot(full[1:891,], aes(x = Fsize, fill = factor(Survived))) +
geom_bar(stat='count', position='dodge') +
scale_x_continuous(breaks=c(1:11)) +
labs(x = 'Family Size') +
theme_few()
&/code&&/pre&&/div&&img src=&/v2-5ad1a76b8ceddbff89006a_b.png& data-rawwidth=&673& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&673& data-original=&/v2-5ad1a76b8ceddbff89006a_r.png&&通过图形我们可以明显发现以下特点: &p&- 1 个人上船和家庭人数&4人的家庭的存活人数小于死亡人数 &/p&&p&- 2 家庭人数size在[2:4]的存活人数要高于死亡人数 &/p&&p&因此我们可以将家庭人数变量进行分段合并,明显的可以分为3段:个人,小家庭,大家庭,由此生成新变量.&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 离散化
full$FsizeD[full$Fsize == 1] &- 'singleton'
full$FsizeD[full$Fsize & 5 & full$Fsize & 1]&- 'small'
full$FsizeD[full$Fsize & 4] &- 'large'
# 通过马赛克图(mosaic plot)查看家庭规模与生存情况之间关系
mosaicplot(table(full$FsizeD,full$Survived), main='Family Size by Survival', shade=TRUE)
&/code&&/pre&&/div&&img src=&/v2-b2dbcf55d33139aac9fdf5_b.png& data-rawwidth=&586& data-rawheight=&410& class=&origin_image zh-lightbox-thumb& width=&586& data-original=&/v2-b2dbcf55d33139aac9fdf5_r.png&&&p&从图上也可以显而易见的观察出来,个人与大家庭不利于生存下来,而相对的小家庭当中生存率相对较高&/p&&p&&b&&u&c. 试着生成更多变量 &/u&&/b&&br&&/p&&p& 可以发现在乘客客舱变量 &b&passenger cabin&/b& 也存在一些有价值的信息如客舱层数 &b&deck&/b&. .&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 可以看出这一变量有很多缺失值
full$Cabin[1:28]
&/code&&/pre&&/div&&img src=&/v2-a397bb3ab4b_b.png& data-rawwidth=&1044& data-rawheight=&171& class=&origin_image zh-lightbox-thumb& width=&1044& data-original=&/v2-a397bb3ab4b_r.png&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 第一个字母即为客舱层数.如:
strsplit(full$Cabin[2], NULL)[[1]]
&C& &8& &5&
# 建立一个层数变量(Deck)变化取值从 A - F:
full$Deck&-factor(sapply(full$Cabin, function(x) strsplit(x, NULL)[[1]][1]))
summary(full$Deck)
&/code&&/pre&&/div&&img src=&/v2-c27e14fcfc92592dddf0679_b.png& data-rawwidth=&712& data-rawheight=&48& class=&origin_image zh-lightbox-thumb& width=&712& data-original=&/v2-c27e14fcfc92592dddf0679_r.png&&&p&这里有很多可以进一步操作的地方,如有些乘客名下包含很多间房 (e.g., row 28: &C23 C25
C27&), 但是考虑到这一变量数值的稀疏性(sparseness),有1014 个缺失值。 后面就不再进一步考虑。&/p&&p&------------------------&/p&&h1&缺失值&/h1&&p&现在我们开始对原始数据当中的缺失值进行处理(填补)。&/p&&p&具体做法有很多种,考虑到数据集本身较小,样本数也不多,因而不能直接整行或者整列删除缺失值样本。那么只能通过现有数据和变量对缺失值进行预估填补 例如:可以用&b&均值&/b&&b&中位数&/b&&b&模型&/b& 填补缺失值,这里使用后面两种方式进行。&/p&&p&&b&a. 登船港口缺失——中位数&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 乘客 62 and 830 缺少登船港口信息。
full[c(62, 830), 'Embarked']
## [1] && &&
&/code&&/pre&&/div&&p&我估计对于有相同&b&舱位等级(&/b&&b&passenger class&/b&&b&)&/b&和&b&票价(&/b&&b&Fare&/b&&b&)&/b&的乘客也许有着相同的 &b&登船港口位置embarkment&/b& .我们可以看到他们支付的票价分别为: $ 80 和 $ 80 同时他们的舱位等级分别是: 1 和 1 . 那么他们最有可能是在哪个港口登船的呢?&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 去除缺失值乘客的ID
embark_fare &- full %&%
filter(PassengerId != 62 & PassengerId != 830)
# 用 ggplot2 绘制embarkment, passenger class, & median fare 三者关系图
ggplot(embark_fare, aes(x = Embarked, y = Fare, fill = factor(Pclass))) +
geom_boxplot() +
geom_hline(aes(yintercept=80),
colour='red', linetype='dashed', lwd=2) +
scale_y_continuous(labels=dollar_format()) +
theme_few()
&/code&&/pre&&/div&&img src=&/v2-4f41460eabd8becc960aa_b.png& data-rawwidth=&774& data-rawheight=&561& class=&origin_image zh-lightbox-thumb& width=&774& data-original=&/v2-4f41460eabd8becc960aa_r.png&&很明显!&p&从港口 ('C')出发的头等舱支付的票价的中位数为80。因此我们可以放心的把处于头等舱且票价在$80的乘客62和830 的出发港口缺失值替换为'C'.&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& # 因为他们票价为80且处于头等舱,因而他们很有可能都是从港口C登船的。
full$Embarked[c(62, 830)] &- 'C'
&/code&&/pre&&/div&&p&&b&&u&b. 票价缺失 ——中位数&/u&&/b&&br&&/p&&p&这里发现1044行的乘客票价为空值&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 提取1044行数据
full[1044, ]
&/code&&/pre&&/div&&img src=&/v2-1dcc0bfc194d22c2c838_b.png& data-rawwidth=&982& data-rawheight=&152& class=&origin_image zh-lightbox-thumb& width=&982& data-original=&/v2-1dcc0bfc194d22c2c838_r.png&&&p&这是从港口Southampton ('S')出发的三等舱乘客。 从相同港口出发且处于相同舱位的乘客数目为 (n = 494).&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ggplot(full[full$Pclass == '3' & full$Embarked == 'S', ],
aes(x = Fare)) +
geom_density(fill = '#99d6ff', alpha=0.4) +
geom_vline(aes(xintercept=median(Fare, na.rm=T)),colour='red', linetype='dashed', lwd=1) +scale_x_continuous(labels=dollar_format()) + theme_few()
&/code&&/pre&&/div&&img src=&/v2-c8be173f7ec8e_b.png& data-rawwidth=&680& data-rawheight=&503& class=&origin_image zh-lightbox-thumb& width=&680& data-original=&/v2-c8be173f7ec8e_r.png&&&p&从得到的图形上看,将缺失值用中位数进行替换是合理的。替换数值为$8.05.&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 基于出发港口和客舱等级,替换票价缺失值
full$Fare[1044] &- median(full[full$Pclass == '3' & full$Embarked == 'S', ]$Fare, na.rm = TRUE)
&/code&&/pre&&/div&&br&&p&&b&&u&c. 年龄缺失——预测填补&/u&&/b&&/p&&p&最后,正如我们之前观察到的,在用户&b&年龄(&/b&&b&Age&/b&&b&)&/b& 中有大量的缺失存在。 这里我们将基于年龄和其他变量构建一个预测模型对年龄缺失值进行预测
&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# S统计缺失数量
sum(is.na(full$Age))
## [1] 263
&/code&&/pre&&/div&&p&通常我们会使用 rpart
(recursive partitioning for regression) 包来做缺失值预测 在这里我将使用 mice 包进行处理。具体理由,你可以通过阅读关于基于&b&链式方程&/b&&b& Chained Equations&/b&的&b&多重插补法&/b&&b&Multiple Imputation&/b&(MICE)的内容&a href=&/?target=http%3A//www.jstatsoft.org/article/view/v045i03/v45i03.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MICE&i class=&icon-external&&&/i&&/a&
(PDF). 在这之前我们先要对因子变量(factor variables)因子化,然后再进行多重插补法。
&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 使因子变量因子化
factor_vars &- c('PassengerId','Pclass','Sex','Embarked',
'Title','Surname','Family','FsizeD')
full[factor_vars] &- lapply(full[factor_vars],function(x) as.factor(x))
# 设置随机种子
set.seed(129)
# 执行多重插补法,剔除一些没什么用的变量:
mice_mod &- mice(full[, !names(full) %in% c('PassengerId','Name','Ticket','Cabin','Family','Surname','Survived')], method='rf')
# 保存完整输出
mice_output &- complete(mice_mod)
&/code&&/pre&&/div&&p&让我们对比数据填补前与填补后的数据分布情况。确保数据分布没用发生偏移&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 绘制年龄分布图
par(mfrow=c(1,2))
hist(full$Age, freq=F, main='Age: Original Data',
col='darkgreen', ylim=c(0,0.04))
hist(mice_output$Age, freq=F, main='Age: MICE Output',
col='lightgreen', ylim=c(0,0.04))
&/code&&/pre&&/div&&img src=&/v2-3e5a1dbceba56_b.png& data-rawwidth=&693& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&693& data-original=&/v2-3e5a1dbceba56_r.png&&&p&结果看起来不错,那么下面可以用mice模型的结果对原年龄数据进行替换。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# MICE模型结果替换年龄变量.
full$Age &- mice_output$Age
# 检查缺失值是否被完全替换了
sum(is.na(full$Age))
&/code&&/pre&&/div&&p& 现在,我们已经完成了对所有重要变量的缺失值的替换工作。 但是这一切还没结束,我们可以对年龄变量进一步对的划分 ..&/p&&p&-----------------------------------&/p&&h1&特征工程2&/h1&&p&现在我们知道每一位乘客的年龄,那么我们可以基于年龄生成一些变量如&b&儿童&/b&(Child)和 &b&母亲&/b&(Mother).
&/p&&p&划分标准:&/p&&p&- 儿童 : 年龄Age & 18 &/p&&p&- 母亲 : 1 女性; 2 年龄 & 18; 3
拥有超过1个子女 4 头衔不是'Miss'.&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 首先我们来看年龄与生存情况之间的关系
ggplot(full[1:891,], aes(Age, fill = factor(Survived))) +
geom_histogram() +
# 分性别来看,因为前面我们知道 性别对于生存情况有重要影响
facet_grid(.~Sex) +
theme_few()
&/code&&/pre&&/div&&img src=&/v2-9cdaa6ba2223be2_b.png& data-rawwidth=&628& data-rawheight=&494& class=&origin_image zh-lightbox-thumb& width=&628& data-original=&/v2-9cdaa6ba2223be2_r.png&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 生成儿童(child)变量, 并且基于此划分儿童child与成人adult
full$Child[full$Age & 18] &- 'Child'
full$Child[full$Age &= 18] &- 'Adult'
# 展示对应人数
table(full$Child, full$Survived)
Adult 484 274
&/code&&/pre&&/div&&p&从结果看,儿童的生存率要高于成人但是这并不意味着作为儿童就一定可以生还。正如我们当年看《泰坦尼克号》电影时,最后船员要求母亲和儿童先上船一样。&/p&&p&下面来生成&b&母亲&/b&这个变量.
&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 生成母亲变量
full$Mother &- 'NotMother'
full$Mother[full$Sex =='female' & full$Parch & 0 & full$Age & 18 & full$Title != 'Miss'] &- 'Mother'
# 统计对于数量
table(full$Mother, full$Survived)
Not Mother
# 对新生成的两个变量完成因子化。
full$Child
&- factor(full$Child)
full$Mother &- factor(full$Mother)
&/code&&/pre&&/div&&p& 至此,所有我们需要的变量都已经生成,并且其中没有缺失值。 为了保险起见,我们进行二次确认。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#这个起到什么作用?
md.pattern(full)
&/code&&/pre&&/div&&p& 现在我们终于完成对泰坦尼克数据集(the Titanic dataset)中所有的变量缺失值的填补,并基于原有变量构建了一些新变量,希望这些可以在最终的生存情况预测时起到帮助。&/p&&p&----------------------&br&&/p&&h1&模型设定与预测&/h1&&p& 在完成上面的工作之后,我们进入到最后一步:预测泰坦尼克号上乘客的生存状况。 在这里我们使用随机森林分类算法(The RandomForest
Classification Algorithm) 我们前期那么多工作都是为了这一步服务的。&/p&&p&&b&&u&a. 拆分训练集与测试集&/u&&/b&&br&&/p&&p&我们第一步需要将数据变回原先的训练集与测试集.&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 将数据拆分为训练集与测试集
train &- full[1:891,]
test &- full[892:1309,]
&/code&&/pre&&/div&&p&&u&b. 建立模型&/u&&/p&&p&我们利用训练集训练建立随机森林 randomForest 模型.&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 设置随机种子
set.seed(754)
# 建立模型l (注意: 不是所有可用变量全部加入)
rf_model &- randomForest(factor(Survived) ~ Pclass + Sex + Age + SibSp + Sex*Parch + Fare + Embarked + Title + FsizeD + Child + Mother, data = train)
# 显示模型误差
plot(rf_model, ylim=c(0,0.36))
legend('topright', colnames(rf_model$err.rate), col=1:3, fill=1:3)
&/code&&/pre&&/div&&img src=&/v2-28d699c249eefc6cc1e6_b.png& data-rawwidth=&671& data-rawheight=&452& class=&origin_image zh-lightbox-thumb& width=&671& data-original=&/v2-28d699c249eefc6cc1e6_r.png&&&p&黑色那条线表示:整体误差率(the overall error rate)低于20% 红色和绿色分别表示:遇难与生还的误差率 至此相对于生还来说,我们可以更准确的预测出死亡。&/p&&p&&b&&u&c.变量重要性&/u&&/b&&br&&/p&&p&通过计算Gini系数得到相应变量的重要性排序&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 获取重要性系数
importance
&- importance(rf_model)
varImportance &- data.frame(Variables = row.names(importance), Importance = round(importance[ ,'MeanDecreaseGini'],2))
# 基于重要性系数排列变量
rankImportance &- varImportance %&%
mutate(Rank = paste0('#',dense_rank(desc(Importance))))
#通过 ggplot2 绘制相关重要性变量图
ggplot(rankImportance, aes(x = reorder(Variables, Importance),
y = Importance, fill = Importance)) +
geom_bar(stat='identity') +
geom_text(aes(x = Variables, y = 0.5, label = Rank),
hjust=0, vjust=0.55, size = 4, colour= 'red') +
labs(x = 'Variables') +
coord_flip() +
theme_few()
&/code&&/pre&&/div&&img src=&/v2-ffc896b8fdd0a7e237ba86b44f340dbf_b.png& data-rawwidth=&663& data-rawheight=&511& class=&origin_image zh-lightbox-thumb& width=&663& data-original=&/v2-ffc896b8fdd0a7e237ba86b44f340dbf_r.png&&&p&我们从图上可以看出哪些变量才是对我们预测最重要的变量 从图上看头衔和性别对于生存情况影响最大,其次是船票价格和年龄。而相应的乘客舱位排第五。 而最出乎我意料的是母亲和孩子对于生存与否的影响最小排在11和10. 这个我小时候看泰坦尼克号的印象相差甚远。&br&&br&&/p&&p&&b&&u&d.预测&/u&&/b&&br&&/p&&p&下面到了最后一步了----预测结果! 在这里可以把刚才建立的模型直接应用在测试集上。 但为了达到最佳的预测结果,我们也可以重新构建不同的模型,或者用不同的变量进行组合。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 基于测试集进行预测
prediction &- predict(rf_model, test)
# 将结果保存为数据框,按照Kaggle提交文档的格式要求。[两列:PassengerId and Survived (prediction)]
solution &- data.frame(PassengerID = test$PassengerId, Survived = prediction)
# 将结果写入文件
write.csv(solution, file = 'rf_mod_Solution1.csv', row.names = F)
&/code&&/pre&&/div&&p&得到的文件大家就可以上传Kaggle获取自己的排名情况啦~&/p&&p&当然前提你得有个Kaggle账号。&a href=&/?target=https%3A///account/register& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&注册kaggle&i class=&icon-external&&&/i&&/a&&/p&&p&比赛页面:&a href=&/?target=https%3A///c/titanic/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Titanic: Machine Learning from Disaster&i class=&icon-external&&&/i&&/a&&br&&/p&&img src=&/v2-aa036cffda8edb3972bb2bbd559d7f06_b.png& data-rawwidth=&1195& data-rawheight=&403& class=&origin_image zh-lightbox-thumb& width=&1195& data-original=&/v2-aa036cffda8edb3972bb2bbd559d7f06_r.png&&&p&Ps:Kaggle上不光可以参加比赛,还可以学习其他优秀选手分享的经验、以及一些代码等。&/p&&p&借此机会,好好逛

我要回帖

更多关于 高等数学 的文章

 

随机推荐