世界卫生概览,R语言版





5.00/5 (7投票s)
使用R语言进行数据分析入门,快速了解世界卫生状况。
1. 引言
世界卫生组织(WHO)提供的关于社会、经济、健康和政治指标的数据由该组织汇编,并以名为WHO.csv的文件提供。这个文件,顾名思义,是一个逗号分隔值文件。这个CSV文件有358列,202行,每行代表一个国家。例如,一些列的标题是“国家”,“大洲”,“人口(千人)总计”,以及“脊髓灰质炎确诊病例数”。
在本文中,我们将尝试通过R编程语言从这个文件中提取有意义的数据。大约两年前,我参加了MIT在edX在线平台上开设的一门在线课程,名为The Analytics Edge。他们使用上述WHO CSV文件的一个简化版本介绍了R语言。我们将尝试使用WHO文件的一个简化版本的不同版本来介绍R语言。在开始R的学习之旅之前,让我们先看看这个简化WHO数据文件的内容。这个文件有与上面相同的202行,但只有15列,以便我们更容易理解。这个简化WHO数据文件可在此页面顶部下载,名为WHOReduced.csv。这个简化WHO数据文件的列是
Country
:国家名称CountryID
:国家的唯一数字IDContinent
:国家所属大洲的数字ID,有7个值AdultLiteracyRate
:国家的成人识字率(百分比)GNI
:国家人均国民总收入Population
:国家人口(以千为单位)PopGrowth
:人口增长率(百分比)UrbanPop
:国家城镇人口(百分比)BPLPop
:国家贫困线以下人口(百分比)MedianAge
:人口中位年龄(岁)Above60
:国家60岁以上人口的百分比Below15
:国家15岁以下人口的百分比FertilityRate
:生育率(百分比)HospitalBeds
:每千人拥有医院床位数NumberOfPhysicians
:国家医生数量
我们使用这个简化数据集来理解数据的一些细微之处,并为此使用R编程语言。
2. R语言简介
R是一个用于数据分析、统计计算和图形绘制的软件环境。它也是一门编程语言,可以让我们编写一系列步骤来实现统计或机器学习的结果。R是开源的。尽管有许多数据分析软件可供选择,如SAS、Stata、SPSS、Microsoft Excel、Matlab、Minitab、pandas,但本文将使用R。
最新版本的R可以从这里下载。有一些R的图形用户界面,例如RStudio和Rattle。然而,在本文中,我们将使用R的命令行界面,并通过R控制台运行命令。以下是我拥有的R版本的截图。
在本文的其余部分,我们将通过一系列问题及其相应的答案来介绍R。
3. 使用R命令从WHO文件中获取有用信息
在本节中,我们将提出一系列问题,并使用R命令来获取答案。这将作为我们对R的介绍。
- 如何将CSV数据读入R?
CSV文件的数据可以通过将其读入一个数据框来加载到R中。在了解数据框之前,我们需要知道什么是向量。向量是一系列数字或字符,存储在同一个对象中。例如,R命令
v = c(1, 2, 3, 4, 5)
创建一个名为v
的向量,该向量有五个元素,即数字1、2、3、4、5。不允许在同一个向量中混合字符和数字。两个或多个相同长度的向量可以组合成一个数据框,这是R中的一个重要数据结构。如果我们考虑两个向量v1 = c(1, 2, 3, 4, 5)
和v2=c(100, 200, 300, 400, 500)
,那么这两个向量可以组合成一个单一的数据框,该数据框有五行两列,第一列是第一个向量v1
,第二列是第二个向量v2
。最简单的情况下,数据框可以被理解为一个矩阵。但是,数据框比矩阵更通用,因为不同的列可以包含不同数据类型的数量,如下所示。由于我们处理的是CSV文件,R有一个简单的命令可以将整个CSV文件读入单个数据框。在执行此命令之前,您需要使用R菜单将目录更改到文件WHOReduced.csv所在的文件夹。
> who = read.csv("WHOReduced.csv")
此命令将整个CSV文件加载到名为
who
的数据框中。只需将此命令键入R控制台,然后按Enter键即可运行此命令。接下来,我们看看这个数据的结构。
- 如何开始理解数据的结构?
R有一个有用的命令叫做
str
,它可以帮助我们理解加载到数据框中的数据的结构。> str(who)
运行此命令后,R控制台将输出以下内容。
从这个输出中,我们可以知道有202个观测值和15个变量。这意味着有202行,每行有15个变量。这个数据框中的15个不同变量是Country, CountryID, Continent, AdultLiteracyRate, GNI, Population, PopGrowth, UrbanPop, BPLPop, MedianAge, Above60, Below15, FertilityRate, HospitalBeds, NumberOfPhysicians
。其中一些变量是int
类型,包含整数值。另一些是num
类型,包含浮点数值。第一个变量Country
是Factor
类型,是一个分类变量。上面的截图显示Country
有202个类别,即级别,每个级别都是唯一的国家名称。关于此文件中大陆的标签,在此做一个简要说明。如下表所示。严格来说,这些不是大陆的名称,但我们就以这些为准。
大陆标签 大陆名称 1
东地中海
2
欧洲
3
非洲
4
北美洲
5
南美洲
6
西太平洋
7
亚洲
接下来,我们来看看数据的摘要。
- 如何获取数据的摘要?
R有另一个有用的命令叫做
summary
,它可以帮助我们理解加载到数据框中的数据的摘要。> summary(who)
运行此命令后,R控制台将输出以下输出
从这个输出中,我们可以发现R已经输出了这个数据框中所有15个不同变量的摘要。对于具有数值的量,R输出了这些量 - 最小值、第一四分位数(25%的值低于该值)、中位数(50%的值低于该值)、均值、第三四分位数(75%的值低于该值)以及最大值。例如,对于变量
MedianAge
,这些值是最小值=15.00,第一四分位数=20.00,中位数=25.00,均值=26.74,第三四分位数=35.00,最大值=43。我们还看到一个名为NA's : 23
的条目对应于变量MedianAge
。这表明有23个条目的中位年龄在数据集中未列出,因此在数据框中。这23个值是不可用的。类似地,所有其他13个整数/数值变量的摘要也可以这样理解。对于因子变量Country
,摘要在上面的截图中列出了前六个条目。R命令
str()
和summary()
对于获取数据的结构信息和数据的摘要信息分别非常有用。接下来,我们对这些数据提出一些有趣的问题,并寻求答案。
- 哪个国家15岁以下人口比例最低,哪个最高?
为了回答这个问题,我们需要找出这个国家的索引。R命令如下:
> which.min(who$Below15)
运行此命令后,R控制台输出答案为4。现在,使用以下命令查找国家名称:
> who$Country[4]
答案是安道尔。上面的两个命令可以合并成一个命令,如下所示:
> who$Country[which.min(who$Below15)]
结果与安道尔一样,安道尔是15岁以下人口比例最低的国家。
同样,可以使用以下命令查找此数字的最大值的国家:
> who$Country[which.max(who$Below15)]
答案是
乌干达
。 - 哪个国家60岁以上人口比例最低,哪个最高?
为了回答这些问题,像以前一样,我们输入命令:
> who$Country[which.min(who$Above60)]
结果是
阿联酋
,这是60岁以上人口比例最低的国家。同样,可以使用以下命令查找此数字的最大值的国家:
> who$Country[which.max(who$Above60)]
答案是日本
。 - 是否有国家的全部人口都是城市人口?
查看数据的摘要,可以看到变量
UrbanPop
的最大值为100。要找出哪个国家全部人口都是城市人口,我们使用命令:为了回答这个问题,像以前一样,我们输入命令:> who$Country[which.max(who$UrbanPop)]
结果是
摩纳哥
。同样,使用以下命令查找该数字最小值的国家:
> who$Country[which.min(who$UrbanPop)]
答案是
布隆迪
。 - GNI与生育率的图看起来如何?
为了回答这个问题,像以前一样,我们使用命令绘制数据:
> plot(who$GNI, who$FertilityRate)
结果是下图所示的图
我们看到这是一个大致呈三角形的图。这意味着较低的GNI对应较高的生育率,反之亦然。然而,有些国家GNI高且生育率也高。我们接下来调查这个问题。
- 哪些国家GNI高且生育率也高?
为了回答这个问题,像以前一样,我们对原始数据进行子集提取,如下所示:
> HighVals = subset(who, GNI > 10000 & FertilityRate > 2.5)
这创建了一个数据子集,其中GNI大于10000且生育率大于2.5。要找出符合此类别国家数量,我们使用命令:
> nrow(HighVals)
输出结果为
9
,表示有9个这样的国家。要确定符合此类别国家,我们使用命令:> HighVals[c("Country", "GNI", "FertilityRate")]
结果如下:这列出了9个国家及其GNI和生育率。
- 哪个国家每人医生数量的比例最高和最低?
为了回答这个问题,我们使用以下命令将一个向量添加到原始数据集中:
> who$DrsPop = who$NumberOfPhysicians / who$Population
在这里,取变量
NumberOfPhysicians
与变量Population
的比例,并将其存储在数据框who
中的一个单独的向量DrsPop
中。要回答上述问题,我们使用命令:> who$Country[which.min(who$DrsPop)] > who$Country[which.max(who$DrsPop)]
这些问题的答案分别是
圣马力诺
(每人医生数量最高)和马拉维
(每人医生数量最低)。使用
str()
命令查看数据结构将得到202个观测值和16个变量,第16个变量是新添加的DrsPop
。 - 医院床位数量的直方图是什么样的?
为了回答这个问题,我们使用命令绘制直方图:
> hist(who$HospitalBeds)
这显示了下图所示的直方图
我们看到这个直方图高度偏斜,大多数国家的医院床位数量很少。
- 按大洲划分的人口增长箱线图是什么样的?
为了回答这个问题,我们使用命令绘制箱线图:
> boxplot(who$PopGrowth ~ who$Continent, xlab = "Continent", ylab = "Population Growth")
这显示了下图所示的箱线图从这个箱线图,我们看到有些大洲的人口增长率确实为负。有些大洲的四分位距(箱子的垂直高度)非常小,这表明该大洲的人口增长率差异不大。离第一或第三四分位数超过四分位距的离群值,在上面的图中显示为圆圈。
- 60岁以上人口变量的表格如何随大洲变化?
为了回答这个问题,我们使用
table
命令如下:> table(who$Above60, who$Continent)
这显示了下表
从这个表中,我们看到大洲2(
欧洲
)有11个国家,其人口的22%在60岁以上。 - 我们能按大洲计算平均城镇人口吗?
为了回答这个问题,我们使用
tapply
命令如下:> tapply(who$UrbanPop, who$Continent, mean, na.rm=TRUE)
tapply(arg1, arg2, arg3)
命令接受三个参数,按arg2
对arg1
进行分组,并应用arg3
。这意味着在这种情况下,tapply
命令按变量Continent
对变量UrbanPop
进行分组,并应用平均值。上述命令中的参数na.rm=TRUE
用于指示R在计算中排除NA值。这显示了下表
我们看到,尽管大洲4(
北美洲
)也紧随其后,但大洲1(东地中海
)的平均城镇人口最多。 - 我们能按大洲计算平均人口增长率吗?
为了回答这个问题,我们再次使用
tapply
命令如下:> tapply(who$PopGrowth, who$Continent, mean, na.rm=TRUE)
这显示了下表。我们看到,大洲3(
非洲
)的平均人口增长率最高,而大洲2(欧洲
)最低。
4. 结语
在本文中,我们通过R中的简单命令,初步了解了如何查看CSV文件中的数据。我们使用的示例文件是WHOReduced.csv
,这是2017年WHO数据的简化版本。我试图通过提出一系列简单但重要的数据问题来介绍R。我们了解了read.csv(), str(), summary(), which.min(), which.max(), plot(), subset(), nrow(), hist(), boxplot(), table(), tapply()
等命令。我计划将来继续撰写相关文章,并使用R语言涵盖其他重要的分析工具。
同时,我鼓励您加载自己的CSV文件,尝试上面列出的命令,并让我知道您的反馈。
历史
- 2017年2月8日:版本1.0