Capítol 9 Alternativas Tydiverse

El universo de Tydiverse consiste en una colección de packages de R orientados al Data Science. Se recomienda la consulta del libro online R para Ciencia de Datos.

El package dplyr, al igual que ggplot2, está desarrollado por Hadley Wickham. Este paquete, supone un cambio de filosofía en la forma de trabajar con los datos y se está transformando en un nuevo estándar en R.

9.1 Dplyr: arrange, filter, select

  • arange: Ordena los registros de un data frame.
  • filter: Filtra a partir de un conjunto condiciones lógicas.
  • select: Selecciona las variables.

Paises asiaticos con PIB per cápita inferior a 1000 $ en 2007.

pais07dplyr <- paises07 %>% 
  arrange(desc(esperanza_de_vida)) %>% 
  filter(continente=='Asia' & pib_per_capita < 1000) %>% 
  dplyr::select(pais,esperanza_de_vida,pib_per_capita)

kable(pais07dplyr)
pais esperanza_de_vida pib_per_capita
Myanmar 62.069 944.0000
Afganistán 43.828 974.5803

Las 3 comparten el hecho que no necesitan de comillas para referirse a las variables. También utilizan el operador %>% llamado pipe. Éste sustituye el parámetro de entrada de datos. De esta forma, permite escribir las operaciones de izquierda a derecha facilitando así su lectura.

9.2 Dplyr: mutate, group_by, summarise

  • mutate: Crea o modifica las variables del data frame.
  • group_by: Especifica una o varias variables de agrupación.
  • summarise: define los agregados de las variables originales.

Esperanza de vida y PIB per cápita medio por continente y año.

continentes_anio <- paises %>% 
  arrange(continente,anio) %>% 
  mutate(esperanza_de_vida_total = esperanza_de_vida * poblacion
         , pib_total = pib_per_capita * poblacion) %>% 
  group_by(continente,anio) %>% 
  dplyr::summarize(n_paises=n()
            , esperanza_de_vida = sum(esperanza_de_vida_total ) /
                sum(poblacion )
            , pib_per_capita = sum(pib_total) / 
              sum(poblacion)
            , poblacion = sum(poblacion))

kable(continentes_anio %>% head(10))
continente anio n_paises esperanza_de_vida pib_per_capita poblacion
África 1952 52 38.79973 1311.221 237640501
África 1957 52 40.94031 1444.952 264837738
África 1962 52 43.09925 1540.599 296516865
África 1967 52 45.17721 1774.847 335289489
África 1972 52 47.21229 2063.171 379879541
África 1977 52 49.20883 2244.799 433061021
África 1982 52 51.01744 2295.192 499348587
África 1987 52 52.82479 2180.764 574834110
África 1992 52 53.37292 2071.615 659081517
África 1997 52 53.28327 2098.865 743832984

Para la evolución de los continentes en ggplot2, es útil el geom_path()

ggplot(continentes_anio, aes(x=pib_per_capita
                          , y=esperanza_de_vida
                          , color =continente)) +
  geom_path() +
  scale_x_log10() +
  geom_text_repel(aes(label=anio), size=2, color="black") +
  labs(title="Evolución continentes (ponderado)")
Fuente: Elaboración propia con datos de Gapminder

Figura 9.1: Fuente: Elaboración propia con datos de Gapminder

9.3 Actividad guiada 1.4.

Vamos a incorporar los gráficos de evolución de los continentes en el informe teniendo en cuenta los siguientes cambios:

  • Recodifica Oceanía como Asia y Modifica los colores de los continentes.
  • Utiliza la paleta de colores de la actividad guiada 1.3.

Observa:

  • Se ha utilizado dplyr: arrange,mutate,group_by y summarize.
  • Se ha utilizado geom_path.

9.4 Actividad guiada 1.4

library(knitr)
library(datos)
suppressPackageStartupMessages(library(tidyverse))
library(ggrepel)

knitr::opts_chunk$set(echo = TRUE)

paises_informe <- paises
# Recodifica Oceanía por Asia
paises_informe$continente[paises_informe$continente=="Oceanía"] <- "Asia"
# Elimina Oceanía de los levels
paises_informe$continente <- factor(paises_informe$continente)
# Paleta de colores
colores_continente <- c("blue","green", "red", "yellow") 
names(colores_continente) <- c("África", "Américas", "Asia", "Europa")
# Etiquetas
etiquetas_paises <- c("España","China","Etiopía","Canadá")
# funcion describir
describir <- function(data, colores, etiquetas) {
  
  # filtra paises con etiqueta
  data_etiquetas <- data[data$pais %in% etiquetas, ]
  
  # Agrega continentes
  data_continente <- data %>% 
    arrange(continente, anio) %>% 
    mutate(esperanza_de_vida_total = esperanza_de_vida * poblacion
      , pib_total = pib_per_capita * poblacion) %>% 
    group_by(continente, anio) %>% 
    dplyr::summarize(n_paises=n()
      , esperanza_de_vida = sum(esperanza_de_vida_total ) /
          sum(poblacion )
      , pib_per_capita = sum(pib_total) / 
        sum(poblacion)
      , poblacion = sum(poblacion))

  resultados <- list()
  
  resultados[["continentes"]] <- ggplot(data_continente, aes(x=pib_per_capita, y=esperanza_de_vida
      , color=continente)) +
    geom_path() +
    scale_x_log10() +
    scale_colour_manual(values = colores) +
    geom_text_repel(aes(label=anio), size=2, color="black") +
    labs(title="Evolución de los Continentes de 1952 a 2007"
      , x = "Logaritmo base 10 del PIB per cápita ($ americanos, ajustados según inflación)"
      , y = "Esperanza de vida (años)")
  
  return(resultados)
}
resumen <- describir(paises_informe, colores_continente, etiquetas_paises)
## `summarise()` regrouping output by 'continente' (override with `.groups` argument)

9.4.1 Evolución de los continentes

Evolución continentes (Fuente: Elaboración propia con datos de Gapminder)

Figura 9.2: Evolución continentes (Fuente: Elaboración propia con datos de Gapminder)

El gráfico muestra la traza que han recorrido los continentes en sus valores medios de PIB per cápita y Esperanza de vida. Se confirma la mayor progresión de Asia. Vemos que como América y Europa, en media tienen un comportamiento bastante paralelo. Se observa como el recorrido de África, aunque partiendo de valores muy inferiores, ha sido positiva y ha incrementado de forma similar el resto de continentes.