30  Pre-procesamiento de los datos

En esta sección llevaremos a cabo la manipulación y limpieza de los datos que utilizaremos en los ejercicios posteriores.

Cargar paquetes en R

Código
pacman::p_load(
  gapminder,        # Datos mundiales
  tidyverse,        # gestión de datos
  DT,               # Tablas bonitas
  gtsummary,        # generar resumenes
  psych,            # tabla con estadisticos
  knitr,             # Tabla bonita
  flextable,
  gt
)        

30.1 Selección de datos

Nos gustaría conocer la información relacionada con la esperanza de vida (lifeExp), la población total del país (pop) y el producto interno bruto per cápita (gdpPercap) de los países involucrados en el Proyecto JAGUAR - UNAM durante el año 2007, utilizando el conjunto de datos gapminder disponible a través del paquete gapminder en R.

Código
# Paises involucrados con el proyecto JAGUAR
JAGUAR_paises <-  c("Argentina", "Brazil", "Colombia", "Chile", "Mexico", "Peru", "Uruguay")

# Seleccionar la informacion relacionada con los paises del proyecto JAGUAR durante todos los years registrados
JAGUAR_gapminder <- gapminder::gapminder %>% 
  mutate(
    # Convertir paises de factor a caracter para tener capas independientes por paises en la figura interactiva
    id = levels(country)[as.numeric(country)],
    country = forcats::fct_reorder(country, lifeExp)) %>% 
  filter(continent == "Americas") %>%
  filter(country %in% JAGUAR_paises) %>% # seleccionar paises
  droplevels()  # eliminar niveles de factor no utilizados

Revisar informacion

Código
# Visualizar informacion en una tabla bonita
JAGUAR_gapminder %>%
  DT::datatable()

Guardar la variable

Código
# crear una carpeta para la salida
# Eliminar si existe
if (dir.exists("data")) {
  unlink("data", recursive = TRUE)
}

# Crear el nuevo directorio
dir.create("data")

# Guardar la variable
save(JAGUAR_gapminder, file = "data/JAGUAR_gapminder.RData")

30.2 Estadística descriptiva de los datos

30.2.1 TIPO 1: Tabla con summary() (Base R) 🟢

La forma más simple y rápida de obtener estadísticas.

Código
gapminder %>%
  filter(year == 2007) %>%
  select(lifeExp, pop, gdpPercap) %>%
  summary()
    lifeExp           pop              gdpPercap      
 Min.   :39.61   Min.   :1.996e+05   Min.   :  277.6  
 1st Qu.:57.16   1st Qu.:4.508e+06   1st Qu.: 1624.8  
 Median :71.94   Median :1.052e+07   Median : 6124.4  
 Mean   :67.01   Mean   :4.402e+07   Mean   :11680.1  
 3rd Qu.:76.41   3rd Qu.:3.121e+07   3rd Qu.:18008.8  
 Max.   :82.60   Max.   :1.319e+09   Max.   :49357.2  

Ventajas:

  • ✅ Muy rápido
  • ✅ No requiere paquetes adicionales
  • ✅ Muestra 6 estadísticas automáticamente

Desventajas:

  • ❌ No es muy bonito
  • ❌ Difícil de personalizar
  • ❌ No agrupa bien

30.2.2 TIPO 2: Tabla con describe() (Paquete psych) 🟡

¿Qué es?: Tabla más detallada que summary().

Código
gapminder %>%
  filter(year == 2007) %>%
  select(lifeExp, pop, gdpPercap) %>%
  describe()
          vars   n        mean           sd      median     trimmed         mad
lifeExp      1 142       67.01        12.07       71.94       68.11       11.01
pop          2 142 44021219.57 147621397.90 10517531.00 18112753.95 12212489.77
gdpPercap    3 142    11680.07     12859.94     6124.37     9614.17     7522.41
                min          max        range  skew kurtosis          se
lifeExp       39.61 8.260000e+01 4.299000e+01 -0.67    -0.87        1.01
pop       199579.00 1.318683e+09 1.318484e+09  7.25    55.42 12388112.52
gdpPercap    277.55 4.935719e+04 4.907964e+04  1.20     0.25     1079.18

30.2.3 TIPO 3: Tabla con group_by() y summarize() 🟠

Tabla personalizada creada manualmente con dplyr.

Código
gapminder %>%
  filter(year == 2007) %>%
  group_by(continent) %>%
  summarize(
    n = n(),
    media_lifeExp = mean(lifeExp),
    sd_lifeExp = sd(lifeExp),
    min_lifeExp = min(lifeExp),
    max_lifeExp = max(lifeExp),
    media_gdp = mean(gdpPercap),
    sd_gdp = sd(gdpPercap),
    .groups = 'drop'
  )
# A tibble: 5 × 8
  continent     n media_lifeExp sd_lifeExp min_lifeExp max_lifeExp media_gdp
  <fct>     <int>         <dbl>      <dbl>       <dbl>       <dbl>     <dbl>
1 Africa       52          54.8      9.63         39.6        76.4     3089.
2 Americas     25          73.6      4.44         60.9        80.7    11003.
3 Asia         33          70.7      7.96         43.8        82.6    12473.
4 Europe       30          77.6      2.98         71.8        81.8    25054.
5 Oceania       2          80.7      0.729        80.2        81.2    29810.
# ℹ 1 more variable: sd_gdp <dbl>

30.2.4 TIPO 4: Tabla con knitr::kable() 🔴

Tabla bonita para reportes y documentos.

Código
gapminder %>%
  filter(year == 2007) %>%
  group_by(continent) %>%
  summarize(
    Países = n(),
    `Esperanza de Vida (media)` = round(mean(lifeExp), 2),
    `Esperanza de Vida (SD)` = round(sd(lifeExp), 2),
    `PIB per Cápita (media)` = round(mean(gdpPercap), 0),
    .groups = 'drop'
  ) %>%
  kable(
    caption = "Estadísticas por Continente en 2007",
    align = c("l", "c", "c", "c", "c")
  )
Estadísticas por Continente en 2007
continent Países Esperanza de Vida (media) Esperanza de Vida (SD) PIB per Cápita (media)
Africa 52 54.81 9.63 3089
Americas 25 73.61 4.44 11003
Asia 33 70.73 7.96 12473
Europe 30 77.65 2.98 25054
Oceania 2 80.72 0.73 29810

30.2.5 TIPO 5: Tabla con flextable() 🟣

Código
gapminder %>%
  filter(year == 2007) %>%
  group_by(continent) %>%
  summarize(
    Países = n(),
    `Esperanza de Vida` = round(mean(lifeExp), 2),
    `PIB per Cápita` = round(mean(gdpPercap), 0),
    .groups = 'drop'
  ) %>%
  flextable() %>%
  set_header_labels(
    continent = "Continente",
    Países = "Número de Países",
    `Esperanza de Vida` = "Esperanza de Vida (años)",
    `PIB per Cápita` = "PIB per Cápita (USD)"
  ) %>%
  autofit() %>%
  theme_vanilla()

Continente

Número de Países

Esperanza de Vida (años)

PIB per Cápita (USD)

Africa

52

54.81

3,089

Americas

25

73.61

11,003

Asia

33

70.73

12,473

Europe

30

77.65

25,054

Oceania

2

80.72

29,810

Resultado: Tabla profesional con formato automático

30.2.6 TIPO 6: Tabla Dinámica (Pivot Table) 🔵

Código
gapminder %>%
  filter(year %in% c(1952, 1982, 2007)) %>%
  group_by(continent, year) %>%
  summarize(
    media_lifeExp = round(mean(lifeExp), 2),
    .groups = 'drop'
  ) %>%
  pivot_wider(
    names_from = year,
    values_from = media_lifeExp
  ) %>%
  kable(
    caption = "Esperanza de Vida por Continente (1952, 1982, 2007)"
  )
Esperanza de Vida por Continente (1952, 1982, 2007)
continent 1952 1982 2007
Africa 39.14 51.59 54.81
Americas 53.28 66.23 73.61
Asia 46.31 62.62 70.73
Europe 64.41 72.81 77.65
Oceania 69.25 74.29 80.72

30.2.7 TIPO 7: Tabla con gt() (Great Tables) 🟢

Código
gapminder %>%
  filter(year == 2007) %>%
  group_by(continent) %>%
  summarize(
    Países = n(),
    `Esperanza de Vida` = mean(lifeExp),
    `PIB per Cápita` = mean(gdpPercap),
    .groups = 'drop'
  ) %>%
  gt() %>%
  fmt_number(
    columns = c(`Esperanza de Vida`, `PIB per Cápita`),
    decimals = 2
  ) %>%
  tab_header(
    title = "Estadísticas por Continente en 2007",
    subtitle = "Datos de Gapminder"
  ) %>%
  cols_label(
    continent = "Continente",
    Países = "Número de Países",
    `Esperanza de Vida` = "Esperanza de Vida (años)",
    `PIB per Cápita` = "PIB per Cápita (USD)"
  )
Estadísticas por Continente en 2007
Datos de Gapminder
Continente Número de Países Esperanza de Vida (años) PIB per Cápita (USD)
Africa 52 54.81 3,089.03
Americas 25 73.61 11,003.03
Asia 33 70.73 12,473.03
Europe 30 77.65 25,054.48
Oceania 2 80.72 29,810.19

Uso: Para publicaciones y reportes científicos

30.2.8 TIPO 8: Tabla Interactiva con DT::datatable() 🟡

Código
gapminder %>%
  filter(year == 2007) %>%
  select(country, continent, lifeExp, pop, gdpPercap) %>%
  datatable(
    colnames = c("País", "Continente", "Esperanza de Vida", "Población", "PIB per Cápita"),
    options = list(
      pageLength = 10,
      searching = TRUE,
      ordering = TRUE
    ),
    caption = "Datos de Gapminder 2007"
  )

30.2.9 TIPO 9: Tabla profesional para artículos

Obtener un resumen descriptivo de la esperanza de vida media en los países seleccionados.

Código
JAGUAR_gapminder %>%
  # Eliminar columnas
  select(-continent, -id, -year) %>% 
  # Estadistica descriptiva en la tabla. Crea la tabla de resumen.
  tbl_summary(
    by = country, 
    # Para variables continuas (lifeExp, pop, gdpPercap). Muestra: Media (Desviación Estándar)
    statistic = list(all_continuous() ~ "{mean} ({sd})", 
    # Para variables categóricas (country). Muestra: Conteo / Total (Porcentaje)          
                     all_categorical() ~ "{n} / {N} ({p}%)"),
    # {N} se reemplaza automáticamente con el número total de observaciones
    # Redondea variables continuas a 2 decimales
    digits = all_continuous() ~ 2) %>% 
  # Nombre del titulo de la tabla
  modify_caption("Caracteristicas de los paises (N = {N})") %>%
  # Convierte la tabla a formato gt (Great Tables) para mejor visualización.
  as_gt() 
Caracteristicas de los paises (N = 84)
Characteristic Peru
N = 121
Brazil
N = 121
Colombia
N = 121
Mexico
N = 121
Chile
N = 121
Argentina
N = 121
Uruguay
N = 121
lifeExp 58.86 (9.57) 62.24 (7.04) 63.90 (6.98) 65.41 (8.19) 67.43 (8.67) 69.06 (4.19) 70.78 (3.34)
pop 17,559,093.00 (7,053,307.63) 122,312,126.67 (45,747,618.44) 27,256,099.58 (10,535,047.08) 68,414,297.42 (26,954,820.63) 11,205,725.33 (3,333,125.57) 28,602,239.92 (7,546,608.99) 2,912,487.17 (368,526.99)
gdpPercap 5,613.84 (1,056.66) 5,829.32 (2,436.45) 4,195.34 (1,652.93) 7,724.11 (2,770.81) 6,703.29 (3,026.19) 8,955.55 (1,862.58) 7,100.13 (1,612.26)
1 Mean (SD)

30.3 Referencias