Изучаем данные ВОЗ

Данные Всемирной организации здравоохранения (ВОЗ) будут использованы в качестве иллюстрации к положениям, изложенным в книге Garrett Grolemund и Hadley Wickham “R for Data Science”. Web-версия в свободном доступе

Файл с данными, используемый для изучения материалов книги, собран с использованием пакета WHO. Создание файла описано ранее

Будут использованы пакеты, включенные в tidyverse

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