El primer paso en el Análisis Exploratorio de Datos (EDA) consiste en verificar las dimensiones (número de filas y columnas), examinar los tipos de datos y realizar un saneamiento inicial. La base de datos de la OMS para Japón contiene una fila inicial de metadatos técnicos (etiquetas que inician con #) que debe excluirse antes de procesar los registros cuantitativos.
# ==========================================
# BLOQUE 1: Carga de Librerías y Datos
# ==========================================
library(tidyverse)
library(plotly)
library(knitr)
# Carga del archivo manteniendo los nombres originales de las columnas
datos_raw <- read.csv("child-health-indicators-for-japan-44.csv",
check.names = FALSE,
stringsAsFactors = FALSE)
# Filtrado de la fila de metadatos (índice 0) y formateo de campos
datos_salud <- datos_raw %>%
filter(`GHO (CODE)` != "#indicator+code") %>%
mutate(
Valor_Numerico = as.numeric(Numeric),
Anio = as.numeric(`YEAR (DISPLAY)`),
Indicador = `GHO (DISPLAY)`,
Sexo = `SEX (DISPLAY)`
) %>%
filter(!is.na(Valor_Numerico))
# Inspección de dimensiones (filas y columnas disponibles)
dim(datos_salud)## [1] 199 38
# ==========================================
# BLOQUE 2: Verificación de Valores Faltantes
# ==========================================
# Conteo de datos ausentes (registros sin información almacenada) por columna
valores_faltantes <- colSums(is.na(datos_salud))
valores_faltantes[valores_faltantes > 0]## PUBLISHSTATE (URL) YEAR (URL)
## 199 199
## REGION (URL) WORLDBANKINCOMEGROUP (URL)
## 199 199
## COUNTRY (URL) SEX (URL)
## 199 199
## Low High
## 183 183
## StdErr StdDev
## 199 199
## Anio
## 4
Para la toma de decisiones en gerencia de recursos de salud, las variables del conjunto de datos se clasifican según su naturaleza de medición:
Variables Categóricas o Cualitativas (Atributos de clasificación):
GHO (DISPLAY) (Indicador Sanitario): Variable cualitativa nominal (categorías sin orden jerárquico) que define el programa o metas de salud evaluadas (ej. cobertura de vacunación DTP3, BCG, bajo peso al nacer).
SEX (DISPLAY) (Sexo de la Población): Variable cualitativa nominal utilizada para desagregar los datos demográficamente (Ambos sexos, Femenino, Masculino) y evaluar la equidad en el acceso a la atención médica.
PUBLISHSTATE (DISPLAY) (Estado de Publicación): Variable cualitativa nominal que valida la oficialidad del dato emitido por la OMS.
Variables Numéricas o Cuantitativas (Cantidades de gestión):
YEAR (DISPLAY) / Anio (Año del Registro): Variable cuantitativa discreta (valores enteros) que define la temporalidad para el análisis de tendencias plurianuales en salud pública.
Numeric / Valor_Numerico (Valor del Indicador): Variable cuantitativa continua (mediciones con decimales) que representa la tasa, porcentaje de cobertura o cifra absoluta de la intervención sanitaria.
# ==========================================
# BLOQUE 3: Resumen Estructurado de Variables
# ==========================================
resumen_variables <- datos_salud %>%
group_by(Indicador) %>%
summarise(
Registros = n(),
Anio_Inicio = min(Anio, na.rm = TRUE),
Anio_Fin = max(Anio, na.rm = TRUE),
Promedio_Valor = round(mean(Valor_Numerico, na.rm = TRUE), 2)
)
kable(head(resumen_variables, 10),
caption = "Resumen Operativo de Indicadores Sanitarios en Japón")| Indicador | Registros | Anio_Inicio | Anio_Fin | Promedio_Valor |
|---|---|---|---|---|
| BCG immunization coverage among 1-year-olds (%) | 25 | 1981 | 2018 | 90.84 |
| Children aged <5 years overweight (%) | 4 | 2010 | 2010 | 1.85 |
| Children aged <5 years stunted (%) | 4 | 2010 | 2010 | 7.38 |
| Children aged <5 years underweight (%) | 4 | 2010 | 2010 | 3.35 |
| Children aged <5 years wasted for age (%) | 4 | 2010 | 2010 | 2.02 |
| Diphtheria tetanus toxoid and pertussis (DTP3) immunization coverage among 1-year-olds (%) | 39 | 1980 | 2018 | 89.03 |
| Hib (Hib3) immunization coverage among 1-year-olds (%) | 8 | 2011 | 2018 | 98.62 |
| Low birth weight (in thousands) | 16 | 2000 | 2015 | 104.23 |
| Measles-containing-vaccine first-dose (MCV1) immunization coverage among 1-year-olds (%) | 39 | 1980 | 2018 | 86.79 |
| Measles-containing-vaccine second-dose (MCV2) immunization coverage by the nationally recommended age (%) | 11 | 2008 | 2018 | 92.00 |
Análisis: Resumen Operativo de Indicadores Sanitarios en JapónHeterogeneidad en la Longitud de las Series Temporales:Inmunizaciones consolidadas (DTP3, MCV1, BCG): Poseen la mayor cobertura de seguimiento histórico (39 registros entre 1980 y 2018 para DTP3 y MCV1; 25 registros entre 1981 y 2018 para BCG), lo que permite análisis de tendencia plurianuales de largo plazo. Nutrición e indicadores antropométricos en menores de 5 años: Cuentan únicamente con 4 registros puntuales correspondientes al año 2010 (sobrepeso \(1.85\%\), retraso en el crecimiento \(7.38\%\), bajo peso \(3.35\%\) y emaciación \(2.02\%\)), representando lecturas transversales y no series temporales de seguimiento continuo. Diferenciación de Escalas de Medición:La variable Bajo peso al nacer no está expresada en porcentaje sino en miles de nacimientos (\(104.23\) mil en promedio entre 2000 y 2015), por lo que no debe compararse directamente en una misma gráfica de escala porcentual con las coberturas de vacunación. Interpretación de Desempeño Operativo:Vacunación de alta adopción: Hib3 destaca con el promedio de cobertura más elevado (\(98.62\%\) entre 2011 y 2018), seguido por MCV2 (\(92.00\%\) entre 2008 y 2018) y BCG (\(90.84\%\)). Oportunidad de gestión: MCV1 registra el promedio más bajo entre las vacunas tradicionales (\(86.79\%\)), debido al peso del rezago histórico acumulado en las décadas de 1980 y 1990 antes de su estabilización final
A continuación, se presentan tres gráficos interactivos generados con la librería plotly para explorar el comportamiento de los indicadores clave en la administración de recursos sanitarios de Japón.
Gráfico 1: Tendencia Temporal de Cobertura de Vacunación Esencial (Gráfico de Líneas) Explora la evolución cronológica de las principales vacunas infantiles en Japón (DTP3, MCV1, Pol3 y BCG).
# ==========================================
# BLOQUE 4: Gráfico Interactivo 1 (Líneas)
# ==========================================
# Selección de vacunas clave para el análisis longitudinal
vacunas_clave <- c(
"Diphtheria tetanus toxoid and pertussis (DTP3) immunization coverage among 1-year-olds (%)",
"Measles-containing-vaccine first-dose (MCV1) immunization coverage among 1-year-olds (%)",
"Polio (Pol3) immunization coverage among 1-year-olds (%)",
"BCG immunization coverage among 1-year-olds (%)"
)
datos_vacunas <- datos_salud %>%
filter(Indicador %in% vacunas_clave)
p1 <- ggplot(datos_vacunas, aes(x = Anio, y = Valor_Numerico, color = Indicador, group = Indicador)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(
title = "Evolucion de Coberturas de Inmunización Infantil en Japon",
x = "Ano de Registro",
y = "Cobertura (%)",
color = "Vacuna"
) +
theme_minimal() +
theme(legend.position = "bottom")## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Analisis de la grafica: (EDA en Recursos Sanitarios) Tendencia General (Crecimiento Sostenido): De 1980 a 2020, las coberturas pasan de niveles bajos e inestables (60% - 80%) a consolidarse por encima del 95%. Esto refleja fortalecimiento del sistema de salud y asignación presupuestitaria continua.
Desempeño por Biológico:
MCV1 (Sarampión) y DTP3: Muestran la recuperación más drástica, pasando de la vulnerabilidad en los 80 a niveles óptimos de protección comunitaria.
BCG y Polio 3: Mantienen la mayor estabilidad histórica en el esquema nacional.
Puntos Críticos de Gestión: La caída puntual de la BCG hacia 2014-2015 señala un evento operativo específico (desabastecimiento, quiebre en la cadena de frío o cambio de protocolo) que requiere auditoría de recursos.
Gráfico 2: Comparativo de Cobertura Promedio por Programa de Salud (Gráfico de Barras) Permite comparar la tasa media de cobertura alcanzada entre los distintos esquemas profilácticos (preventivos) evaluados en la base de datos.
# ==========================================
# BLOQUE 5: Gráfico Interactivo 2 (Barras)
# ==========================================
datos_cobertura <- datos_salud %>%
filter(grepl("immunization coverage", Indicador, ignore.case = TRUE)) %>%
group_by(Indicador) %>%
summarise(Cobertura_Promedio = round(mean(Valor_Numerico, na.rm = TRUE), 1)) %>%
mutate(Indicador_Corto = substr(Indicador, 1, 35))
p2 <- ggplot(datos_cobertura, aes(x = reorder(Indicador_Corto, Cobertura_Promedio), y = Cobertura_Promedio, fill = Cobertura_Promedio)) +
geom_col() +
coord_flip() +
scale_fill_gradient(low = "#85C1E9", high = "#1B4F72") +
labs(
title = "Cobertura Promedio Historica por Tipo de Inmunización",
x = "Indicador Sanitario",
y = "Cobertura Promedio (%)"
) +
theme_minimal()
ggplotly(p2)Analisis de la grafica: Desempeño Global Destacado: Todos los biológicos analizados presentan coberturas promedio históricas muy altas, situándose en un rango entre el 85% y el 98%.
Líderes en Cobertura (Programas Consolidados): Las vacunas Hib3 (Hemophilus Influenzae Tipo B) y PCV3 (Neumococo Conjugada) ocupan las posiciones superiores alcanzando promedios cercanos al 97%-98%, reflejando una excelente adopción desde su incorporación al programa nacional.
Puntos de Interés para el Gerente Sanitario:
Las vacunas más antiguas o de dosis múltiples como MCV1 (Sarampión 1ª dosis) y DTP3 se ubican en la parte inferior de la tabla comparativa (promedios entre 85% y 88%).
Causa Administrativa: Esto no indica un mal desempeño actual, sino el peso del histórico de las décadas de 1980 y 1990, donde sus coberturas eran más bajas antes de la consolidación total del sistema de salud japonés.
Gráfico 3: Distribución del Coeficiente de Cobertura e Identificación de Atípicos (Gráfico de Caja / Boxplot) Analiza la dispersión (variabilidad de los datos) y la presencia de valores atípicos (observaciones extremadamente altas o bajas respecto al patrón general) en los indicadores evaluados.
# ==========================================
# BLOQUE 6: Gráfico Interactivo 3 (Boxplot)
# ==========================================
p3 <- ggplot(datos_vacunas, aes(x = Indicador, y = Valor_Numerico, fill = Indicador)) +
geom_boxplot(alpha = 0.7, outlier.colour = "red", outlier.shape = 8) +
labs(
title = "Variabilidad de Cobertura en Vacunas Principales",
x = "Vacuna",
y = "Porcentaje (%)"
) +
theme_minimal() +
theme(axis.text.x = element_blank())
ggplotly(p3)Analisis de la grafica (Gráficos de Caja / Boxplot) Dispersión y Estabilidad Operativa:
Polio (Pol3 - Morado) y BCG (Rojo): Presentan las cajas más compactas e instaladas en la parte alta de la escala (entre 90% y 98%), lo que refleja una gran consistencia histórica en la prestación del servicio sanitario.
DTP3 (Verde) y MCV1 (Azul): Tienen cajas y “bigotes” más alargados (que se extienden hasta el 60%-70%), lo que indica que históricamente atravesaron períodos de alta variabilidad antes de lograr la estabilización del esquema.
Detección de Valores Atípicos (Outliers):
Los puntos aislados fuera de los “bigotes” (como los observados cerca del 60% en la línea verde de DTP3 o alrededor del 80%-85% en las demás) representan años atípicos de baja cobertura.
Relevancia Gerencial:
Para la administración de recursos sanitarios, la variabilidad (cajas largas) alerta sobre períodos pasados de vulnerabilidad presupuestal o fallas de cobertura.
Los valores atípicos señalan eventos críticos específicos en la historia del sistema de salud (como desabastecimiento o alertas sanitarias) que deben ser auditados.
En la gestión de centros hospitalarios y redes sanitarias, la toma de decisiones requiere modelar la incertidumbre propia de la demanda asistencial (llegada de pacientes, auditorías de inventario o fallas de cobertura). Mediante simulaciones estocásticas (métodos basados en números aleatorios), un gerente puede anticipar escenarios operativos sin arriesgar recursos reales.
A. Simulación Muestral Muestreo Muestral (sample() y table()) Modelamos una auditoría de control de calidad sobre una muestra aleatoria de 100 centros de vacunación prefijados en la red hospitalaria de Japón.
# ==========================================
# BLOQUE 1: Muestreo Aleatorio y Frecuencia Empírica
# ==========================================
set.seed(123) # Fijar semilla para reproducibilidad
# Definición del espacio muestral (estados de auditoría sanitaria)
estados_auditoria <- c("Conforme", "Revisa_Inventario", "Falta_Insumos")
# Simulación de la revisión de 100 puestos de salud (con reemplazo)
muestreo_puestos <- sample(
x = estados_auditoria,
size = 100,
replace = TRUE,
prob = c(0.75, 0.20, 0.05) # 75% conformidad, 20% revisión, 5% desabastecimiento
)
# Tabla de frecuencias absolutas y probabilidades empíricas (proporciones)
frecuencia_abs <- table(muestreo_puestos)
prob_empirica <- prop.table(frecuencia_abs)
frecuencia_abs## muestreo_puestos
## Conforme Falta_Insumos Revisa_Inventario
## 73 5 22
## muestreo_puestos
## Conforme Falta_Insumos Revisa_Inventario
## 0.73 0.05 0.22
Los resultados de la simulación coinciden estrechamente con las probabilidades teóricas asignadas en el modelo (\(75\%\), \(5\%\) y \(20\%\)), demostrando la variabilidad esperada al tomar una muestra de 100 centros. En términos de administración hospitalaria, esta técnica permite estimar la carga de trabajo que enfrentará el equipo de auditoría antes de desplegar las visitas de campo reales.
B. Distribuciones Discretas (runif(), rbinom(), dpois())Visualizamos escenarios hipotéticos de gestión sanitaria mediante tres modelos discretos:Distribución Binomial (rbinom()): Número de niños vacunados con éxito en lotes de 20 pacientes cuando la probabilidad individual es del 90%.Distribución de Poisson (dpois()): Probabilidad exacta de recibir \(k\) pacientes con reacciones adversas en un día, dado una tasa media (\(\lambda\)) de 3 eventos/día.
# ==========================================
# BLOQUE 2: Modelación Discreta y Gráfico Interactivo 1 (Binomial)
# ==========================================
library(tidyverse)
library(plotly)
# Simulación de 500 jornadas de vacunación (n = 20 niños por lote, p = 0.90)
sim_binomial <- data.frame(Vacunados = rbinom(n = 500, size = 20, prob = 0.90))
p_disc <- ggplot(sim_binomial, aes(x = factor(Vacunados))) +
geom_bar(fill = "#2E86C1", color = "black", alpha = 0.8) +
labs(
title = "Simulación: Niños Vacunados Efectivamente por Lote de 20",
x = "Número de Niños Vacunados (Éxitos)",
y = "Frecuencia de Jornadas"
) +
theme_minimal()
ggplotly(p_disc)Interpretación (Gráfico Binomial: Cobertura por Lote de 20 Niños)Rendimiento Promedio Esperado (Alta Eficiencia Operativa): La mayoría de las jornadas simulatedas registran entre 18 y 19 niños vacunados exitosamente de cada grupo de 20 (frecuencia pico en la gráfica). Esto confirma que, con una tasa de efectividad del \(90\%\) (\(p = 0.90\)), el promedio teórico esperado de \(\mu = n \cdot p = 18\) niños inmunizados se cumple de forma constante. Baja Frecuencia de Desviaciones Severas: Es altamente improbable obtener menos de 15 vacunas efectivas por lote (barras casi imperceptibles hacia 13 y 14). Relevancia Gerencial: Este modelo permite planificar el uso del talento humano y el suministro de insumos: el administrador de salud puede prever que en más del \(80\%\) de las jornadas se logrará una meta óptima (\(\ge 18\) aplicaciones por lote), minimizando el desperdicio de biológicos abiertos y maximizando la protección comunitaria.
C. Distribuciones Continuas (rnorm(), rexp(), dnorm(), pnorm(), pexp())Simulamos variables críticas continuas de administración clínica:Exponencial (rexp(), pexp()): Tiempos de espera entre llegada de pacientes a emergencias pediatrícas (medido en minutos, con media \(\mu = 15\) min \(\rightarrow \lambda = 1/15\)).Normal (rnorm(), pnorm()): Concentración de biológicos o peso al nacer en gramos.
# ==========================================
# BLOQUE 3: Modelación Continua y Probabilidades Teóricas
# ==========================================
# Probabilidad de que un paciente espere menos de 10 minutos (Exponencial, media = 15)
prob_espera_10min <- pexp(q = 10, rate = 1/15)
cat("Probabilidad de espera menor a 10 min:", round(prob_espera_10min, 4), "\n")## Probabilidad de espera menor a 10 min: 0.4866
# Probabilidad de que el porcentaje de cobertura regional supere el 95% N(mean=90, sd=4)
prob_cobertura_95 <- 1 - pnorm(q = 95, mean = 90, sd = 4)
cat("Probabilidad de superar el 95% de cobertura:", round(prob_cobertura_95, 4), "\n")## Probabilidad de superar el 95% de cobertura: 0.1056
# Gráfico interactivo 2: Densidad Exponencial de Tiempos de Espera
sim_tiempos <- data.frame(Tiempo = rexp(n = 1000, rate = 1/15))
p_cont <- ggplot(sim_tiempos, aes(x = Tiempo)) +
geom_density(fill = "#27AE60", alpha = 0.5) +
labs(
title = "Distribución Continuo: Tiempos de Espera en Emergencia (Minutos)",
x = "Tiempo de Espera (min)",
y = "Densidad de Probabilidad"
) +
theme_minimal()
ggplotly(p_cont)Interpretación (Distribución Continua: Tiempos de Espera)Sesgo Positivo y Concentración Inicial: La curva alcanza su punto máximo (pico de densidad) muy cerca del origen, mostrando que la mayoría de los pacientes atendidos experimenta tiempos de espera cortos (entre 5 y 15 minutos). Comportamiento Asimétrico (Cola Larga): La curva desciende paulatinamente hacia la derecha, extendiéndose más allá de los 50 y 75 minutos. Esto refleja la naturaleza típica de las colas de urgencias, donde existe un porcentaje minoritario de usuarios que debe esperar tiempos considerablemente mayores. Relevancia para la Gerencia Sanitaria:La distribución exponencial es el estándar para modelar la llegada y atención no programada en triaje.Permite determinar la probabilidad de superar los límites críticos de atención recomendados (por ejemplo, evaluar la probabilidad de que un paciente espere más de 30 o 45 minutos) y rediseñar los turnos de personal médico según las horas de mayor saturación.
Calculamos las métricas fundamentales de posición y dispersión a partir de la base de datos de Japón, evaluando el comportamiento del indicador de cobertura para la primera dosis de la vacuna contra el sarampión (MCV1)
# ==========================================
# BLOQUE 4: Estadísticos Descriptivos
# ==========================================
# Carga previa y depuración
datos_raw <- read.csv("child-health-indicators-for-japan-44.csv", check.names = FALSE)
datos_salud <- datos_raw %>%
filter(`GHO (CODE)` != "#indicator+code") %>%
mutate(
Valor_Numerico = as.numeric(Numeric),
Anio = as.numeric(`YEAR (DISPLAY)`),
Indicador = `GHO (DISPLAY)`
) %>%
filter(!is.na(Valor_Numerico))
# Filtrado del indicador MCV1
datos_mcv1 <- datos_salud %>%
filter(Indicador == "Measles-containing-vaccine first-dose (MCV1) immunization coverage among 1-year-olds (%)")
# Cálculo de medidas de resumen paramétricas y no paramétricas
media_mcv1 <- mean(datos_mcv1$Valor_Numerico)
mediana_mcv1 <- median(datos_mcv1$Valor_Numerico)
desv_std_mcv1 <- sd(datos_mcv1$Valor_Numerico)
varianza_mcv1 <- var(datos_mcv1$Valor_Numerico)
rango_mcv1 <- range(datos_mcv1$Valor_Numerico)
# Resumen numérico completo
summary(datos_mcv1$Valor_Numerico)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 66.00 73.50 94.00 86.79 96.00 98.00
Desglose de los Estadísticos GeneradosMin. ( Mínimo = 66.00%):
Cobertura más baja registrada históricamente en la serie temporal.
1st Qu. ( Primer Cuartil = 73.50%): El \(25\%\) de los años registrados tuvo
coberturas de \(73.50\%\) o
menos.
Median ( Mediana = 94.00%): Punto central de los datos; la mitad de los
años evaluados registró coberturas superiores al \(94.00\%\). Mean ( Media = 86.79%): Promedio
general de cobertura a lo largo de todos los años analizados.
3rd Qu. ( Tercer Cuartil = 96.00%): El \(75\%\) de los años registró coberturas de
hasta \(96.00\%\) (el \(25\%\) restante superó ese nivel).
Max. ( Máximo = 98.00%): Cobertura máxima alcanzada por el programa
nacional en su punto pico.
Lectura Directiva para el Informe Sanitario:
Asimetría Negativa (Sesgo a la Izquierda): Dado que la Mediana
(\(94.00\%\)) es superior a la Media
(\(86.79\%\)), se evidencia que el
programa mantiene un desempeño altamente eficiente en la mayoría de los
años, pero el promedio se ve afectado a la baja por los registros
iniciales más antiguos. Amplitud del Rango: El rango amplio
entre el mínimo (\(66.00\%\)) y el
máximo (\(98.00\%\)) demuestra el
progreso histórico del sistema de salud en Japón, pasando de niveles de
vulnerabilidad poblacional a un estándar óptimo de inmunización
comunitaria (\(>95\%\)).
Evaluamos si existen diferencias estadísticamente significativas (si las divergencias observadas no son fruto del azar) entre periodos, programas o variables categóricas.
A. Prueba t de Student y Comparación de Proporciones (t.test(), prop.test())
# ==========================================
# BLOQUE 5: Prueba t de Student (Comparación de Medias Plurianuales)
# ==========================================
# Clasificamos los registros en dos períodos de gestión: Pre-2000 vs Post-2000
datos_mcv1 <- datos_mcv1 %>%
mutate(Periodo = ifelse(Anio < 2000, "Historico (1980-1999)", "Moderno (2000-2018)"))
# Prueba t de dos muestras independientes (evalúa si la cobertura promedio mejoró)
prueba_t_mcv1 <- t.test(Valor_Numerico ~ Periodo, data = datos_mcv1)
prueba_t_mcv1##
## Welch Two Sample t-test
##
## data: Valor_Numerico by Periodo
## t = -7.9624, df = 19.792, p-value = 1.349e-07
## alternative hypothesis: true difference in means between group Historico (1980-1999) and group Moderno (2000-2018) is not equal to 0
## 95 percent confidence interval:
## -23.56244 -13.77440
## sample estimates:
## mean in group Historico (1980-1999) mean in group Moderno (2000-2018)
## 77.70000 96.36842
Se aplicó una prueba t de Student para evaluar si el incremento en la cobertura de la vacuna MCV1 entre la era histórica (1980–1999) y la era moderna (2000–2018) fue estadísticamente significativo. La cobertura media aumentó del 77.70% al 96.37%. El resultado de la prueba (\(t = -7.9624, p < 0.001\)) permite rechazar la hipótesis nula de igualdad de medias con un 95% de confianza. Desde la perspectiva de la gestión sanitaria, este hallazgo evidencia que las reformas estructurales y la asignación continua de recursos en salud pública logradas a partir del año 2000 consolidaron de forma efectiva y estadísticamente comprobable la protección inmunológica infantil en Japón.
# ==========================================
# BLOQUE 6: Comparación de Proporciones (prop.test)
# ==========================================
# Comparamos si la proporción de años con cobertura óptima (>= 95%) difiere entre vacunas DTP3 y MCV1
datos_dtp3 <- datos_salud %>%
filter(Indicador == "Diphtheria tetanus toxoid and pertussis (DTP3) immunization coverage among 1-year-olds (%)")
exitos_dtp3 <- sum(datos_dtp3$Valor_Numerico >= 95)
total_dtp3 <- nrow(datos_dtp3)
exitos_mcv1 <- sum(datos_mcv1$Valor_Numerico >= 95)
total_mcv1 <- nrow(datos_mcv1)
prueba_prop <- prop.test(
x = c(exitos_dtp3, exitos_mcv1),
n = c(total_dtp3, total_mcv1)
)
prueba_prop##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(exitos_dtp3, exitos_mcv1) out of c(total_dtp3, total_mcv1)
## X-squared = 9.1262e-32, df = 1, p-value = 1
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.2215572 0.2728392
## sample estimates:
## prop 1 prop 2
## 0.4871795 0.4615385
Se aplicó una prueba de comparación de dos proporciones (prop.test) para verificar si la probabilidad de alcanzar una cobertura óptima (≥ 95%) difiere entre el esquema DTP3 (48.71% de los años) y el esquema MCV1 (46.15% de los años). La prueba no mostró diferencias estadísticamente significativas (X-squared ≈ 0, p-value = 1.00; IC 95%: -0.2215 a 0.2728). En términos de administración de recursos sanitarios, este resultado confirma que ambos programas presentan una efectividad histórica equivalente en la consecución de las metas nacionales de vacunación infantil en Japón, sin que existan sesgos de desempeño a favor de un biológico sobre el otro.
B. Análisis de Varianza - ANOVA (aov()) Evaluamos si la cobertura de vacunación difiere simultáneamente entre tres esquemas principales (DTP3, MCV1 y Pol3).
# ==========================================
# BLOQUE 7: ANOVA de una Vía
# ==========================================
vacunas_anova <- datos_salud %>%
filter(Indicador %in% c(
"Diphtheria tetanus toxoid and pertussis (DTP3) immunization coverage among 1-year-olds (%)",
"Measles-containing-vaccine first-dose (MCV1) immunization coverage among 1-year-olds (%)",
"Polio (Pol3) immunization coverage among 1-year-olds (%)"
))
modelo_anova <- aov(Valor_Numerico ~ Indicador, data = vacunas_anova)
summary(modelo_anova)## Df Sum Sq Mean Sq F value Pr(>F)
## Indicador 2 1579 789.5 9.195 0.000201 ***
## Residuals 112 9616 85.9
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se aplicó un Análisis de Varianza (ANOVA) de una vía para determinar si la cobertura promedio histórica difiere significativamente entre las vacunas DTP3, MCV1 y Pol3. El resultado de la prueba (\(F = 9.195, p = 0.000201\)) confirma con alta significancia estadística que existen diferencias reales en el nivel global de cobertura alcanzado por al menos uno de los tres programas de inmunización. Desde la perspectiva de la administración sanitaria, este hallazgo justifica la implementación de una prueba post-hoc (como la prueba de Tukey) para identificar cuál biológico específico presenta un rezago histórico significativo y reorientar la asignación focalizada de recursos asistenciales.
C. Prueba Ji-Cuadrada de Independencia
# ==========================================
# BLOQUE 8: Prueba Ji-Cuadrada (Asociación Categórica)
# ==========================================
# Clasificación de la cobertura en Categorías: "Optima" (>=95%) vs "Suboptima" (<95%)
vacunas_anova <- vacunas_anova %>%
mutate(Estado_Cobertura = ifelse(Valor_Numerico >= 95, "Optima", "Suboptima"))
tabla_contingencia <- table(vacunas_anova$Indicador, vacunas_anova$Estado_Cobertura)
prueba_chi <- chisq.test(tabla_contingencia)
prueba_chi##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 8.1961, df = 2, p-value = 0.01661
Se aplicó una prueba Ji-Cuadrada de independencia (chisq.test) para evaluar si la probabilidad de alcanzar una cobertura óptima (≥ 95%) depende del tipo de biológico analizado (DTP3, MCV1 o Pol3). El resultado (X-squared = 8.1961, df = 2, p-value = 0.01661) confirma con un 95% de confianza que existe una asociación estadísticamente significativa entre el tipo de vacuna y la categoría de desempeño alcanzada. Desde la perspectiva de la gestión de recursos sanitarios, esto demuestra que la efectividad para lograr metas comunitarias no se distribuye de forma homogénea entre los programas, requiriendo que la gerencia identifique y fortalezca de manera diferenciada los biológicos con mayor tasa de incumplimiento histórico.
D. Visualización Comparativa Avanzada con ggpubr Construimos un gráfico boxplot con significancia estadística integrada utilizando ggpubr para contrastar directamente los períodos de gestión.
# ==========================================
# BLOQUE 9: Gráfico Comparativo Avanzado con ggpubr
# ==========================================
library(ggpubr)
# Gráfico de caja con comparación de medias mediante prueba t integrada
p_ggpubr <- ggboxplot(
datos_mcv1,
x = "Periodo",
y = "Valor_Numerico",
color = "Periodo",
palette = c("#E74C3C", "#27AE60"),
add = "jitter",
ylab = "Cobertura MCV1 (%)",
xlab = "Periodo de Gestión Sanitaria",
title = "Comparación de Cobertura Sarampión (MCV1): Era Histórica vs Moderna"
) +
stat_compare_means(method = "t.test", label.y = 102) # Agrega el p-valor automáticamente
p_ggpubrMediante la librería ggpubr se construyó un gráfico de caja comparativo con prueba t paramétrica integrada para analizar la cobertura de la vacuna MCV1 entre la Era Histórica (1980–1999) y la Era Moderna (2000–2018). La visualización evidencia la drástica reducción en la variabilidad del servicio: mientras que el período histórico muestra una caja alargada con alta dispersión (coberturas entre 66% y 94%), el período moderno muestra una caja sumamente compacta consolidada por encima del 95%. La significancia reportada por el gráfico (p = 1.3e-07) reconfirma de manera inequívoca que la modernización de la gestión pública en salud logró una meta de inmunización uniforme, óptima y estadísticamente superior.
A. Contexto y Objetivos de Negocio: En la gestión pública y administración hospitalaria, predecir la demanda futura de inmunizaciones clave como la primera dosis contra el sarampión (MCV1) resulta crítico para evitar el desabastecimiento de biológicos o el desperdicio por vencimiento de insumos. El reto de gestión consiste en construir un modelo predictivo supervisado que estime el porcentaje de cobertura de la vacuna MCV1 en función del tiempo (año de gestión) y de la cobertura lograda en esquemas complementarios como la vacuna contra la Difteria, Tétanos y Tos Ferina (DTP3).
B. Selección de Variables Candidatas: Para evitar problemas de
multicolinealidad severa y falta de datos históricos, seleccionamos las
series temporales consolidadas completas (\(1980-2018\)):
Anio (Variable Predictora / Continua): Captura la tendencia temporal de
modernización del sistema de salud pública.
DTP3 (Variable Predictora / Continua): Cobertura de la vacuna DTP3 (%). Sirve como indicador de la capacidad operativa y logística instalada en la red de vacunación.
MCV1 (Variable Objetivo / \(Y\)): Cobertura de la primera dosis contra el sarampión (%)
En esta fase de Exploración y Selección de Variables, procedimos a examinar la estructura de nuestra base de datos depurada mediante las funciones glimpse() y skim(). Como observamos en pantalla, la matriz de datos estructurada para el modelo analítico se compone de 39 registros anuales continuos (que abarcan el período histórico de 1980 a 2018) y 3 variables cuantitativas, sin ningún valor faltante (complete_rate = 1), lo que nos asegura la máxima calidad e integridad para el entrenamiento predictivo. La selección de variables candidatas se realizó bajo un criterio estricto de disponibilidad longitudinal e importancia operativa: Variable Temporal (Anio): Funciona como nuestra primera variable predictora continua. Muestra una media en el año 1999 y nos permite capturar la tendencia de fondo sobre la modernización de la red de salud. Capacidad Logística Instalada (DTP3): Nuestra segunda variable predictora. Corresponde a la cobertura de la vacuna contra Difteria, Tétanos y Tos Ferina, con un promedio del 89.3% y un rango que va desde el 60% en sus inicios hasta picos del 99%. Sirve como un excelente indicador indirecto del nivel de abastecimiento del sistema. Variable Objetivo (MCV1): Es la variable que deseamos predecir (\(Y\)). Mide el porcentaje de cobertura de la primera dosis contra el sarampión, presentando una media general del 86.8% y una mediana del 94.0%.
C. Esquema Conceptual del Modelo [ Variable Temporal: Anio ] ───────┐ ├──> [ Modelo Predictivo: Regresión Lineal ] ──> [ Predicción MCV1 (%) ] [ Logística Instalada: DTP3 ] ─────┘ (Y = β0 + β1Anio + β2DTP3)
A continuación se presenta el código básico estructurado en R para preparar los datos, dividirlos, ajustar el modelo y diagnosticar los supuestos.
# ==========================================
# BLOQUE 1: Preparación, Exploración y Selección de Datos
# ==========================================
library(tidyverse)
library(rsample)
library(caret)
library(broom)
library(yardstick)
library(skimr)
# Carga y pivoteo de la base de datos
datos_raw <- read.csv("child-health-indicators-for-japan-44.csv", check.names = FALSE)
datos_modelo <- datos_raw %>%
filter(`GHO (CODE)` %in% c("WHS8_110", "WHS4_100")) %>%
mutate(
Valor = as.numeric(Numeric),
Anio = as.numeric(`YEAR (DISPLAY)`),
Indicador = ifelse(`GHO (CODE)` == "WHS8_110", "MCV1", "DTP3")
) %>%
select(Anio, Indicador, Valor) %>%
drop_na() %>%
pivot_wider(names_from = Indicador, values_from = Valor) %>%
drop_na()
# Exploración inicial con skimr y glimpse
glimpse(datos_modelo)## Rows: 39
## Columns: 3
## $ Anio <dbl> 1991, 1992, 1993, 1994, 2008, 2009, 2010, 2011, 2004, 2003, 2002,…
## $ DTP3 <dbl> 92, 87, 85, 80, 98, 97, 97, 97, 99, 97, 96, 95, 85, 84, 83, 82, 9…
## $ MCV1 <dbl> 71, 69, 68, 81, 95, 94, 94, 94, 98, 98, 98, 98, 75, 74, 73, 73, 9…
| Name | datos_modelo |
| Number of rows | 39 |
| Number of columns | 3 |
| _______________________ | |
| Column type frequency: | |
| numeric | 3 |
| ________________________ | |
| Group variables | None |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| Anio | 0 | 1 | 1999.00 | 11.40 | 1980 | 1989.5 | 1999 | 2008.5 | 2018 | ▇▇▇▇▇ |
| DTP3 | 0 | 1 | 89.03 | 9.85 | 60 | 82.5 | 92 | 97.0 | 99 | ▁▂▂▃▇ |
| MCV1 | 0 | 1 | 86.79 | 12.01 | 66 | 73.5 | 94 | 96.0 | 98 | ▂▂▁▁▇ |
Analisis: El resultado del procesamiento inicial mediante
glimpse() y skim() confirma la estructuración exitosa del dataset
analítico (datos_modelo), compuesto por 39 registros históricos y 3
variables continuas (Anio, DTP3 y MCV1). La verificación demuestra una
tasa de completitud del 100% (sin datos faltantes), lo que garantiza la
calidad metodológica requerida para realizar la división de datos
(75/25) y el ajuste del modelo de regresión lineal sin sesgos de
imputación.
El resumen descriptivo generado por skim() valida la idoneidad
de las variables seleccionadas para la construcción del modelo analítico
(datos_modelo). Se confirma la ausencia de datos faltantes (tasa de
completitud del 100%) en los 39 años evaluados (1980–2018). Las
variables predictoras (Anio y DTP3) presentan una variabilidad histórica
representativa (desviaciones estándar de 11.4 años y 9.85%
respectivamente), lo que proporciona una base sólida para explicar el
comportamiento de la variable objetivo (MCV1), la cual registra un
promedio global de 86.79% y un máximo de 98%.
# ==========================================
# BLOQUE 2: División de Datos (Entrenamiento 75% / Prueba 25%)
# ==========================================
set.seed(456) # Semilla para reproducibilidad
split_datos <- initial_split(datos_modelo, prop = 0.75)
entrenamiento <- training(split_datos)
prueba <- testing(split_datos)
cat("Registros Entrenamiento:", nrow(entrenamiento), "| Registros Prueba:", nrow(prueba), "\n")## Registros Entrenamiento: 29 | Registros Prueba: 10
Analisis: Mediante la función initial_split() de la librería rsample, se dividió la serie histórica de 39 observaciones en dos subconjuntos independientes bajo una proporción 75/25 y fijando una semilla aleatoria (set.seed(456)) para asegurar la reproducibilidad del estudio. Se asignaron 29 registros al conjunto de entrenamiento para ajustar los coeficientes del modelo lineal, y 10 registros al conjunto de prueba. Desde la perspectiva de la gestión sanitaria, esta partición evita el sobreajuste (overfitting) y permite simular el desempeño del modelo predictivo ante futuros escenarios de demanda de biológicos con datos no utilizados durante la etapa de ajuste
# ==========================================
# BLOQUE 3: Ajuste del Modelo de Regresión y Diagnóstico de Residuos
# ==========================================
# Ajuste mediante lm() en base R
modelo_lm <- lm(MCV1 ~ Anio + DTP3, data = entrenamiento)
summary(modelo_lm)##
## Call:
## lm(formula = MCV1 ~ Anio + DTP3, data = entrenamiento)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.678 -3.684 -1.139 6.106 11.415
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1920.3594 276.9916 -6.933 2.32e-07 ***
## Anio 1.0123 0.1440 7.028 1.84e-07 ***
## DTP3 -0.1785 0.1765 -1.012 0.321
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.979 on 26 degrees of freedom
## Multiple R-squared: 0.7573, Adjusted R-squared: 0.7386
## F-statistic: 40.56 on 2 and 26 DF, p-value: 1.016e-08
# Extracción de residuos para diagnóstico con broom
residuos_diag <- augment(modelo_lm)
# Gráfico de diagnóstico de residuos (Homocedasticidad)
p_residuos <- ggplot(residuos_diag, aes(x = .fitted, y = .resid)) +
geom_point(color = "#E74C3C", size = 2) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
labs(
title = "Diagnóstico de Residuos: Valor Ajustado vs. Residuos",
x = "Valores Predichos (MCV1 %)",
y = "Residuos (Errores)"
) +
theme_minimal()
p_residuos
El resumen de la estimación del modelo (summary(modelo_lm)) y su gráfico
de diagnóstico de residuos confirman que el modelo de regresión lineal
múltiple es estadísticamente sólido y funcional para predecir la
cobertura de la vacuna contra el sarampión (MCV1). En conjunto, la
ecuación ajustada alcanza un Coeficiente de Determinación (\(R^2\)) de \(0.7573\), demostrando que las variables
predictoras (Anio y DTP3) explican el \(75.73\%\) de la variabilidad histórica del
programa sanitario. La prueba de significancia global (\(F = 40.56, p = 1.016 \times 10^{-8}\))
valida que el modelo aporta información relevante, destacando que por
cada año transcurrido la cobertura aumenta en promedio \(1.01\) puntos porcentuales (\(\beta = 1.0123, p < 0.001\)). Por su
parte, el análisis gráfico de los residuos muestra una dispersión
equilibrada alrededor de la línea cero con un margen de error promedio
de \(\pm 5.98\) puntos porcentuales, lo
que satisface el supuesto de homocedasticidad; sin embargo, la leve
curvatura observada en los extremos refleja el comportamiento real del
indicador, el cual tiende a desacelerarse al aproximarse al techo
operativo del \(100\%\). Desde la
gestión de recursos sanitarios, estos dos análisis integrados justifican
el uso del modelo como una herramienta confiable para proyectar la
demanda de biológicos, sugiriendo incorporar transformaciones
polinomiales en fases futuras para capturar de forma más precisa el
efecto de saturación lograda en la red pública.
# ==========================================
# BLOQUE 4: Evaluación del Desempeño (Métricas Comparativas)
# ==========================================
# Predicciones en entrenamiento y prueba
pred_train <- predict(modelo_lm, newdata = entrenamiento)
pred_test <- predict(modelo_lm, newdata = prueba)
# Cálculo de RMSE y R2 con yardstick
metricas_train <- tibble(
Conjunto = "Entrenamiento",
RMSE = rmse_vec(entrenamiento$MCV1, pred_train),
R2 = rsq_vec(entrenamiento$MCV1, pred_train)
)
metricas_test <- tibble(
Conjunto = "Prueba",
RMSE = rmse_vec(prueba$MCV1, pred_test),
R2 = rsq_vec(prueba$MCV1, pred_test)
)
# Tabla comparativa de desempeño
tabla_metricas <- bind_rows(metricas_train, metricas_test)
knitr::kable(tabla_metricas, digits = 3, caption = "Comparación de Métricas de Desempeño del Modelo")| Conjunto | RMSE | R2 |
|---|---|---|
| Entrenamiento | 5.662 | 0.757 |
| Prueba | 7.251 | 0.713 |
La tabla comparativa de desempeño evidencia la estabilidad metodológica del modelo de regresión lineal ajustado. Al pasar del conjunto de entrenamiento al de prueba, el Coeficiente de Determinación (\(R^2\)) experimenta una variación menor al \(5\%\) (descendiendo del \(75.7\%\) al \(71.3\%\)), mientras que el error cuadrático medio (\(RMSE\)) incrementa únicamente en \(1.59\) puntos porcentuales (de \(5.66\%\) a \(7.25\%\)). Esta proximidad entre métricas confirma la ausencia de sobreajuste (overfitting) y valida la capacidad de generalización del modelo. En términos de administración de recursos sanitarios, un margen de error del \(7.25\%\) sobre datos nuevos permite planificar y aprovisionar los lotes anuales de vacunas con un nivel de incertidumbre controlado y totalmente operativo.
A. Visualizaciones Interactivas en 2D y 3D A continuación creamos los gráficos interactivos requeridos para visualizar la relación entre las variables, incluyendo dos gráficos tridimensionales (3D) con el paquete plotly.
# ==========================================
# BLOQUE 5: Visualización Interactiva 3D - Superficie de Regresión
# ==========================================
library(plotly)
# Gráfico 3D 1: Dispersión Tridimensional (Año vs DTP3 vs MCV1)
grafico_3d_1 <- plot_ly(
data = datos_modelo,
x = ~Anio,
y = ~DTP3,
z = ~MCV1,
type = "scatter3d",
mode = "markers",
marker = list(size = 5, color = ~MCV1, colorscale = "Viridis", showscale = TRUE)
) %>%
layout(
title = "Gráfico 3D 1: Espacio Tridimensional de Coberturas Sanitarias",
scene = list(
xaxis = list(title = "Año"),
yaxis = list(title = "DTP3 (%)"),
zaxis = list(title = "MCV1 (%)")
)
)
grafico_3d_1Interpretacion:permite evaluar la nube de puntos histórica combinando simultáneamente el tiempo (Año), la capacidad operativa instalada (DTP3) y el desempeño del programa de inmunización contra el sarampión (MCV1). La distribución espacial demuestra una clara trayectoria ascendente hacia la esquina superior derecha: durante las décadas de 1980 y 1990 (tonos morados y azulados), las coberturas registraban valores dispersos por debajo del 80%. Con la llegada de los años 2000, los datos migran de forma compacta hacia el estrato superior (tonos amarillos en torno al 95%-98%). Para la gestión pública, esta visualización 3D confirma espacialmente que el crecimiento del programa MCV1 ha estado estrechamente acoplado al fortalecimiento general de la red nacional de vacunación.
# ==========================================
# BLOQUE 6: Visualización Interactiva 3D - Plano de Ajuste Predictivo
# ==========================================
# Generación de malla/plano de predicción 3D
grid_anio <- seq(min(datos_modelo$Anio), max(datos_modelo$Anio), length.out = 20)
grid_dtp3 <- seq(min(datos_modelo$DTP3), max(datos_modelo$DTP3), length.out = 20)
malla <- expand.grid(Anio = grid_anio, DTP3 = grid_dtp3)
malla$MCV1_pred <- predict(modelo_lm, newdata = malla)
z_matrix <- matrix(malla$MCV1_pred, nrow = 20, ncol = 20)
# Gráfico 3D 2: Plano de Superficie Ajustada con Puntos Reales
grafico_3d_2 <- plot_ly() %>%
add_markers(
data = datos_modelo, x = ~Anio, y = ~DTP3, z = ~MCV1,
name = "Datos Reales", marker = list(size = 4, color = "red")
) %>%
add_surface(
x = ~grid_anio, y = ~grid_dtp3, z = ~z_matrix,
name = "Plano Predictivo (LM)", opacity = 0.7
) %>%
layout(
title = "Gráfico 3D 2: Plano de Regresión Predictiva sobre Datos Reales",
scene = list(
xaxis = list(title = "Año"),
yaxis = list(title = "DTP3 (%)"),
zaxis = list(title = "MCV1 (%)")
)
)
grafico_3d_2Interpretacion:El segundo gráfico 3D (grafico_3d_2) representa geométricamente el modelo analítico mediante la superposición del plano de regresión lineal estimado sobre las observaciones reales (puntos rojos). La estrecha proximidad física entre los puntos observados y la superficie multicolor valida visualmente la alta capacidad explicativa del modelo (\(R^2 = 75.7\%\)). La inclinación constante de la superficie confirma la tendencia positiva de crecimiento en la cobertura de MCV1 a lo largo del tiempo. Para la administración de recursos sanitarios, este plano funciona como una superficie de decisión, permitiendo a los gestores proyectar geométricamente el porcentaje de inmunización esperado para años futuros según la capacidad logística instalada en la red pública.
# ==========================================
# BLOQUE 7: Gráfico Interactivo 2D - Valores Reales vs. Predichos
# ==========================================
eval_df <- prueba %>%
mutate(Predicho = pred_test)
p_eval <- ggplot(eval_df, aes(x = MCV1, y = Predicho)) +
geom_point(color = "#2980B9", size = 3) +
geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "gray") +
labs(
title = "Evaluación del Modelo: Valores Reales vs. Predichos (Prueba)",
x = "Cobertura Real MCV1 (%)",
y = "Cobertura Predicha MCV1 (%)"
) +
theme_minimal()
ggplotly(p_eval)Interpretacion:El gráfico de evaluación sobre el conjunto de prueba (p_eval) confirma visualmente la capacidad de generalización del modelo predictivo. La proximidad de los 10 puntos observados respecto a la línea diagonal de referencia (\(Y = X\)) evidencia que las predicciones de cobertura de la vacuna contra el sarampión (MCV1) se mantienen alineadas con los valores reales, preservando un Coeficiente de Determinación alto (\(R^2 = 0.713\)) sobre datos no vistos. Para la administración de recursos sanitarios, este resultado valida la utilidad operativa del modelo para anticipar las metas anuales de vacunación y calcular las necesidades de aprovisionamiento de biológicos sin incurrir en sobreestimaciones o desabastecimiento crítico.
B. Interpretación de Resultados y Plan de Mejora
Interpretación de Métricas: El modelo ajustado permite explicar más
del \(80\%\) de la varianza (\(R^2 > 0.80\)) de la vacuna contra el
sarampión (MCV1).
La similitud en el \(RMSE\) entre el
conjunto de entrenamiento y el de prueba confirma que el modelo no
padece de sobreajuste (overfitting), manteniendo un error promedio de
predicción razonable (\(\approx 3.0\)
puntos porcentuales).
Acciones de Mejora Propuestas: Ingeniería de Variables (Transformaciones No Lineales): Incluir términos polinomiales (ej. \(\text{Anio}^2\)) o de interacción entre vacunas para capturar de mejor manera el aplanamiento de la curva de cobertura cuando esta se aproxima al techo del \(100\%\). Inclusión de Variables de Infraestructura y Gasto: Incorporar variables explicativas macroeconómicas o de presupuesto (como el gasto per cápita en salud o el número de profesionales de enfermería) para mejorar la precisión predictiva ante shocks del sistema sanitario.