6.1 Gráficas en R

El objetivo de esta sección es mostrar cómo generar gráficos a partir de encuestas complejas en R. En todo análisis de encuestas, el componente gráfico cumple dos funciones principales:

  1. Análisis exploratorio: permite revisar tendencias en variables de interés, distribuciones y asociaciones.
  2. Diagnóstico de modelos: ayuda a verificar supuestos en el ajuste de modelos, tales como la homogeneidad de varianzas o la normalidad de los errores.

Uno de los paquetes más utilizados en R para graficar es ggplot2, desarrollado por Hadley Wickham. Este paquete implementa el enfoque Grammar of Graphics, el cual plantea que cualquier gráfico puede describirse mediante una gramática compuesta de capas (datos, estéticas, geometrías, estadísticas, escalas y temas).

En combinación con paquetes como survey y srvyr, es posible generar gráficos que consideren los pesos de la encuesta y que representen correctamente tanto estimaciones como errores de muestreo.

Como es costumbre, iniciamos cargando las librerías necesarias y configurando opciones generales:

# Configuración general
# knitr::opts_chunk$set(cache = TRUE, warning = FALSE, message = FALSE, error = FALSE)
options(digits = 4)

# Paquetes para manejo de encuestas y visualización
library(tidyverse)
library(survey)      # Diseños muestrales complejos
library(srvyr)       # Interfaz amigable con dplyr para encuestas
library(ggplot2)     # Gramática de gráficos
library(patchwork)   # Composición de gráficos

El cargue de la base de datos se hace a continuación,

data(BigCity, package = "TeachingSampling")
encuesta <- readRDS("Data/encuesta.rds")

A continuación, se define el diseño de muestreo:

library(srvyr)
diseno <- encuesta %>%
  as_survey_design(
    strata = Stratum,
    ids = PSU,
    weights = wk,
    nest = T
  )

A partir de las variables de la encuesta, para efectos de los ejemplos, se definen las siguientes variables:

diseno <- diseno %>% mutate(
  pobreza = ifelse(Poverty != "NotPoor", 1, 0),
  desempleo = ifelse(Employment == "Unemployed", 1, 0),
  edad_18 = case_when(
    Age < 18 ~ "< 18 años",
    TRUE ~ ">= 18 años"
  )
)

Como se mostró en capítulos anteriores, se divide la muestra en sub grupos para ejemplificar los conceptos que se mostrarán en este capítulo:

sub_Urbano <- diseno %>% filter(Zone == "Urban")
sub_Rural <- diseno %>% filter(Zone == "Rural")
sub_Mujer <- diseno %>% filter(Sex == "Female")
sub_Hombre <- diseno %>% filter(Sex == "Male")

Para crear las gráficas en este texto se utilizará por defecto el tema que la CEPAL tiene asignado por defecto. El tema se define a continuación:

theme_cepal <- function(...) {
  theme_light(10) +
    theme(
      axis.text.x = element_blank(),
      axis.ticks.x = element_blank(),
      axis.text.y = element_blank(),
      axis.ticks.y = element_blank(),
      legend.position = "bottom",
      legend.justification = "left",
      legend.direction = "horizontal",
      plot.title = element_text(size = 20, hjust = 0.5),
      ...
    )
}