首页
学习
活动
专区
工具
TVP
发布

数据可视化

今天我们来聊一波有趣的数据可视化。

首先,我们先讲一下我们今天要用到的数据。是来自于

http://www.stat.ubc.ca/~rickw/gapminderDataFiveYear.txt

的世界经济数据。

我们打开前6行可以看到以下部分:

X

head(X)

其中country就是统计的国家啦,year则是统计获得的年份,这份数据采集了1952年到2007年的数据,每五年进行一次统计,pop则是人口的数目,continent代表国家所在的大洲,包括Aisa,Africa,America,Europe,Oceania,之后的lifeExp代表当时该国人口的寿命期望,gdpPercap代表人均GDP产值。下面我们将就这些数据利用ggplot2做出进一步分析。

首先,我们做出基本的散点图。

qplot(gdpPercap, lifeExp, data=X)

我们可以看到一些位置样本分布比较密集,所以我们可以采用log函数来做一次均匀化。顺带依据年份进行区分。于是我们就得到下面的图形:

qplot(gdpPercap, lifeExp, data=X, log ="x", color = year)

再然后,颜色单一来区分各个年份总不是很明显,所以let’s make it more colorful:

qplot(gdpPercap, lifeExp, data=X, log ="x", color = factor(year))

然而,最令我们感兴趣的其实是我国的数据。

那么,我们应该如何在图上找到我国呢,嗯,不如把人口数据也填进来。

下面是包含人口数据的气泡图,气泡的大小都和样本中人口的数目成正比。

qplot(gdpPercap, lifeExp, data=X, log ="x", color = year, size = pop)

这幅图中,我们注意到其中几个比较大的气泡(人口数大于1.25e+9),基本就可以确认是我国近几年的数据了。

除去用气泡大小表示连续变量(例如人口数目),对于离散变量(例如所属大洲),我们还可以用点的形状加以区分,下面我们就把各个样本所在大洲用点的形状在图中区分出来:

qplot(gdpPercap, lifeExp, data=X, log ="x", color = year, shape = continent)

从图中我们可以发现,寿命预期较低的国家的点普遍是圆形,侧面说明了非洲人民真的是生活在水深火热之中啊…

通过对前几个样例的观察,我们发现一个规律,人均GDP较高的国家预期寿命普遍也比较高,下面我们就可以利用ggplot2提供的平滑曲线来展示这个趋势。

qplot(gdpPercap, lifeExp, data=X, log ="x", alpha=I(0.5), geom=c("point", "smooth"))

这里我们基本可以判断GDP与人均寿命确实是有所联系的(有钱真的是可以为所欲为…)。

但是我们同样观察到在图右侧,一些gdp非常高而预期寿命中等的国家影响了曲线的走势。对于这种干扰,我们可以进一步采用可靠的线性模型,重新对数据进行拟合。并绘制出拟合出的线性模型:

ggplot(X,aes(x =log(X$gdpPercap),y=X$lifeExp)) + geom_point(shape=19) +

xlab("gdpPercap") + ylab("lifeExp") +geom_smooth(method = lm)

这样一些特殊的离群点的影响就被一定程度限制了。

////这里顺带说一句,ggplot2的2.0版本以前是提供直接使用qplot函数更改拟合模型的,例如,广义线性模型(glm)或者用户自定义的模型(例如y=x^3)。不过2.0以后,ggplot2的编写者为了鼓励大家放弃qplot这种简单暴力的绘图函数,使用ggplot2提供的更多其他的绘图功能,所以不再在qplot里支持更改拟合模型的功能。

然后我们继续观察年份与寿命的关系,通常我们可以猜测,随时间推移,人的寿命是可以续一波的(例如改变了中国的他),所以我们尝试在图中将这种趋势展现。

qplot(gdpPercap, lifeExp, data=X, log ="x", alpha=I(0.5), color=year, geom=c("point","path"))

其中将同一国家不同年份的数据进行了连线…虽然大致可以观察到lifeExp较大的样本颜色也较浅(年份更靠后)。

不过出现了大量样本的堆积,这样的效果并不理想,一种选择是我们单独观察某个国家,例如中国。另一种选择是使用横轴是年份的箱线图来显示整体趋势。

于是我们得到以下两个结果:

qplot(gdpPercap, lifeExp,data=X[X$country=='China',], log = "x", alpha=I(0.5), color=year,geom=c("point", "path"))

X$year.fac

qplot(year.fac, lifeExp, data=X,color=I("red"), geom="boxplot")

在箱线图中,我们明显观察到了lifeExp随时间增长的趋势。此外我们同样观察到两个特殊的点,图一中1962年的数据点(连线上的第三个点),和图二中1992年的数据点。1962前后年的中国,我们都知道发生了什么。那么,1992年前后的世界,又发生了什么呢?

我们找出了1992年lifeExp最低的样本:

strangeExp=min(X$lifeExp[X$year==1992])

example=X[X$lifeExp==strangeExp,]

head(example)

“Rwanda”,卢旺达,不是很熟悉的名字,不过我想起一部经典的电影叫《卢旺达大饭店》,有兴趣的同学自己看一下这部电影大概就明白了这个数据的问题所在。

此外,如果我们还可以将箱线图中的数据散点化并绘制出如下的结果。

qplot(year.fac, lifeExp, data=X,color=I("red"), geom="jitter")

下面让我们在回到大洲与lifeExp的关系上,非酋vs欧皇的时候到了…

在这里我们选择用柱形图,首先横轴代表着lifeExp的各个区间,纵轴代表这个区间存在的样本数,最后我们在每一个lifeExp的数据上用颜色区分样例来源于哪个大洲,于是我们得到了如下的结果:

这里我们可以明显发现:

预期寿命长的国家里,欧洲国家比例较多,而非洲国家大部分都在寿命比较短的几个区域里。(非酋的生活不轻松啊……)

亚洲国家的寿命预期分布比较平均。

大洋洲国家,全都分布在lifeExp>60的区域里。

或许有的同学觉得上图还是比较凌乱,为了增强对比,我们可以选择将各个大洲的统计图单独绘制,就像这个样子:

qplot(lifeExp,data=X,geom="histogram", facets=continent~.)

这里我们可以更加明显地看到上述结论。非酋感觉又中了一箭…

不过有同学就说,你这个图啊,naïve,不同年份的数据混到一起,没什么代表性啊,我要看各个年份的对比图行不行?

行,当然行,看我一次给你都画出来:

qplot(lifeExp,data=X,geom="histogram", facets=year~continent)

这样就很明显了…

以上呢,就是今天的内容了,希望大家喜欢。

相关引文:https://www.douban.com/note/427543680/

R语言安装:https://www.r-project.org/

p.s.本文主讲画图功能,结论只是简单推测,不代表显示情况,同时不对数据可靠性负责。

p.p.s如果觉得数据说明中或者代码上有什么问题,欢迎交流。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171224G0JUHQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券