Данные Всемирной организации здравоохранения (ВОЗ) будут использованы в качестве иллюстрации к положениям, изложенным в книге Garrett Grolemund и Hadley Wickham “R for Data Science”. Web-версия в свободном доступе
Файл с данными, используемый для изучения материалов книги, собран с использованием пакета WHO. Создание файла описано ранее
library(tidyverse)
WHOData <- read.csv("WHOData.csv")
glimpse(WHOData)
## Observations: 181
## Variables: 10
## $ country <fctr> Bosnia and Herzegovina, Botsw...
## $ worldbankincomegroup <fctr> Upper-middle-income, Upper-mi...
## $ PerCapitaTotalHealthExpenditure <dbl> 957.40, 870.84, 6468.50, 472.6...
## $ region <fctr> Europe, Africa, Europe, Weste...
## $ LifeExpectancy <dbl> 77.4, 65.7, 83.4, 69.4, 70.9, ...
## $ AdolescentBirthRate <dbl> 11.0, 39.0, 2.0, 32.6, 56.0, 1...
## $ ContraceptivePrevalence <dbl> 45.8, 52.8, 82.0, NA, 60.3, 63...
## $ LowBirthWeight <int> 5, 13, 6, 18, 13, 4, 14, 27, 5...
## $ LiteracyRate <int> 98, 85, NA, NA, 74, 100, 61, N...
## $ TotalFertilityRate <dbl> 1.3, 2.6, 1.5, 3.3, 2.8, 1.6, ...
# преобразуем тип переменной country
WHOData$country <- as.character(WHOData$country)
# определим порядок в переменной
WHOData$worldbankincomegroup <- factor(WHOData$worldbankincomegroup,
levels = c("Low-income", "Lower-middle-income", "Upper-middle-income", "High-income"))
summary(WHOData)
## country worldbankincomegroup
## Length:181 Low-income :29
## Class :character Lower-middle-income:49
## Mode :character Upper-middle-income:48
## High-income :55
##
##
##
## PerCapitaTotalHealthExpenditure region
## Min. : 24.96 Africa :47
## 1st Qu.: 202.16 Americas :33
## Median : 698.30 Eastern Mediterranean:20
## Mean :1269.48 Europe :50
## 3rd Qu.:1718.02 South-East Asia :10
## Max. :9402.54 Western Pacific :21
##
## LifeExpectancy AdolescentBirthRate ContraceptivePrevalence
## Min. :50.10 Min. : 1.70 Min. : 4.00
## 1st Qu.:65.70 1st Qu.: 17.00 1st Qu.:34.40
## Median :73.50 Median : 45.70 Median :54.80
## Mean :71.38 Mean : 56.77 Mean :51.21
## 3rd Qu.:76.70 3rd Qu.: 84.00 3rd Qu.:70.30
## Max. :83.70 Max. :229.00 Max. :88.40
## NA's :16
## LowBirthWeight LiteracyRate TotalFertilityRate
## Min. : 3.00 Min. : 29.00 Min. :1.300
## 1st Qu.: 6.00 1st Qu.: 71.00 1st Qu.:1.800
## Median : 9.00 Median : 90.00 Median :2.300
## Mean :10.52 Mean : 83.36 Mean :2.863
## 3rd Qu.:13.00 3rd Qu.: 98.00 3rd Qu.:3.800
## Max. :34.00 Max. :100.00 Max. :7.600
## NA's :7 NA's :50
В книге “R for Data Science” Hadley Wickham начинает с визуализации данных, цитируя John Tukey
“The simple graph has brought more information to the data analyst’s mind than any other device.”
Разумеется, приоритет отдается пакету ggplot2.
В качестве первого примера приводится скаттерограмма (диаграмма рассеивания, точечная диаграмма), демонстрирующая связь количественных показателей TotalFertilityRate и AdolescentBirthRate
ggplot(data = WHOData, aes(x = TotalFertilityRate, y = AdolescentBirthRate)) +
geom_point()
График можно сделать более информативным, используя такие аргументы как colour (цвет), shape (форма) и size (размер).
Зададим цвет точек в зависимости от значения region
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
colour = region)) +
geom_point()
Информацию об отнесении страны к той или иной группе по классификации Всемирного банка можно вывести, изменив форму или размер точек. Изменение размера точек можно приложить как к количественным так и к номинативным порядковым данным.
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
colour = region,
shape = worldbankincomegroup)) +
geom_point()
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
colour = region,
size = worldbankincomegroup)) +
geom_point()
## Warning: Using size for a discrete variable is not advised.
Вариант визуализации, при котором размер точки определяется распространением контрацепции в стране
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
size = ContraceptivePrevalence,
colour = region)) +
geom_point()
## Warning: Removed 16 rows containing missing values (geom_point).
Другим способом визуализации этой информации будет фацетирование, когда диаграмма по каждой группе будет выведена на отдельном графике.
И здесь возможны варианты как самого фацетирования, так и использования таких аргументов как цвет, форма, размер.
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
colour = region)) +
geom_point() +
facet_grid(~ worldbankincomegroup)
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
colour = region)) +
geom_point() +
facet_grid(~ worldbankincomegroup, scales = "free")
Добавление аргумента scales = “free” позволяет использовать отдельную шкалу для каждого графика.
Вариант facet_wrap позволяет иначе скомпоновать выводимые графики
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
colour = region)) +
geom_point() +
facet_wrap(~ worldbankincomegroup)
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
colour = region)) +
geom_point() +
facet_wrap(~ worldbankincomegroup, scales = "free")
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate,
size = ContraceptivePrevalence,
colour = worldbankincomegroup)) +
geom_point() +
facet_wrap(~ region, scales = "free")
## Warning: Removed 16 rows containing missing values (geom_point).
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate)) +
geom_point() +
geom_smooth(method = loess)
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate)) +
geom_point() +
geom_smooth(method = lm)
Два графика удобнее сравнивать, если вывести их на одном рисунке
myplot1 <- ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate)) +
geom_point() +
geom_smooth(method = loess) +
ggtitle("loess method")
myplot2 <- ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate)) +
geom_point() +
geom_smooth(method = lm) +
ggtitle("lm methos")
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
grid.arrange(myplot1, myplot2, ncol=2)
Линии тренда могут отличаться своим типом и цветом
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate)) +
geom_point() +
geom_smooth(method = loess, se = FALSE,
aes(linetype = worldbankincomegroup))
ggplot(WHOData, aes(TotalFertilityRate, AdolescentBirthRate)) +
geom_point() +
geom_smooth(method = loess, se = FALSE,
aes(colour = worldbankincomegroup))
To be continued