Índice de Transmisión Económica y Bienestar Social (ITEBS-SV)
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMIA

Docente: Mtro. Balmore Alexis Rodríguez Ochoa
Materia: Metodos para el Analisis Economico
Tema: Índice de Transmisión Económica y
Bienestar Social (ITEBS-SV)
ESTUDIANTE:
APELLIDOS
NOMBRES
CARNET
Rodriguez Claros
Santos Isaac
RC12013
Fecha: 7 de Septiembre de 2026
Ciudad Universitaria, San Miguel, El Salvador
::: ::::
1. INTRODUCCION
La evaluación de la coyuntura económica en países en desarrollo
requiere ir más allá del análisis exclusivo del Producto Interno Bruto
(PIB), integrando indicadores de frecuencia mensual que reflejen de
forma oportuna la realidad material de los hogares. En El Salvador, el
dinamismo productivo, el choque de precios en los alimentos, el flujo de
recursos externos y las condiciones del mercado laboral formal
interactúan de manera constante para configurar las condiciones de vida
de la población.
Para analizar esta dinámica de forma cuantitativa y estructurada, el
presente trabajo introduce el Índice de Transmisión Económica y
Bienestar Social de El Salvador (ITEBS-SV). Este indicador sintético
multidimensional está compuesto por tres dimensiones analíticas y seis
variables clave obtenidas del Banco Central de Reserva de El Salvador
(BCR) y del Instituto Salvadoreño del Seguro Social (ISSS):
Dimensión 1: Tracción Productiva: Captura el ritmo de la actividad
económica agregada y comercial mediante el índice general del Índice de
Volumen de la Actividad Económica (ivae_global_index) y el índice
específico del sector comercio, restaurantes y hoteles
(ivae_comercio_index).
Dimensión 2: Capacidad de Compra: Evalúa la presión financiera y
alimentaria de los hogares al contrastar la entrada de recursos externos
a través del ingreso de remesas familiares (remesas_familiares_usd)
frente al costo mensual de la Canasta Básica Alimentaria Urbana
(costo_cba_urbana_usd).
Dimensión 3: Empleo y Salarios: Mide la solidez y calidad del mercado
laboral formal a través del total de trabajadores cotizantes activos al
Seguro Social (cotizantes_activos_isss) y el salario nominal medio
mensual de dichos cotizantes (salario_medio_isss_usd).
Mediante esta integración de datos de alta frecuencia, el ITEBS-SV se
consolida como una herramienta técnica de monitoreo diseñada para
capturar con precisión de qué manera los impulsos del sector real y
financiero se transmiten hacia la capacidad adquisitiva y la estabilidad
laboral de la sociedad salvadoreña.
2. Objetivos
Objetivo general
Construir un índice sintético multidimensional que permita medir y
analizar la transmisión de las variables macroeconómicas sobre el
bienestar social y la capacidad de compra de las familias en El
Salvador.
Objetivos específicos
Clasificar las variables socioeconómicas mensuales del BCR e ISSS
en tres dimensiones conceptuales coherentes: Tracción Productiva,
Capacidad de Compra, y Empleo y Salarios.
Normalizar los indicadores mediante el método Min-Max (o
estandarización según el comportamiento de la serie temporal),
expresándolos en una escala común y adimensional para su adecuada
agregación.
Calcular subíndices dimensionales y un índice sintético global
(ITEBS-SV) bajo un esquema de ponderación técnica que refleje la
incidencia de cada dimensión en el bienestar.
Analizar la evolución temporal del índice, identificando los
periodos de mayor y menor bienestar social, así como las dimensiones
clave que explican sus variaciones principales.
Documentar el procedimiento de forma reproducible en RStudio,
garantizando la trazabilidad desde la extracción de datos de las fuentes
oficiales hasta el cálculo final de las series.
3. Enfoque teórico
Definición del índice
Un índice sintético o indicador compuesto es una medida agregada que
resume, en un valor único, la información contenida en un conjunto de
indicadores simples que miden distintas facetas de un mismo fenómeno
multidimensional. Su utilidad radica en permitir el monitoreo y
seguimiento temporal de dinámicas complejas cuando ninguna variable
individual capta por sí sola la magnitud total del concepto de
interés.
El Índice de Transmisión Económica y Bienestar Social (ITEBS-SV) que
aquí se construye mide la capacidad y velocidad con la que los impulsos
macroeconómicos y productivos del país se traducen en la capacidad de
compra y la estabilidad laboral formal de las familias en El Salvador.
Se trata de un índice de transmisión socioeconómica de alta frecuencia,
no de un índice de pobreza multidimensional estructural ni de desarrollo
humano de largo plazo: mide la sensibilidad y vulnerabilidad del
bienestar coyuntural ante el entorno económico, no las carencias
sociales acumuladas a lo largo de décadas.
Esta delimitación es relevante porque, en la literatura sobre
economía del bienestar y macroeconomía del consumo, se distinguen
habitualmente tres niveles o etapas del ciclo de transmisión:
La tracción del sector real (primera etapa): La capacidad de la
economía para generar actividad, valor agregado y dinamismo
comercial.
La capacidad de absorción y liquidez (segunda etapa): El flujo de
ingresos directos (como las remesas) y la resistencia del poder
adquisitivo frente al costo de la canasta alimentaria.
La consolidación de condiciones laborales (tercera etapa): La
formalización del empleo y el nivel salarial alcanzado que sostienen la
calidad de vida de manera estable.
El presente ejercicio se sitúa en la intersección de estas tres
etapas, midiendo cómo la producción macroeconómica se propaga de manera
directa hacia la capacidad adquisitiva e inserción laboral de los
hogares salvadoreños.
4. Dimensiones e indicadores
La base de datos se consolida a partir de seis series temporales de
frecuencia mensual provenientes del Banco Central de Reserva de El
Salvador (BCR) y del Instituto Salvadoreño del Seguro Social (ISSS).
Estas variables se agrupan en tres dimensiones conceptuales que captan
los distintos eslabones del proceso de transmisión económica hacia el
bienestar:
Dimensión
Concepto
que capta
Indicadores
D1.
Tracción Productiva
El
ritmo de actividad del sector real de la economía y la dinámica de los
sectores clave generadores de valor agregado y empleo comercial.
Índx. de
Volumen de la Actividad Económica General
(ivae_global_index); Índx. de Volumen del Comercio,
Restaurantes y Hoteles (ivae_comercio_index).
D2.
Capacidad de Compra
La
liquidez directa recibida por los hogares desde el exterior y su
relación de contención frente a la presión del costo de la canasta
alimentaria básica.
Ingreso de
Remesas Familiares en USD (remesas_familiares_usd); Costo
de la Canasta Básica Alimentaria Urbana en USD
(costo_cba_urbana_usd).
D3. Empleo
y Salarios
La
solidez, absorción y calidad del mercado laboral formal como vía
principal de sostenibilidad del ingreso familiar.
Cotizantes
Activos al Seguro Social (cotizantes_activos_isss); Salario
Nominal Medio Mensual de Cotizantes en USD
(salario_medio_isss_usd).
Justificación de la clasificación. La estructura
tripartita del índice responde al circuito a través del cual la
macroeconomía incide en la vida cotidiana de la población salvadoreña.
La Tracción Productiva actúa como la fuerza motora de la oferta
agregada: sin dinamismo en la producción global y comercial, se contrae
la capacidad del sistema para sostener la actividad interna. Sin
embargo, la producción nacional por sí sola no determina el consumo
inmediato; por ello, la Capacidad de Compra evalúa el poder adquisitivo
real de los hogares, contrastando el flujo de remesas —fuente crucial de
liquidez familiar en El Salvador— con la barrera de acceso que
representa el costo de la canasta alimentaria urbana. Finalmente, la
dimensión de Empleo y Salarios mide la canalización de dicho entorno en
la economía formal, diferenciando la masa laboral activa del ingreso
promedio percibido. Desacoplar el empleo formal del ingreso y del costo
alimentario permite identificar tensiones estructurales, tales como
períodos donde la economía crece o el empleo aumenta, pero el salario
real se deteriora frente al costo de la vida.
5. Metodología aplicada
Fuente de datos
La información utilizada procede de las bases de datos y registros
administrativos del Banco Central de Reserva de El Salvador (BCR) y del
Instituto Salvadoreño del Seguro Social (ISSS). Para la construcción del
índice se conformó una base de datos de frecuencia mensual que consolida
los seis indicadores que aquí se emplean: el Índice de Volumen de la
Actividad Económica General (ivae_global_index), el IVAE del sector
comercio, restaurantes y hoteles (ivae_comercio_index), los ingresos por
remesas familiares en millones de USD (remesas_familiares_usd), el costo
de la Canasta Básica Alimentaria Urbana en USD (costo_cba_urbana_usd),
el total de trabajadores cotizantes activos al Seguro Social
(cotizantes_activos_isss) y el salario nominal medio mensual de dichos
cotizantes en USD (salario_medio_isss_usd).
Trabajar con registros administrativos y métricas macroeconómicas de
frecuencia mensual tiene tres implicaciones metodológicas clave para
este ejercicio. Primera, al tratarse de series temporales de alta
frecuencia, el índice no ofrece una captura estática en un punto del
tiempo, sino un monitoreo continuo de la evolución, tendencia y
sensibilidad de la transmisión económica mes a mes. Segunda, las
variables provienen de las fuentes oficiales primarias encargadas de la
contabilidad nacional y la seguridad social en El Salvador, lo que
garantiza la homogenización de los criterios de captura y la validez
técnica de la información. Tercera, los datos corresponden a agregados
de nivel nacional: registran la dinámica macroeconómica, el costo
promedio de la vida urbana y la masa laboral formal, lo que confirma la
delimitación del ITEBS-SV como un índice de transmisión socioeconómica
coyuntural y no como un indicador de pobreza estructural o desigualdad
territorial a nivel microeconómico.
Las series de tiempo originales fueron alineadas cronológicamente y
organizadas en una matriz de datos longitudinal. Ese conjunto de datos
es el que se almacena en el archivo de trabajo ITEBS_SV_DATA.xlsx (o
.csv), insumo directo del código de procesamiento en RStudio. Al
integrar variables expresadas en distintas unidades de medida (índices
en base 100, montos monetarios en USD y recuentos de personas), se hace
indispensable un proceso previo de normalización antes de su agregación
dimensional.
6. Procedimiento
La construcción del Índice de Transmisión Económica y Bienestar
Social de El Salvador (ITEBS-SV) se desarrolla mediante cuatro etapas
metodológicas interconectadas: Etapa 1. Normalización por Min-Max. Las
seis variables se transforman a una escala adimensional \([0,1]\) para hacerlas comparables entre sí,
aplicando la fórmula correspondiente según la orientación o polaridad de
cada indicador respecto al bienestar:
Variables de polaridad positiva: A mayor valor del indicador, mayor
es la tracción económica o el bienestar. Se aplica a ivae_global_index,
ivae_comercio_index, remesas_familiares_usd, cotizantes_activos_isss y
salario_medio_isss_usd:
\[
X_{ij}^{\text{norm}} = \frac{X_{ij} - \min(X_j)}{\max(X_j) - \min(X_j)}
\]
Variables de polaridad negativa: A mayor valor del indicador, mayor
es la presión financiera y el deterioro del bienestar (efecto de costo).
Se aplica a la Canasta Básica Alimentaria Urbana (costo_cba_urbana_usd),
invirtiendo su escala para que valores más altos reflejen mayor
contención o menor encarecimiento:
\[
X_{tj}^{\text{norm}} = \frac{\max(X_j) - X_{tj}}{\max(X_j) - \min(X_j)}
\] Donde \(X_{tj}\) representa
el valor del indicador \(j\) en el mes
\(t\), mientras que \(\min(X_j)\) y \(\max(X_j)\) son los valores mínimo y máximo
históricos observados a lo largo de toda la serie temporal.
Etapa 2. Subíndices dimensionales. Para cada mes \(t\), se calcula el promedio aritmético
simple de las variables normalizadas que integran cada una de las tres
dimensiones:
\[
ISub_{ik} = \frac{1}{n_k} \sum_{j \in D_k} X_{ij}^{norm}
\]
Donde \(D_k\) representa el conjunto
de indicadores pertenecientes a la dimensión \(k\), y \(n_k =
2\) es el número de indicadores por dimensión:
Subíndice de Tracción Productiva (\(ISub_{t,\text{Trac}}\)): Promedio de
ivae_global_index e ivae_comercio_index normalizados.
Subíndice de Capacidad de Compra (\(ISub_{t,\text{Compra}}\)): Promedio de
remesas_familiares_usd y costo_cba_urbana_usd normalizados (esta última
invertida).
Subíndice de Empleo y Salarios (\(ISub_{t,\text{Emp}}\)): Promedio de
cotizantes_activos_isss y salario_medio_isss_usd normalizados.
Etapa 3. Índice sintético global (ITEBS-SV). El índice global mensual
se obtiene calculando la media aritmética de los tres subíndices
dimensionales bajo un esquema de ponderación equitativa (un tercio para
cada dimensión):
\[
ITEBS\_SV_t = \frac{1}{3}\left( ISub_{t,\text{Trac}} +
ISub_{t,\text{Compra}} + ISub_{t,\text{Emp}} \right)
\]
El resultado final se ubica en el rango \([0,1]\), donde valores cercanos a \(1\) indican períodos de alta transmisión
económica y óptimo bienestar social coyuntural, mientras que valores
cercanos a \(0\) reflejan fases de
estancamiento productivo, pérdida de poder adquisitivo y deterioro del
mercado laboral.
Etapa 4. Análisis de tendencias y dinámica temporal. Se evalúa la
evolución longitudinal del \(ITEBS\_SV_t\) a través del tiempo,
identificando ciclos de expansión, puntos de inflexión coyunturales y
los subíndices dimensionales que explican las variaciones principales en
la calidad de vida de los hogares salvadoreños.
7. Supuestos y limitaciones
La ponderación equitativa supone que la Tracción Productiva, la
Capacidad de Compra y el Empleo y Salarios contribuyen en igual medida a
la transmisión del entorno económico hacia el bienestar social de los
hogares salvadoreños. Constituye el supuesto más transparente, neutral y
utilizado en la construcción de índices compuestos agregados. Sin
embargo, representa una decisión metodológica sustantiva y no un
hallazgo empírico: asignar pesos diferenciados —por ejemplo, otorgar
mayor ponderación a la Capacidad de Compra por la alta sensibilidad del
costo alimentario y las remesas— alteraría la magnitud final de las
variaciones del índice.
La agregación aritmética empleada en los subíndices y en el índice
global asume un principio de compensabilidad perfecta. Esto implica que
una caída severa en la dimensión de Empleo y Salarios o un
encarecimiento de la Canasta Básica Alimentaria Urbana puede verse
numéricamente neutralizada por un repunte extraordinario en el ingreso
de remesas o en el IVAE Comercio. En escenarios donde se busque
penalizar los desequilibrios coyunturales entre dimensiones, la
literatura metodológica sugiere emplear esquemas no compensatorios, como
la media geométrica (adoptada por el PNUD para el Índice de Desarrollo
Humano).
La normalización Min-Max sobre series de tiempo es relativa al
periodo histórico observado. Los valores 0 y 1 no representan colapso
absoluto ni un estado de bienestar perfecto, sino los extremos mínimos y
máximos registrados por los indicadores del BCR e ISSS durante el
intervalo temporal analizado. Esto significa que la incorporación de
nuevos datos mensuales futuros o la modificación de la ventana de
análisis alterará los valores de referencia (\(\min\) y \(\max\)), reescalando los resultados
históricos.
Por último, el índice opera con agregados macroeconómicos y promedios
nacionales, lo que limita su capacidad para captar heterogeneidades
territoriales, dinámicas de la economía informal (no registrada en el
ISSS) o la desigualdad en la distribución del ingreso entre distintos
estratos socioeconómicos de El Salvador.
8. Resultados del índice
Preparación del entorno y carga de datos.
# install.packages(c("readxl","dplyr","tidyr","ggplot2","fmsb","scales",
# "knitr","kableExtra"))
library(readxl) # lectura del archivo Excel
library(dplyr) # manipulación de datos
library(tidyr) # reestructuración de datos para graficar
library(ggplot2) # gráficos
library(fmsb) # gráfico de radar
library(scales) # utilidades de escala y transparencia
library(knitr) # tablas
library(kableExtra) # formato de tablas en HTML
library(readxl)
library(dplyr)
library(readxl)
Indice_de_Volumen_de_la_Actividad_Economica_IVAE_Serie_desestacionalizada <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Indice_de_Volumen_de_la_Actividad_Economica_(IVAE)._Serie_desestacionalizada.xlsx")
View(Indice_de_Volumen_de_la_Actividad_Economica_IVAE_Serie_desestacionalizada)
library(readxl)
Ingresos_mensuales_de_remesas_familiares <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Ingresos_mensuales_de_remesas_familiares.xlsx")
View(Ingresos_mensuales_de_remesas_familiares)
library(readxl)
Índice_de_Precios_al_Consumidor_IPC_1_ <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Índice_de_Precios_al_Consumidor_(IPC) (1).xlsx")
View(Índice_de_Precios_al_Consumidor_IPC_1_)
library(readxl)
base_cotizantes_a_mayo_2023 <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/base_cotizantes_a_mayo_2023.xlsx")
View(base_cotizantes_a_mayo_2023)
library(readxl)
library(dplyr)
library(stringr)
# ------------------------------------------------------------------------------
# DEFINICIÓN DE RUTAS CON RESPALDO LOCAL / DESK
# ------------------------------------------------------------------------------
dir_respaldo <- "C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio"
obtener_ruta <- function(nombre_archivo) {
if (file.exists(nombre_archivo)) {
return(nombre_archivo)
} else {
ruta_alt <- file.path(dir_respaldo, nombre_archivo)
if (file.exists(ruta_alt)) {
return(ruta_alt)
} else {
stop("No se encontró el archivo: ", nombre_archivo)
}
}
}
ruta_ivae <- obtener_ruta("Indice_de_Volumen_de_la_Actividad_Economica_(IVAE)._Serie_desestacionalizada.xlsx")
ruta_remesas <- obtener_ruta("Ingresos_mensuales_de_remesas_familiares.xlsx")
ruta_ipc <- obtener_ruta("Índice_de_Precios_al_Consumidor_(IPC) (1).xlsx")
ruta_cotizantes <- obtener_ruta("base_cotizantes_a_mayo_2023.xlsx")
# ------------------------------------------------------------------------------
# FUNCIONES AUXILIARES ROBUSTAS
# ------------------------------------------------------------------------------
limpiar_texto <- function(texto) {
texto |>
as.character() |>
str_trim() |>
tolower() |>
iconv(from = "UTF-8", to = "ASCII//TRANSLIT")
}
# Encuentra la fila que contiene la palabra clave (ej. 'concepto') para usarla como encabezado
cargar_excel_inteligente <- function(ruta, palabra_clave = "concepto") {
df_raw <- read_excel(ruta, col_names = FALSE)
# Buscar en qué fila se encuentra la palabra clave
fila_hdr <- 0
for (i in 1:min(10, nrow(df_raw))) {
valores_fila <- limpiar_texto(df_raw[i, ])
if (any(str_detect(valores_fila, palabra_clave), na.rm = TRUE)) {
fila_hdr <- i
break
}
}
if (fila_hdr == 0) {
stop("No se pudo identificar la fila de encabezados con la palabra '", palabra_clave, "' en ", ruta)
}
# Extraer encabezados y datos
encabezados <- as.character(df_raw[fila_hdr, ])
encabezados <- str_trim(encabezados)
df_datos <- df_raw[(fila_hdr + 1):nrow(df_raw), ]
names(df_datos) <- encabezados
# Renombrar columna principal
idx_concepto <- which(limpiar_texto(encabezados) == palabra_clave)
if (length(idx_concepto) > 0) {
names(df_datos)[idx_concepto[1]] <- "concepto"
}
return(df_datos)
}
ubicar_columna <- function(df_names, patron) {
nombres_simples <- limpiar_texto(df_names)
idx <- grep(patron, nombres_simples)
if (length(idx) == 0) {
stop("No se encontró ninguna columna con el patrón: '", patron, "'")
}
df_names[idx[1]]
}
# ------------------------------------------------------------------------------
# 1. CARGA Y LIMPIEZA: IVAE
# ------------------------------------------------------------------------------
df_ivae <- cargar_excel_inteligente(ruta_ivae, "concepto") |>
filter(!is.na(concepto), concepto != "")
# ------------------------------------------------------------------------------
# 2. CARGA Y LIMPIEZA: REMESAS FAMILIARES
# ------------------------------------------------------------------------------
df_remesas <- cargar_excel_inteligente(ruta_remesas, "concepto") |>
filter(!is.na(concepto), concepto != "", !str_detect(tolower(concepto), "notas"))
# ------------------------------------------------------------------------------
# 3. CARGA Y LIMPIEZA: ÍNDICE DE PRECIOS AL CONSUMIDOR (IPC)
# ------------------------------------------------------------------------------
df_ipc <- cargar_excel_inteligente(ruta_ipc, "concepto") |>
filter(!is.na(concepto), concepto != "")
# ------------------------------------------------------------------------------
# 4. CARGA Y LIMPIEZA: BASE DE COTIZANTES (ISSS)
# ------------------------------------------------------------------------------
df_cotizantes_raw <- read_excel(ruta_cotizantes, sheet = 1)
col_actividad <- ubicar_columna(names(df_cotizantes_raw), "actividad")
col_patrono <- ubicar_columna(names(df_cotizantes_raw), "patrono")
col_trabajad <- ubicar_columna(names(df_cotizantes_raw), "trabajad")
col_salario <- ubicar_columna(names(df_cotizantes_raw), "salario")
col_periodo <- ubicar_columna(names(df_cotizantes_raw), "periodo")
df_cotizantes <- df_cotizantes_raw |>
rename(
actividad = all_of(col_actividad),
patronos = all_of(col_patrono),
trabajadores = all_of(col_trabajad),
salario_total = all_of(col_salario),
periodo = all_of(col_periodo)
) |>
select(periodo, actividad, patronos, trabajadores, salario_total)
# ------------------------------------------------------------------------------
# RESUMEN Y NOTIFICACIÓN
# ------------------------------------------------------------------------------
cat("==================================================\n")
## ==================================================
## ARCHIVOS CARGADOS Y PROCESADOS CORRECTAMENTE
## ==================================================
## IVAE: 11 filas | 144 columnas temporales
## Remesas: 1 filas | 144 columnas temporales
## IPC: 14 filas | 12 columnas temporales
cat("Cotizantes: ", nrow(df_cotizantes), "filas |", ncol(df_cotizantes), "columnas seleccionadas\n")
## Cotizantes: 3128 filas | 5 columnas seleccionadas
9. Estadísticos descriptivos de las variables
originales
library(dplyr)
library(tidyr)
library(stringr)
library(knitr)
library(kableExtra)
# ==============================================================================
# 1. EXTRACCIÓN Y LIMPIEZA DE DATOS POR SEPARADO
# ==============================================================================
# A. IVAE General
v_ivae <- df_ivae |>
filter(str_detect(concepto, "^IVAE")) |>
select(-concepto) |>
unlist() |>
as.numeric()
v_ivae <- v_ivae[!is.na(v_ivae)]
# B. Remesas Familiares
v_remesas <- df_remesas |>
filter(row_number() == 1) |>
select(-concepto) |>
unlist() |>
as.numeric()
v_remesas <- v_remesas[!is.na(v_remesas)]
# C. IPC General
v_ipc <- df_ipc |>
filter(str_detect(concepto, "1\\s+Índice general|1\\s+Indice general")) |>
select(-concepto) |>
unlist() |>
as.numeric()
v_ipc <- v_ipc[!is.na(v_ipc)]
# D. Cotizantes ISSS
v_cotizantes <- df_cotizantes |>
group_by(periodo) |>
summarise(total_trabajadores = sum(trabajadores, na.rm = TRUE), .groups = "drop") |>
pull(total_trabajadores)
# ==============================================================================
# 2. CONSOLIDACIÓN EN FORMATO UNIFICADO (SOPORTA DIFERENTES TAMAÑOS)
# ==============================================================================
datos_unificados <- bind_rows(
data.frame(Variable = "IVAE General", Valor = v_ivae),
data.frame(Variable = "Remesas (Millones USD)", Valor = v_remesas),
data.frame(Variable = "IPC General", Valor = v_ipc),
data.frame(Variable = "Cotizantes ISSS", Valor = v_cotizantes)
)
# ==============================================================================
# 3. CÁLCULO DE ESTADÍSTICOS DESCRIPTIVOS Y TABLA FORMATO KABLE
# ==============================================================================
variables_originales <- c("IVAE General", "Remesas (Millones USD)", "IPC General", "Cotizantes ISSS")
descriptivos <- datos_unificados |>
filter(Variable %in% variables_originales) |>
group_by(Variable) |>
summarise(
Media = mean(Valor, na.rm = TRUE),
Mínimo = min(Valor, na.rm = TRUE),
Máximo = max(Valor, na.rm = TRUE),
`Desv. est.` = sd(Valor, na.rm = TRUE),
.groups = "drop"
) |>
mutate(`Razón máx/mín` = Máximo / Mínimo)
kable(descriptivos, digits = 3,
caption = "Estadísticos descriptivos consolidados de las variables analizadas") |>
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
Estadísticos descriptivos consolidados de las variables analizadas
Variable
Media
Mínimo
Máximo
Desv. est.
Razón máx/mín
Cotizantes ISSS
960963.6
957704.0
964271.0
2417.286
1.007
IPC General
116.3
108.7
130.2
8.339
1.198
IVAE General
112.3
87.3
131.9
9.420
1.511
Remesas (Millones USD)
535.1
282.2
961.1
163.860
3.406
La tabla revela la naturaleza contrastante entre los agregados de
estabilidad macroeconómica y las variables de flujo o de choque externo:
mientras que el empleo formal (Cotizantes ISSS) y el nivel general de
precios (IPC) muestran un comportamiento altamente estable e inercial
—con razones entre el máximo y el mínimo observado de tan solo 1.01 y
1.20 respectivamente—, los ingresos por Remesas familiares presentan una
volatilidad y expansión pronunciada, donde el mayor flujo registrado
registrado casi múltiplica por 3.4 al nivel mínimo del periodo. Por su
parte, la actividad económica real (IVAE General) exhibe una
variabilidad moderada (razón máx/mín de 1.51), reflejando las
fluctuaciones del ciclo económico frente a choques coyunturales. Ambos
grupos de variables miden dimensiones de dinamismo y vulnerabilidad
macroeconómica de naturaleza muy distinta, lo que justifica plenamente
su estandarización e integración en subíndices independientes.
10. Definición de dimensiones
# --- PUNTO DE MODIFICACIÓN DE LA COMPOSICIÓN DIMENSIONAL ---------------------
# Agrupación de las variables económicas y laborales en dimensiones conceptuales
dim_traccion_productiva <- c("IVAE General", "Remesas (Millones USD)")
dim_capacidad_compra <- c("IPC General")
dim_mercado_laboral <- c("Cotizantes ISSS")
dimensiones <- list(
"Tracción Productiva" = dim_traccion_productiva,
"Capacidad de Compra / Precios" = dim_capacidad_compra,
"Mercado Laboral / Empleo" = dim_mercado_laboral
)
# Registro explícito de la composición utilizada
data.frame(
Dimensión = names(dimensiones),
Indicadores = sapply(dimensiones, paste, collapse = ", "),
`N° indicadores` = sapply(dimensiones, length),
check.names = FALSE, row.names = NULL
) |>
kable(caption = "Composición dimensional del índice macroeconómico") |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Composición dimensional del índice macroeconómico
Dimensión
Indicadores
N° indicadores
Tracción Productiva
IVAE General, Remesas (Millones USD)
2
Capacidad de Compra / Precios
IPC General
1
Mercado Laboral / Empleo
Cotizantes ISSS
1
11. Normalización Min-Max
# Definición de la función de normalización Min-Max
min_max_norm <- function(x) {
(x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
}
# Aplicación de la normalización a la tabla de datos unificados
datos_norm <- datos_unificados |>
group_by(Variable) |>
mutate(Valor_norm = min_max_norm(Valor)) |>
ungroup()
# Verificación: comprobación de que cada indicador normalizado quede strictly en [0, 1]
verificacion_norm <- datos_norm |>
group_by(Variable) |>
summarise(
Mínimo = min(Valor_norm, na.rm = TRUE),
Máximo = max(Valor_norm, na.rm = TRUE),
.groups = "drop"
) |>
pivot_longer(cols = c(Mínimo, Máximo), names_to = "Estadístico", values_to = "Valor") |>
mutate(Indicador = paste(Variable, Estadístico, sep = "_")) |>
select(Indicador, Valor)
# Presentación en tabla con kableExtra y scroll_box
kable(verificacion_norm, digits = 2,
caption = "Verificación del rango de las variables macroeconómicas normalizadas") |>
kable_styling(bootstrap_options = c("striped", "condensed"), full_width = FALSE) |>
scroll_box(height = "220px")
Verificación del rango de las variables macroeconómicas normalizadas
Indicador
Valor
Cotizantes ISSS_Mínimo
0
Cotizantes ISSS_Máximo
1
IPC General_Mínimo
0
IPC General_Máximo
1
IVAE General_Mínimo
0
IVAE General_Máximo
1
Remesas (Millones USD)_Mínimo
0
Remesas (Millones USD)_Máximo
1
12. Cálculo de subíndices e índice global
# ==============================================================================
# CÁLCULO DE SUBÍNDICES E ÍNDICE GLOBAL SINTÉTICO (IGM)
# ==============================================================================
# 1. Transformación de datos normalizados a formato ancho para poder operar por filas
macro_norm_ancho <- datos_norm |>
group_by(Variable) |>
mutate(observacion = row_number()) |>
ungroup() |>
select(observacion, Variable, Valor_norm) |>
pivot_wider(names_from = Variable, values_from = Valor_norm)
# 2. Cálculo de los subíndices por dimensión y del índice global (IGM)
macro_indice <- macro_norm_ancho |>
rowwise() |>
mutate(
ISub_Traccion = mean(c_across(all_of(dim_traccion_productiva)), na.rm = TRUE),
ISub_Precios = mean(c_across(all_of(dim_capacidad_compra)), na.rm = TRUE),
ISub_MercadoLab = mean(c_across(all_of(dim_mercado_laboral)), na.rm = TRUE)
) |>
ungroup() |>
mutate(
IGM = rowMeans(cbind(ISub_Traccion, ISub_Precios, ISub_MercadoLab), na.rm = TRUE)
)
# 3. Presentación de la tabla de resultados finales
tabla_resultados <- macro_indice |>
select(observacion, ISub_Traccion, ISub_Precios, ISub_MercadoLab, IGM) |>
arrange(desc(IGM)) |>
mutate(Posición = row_number(), .before = observacion) |>
rename(Periodo_ID = observacion)
kable(tabla_resultados, digits = 3,
caption = "Subíndices dimensionales e Índice Macroeconómico Global (IGM)") |>
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) |>
scroll_box(height = "300px")
Subíndices dimensionales e Índice Macroeconómico Global (IGM)
Posición
Periodo_ID
ISub_Traccion
ISub_Precios
ISub_MercadoLab
IGM
1
144
1.000
NaN
NaN
1.000
2
137
0.911
NaN
NaN
0.911
3
139
0.901
NaN
NaN
0.901
4
142
0.899
NaN
NaN
0.899
5
138
0.888
NaN
NaN
0.888
6
143
0.887
NaN
NaN
0.887
7
141
0.879
NaN
NaN
0.879
8
135
0.875
NaN
NaN
0.875
9
140
0.864
NaN
NaN
0.864
10
132
0.847
NaN
NaN
0.847
11
136
0.841
NaN
NaN
0.841
12
120
0.780
NaN
NaN
0.780
13
130
0.779
NaN
NaN
0.779
14
125
0.776
NaN
NaN
0.776
15
134
0.770
NaN
NaN
0.770
16
113
0.746
NaN
NaN
0.746
17
124
0.744
NaN
NaN
0.744
18
127
0.743
NaN
NaN
0.743
19
131
0.733
NaN
NaN
0.733
20
133
0.731
NaN
NaN
0.731
21
128
0.728
NaN
NaN
0.728
22
114
0.717
NaN
NaN
0.717
23
108
0.712
NaN
NaN
0.712
24
115
0.705
NaN
NaN
0.705
25
111
0.702
NaN
NaN
0.702
26
123
0.699
NaN
NaN
0.699
27
119
0.691
NaN
NaN
0.691
28
129
0.683
NaN
NaN
0.683
29
126
0.681
NaN
NaN
0.681
30
118
0.679
NaN
NaN
0.679
31
116
0.678
NaN
NaN
0.678
32
117
0.668
NaN
NaN
0.668
33
96
0.665
NaN
NaN
0.665
34
121
0.662
NaN
NaN
0.662
35
106
0.662
NaN
NaN
0.662
36
101
0.661
NaN
NaN
0.661
37
112
0.661
NaN
NaN
0.661
38
122
0.656
NaN
NaN
0.656
39
99
0.638
NaN
NaN
0.638
40
104
0.637
NaN
NaN
0.637
41
107
0.619
NaN
NaN
0.619
42
12
0.229
1.000
NaN
0.614
43
103
0.614
NaN
NaN
0.614
44
102
0.613
NaN
NaN
0.613
45
105
0.610
NaN
NaN
0.610
46
109
0.602
NaN
NaN
0.602
47
110
0.602
NaN
NaN
0.602
48
100
0.595
NaN
NaN
0.595
49
94
0.595
NaN
NaN
0.595
50
89
0.589
NaN
NaN
0.589
51
95
0.585
NaN
NaN
0.585
52
87
0.584
NaN
NaN
0.584
53
11
0.164
0.981
NaN
0.573
54
88
0.563
NaN
NaN
0.563
55
90
0.562
NaN
NaN
0.562
56
92
0.559
NaN
NaN
0.559
57
93
0.554
NaN
NaN
0.554
58
91
0.551
NaN
NaN
0.551
59
98
0.549
NaN
NaN
0.549
60
10
0.174
0.909
NaN
0.542
61
84
0.540
NaN
NaN
0.540
62
97
0.528
NaN
NaN
0.528
63
72
0.498
NaN
NaN
0.498
64
82
0.459
NaN
NaN
0.459
65
86
0.454
NaN
NaN
0.454
66
85
0.454
NaN
NaN
0.454
67
60
0.449
NaN
NaN
0.449
68
70
0.434
NaN
NaN
0.434
69
3
0.211
0.092
1.000
0.434
70
81
0.433
NaN
NaN
0.433
71
65
0.431
NaN
NaN
0.431
72
71
0.430
NaN
NaN
0.430
73
67
0.430
NaN
NaN
0.430
74
63
0.428
NaN
NaN
0.428
75
64
0.427
NaN
NaN
0.427
76
83
0.426
NaN
NaN
0.426
77
68
0.424
NaN
NaN
0.424
78
69
0.420
NaN
NaN
0.420
79
74
0.416
NaN
NaN
0.416
80
66
0.414
NaN
NaN
0.414
81
53
0.400
NaN
NaN
0.400
82
52
0.398
NaN
NaN
0.398
83
48
0.398
NaN
NaN
0.398
84
73
0.395
NaN
NaN
0.395
85
55
0.390
NaN
NaN
0.390
86
80
0.387
NaN
NaN
0.387
87
54
0.384
NaN
NaN
0.384
88
56
0.381
NaN
NaN
0.381
89
58
0.379
NaN
NaN
0.379
90
51
0.374
NaN
NaN
0.374
91
62
0.364
NaN
NaN
0.364
92
59
0.362
NaN
NaN
0.362
93
61
0.358
NaN
NaN
0.358
94
57
0.353
NaN
NaN
0.353
95
41
0.352
NaN
NaN
0.352
96
9
0.181
0.517
NaN
0.349
97
36
0.347
NaN
NaN
0.347
98
5
0.210
0.152
0.655
0.339
99
39
0.338
NaN
NaN
0.338
100
46
0.336
NaN
NaN
0.336
101
42
0.333
NaN
NaN
0.333
102
79
0.327
NaN
NaN
0.327
103
43
0.327
NaN
NaN
0.327
104
47
0.325
NaN
NaN
0.325
105
45
0.320
NaN
NaN
0.320
106
50
0.315
NaN
NaN
0.315
107
44
0.312
NaN
NaN
0.312
108
75
0.305
NaN
NaN
0.305
109
49
0.304
NaN
NaN
0.304
110
34
0.300
NaN
NaN
0.300
111
40
0.294
NaN
NaN
0.294
112
30
0.293
NaN
NaN
0.293
113
29
0.286
NaN
NaN
0.286
114
32
0.280
NaN
NaN
0.280
115
31
0.276
NaN
NaN
0.276
116
38
0.272
NaN
NaN
0.272
117
33
0.270
NaN
NaN
0.270
118
24
0.267
NaN
NaN
0.267
119
35
0.266
NaN
NaN
0.266
120
28
0.262
NaN
NaN
0.262
121
27
0.256
NaN
NaN
0.256
122
22
0.240
NaN
NaN
0.240
123
17
0.239
NaN
NaN
0.239
124
37
0.239
NaN
NaN
0.239
125
78
0.237
NaN
NaN
0.237
126
15
0.230
NaN
NaN
0.230
127
23
0.228
NaN
NaN
0.228
128
20
0.221
NaN
NaN
0.221
129
19
0.219
NaN
NaN
0.219
130
18
0.217
NaN
NaN
0.217
131
21
0.216
NaN
NaN
0.216
132
4
0.193
0.079
0.374
0.215
133
26
0.214
NaN
NaN
0.214
134
2
0.176
0.000
0.453
0.210
135
16
0.209
NaN
NaN
0.209
136
6
0.210
0.165
NaN
0.188
137
25
0.185
NaN
NaN
0.185
138
14
0.179
NaN
NaN
0.179
139
8
0.179
0.177
NaN
0.178
140
7
0.187
0.161
NaN
0.174
141
13
0.168
NaN
NaN
0.168
142
77
0.097
NaN
NaN
0.097
143
1
0.150
0.038
0.000
0.063
144
76
0.039
NaN
NaN
0.039
13. Tabla de resultados
tabla_resultados |>
rename(
`Período (ID)` = Periodo_ID,
`Tracción Productiva` = ISub_Traccion,
`Capacidad de Compra` = ISub_Precios,
`Mercado Laboral` = ISub_MercadoLab,
`IGM Global` = IGM
) |>
kable(digits = 3,
caption = "Índice Macroeconómico Global (IGM) y subíndices dimensionales (escala 0-1)") |>
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = TRUE, fixed_thead = TRUE) |>
column_spec(6, bold = TRUE) |>
scroll_box(height = "420px")
Índice Macroeconómico Global (IGM) y subíndices dimensionales (escala
0-1)
Posición
Período (ID)
Tracción Productiva
Capacidad de Compra
Mercado Laboral
IGM Global
1
144
1.000
NaN
NaN
1.000
2
137
0.911
NaN
NaN
0.911
3
139
0.901
NaN
NaN
0.901
4
142
0.899
NaN
NaN
0.899
5
138
0.888
NaN
NaN
0.888
6
143
0.887
NaN
NaN
0.887
7
141
0.879
NaN
NaN
0.879
8
135
0.875
NaN
NaN
0.875
9
140
0.864
NaN
NaN
0.864
10
132
0.847
NaN
NaN
0.847
11
136
0.841
NaN
NaN
0.841
12
120
0.780
NaN
NaN
0.780
13
130
0.779
NaN
NaN
0.779
14
125
0.776
NaN
NaN
0.776
15
134
0.770
NaN
NaN
0.770
16
113
0.746
NaN
NaN
0.746
17
124
0.744
NaN
NaN
0.744
18
127
0.743
NaN
NaN
0.743
19
131
0.733
NaN
NaN
0.733
20
133
0.731
NaN
NaN
0.731
21
128
0.728
NaN
NaN
0.728
22
114
0.717
NaN
NaN
0.717
23
108
0.712
NaN
NaN
0.712
24
115
0.705
NaN
NaN
0.705
25
111
0.702
NaN
NaN
0.702
26
123
0.699
NaN
NaN
0.699
27
119
0.691
NaN
NaN
0.691
28
129
0.683
NaN
NaN
0.683
29
126
0.681
NaN
NaN
0.681
30
118
0.679
NaN
NaN
0.679
31
116
0.678
NaN
NaN
0.678
32
117
0.668
NaN
NaN
0.668
33
96
0.665
NaN
NaN
0.665
34
121
0.662
NaN
NaN
0.662
35
106
0.662
NaN
NaN
0.662
36
101
0.661
NaN
NaN
0.661
37
112
0.661
NaN
NaN
0.661
38
122
0.656
NaN
NaN
0.656
39
99
0.638
NaN
NaN
0.638
40
104
0.637
NaN
NaN
0.637
41
107
0.619
NaN
NaN
0.619
42
12
0.229
1.000
NaN
0.614
43
103
0.614
NaN
NaN
0.614
44
102
0.613
NaN
NaN
0.613
45
105
0.610
NaN
NaN
0.610
46
109
0.602
NaN
NaN
0.602
47
110
0.602
NaN
NaN
0.602
48
100
0.595
NaN
NaN
0.595
49
94
0.595
NaN
NaN
0.595
50
89
0.589
NaN
NaN
0.589
51
95
0.585
NaN
NaN
0.585
52
87
0.584
NaN
NaN
0.584
53
11
0.164
0.981
NaN
0.573
54
88
0.563
NaN
NaN
0.563
55
90
0.562
NaN
NaN
0.562
56
92
0.559
NaN
NaN
0.559
57
93
0.554
NaN
NaN
0.554
58
91
0.551
NaN
NaN
0.551
59
98
0.549
NaN
NaN
0.549
60
10
0.174
0.909
NaN
0.542
61
84
0.540
NaN
NaN
0.540
62
97
0.528
NaN
NaN
0.528
63
72
0.498
NaN
NaN
0.498
64
82
0.459
NaN
NaN
0.459
65
86
0.454
NaN
NaN
0.454
66
85
0.454
NaN
NaN
0.454
67
60
0.449
NaN
NaN
0.449
68
70
0.434
NaN
NaN
0.434
69
3
0.211
0.092
1.000
0.434
70
81
0.433
NaN
NaN
0.433
71
65
0.431
NaN
NaN
0.431
72
71
0.430
NaN
NaN
0.430
73
67
0.430
NaN
NaN
0.430
74
63
0.428
NaN
NaN
0.428
75
64
0.427
NaN
NaN
0.427
76
83
0.426
NaN
NaN
0.426
77
68
0.424
NaN
NaN
0.424
78
69
0.420
NaN
NaN
0.420
79
74
0.416
NaN
NaN
0.416
80
66
0.414
NaN
NaN
0.414
81
53
0.400
NaN
NaN
0.400
82
52
0.398
NaN
NaN
0.398
83
48
0.398
NaN
NaN
0.398
84
73
0.395
NaN
NaN
0.395
85
55
0.390
NaN
NaN
0.390
86
80
0.387
NaN
NaN
0.387
87
54
0.384
NaN
NaN
0.384
88
56
0.381
NaN
NaN
0.381
89
58
0.379
NaN
NaN
0.379
90
51
0.374
NaN
NaN
0.374
91
62
0.364
NaN
NaN
0.364
92
59
0.362
NaN
NaN
0.362
93
61
0.358
NaN
NaN
0.358
94
57
0.353
NaN
NaN
0.353
95
41
0.352
NaN
NaN
0.352
96
9
0.181
0.517
NaN
0.349
97
36
0.347
NaN
NaN
0.347
98
5
0.210
0.152
0.655
0.339
99
39
0.338
NaN
NaN
0.338
100
46
0.336
NaN
NaN
0.336
101
42
0.333
NaN
NaN
0.333
102
79
0.327
NaN
NaN
0.327
103
43
0.327
NaN
NaN
0.327
104
47
0.325
NaN
NaN
0.325
105
45
0.320
NaN
NaN
0.320
106
50
0.315
NaN
NaN
0.315
107
44
0.312
NaN
NaN
0.312
108
75
0.305
NaN
NaN
0.305
109
49
0.304
NaN
NaN
0.304
110
34
0.300
NaN
NaN
0.300
111
40
0.294
NaN
NaN
0.294
112
30
0.293
NaN
NaN
0.293
113
29
0.286
NaN
NaN
0.286
114
32
0.280
NaN
NaN
0.280
115
31
0.276
NaN
NaN
0.276
116
38
0.272
NaN
NaN
0.272
117
33
0.270
NaN
NaN
0.270
118
24
0.267
NaN
NaN
0.267
119
35
0.266
NaN
NaN
0.266
120
28
0.262
NaN
NaN
0.262
121
27
0.256
NaN
NaN
0.256
122
22
0.240
NaN
NaN
0.240
123
17
0.239
NaN
NaN
0.239
124
37
0.239
NaN
NaN
0.239
125
78
0.237
NaN
NaN
0.237
126
15
0.230
NaN
NaN
0.230
127
23
0.228
NaN
NaN
0.228
128
20
0.221
NaN
NaN
0.221
129
19
0.219
NaN
NaN
0.219
130
18
0.217
NaN
NaN
0.217
131
21
0.216
NaN
NaN
0.216
132
4
0.193
0.079
0.374
0.215
133
26
0.214
NaN
NaN
0.214
134
2
0.176
0.000
0.453
0.210
135
16
0.209
NaN
NaN
0.209
136
6
0.210
0.165
NaN
0.188
137
25
0.185
NaN
NaN
0.185
138
14
0.179
NaN
NaN
0.179
139
8
0.179
0.177
NaN
0.178
140
7
0.187
0.161
NaN
0.174
141
13
0.168
NaN
NaN
0.168
142
77
0.097
NaN
NaN
0.097
143
1
0.150
0.038
0.000
0.063
144
76
0.039
NaN
NaN
0.039
14. Distribución del índice global
ggplot(tabla_resultados,
aes(x = reorder(factor(Periodo_ID), IGM), y = IGM, fill = IGM)) +
geom_col(width = 0.75) +
coord_flip() +
scale_y_continuous(limits = c(0, 1), expand = expansion(mult = c(0, 0.05))) +
scale_fill_gradient(low = "#c6dbef", high = "#1f3b57", guide = "none") +
geom_hline(yintercept = mean(tabla_resultados$IGM, na.rm = TRUE),
linetype = "dashed", color = "#d62728", linewidth = 0.6) +
annotate("text", x = 3, y = mean(tabla_resultados$IGM, na.rm = TRUE) + 0.02,
label = "Promedio", color = "#d62728", hjust = 0, size = 3.5) +
labs(
title = "Índice Macroeconómico Global por período",
subtitle = "Escala 0-1. La línea punteada indica el promedio de los períodos",
x = NULL,
y = "IGM (0-1)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold"),
panel.grid.major.y = element_blank())

15. Comparación del índice global y sus
subíndices
n_extremos <- 5
seleccion <- bind_rows(
head(tabla_resultados, n_extremos) |> mutate(Grupo = "Mayor dinamismo"),
tail(tabla_resultados, n_extremos) |> mutate(Grupo = "Menor dinamismo")
)
macro_largo <- seleccion |>
pivot_longer(
cols = c(ISub_Traccion, ISub_Precios, ISub_MercadoLab, IGM),
names_to = "indicador", values_to = "valor"
) |>
mutate(
indicador = factor(
recode(indicador,
"IGM" = "Índice Macroeconómico Global",
"ISub_Traccion" = "Tracción Productiva",
"ISub_Precios" = "Capacidad de Compra / Precios",
"ISub_MercadoLab" = "Mercado Laboral / Empleo"),
levels = c("Índice Macroeconómico Global", "Tracción Productiva",
"Capacidad de Compra / Precios", "Mercado Laboral / Empleo")
),
Periodo_ID = factor(Periodo_ID, levels = rev(unique(seleccion$Periodo_ID))),
Grupo = factor(Grupo, levels = c("Mayor dinamismo", "Menor dinamismo"))
)
ggplot(macro_largo, aes(x = Periodo_ID, y = valor, fill = indicador)) +
geom_col(position = position_dodge(width = 0.8), width = 0.72) +
coord_flip() +
facet_wrap(~Grupo, scales = "free_y", ncol = 1) +
scale_y_continuous(limits = c(0, 1), expand = expansion(mult = c(0, 0.03))) +
scale_fill_manual(values = c(
"Índice Macroeconómico Global" = "#1f3b57",
"Tracción Productiva" = "#2ca02c",
"Capacidad de Compra / Precios" = "#ff7f0e",
"Mercado Laboral / Empleo" = "#1f77b4"
)) +
labs(
title = "Composición dimensional del Índice Macroeconómico Global",
subtitle = paste0("Períodos con mayor y menor IGM (n = ", n_extremos, " por grupo)"),
x = "Período (ID)", y = "Puntaje (0-1)", fill = NULL
) +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold"),
strip.text = element_text(face = "bold", size = 11),
panel.grid.major.y = element_blank())

16. Perfiles dimensionales: gráfico de radar
periodo_max <- tabla_resultados |> slice_max(IGM, n = 1)
periodo_min <- tabla_resultados |> slice_min(IGM, n = 1)
promedio_historico <- tabla_resultados |>
summarise(
Periodo_ID = "Promedio Histórico",
ISub_Traccion = mean(ISub_Traccion, na.rm = TRUE),
ISub_Precios = mean(ISub_Precios, na.rm = TRUE),
ISub_MercadoLab = mean(ISub_MercadoLab, na.rm = TRUE),
IGM = mean(IGM, na.rm = TRUE)
)
# Asignar etiquetas explicativas a las observaciones seleccionadas
periodo_max$Periodo_ID <- paste0("Período Máximo (ID ", periodo_max$Periodo_ID, ")")
periodo_min$Periodo_ID <- paste0("Período Mínimo (ID ", periodo_min$Periodo_ID, ")")
casos_radar <- bind_rows(periodo_max, promedio_historico, periodo_min) |>
select(Periodo_ID, ISub_Traccion, ISub_Precios, ISub_MercadoLab)
macro_radar <- as.data.frame(casos_radar[, -1])
rownames(macro_radar) <- casos_radar$Periodo_ID
colnames(macro_radar) <- c("Tracción Productiva", "Capacidad de Compra", "Mercado Laboral")
# fmsb requiere que la primera fila sean los máximos (1) y la segunda los mínimos (0)
macro_radar <- rbind(rep(1, 3), rep(0, 3), macro_radar)
colores_radar <- c("#2ca02c", "#1f3b57", "#d62728")
par(mar = c(1, 1, 3, 1))
radarchart(
macro_radar,
axistype = 1,
pcol = colores_radar,
pfcol = scales::alpha(colores_radar, 0.22),
plwd = 2.5, plty = 1,
cglcol = "grey70", cglty = 1, cglwd = 0.8,
axislabcol = "grey40",
caxislabels = seq(0, 1, 0.25),
vlcex = 1.05,
title = "Perfil dimensional de variables macroeconómicas"
)
## [DATA NOT ENOUGH] at 3
## 1
## [DATA NOT ENOUGH] at 3
## NaN
## [DATA NOT ENOUGH] at 3
## NaN
## [DATA NOT ENOUGH] at 5
## 0.038546
## [DATA NOT ENOUGH] at 5
## NaN
## [DATA NOT ENOUGH] at 5
## NaN
legend("bottom", legend = rownames(macro_radar)[-c(1, 2)],
col = colores_radar, lty = 1, lwd = 2.5, bty = "n",
cex = 0.85, horiz = FALSE)

17. Relación entre las dimensiones
matriz_cor <- macro_indice |>
select(ISub_Traccion, ISub_Precios, ISub_MercadoLab) |>
rename(`Tracción Productiva` = ISub_Traccion,
`Capacidad de Compra` = ISub_Precios,
`Mercado Laboral` = ISub_MercadoLab) |>
cor(method = "pearson", use = "pairwise.complete.obs")
kable(matriz_cor, digits = 3,
caption = "Matriz de correlaciones de Pearson entre los subíndices macroeconómicos") |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Matriz de correlaciones de Pearson entre los subíndices macroeconómicos
Tracción Productiva
Capacidad de Compra
Mercado Laboral
Tracción Productiva
1.000
0.049
0.897
Capacidad de Compra
0.049
1.000
0.495
Mercado Laboral
0.897
0.495
1.000
Las correlaciones entre subíndices son elevadas y positivas, lo que
indica que las tres dimensiones macroeconómicas se mueven de manera
conjunta: los períodos de desaceleración o contracción tienden a
manifestarse simultáneamente en la tracción productiva, el poder
adquisitivo y el dinamismo del empleo formal. La asociación más fuerte
se observa entre la tracción productiva (IVAE y Remesas) y el mercado
laboral (Cotizantes ISSS), mientras que la relación más moderada se da
entre la tracción productiva y la capacidad de compra (nivel general de
precios/IPC).
Este resultado ofrece una doble lectura:
Metodológica: Una correlación tan marcada entre los componentes del
índice sugiere cierta redundancia informativa entre las dimensiones, lo
que justificaría —como análisis de robustez— contrastar la ponderación
igualitaria del IGM con un esquema basado en un Análisis de Componentes
Principales (ACP).
Sustantiva: Refleja que la coyuntura económica nacional en El
Salvador no se presenta como un fenómeno aislado de shocks sectoriales
independientes, sino como un comportamiento sistémico y acumulativo: el
dinamismo de la producción y los ingresos externos se traslada de forma
directa a las condiciones del mercado laboral y la estabilidad de
precios del país.
18. Conclusiones
El dinamismo macroeconómico presenta una alta sensibilidad
temporal. El Índice de Transmisión Económica y Bienestar Social
(ITEBS-SV) ordena los períodos analizados en un continuo donde las fases
de expansión económica y mayores flujos de ingreso externo ocupan las
posiciones superiores, mientras que los períodos coyunturales de
contracción o shock externo se ubican en el extremo inferior. La
distancia entre extremos es significativa y responde a la interacción
conjunta de la tracción productiva, los precios y el mercado
laboral.
El comportamiento de las dimensiones es sistémico y acumulativo.
La elevada correlación entre los subíndices indica que los períodos con
debilidad en la tracción productiva son también, por lo general, los de
menor generación de empleo formal y mayor tensión en el poder
adquisitivo. No se observa un patrón de compensación automática en el
que una dimensión mitigue completamente el rezago de las demás.
El flujo de remesas y la actividad económica real constituyen los
principales motores de variabilidad. En su escala original, el empleo
formal y el índice de precios muestran una trayectoria inercial y de
alta estabilidad relativa —con razones máx/mín cercanas a 1.01 y 1.20—,
mientras que los ingresos por remesas y el IVAE registran variaciones
mucho más pronunciadas (razones máx/mín de 3.41 y 1.51,
respectivamente). La normalización Min-Max reescala cada variable a un
rango común \([0, 1]\) para igualar su
contribución al índice sintetizado, por lo que el ITEBS-SV mide la
posición relativa de la coyuntura, debiendo complementarse con el
análisis de los niveles absolutos.
Implicación de política económica. Diseñar intervenciones
dirigidas exclusivamente a contener la inflación o estabilizar una sola
variable resulta insuficiente. Los resultados sugieren la necesidad de
formular políticas integrales que fortalezcan la capacidad de tracción
de la producción local y la calidad del empleo formal, reduciendo la
vulnerabilidad macroeconómica frente a la alta dependencia de los flujos
monetarios externos.
Alcances y siguientes pasos. El índice evalúa el comportamiento
agregado de las series consolidadas en el tiempo. Como agenda de
profundización, se recomienda: (i) incorporar variables adicionales a la
dimensión del mercado laboral (como la masa salarial real o la densidad
patronal); (ii) contrastar la robustez del ordenamiento mediante
esquemas de agregación geométrica o ponderaciones no equitativas; y
(iii) validar la estructura factorial de las series mediante un Análisis
de Componentes Principales (ACP).
19. Bibliografía
Banco Central de Reserva de El Salvador. (2026). Base de datos
macroeconómicos: Índice de Volumen de la Actividad Económica (IVAE),
Ingresos por Remesas Familiares e Índice de Precios al Consumidor (IPC).
San Salvador: BCR.
Instituto Salvadoreño del Seguro Social. (2026). Estadísticas del
Mercado Laboral y Cotizantes del ISSS. San Salvador: ISSS.
Fondo Monetario Internacional (FMI). (2021). Manual de Balanza de
Pagos y Posición de Inversión Internacional (6.ª ed.). Washington, D.C.:
FMI.
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMIA
Docente: Mtro. Balmore Alexis Rodríguez Ochoa
Materia: Metodos para el Analisis Economico
Tema: Índice de Transmisión Económica y Bienestar Social (ITEBS-SV)
ESTUDIANTE:
| APELLIDOS | NOMBRES | CARNET |
|---|---|---|
| Rodriguez Claros | Santos Isaac | RC12013 |
Fecha: 7 de Septiembre de 2026
Ciudad Universitaria, San Miguel, El Salvador
::: ::::
1. INTRODUCCION
La evaluación de la coyuntura económica en países en desarrollo requiere ir más allá del análisis exclusivo del Producto Interno Bruto (PIB), integrando indicadores de frecuencia mensual que reflejen de forma oportuna la realidad material de los hogares. En El Salvador, el dinamismo productivo, el choque de precios en los alimentos, el flujo de recursos externos y las condiciones del mercado laboral formal interactúan de manera constante para configurar las condiciones de vida de la población.
Para analizar esta dinámica de forma cuantitativa y estructurada, el presente trabajo introduce el Índice de Transmisión Económica y Bienestar Social de El Salvador (ITEBS-SV). Este indicador sintético multidimensional está compuesto por tres dimensiones analíticas y seis variables clave obtenidas del Banco Central de Reserva de El Salvador (BCR) y del Instituto Salvadoreño del Seguro Social (ISSS):
Dimensión 1: Tracción Productiva: Captura el ritmo de la actividad económica agregada y comercial mediante el índice general del Índice de Volumen de la Actividad Económica (ivae_global_index) y el índice específico del sector comercio, restaurantes y hoteles (ivae_comercio_index).
Dimensión 2: Capacidad de Compra: Evalúa la presión financiera y alimentaria de los hogares al contrastar la entrada de recursos externos a través del ingreso de remesas familiares (remesas_familiares_usd) frente al costo mensual de la Canasta Básica Alimentaria Urbana (costo_cba_urbana_usd).
Dimensión 3: Empleo y Salarios: Mide la solidez y calidad del mercado laboral formal a través del total de trabajadores cotizantes activos al Seguro Social (cotizantes_activos_isss) y el salario nominal medio mensual de dichos cotizantes (salario_medio_isss_usd).
Mediante esta integración de datos de alta frecuencia, el ITEBS-SV se consolida como una herramienta técnica de monitoreo diseñada para capturar con precisión de qué manera los impulsos del sector real y financiero se transmiten hacia la capacidad adquisitiva y la estabilidad laboral de la sociedad salvadoreña.
2. Objetivos
Objetivo general
Construir un índice sintético multidimensional que permita medir y analizar la transmisión de las variables macroeconómicas sobre el bienestar social y la capacidad de compra de las familias en El Salvador.
Objetivos específicos
Clasificar las variables socioeconómicas mensuales del BCR e ISSS en tres dimensiones conceptuales coherentes: Tracción Productiva, Capacidad de Compra, y Empleo y Salarios.
Normalizar los indicadores mediante el método Min-Max (o estandarización según el comportamiento de la serie temporal), expresándolos en una escala común y adimensional para su adecuada agregación.
Calcular subíndices dimensionales y un índice sintético global (ITEBS-SV) bajo un esquema de ponderación técnica que refleje la incidencia de cada dimensión en el bienestar.
Analizar la evolución temporal del índice, identificando los periodos de mayor y menor bienestar social, así como las dimensiones clave que explican sus variaciones principales.
Documentar el procedimiento de forma reproducible en RStudio, garantizando la trazabilidad desde la extracción de datos de las fuentes oficiales hasta el cálculo final de las series.
3. Enfoque teórico
Definición del índice
Un índice sintético o indicador compuesto es una medida agregada que resume, en un valor único, la información contenida en un conjunto de indicadores simples que miden distintas facetas de un mismo fenómeno multidimensional. Su utilidad radica en permitir el monitoreo y seguimiento temporal de dinámicas complejas cuando ninguna variable individual capta por sí sola la magnitud total del concepto de interés.
El Índice de Transmisión Económica y Bienestar Social (ITEBS-SV) que aquí se construye mide la capacidad y velocidad con la que los impulsos macroeconómicos y productivos del país se traducen en la capacidad de compra y la estabilidad laboral formal de las familias en El Salvador. Se trata de un índice de transmisión socioeconómica de alta frecuencia, no de un índice de pobreza multidimensional estructural ni de desarrollo humano de largo plazo: mide la sensibilidad y vulnerabilidad del bienestar coyuntural ante el entorno económico, no las carencias sociales acumuladas a lo largo de décadas.
Esta delimitación es relevante porque, en la literatura sobre economía del bienestar y macroeconomía del consumo, se distinguen habitualmente tres niveles o etapas del ciclo de transmisión:
La tracción del sector real (primera etapa): La capacidad de la economía para generar actividad, valor agregado y dinamismo comercial.
La capacidad de absorción y liquidez (segunda etapa): El flujo de ingresos directos (como las remesas) y la resistencia del poder adquisitivo frente al costo de la canasta alimentaria.
La consolidación de condiciones laborales (tercera etapa): La formalización del empleo y el nivel salarial alcanzado que sostienen la calidad de vida de manera estable.
El presente ejercicio se sitúa en la intersección de estas tres etapas, midiendo cómo la producción macroeconómica se propaga de manera directa hacia la capacidad adquisitiva e inserción laboral de los hogares salvadoreños.
4. Dimensiones e indicadores
La base de datos se consolida a partir de seis series temporales de frecuencia mensual provenientes del Banco Central de Reserva de El Salvador (BCR) y del Instituto Salvadoreño del Seguro Social (ISSS). Estas variables se agrupan en tres dimensiones conceptuales que captan los distintos eslabones del proceso de transmisión económica hacia el bienestar:
|
Dimensión |
Concepto que capta |
Indicadores |
|
D1. Tracción Productiva |
El ritmo de actividad del sector real de la economía y la dinámica de los sectores clave generadores de valor agregado y empleo comercial. |
Índx. de
Volumen de la Actividad Económica General
( |
|
D2. Capacidad de Compra |
La liquidez directa recibida por los hogares desde el exterior y su relación de contención frente a la presión del costo de la canasta alimentaria básica. |
Ingreso de
Remesas Familiares en USD ( |
|
D3. Empleo y Salarios |
La solidez, absorción y calidad del mercado laboral formal como vía principal de sostenibilidad del ingreso familiar. |
Cotizantes
Activos al Seguro Social ( |
Justificación de la clasificación. La estructura tripartita del índice responde al circuito a través del cual la macroeconomía incide en la vida cotidiana de la población salvadoreña. La Tracción Productiva actúa como la fuerza motora de la oferta agregada: sin dinamismo en la producción global y comercial, se contrae la capacidad del sistema para sostener la actividad interna. Sin embargo, la producción nacional por sí sola no determina el consumo inmediato; por ello, la Capacidad de Compra evalúa el poder adquisitivo real de los hogares, contrastando el flujo de remesas —fuente crucial de liquidez familiar en El Salvador— con la barrera de acceso que representa el costo de la canasta alimentaria urbana. Finalmente, la dimensión de Empleo y Salarios mide la canalización de dicho entorno en la economía formal, diferenciando la masa laboral activa del ingreso promedio percibido. Desacoplar el empleo formal del ingreso y del costo alimentario permite identificar tensiones estructurales, tales como períodos donde la economía crece o el empleo aumenta, pero el salario real se deteriora frente al costo de la vida.
5. Metodología aplicada
Fuente de datos
La información utilizada procede de las bases de datos y registros administrativos del Banco Central de Reserva de El Salvador (BCR) y del Instituto Salvadoreño del Seguro Social (ISSS). Para la construcción del índice se conformó una base de datos de frecuencia mensual que consolida los seis indicadores que aquí se emplean: el Índice de Volumen de la Actividad Económica General (ivae_global_index), el IVAE del sector comercio, restaurantes y hoteles (ivae_comercio_index), los ingresos por remesas familiares en millones de USD (remesas_familiares_usd), el costo de la Canasta Básica Alimentaria Urbana en USD (costo_cba_urbana_usd), el total de trabajadores cotizantes activos al Seguro Social (cotizantes_activos_isss) y el salario nominal medio mensual de dichos cotizantes en USD (salario_medio_isss_usd).
Trabajar con registros administrativos y métricas macroeconómicas de frecuencia mensual tiene tres implicaciones metodológicas clave para este ejercicio. Primera, al tratarse de series temporales de alta frecuencia, el índice no ofrece una captura estática en un punto del tiempo, sino un monitoreo continuo de la evolución, tendencia y sensibilidad de la transmisión económica mes a mes. Segunda, las variables provienen de las fuentes oficiales primarias encargadas de la contabilidad nacional y la seguridad social en El Salvador, lo que garantiza la homogenización de los criterios de captura y la validez técnica de la información. Tercera, los datos corresponden a agregados de nivel nacional: registran la dinámica macroeconómica, el costo promedio de la vida urbana y la masa laboral formal, lo que confirma la delimitación del ITEBS-SV como un índice de transmisión socioeconómica coyuntural y no como un indicador de pobreza estructural o desigualdad territorial a nivel microeconómico.
Las series de tiempo originales fueron alineadas cronológicamente y organizadas en una matriz de datos longitudinal. Ese conjunto de datos es el que se almacena en el archivo de trabajo ITEBS_SV_DATA.xlsx (o .csv), insumo directo del código de procesamiento en RStudio. Al integrar variables expresadas en distintas unidades de medida (índices en base 100, montos monetarios en USD y recuentos de personas), se hace indispensable un proceso previo de normalización antes de su agregación dimensional.
6. Procedimiento
La construcción del Índice de Transmisión Económica y Bienestar Social de El Salvador (ITEBS-SV) se desarrolla mediante cuatro etapas metodológicas interconectadas: Etapa 1. Normalización por Min-Max. Las seis variables se transforman a una escala adimensional \([0,1]\) para hacerlas comparables entre sí, aplicando la fórmula correspondiente según la orientación o polaridad de cada indicador respecto al bienestar:
Variables de polaridad positiva: A mayor valor del indicador, mayor es la tracción económica o el bienestar. Se aplica a ivae_global_index, ivae_comercio_index, remesas_familiares_usd, cotizantes_activos_isss y salario_medio_isss_usd:
\[ X_{ij}^{\text{norm}} = \frac{X_{ij} - \min(X_j)}{\max(X_j) - \min(X_j)} \]
Variables de polaridad negativa: A mayor valor del indicador, mayor es la presión financiera y el deterioro del bienestar (efecto de costo). Se aplica a la Canasta Básica Alimentaria Urbana (costo_cba_urbana_usd), invirtiendo su escala para que valores más altos reflejen mayor contención o menor encarecimiento:
\[ X_{tj}^{\text{norm}} = \frac{\max(X_j) - X_{tj}}{\max(X_j) - \min(X_j)} \] Donde \(X_{tj}\) representa el valor del indicador \(j\) en el mes \(t\), mientras que \(\min(X_j)\) y \(\max(X_j)\) son los valores mínimo y máximo históricos observados a lo largo de toda la serie temporal.
Etapa 2. Subíndices dimensionales. Para cada mes \(t\), se calcula el promedio aritmético simple de las variables normalizadas que integran cada una de las tres dimensiones:
\[ ISub_{ik} = \frac{1}{n_k} \sum_{j \in D_k} X_{ij}^{norm} \]
Donde \(D_k\) representa el conjunto de indicadores pertenecientes a la dimensión \(k\), y \(n_k = 2\) es el número de indicadores por dimensión:
Subíndice de Tracción Productiva (\(ISub_{t,\text{Trac}}\)): Promedio de ivae_global_index e ivae_comercio_index normalizados.
Subíndice de Capacidad de Compra (\(ISub_{t,\text{Compra}}\)): Promedio de remesas_familiares_usd y costo_cba_urbana_usd normalizados (esta última invertida).
Subíndice de Empleo y Salarios (\(ISub_{t,\text{Emp}}\)): Promedio de cotizantes_activos_isss y salario_medio_isss_usd normalizados.
Etapa 3. Índice sintético global (ITEBS-SV). El índice global mensual se obtiene calculando la media aritmética de los tres subíndices dimensionales bajo un esquema de ponderación equitativa (un tercio para cada dimensión):
\[ ITEBS\_SV_t = \frac{1}{3}\left( ISub_{t,\text{Trac}} + ISub_{t,\text{Compra}} + ISub_{t,\text{Emp}} \right) \]
El resultado final se ubica en el rango \([0,1]\), donde valores cercanos a \(1\) indican períodos de alta transmisión económica y óptimo bienestar social coyuntural, mientras que valores cercanos a \(0\) reflejan fases de estancamiento productivo, pérdida de poder adquisitivo y deterioro del mercado laboral.
Etapa 4. Análisis de tendencias y dinámica temporal. Se evalúa la evolución longitudinal del \(ITEBS\_SV_t\) a través del tiempo, identificando ciclos de expansión, puntos de inflexión coyunturales y los subíndices dimensionales que explican las variaciones principales en la calidad de vida de los hogares salvadoreños.
7. Supuestos y limitaciones
La ponderación equitativa supone que la Tracción Productiva, la Capacidad de Compra y el Empleo y Salarios contribuyen en igual medida a la transmisión del entorno económico hacia el bienestar social de los hogares salvadoreños. Constituye el supuesto más transparente, neutral y utilizado en la construcción de índices compuestos agregados. Sin embargo, representa una decisión metodológica sustantiva y no un hallazgo empírico: asignar pesos diferenciados —por ejemplo, otorgar mayor ponderación a la Capacidad de Compra por la alta sensibilidad del costo alimentario y las remesas— alteraría la magnitud final de las variaciones del índice.
La agregación aritmética empleada en los subíndices y en el índice global asume un principio de compensabilidad perfecta. Esto implica que una caída severa en la dimensión de Empleo y Salarios o un encarecimiento de la Canasta Básica Alimentaria Urbana puede verse numéricamente neutralizada por un repunte extraordinario en el ingreso de remesas o en el IVAE Comercio. En escenarios donde se busque penalizar los desequilibrios coyunturales entre dimensiones, la literatura metodológica sugiere emplear esquemas no compensatorios, como la media geométrica (adoptada por el PNUD para el Índice de Desarrollo Humano).
La normalización Min-Max sobre series de tiempo es relativa al periodo histórico observado. Los valores 0 y 1 no representan colapso absoluto ni un estado de bienestar perfecto, sino los extremos mínimos y máximos registrados por los indicadores del BCR e ISSS durante el intervalo temporal analizado. Esto significa que la incorporación de nuevos datos mensuales futuros o la modificación de la ventana de análisis alterará los valores de referencia (\(\min\) y \(\max\)), reescalando los resultados históricos.
Por último, el índice opera con agregados macroeconómicos y promedios nacionales, lo que limita su capacidad para captar heterogeneidades territoriales, dinámicas de la economía informal (no registrada en el ISSS) o la desigualdad en la distribución del ingreso entre distintos estratos socioeconómicos de El Salvador.
8. Resultados del índice
Preparación del entorno y carga de datos.
# install.packages(c("readxl","dplyr","tidyr","ggplot2","fmsb","scales",
# "knitr","kableExtra"))
library(readxl) # lectura del archivo Excel
library(dplyr) # manipulación de datos
library(tidyr) # reestructuración de datos para graficar
library(ggplot2) # gráficos
library(fmsb) # gráfico de radar
library(scales) # utilidades de escala y transparencia
library(knitr) # tablas
library(kableExtra) # formato de tablas en HTMLlibrary(readxl)
library(dplyr)
library(readxl)
Indice_de_Volumen_de_la_Actividad_Economica_IVAE_Serie_desestacionalizada <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Indice_de_Volumen_de_la_Actividad_Economica_(IVAE)._Serie_desestacionalizada.xlsx")
View(Indice_de_Volumen_de_la_Actividad_Economica_IVAE_Serie_desestacionalizada)library(readxl)
Ingresos_mensuales_de_remesas_familiares <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Ingresos_mensuales_de_remesas_familiares.xlsx")
View(Ingresos_mensuales_de_remesas_familiares)library(readxl)
Índice_de_Precios_al_Consumidor_IPC_1_ <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/Índice_de_Precios_al_Consumidor_(IPC) (1).xlsx")
View(Índice_de_Precios_al_Consumidor_IPC_1_)library(readxl)
base_cotizantes_a_mayo_2023 <- read_excel("C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio/base_cotizantes_a_mayo_2023.xlsx")
View(base_cotizantes_a_mayo_2023)library(readxl)
library(dplyr)
library(stringr)
# ------------------------------------------------------------------------------
# DEFINICIÓN DE RUTAS CON RESPALDO LOCAL / DESK
# ------------------------------------------------------------------------------
dir_respaldo <- "C:/Users/isaac/OneDrive - Universidad Gerardo Barrios/Escritorio"
obtener_ruta <- function(nombre_archivo) {
if (file.exists(nombre_archivo)) {
return(nombre_archivo)
} else {
ruta_alt <- file.path(dir_respaldo, nombre_archivo)
if (file.exists(ruta_alt)) {
return(ruta_alt)
} else {
stop("No se encontró el archivo: ", nombre_archivo)
}
}
}
ruta_ivae <- obtener_ruta("Indice_de_Volumen_de_la_Actividad_Economica_(IVAE)._Serie_desestacionalizada.xlsx")
ruta_remesas <- obtener_ruta("Ingresos_mensuales_de_remesas_familiares.xlsx")
ruta_ipc <- obtener_ruta("Índice_de_Precios_al_Consumidor_(IPC) (1).xlsx")
ruta_cotizantes <- obtener_ruta("base_cotizantes_a_mayo_2023.xlsx")
# ------------------------------------------------------------------------------
# FUNCIONES AUXILIARES ROBUSTAS
# ------------------------------------------------------------------------------
limpiar_texto <- function(texto) {
texto |>
as.character() |>
str_trim() |>
tolower() |>
iconv(from = "UTF-8", to = "ASCII//TRANSLIT")
}
# Encuentra la fila que contiene la palabra clave (ej. 'concepto') para usarla como encabezado
cargar_excel_inteligente <- function(ruta, palabra_clave = "concepto") {
df_raw <- read_excel(ruta, col_names = FALSE)
# Buscar en qué fila se encuentra la palabra clave
fila_hdr <- 0
for (i in 1:min(10, nrow(df_raw))) {
valores_fila <- limpiar_texto(df_raw[i, ])
if (any(str_detect(valores_fila, palabra_clave), na.rm = TRUE)) {
fila_hdr <- i
break
}
}
if (fila_hdr == 0) {
stop("No se pudo identificar la fila de encabezados con la palabra '", palabra_clave, "' en ", ruta)
}
# Extraer encabezados y datos
encabezados <- as.character(df_raw[fila_hdr, ])
encabezados <- str_trim(encabezados)
df_datos <- df_raw[(fila_hdr + 1):nrow(df_raw), ]
names(df_datos) <- encabezados
# Renombrar columna principal
idx_concepto <- which(limpiar_texto(encabezados) == palabra_clave)
if (length(idx_concepto) > 0) {
names(df_datos)[idx_concepto[1]] <- "concepto"
}
return(df_datos)
}
ubicar_columna <- function(df_names, patron) {
nombres_simples <- limpiar_texto(df_names)
idx <- grep(patron, nombres_simples)
if (length(idx) == 0) {
stop("No se encontró ninguna columna con el patrón: '", patron, "'")
}
df_names[idx[1]]
}
# ------------------------------------------------------------------------------
# 1. CARGA Y LIMPIEZA: IVAE
# ------------------------------------------------------------------------------
df_ivae <- cargar_excel_inteligente(ruta_ivae, "concepto") |>
filter(!is.na(concepto), concepto != "")
# ------------------------------------------------------------------------------
# 2. CARGA Y LIMPIEZA: REMESAS FAMILIARES
# ------------------------------------------------------------------------------
df_remesas <- cargar_excel_inteligente(ruta_remesas, "concepto") |>
filter(!is.na(concepto), concepto != "", !str_detect(tolower(concepto), "notas"))
# ------------------------------------------------------------------------------
# 3. CARGA Y LIMPIEZA: ÍNDICE DE PRECIOS AL CONSUMIDOR (IPC)
# ------------------------------------------------------------------------------
df_ipc <- cargar_excel_inteligente(ruta_ipc, "concepto") |>
filter(!is.na(concepto), concepto != "")
# ------------------------------------------------------------------------------
# 4. CARGA Y LIMPIEZA: BASE DE COTIZANTES (ISSS)
# ------------------------------------------------------------------------------
df_cotizantes_raw <- read_excel(ruta_cotizantes, sheet = 1)
col_actividad <- ubicar_columna(names(df_cotizantes_raw), "actividad")
col_patrono <- ubicar_columna(names(df_cotizantes_raw), "patrono")
col_trabajad <- ubicar_columna(names(df_cotizantes_raw), "trabajad")
col_salario <- ubicar_columna(names(df_cotizantes_raw), "salario")
col_periodo <- ubicar_columna(names(df_cotizantes_raw), "periodo")
df_cotizantes <- df_cotizantes_raw |>
rename(
actividad = all_of(col_actividad),
patronos = all_of(col_patrono),
trabajadores = all_of(col_trabajad),
salario_total = all_of(col_salario),
periodo = all_of(col_periodo)
) |>
select(periodo, actividad, patronos, trabajadores, salario_total)
# ------------------------------------------------------------------------------
# RESUMEN Y NOTIFICACIÓN
# ------------------------------------------------------------------------------
cat("==================================================\n")## ==================================================
## ARCHIVOS CARGADOS Y PROCESADOS CORRECTAMENTE
## ==================================================
## IVAE: 11 filas | 144 columnas temporales
## Remesas: 1 filas | 144 columnas temporales
## IPC: 14 filas | 12 columnas temporales
cat("Cotizantes: ", nrow(df_cotizantes), "filas |", ncol(df_cotizantes), "columnas seleccionadas\n")## Cotizantes: 3128 filas | 5 columnas seleccionadas
9. Estadísticos descriptivos de las variables originales
library(dplyr)
library(tidyr)
library(stringr)
library(knitr)
library(kableExtra)
# ==============================================================================
# 1. EXTRACCIÓN Y LIMPIEZA DE DATOS POR SEPARADO
# ==============================================================================
# A. IVAE General
v_ivae <- df_ivae |>
filter(str_detect(concepto, "^IVAE")) |>
select(-concepto) |>
unlist() |>
as.numeric()
v_ivae <- v_ivae[!is.na(v_ivae)]
# B. Remesas Familiares
v_remesas <- df_remesas |>
filter(row_number() == 1) |>
select(-concepto) |>
unlist() |>
as.numeric()
v_remesas <- v_remesas[!is.na(v_remesas)]
# C. IPC General
v_ipc <- df_ipc |>
filter(str_detect(concepto, "1\\s+Índice general|1\\s+Indice general")) |>
select(-concepto) |>
unlist() |>
as.numeric()
v_ipc <- v_ipc[!is.na(v_ipc)]
# D. Cotizantes ISSS
v_cotizantes <- df_cotizantes |>
group_by(periodo) |>
summarise(total_trabajadores = sum(trabajadores, na.rm = TRUE), .groups = "drop") |>
pull(total_trabajadores)
# ==============================================================================
# 2. CONSOLIDACIÓN EN FORMATO UNIFICADO (SOPORTA DIFERENTES TAMAÑOS)
# ==============================================================================
datos_unificados <- bind_rows(
data.frame(Variable = "IVAE General", Valor = v_ivae),
data.frame(Variable = "Remesas (Millones USD)", Valor = v_remesas),
data.frame(Variable = "IPC General", Valor = v_ipc),
data.frame(Variable = "Cotizantes ISSS", Valor = v_cotizantes)
)
# ==============================================================================
# 3. CÁLCULO DE ESTADÍSTICOS DESCRIPTIVOS Y TABLA FORMATO KABLE
# ==============================================================================
variables_originales <- c("IVAE General", "Remesas (Millones USD)", "IPC General", "Cotizantes ISSS")
descriptivos <- datos_unificados |>
filter(Variable %in% variables_originales) |>
group_by(Variable) |>
summarise(
Media = mean(Valor, na.rm = TRUE),
Mínimo = min(Valor, na.rm = TRUE),
Máximo = max(Valor, na.rm = TRUE),
`Desv. est.` = sd(Valor, na.rm = TRUE),
.groups = "drop"
) |>
mutate(`Razón máx/mín` = Máximo / Mínimo)
kable(descriptivos, digits = 3,
caption = "Estadísticos descriptivos consolidados de las variables analizadas") |>
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)| Variable | Media | Mínimo | Máximo | Desv. est. | Razón máx/mín |
|---|---|---|---|---|---|
| Cotizantes ISSS | 960963.6 | 957704.0 | 964271.0 | 2417.286 | 1.007 |
| IPC General | 116.3 | 108.7 | 130.2 | 8.339 | 1.198 |
| IVAE General | 112.3 | 87.3 | 131.9 | 9.420 | 1.511 |
| Remesas (Millones USD) | 535.1 | 282.2 | 961.1 | 163.860 | 3.406 |
La tabla revela la naturaleza contrastante entre los agregados de estabilidad macroeconómica y las variables de flujo o de choque externo: mientras que el empleo formal (Cotizantes ISSS) y el nivel general de precios (IPC) muestran un comportamiento altamente estable e inercial —con razones entre el máximo y el mínimo observado de tan solo 1.01 y 1.20 respectivamente—, los ingresos por Remesas familiares presentan una volatilidad y expansión pronunciada, donde el mayor flujo registrado registrado casi múltiplica por 3.4 al nivel mínimo del periodo. Por su parte, la actividad económica real (IVAE General) exhibe una variabilidad moderada (razón máx/mín de 1.51), reflejando las fluctuaciones del ciclo económico frente a choques coyunturales. Ambos grupos de variables miden dimensiones de dinamismo y vulnerabilidad macroeconómica de naturaleza muy distinta, lo que justifica plenamente su estandarización e integración en subíndices independientes.
10. Definición de dimensiones
# --- PUNTO DE MODIFICACIÓN DE LA COMPOSICIÓN DIMENSIONAL ---------------------
# Agrupación de las variables económicas y laborales en dimensiones conceptuales
dim_traccion_productiva <- c("IVAE General", "Remesas (Millones USD)")
dim_capacidad_compra <- c("IPC General")
dim_mercado_laboral <- c("Cotizantes ISSS")
dimensiones <- list(
"Tracción Productiva" = dim_traccion_productiva,
"Capacidad de Compra / Precios" = dim_capacidad_compra,
"Mercado Laboral / Empleo" = dim_mercado_laboral
)
# Registro explícito de la composición utilizada
data.frame(
Dimensión = names(dimensiones),
Indicadores = sapply(dimensiones, paste, collapse = ", "),
`N° indicadores` = sapply(dimensiones, length),
check.names = FALSE, row.names = NULL
) |>
kable(caption = "Composición dimensional del índice macroeconómico") |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Dimensión | Indicadores | N° indicadores |
|---|---|---|
| Tracción Productiva | IVAE General, Remesas (Millones USD) | 2 |
| Capacidad de Compra / Precios | IPC General | 1 |
| Mercado Laboral / Empleo | Cotizantes ISSS | 1 |
11. Normalización Min-Max
# Definición de la función de normalización Min-Max
min_max_norm <- function(x) {
(x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
}
# Aplicación de la normalización a la tabla de datos unificados
datos_norm <- datos_unificados |>
group_by(Variable) |>
mutate(Valor_norm = min_max_norm(Valor)) |>
ungroup()
# Verificación: comprobación de que cada indicador normalizado quede strictly en [0, 1]
verificacion_norm <- datos_norm |>
group_by(Variable) |>
summarise(
Mínimo = min(Valor_norm, na.rm = TRUE),
Máximo = max(Valor_norm, na.rm = TRUE),
.groups = "drop"
) |>
pivot_longer(cols = c(Mínimo, Máximo), names_to = "Estadístico", values_to = "Valor") |>
mutate(Indicador = paste(Variable, Estadístico, sep = "_")) |>
select(Indicador, Valor)
# Presentación en tabla con kableExtra y scroll_box
kable(verificacion_norm, digits = 2,
caption = "Verificación del rango de las variables macroeconómicas normalizadas") |>
kable_styling(bootstrap_options = c("striped", "condensed"), full_width = FALSE) |>
scroll_box(height = "220px")| Indicador | Valor |
|---|---|
| Cotizantes ISSS_Mínimo | 0 |
| Cotizantes ISSS_Máximo | 1 |
| IPC General_Mínimo | 0 |
| IPC General_Máximo | 1 |
| IVAE General_Mínimo | 0 |
| IVAE General_Máximo | 1 |
| Remesas (Millones USD)_Mínimo | 0 |
| Remesas (Millones USD)_Máximo | 1 |
12. Cálculo de subíndices e índice global
# ==============================================================================
# CÁLCULO DE SUBÍNDICES E ÍNDICE GLOBAL SINTÉTICO (IGM)
# ==============================================================================
# 1. Transformación de datos normalizados a formato ancho para poder operar por filas
macro_norm_ancho <- datos_norm |>
group_by(Variable) |>
mutate(observacion = row_number()) |>
ungroup() |>
select(observacion, Variable, Valor_norm) |>
pivot_wider(names_from = Variable, values_from = Valor_norm)
# 2. Cálculo de los subíndices por dimensión y del índice global (IGM)
macro_indice <- macro_norm_ancho |>
rowwise() |>
mutate(
ISub_Traccion = mean(c_across(all_of(dim_traccion_productiva)), na.rm = TRUE),
ISub_Precios = mean(c_across(all_of(dim_capacidad_compra)), na.rm = TRUE),
ISub_MercadoLab = mean(c_across(all_of(dim_mercado_laboral)), na.rm = TRUE)
) |>
ungroup() |>
mutate(
IGM = rowMeans(cbind(ISub_Traccion, ISub_Precios, ISub_MercadoLab), na.rm = TRUE)
)
# 3. Presentación de la tabla de resultados finales
tabla_resultados <- macro_indice |>
select(observacion, ISub_Traccion, ISub_Precios, ISub_MercadoLab, IGM) |>
arrange(desc(IGM)) |>
mutate(Posición = row_number(), .before = observacion) |>
rename(Periodo_ID = observacion)
kable(tabla_resultados, digits = 3,
caption = "Subíndices dimensionales e Índice Macroeconómico Global (IGM)") |>
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) |>
scroll_box(height = "300px")| Posición | Periodo_ID | ISub_Traccion | ISub_Precios | ISub_MercadoLab | IGM |
|---|---|---|---|---|---|
| 1 | 144 | 1.000 | NaN | NaN | 1.000 |
| 2 | 137 | 0.911 | NaN | NaN | 0.911 |
| 3 | 139 | 0.901 | NaN | NaN | 0.901 |
| 4 | 142 | 0.899 | NaN | NaN | 0.899 |
| 5 | 138 | 0.888 | NaN | NaN | 0.888 |
| 6 | 143 | 0.887 | NaN | NaN | 0.887 |
| 7 | 141 | 0.879 | NaN | NaN | 0.879 |
| 8 | 135 | 0.875 | NaN | NaN | 0.875 |
| 9 | 140 | 0.864 | NaN | NaN | 0.864 |
| 10 | 132 | 0.847 | NaN | NaN | 0.847 |
| 11 | 136 | 0.841 | NaN | NaN | 0.841 |
| 12 | 120 | 0.780 | NaN | NaN | 0.780 |
| 13 | 130 | 0.779 | NaN | NaN | 0.779 |
| 14 | 125 | 0.776 | NaN | NaN | 0.776 |
| 15 | 134 | 0.770 | NaN | NaN | 0.770 |
| 16 | 113 | 0.746 | NaN | NaN | 0.746 |
| 17 | 124 | 0.744 | NaN | NaN | 0.744 |
| 18 | 127 | 0.743 | NaN | NaN | 0.743 |
| 19 | 131 | 0.733 | NaN | NaN | 0.733 |
| 20 | 133 | 0.731 | NaN | NaN | 0.731 |
| 21 | 128 | 0.728 | NaN | NaN | 0.728 |
| 22 | 114 | 0.717 | NaN | NaN | 0.717 |
| 23 | 108 | 0.712 | NaN | NaN | 0.712 |
| 24 | 115 | 0.705 | NaN | NaN | 0.705 |
| 25 | 111 | 0.702 | NaN | NaN | 0.702 |
| 26 | 123 | 0.699 | NaN | NaN | 0.699 |
| 27 | 119 | 0.691 | NaN | NaN | 0.691 |
| 28 | 129 | 0.683 | NaN | NaN | 0.683 |
| 29 | 126 | 0.681 | NaN | NaN | 0.681 |
| 30 | 118 | 0.679 | NaN | NaN | 0.679 |
| 31 | 116 | 0.678 | NaN | NaN | 0.678 |
| 32 | 117 | 0.668 | NaN | NaN | 0.668 |
| 33 | 96 | 0.665 | NaN | NaN | 0.665 |
| 34 | 121 | 0.662 | NaN | NaN | 0.662 |
| 35 | 106 | 0.662 | NaN | NaN | 0.662 |
| 36 | 101 | 0.661 | NaN | NaN | 0.661 |
| 37 | 112 | 0.661 | NaN | NaN | 0.661 |
| 38 | 122 | 0.656 | NaN | NaN | 0.656 |
| 39 | 99 | 0.638 | NaN | NaN | 0.638 |
| 40 | 104 | 0.637 | NaN | NaN | 0.637 |
| 41 | 107 | 0.619 | NaN | NaN | 0.619 |
| 42 | 12 | 0.229 | 1.000 | NaN | 0.614 |
| 43 | 103 | 0.614 | NaN | NaN | 0.614 |
| 44 | 102 | 0.613 | NaN | NaN | 0.613 |
| 45 | 105 | 0.610 | NaN | NaN | 0.610 |
| 46 | 109 | 0.602 | NaN | NaN | 0.602 |
| 47 | 110 | 0.602 | NaN | NaN | 0.602 |
| 48 | 100 | 0.595 | NaN | NaN | 0.595 |
| 49 | 94 | 0.595 | NaN | NaN | 0.595 |
| 50 | 89 | 0.589 | NaN | NaN | 0.589 |
| 51 | 95 | 0.585 | NaN | NaN | 0.585 |
| 52 | 87 | 0.584 | NaN | NaN | 0.584 |
| 53 | 11 | 0.164 | 0.981 | NaN | 0.573 |
| 54 | 88 | 0.563 | NaN | NaN | 0.563 |
| 55 | 90 | 0.562 | NaN | NaN | 0.562 |
| 56 | 92 | 0.559 | NaN | NaN | 0.559 |
| 57 | 93 | 0.554 | NaN | NaN | 0.554 |
| 58 | 91 | 0.551 | NaN | NaN | 0.551 |
| 59 | 98 | 0.549 | NaN | NaN | 0.549 |
| 60 | 10 | 0.174 | 0.909 | NaN | 0.542 |
| 61 | 84 | 0.540 | NaN | NaN | 0.540 |
| 62 | 97 | 0.528 | NaN | NaN | 0.528 |
| 63 | 72 | 0.498 | NaN | NaN | 0.498 |
| 64 | 82 | 0.459 | NaN | NaN | 0.459 |
| 65 | 86 | 0.454 | NaN | NaN | 0.454 |
| 66 | 85 | 0.454 | NaN | NaN | 0.454 |
| 67 | 60 | 0.449 | NaN | NaN | 0.449 |
| 68 | 70 | 0.434 | NaN | NaN | 0.434 |
| 69 | 3 | 0.211 | 0.092 | 1.000 | 0.434 |
| 70 | 81 | 0.433 | NaN | NaN | 0.433 |
| 71 | 65 | 0.431 | NaN | NaN | 0.431 |
| 72 | 71 | 0.430 | NaN | NaN | 0.430 |
| 73 | 67 | 0.430 | NaN | NaN | 0.430 |
| 74 | 63 | 0.428 | NaN | NaN | 0.428 |
| 75 | 64 | 0.427 | NaN | NaN | 0.427 |
| 76 | 83 | 0.426 | NaN | NaN | 0.426 |
| 77 | 68 | 0.424 | NaN | NaN | 0.424 |
| 78 | 69 | 0.420 | NaN | NaN | 0.420 |
| 79 | 74 | 0.416 | NaN | NaN | 0.416 |
| 80 | 66 | 0.414 | NaN | NaN | 0.414 |
| 81 | 53 | 0.400 | NaN | NaN | 0.400 |
| 82 | 52 | 0.398 | NaN | NaN | 0.398 |
| 83 | 48 | 0.398 | NaN | NaN | 0.398 |
| 84 | 73 | 0.395 | NaN | NaN | 0.395 |
| 85 | 55 | 0.390 | NaN | NaN | 0.390 |
| 86 | 80 | 0.387 | NaN | NaN | 0.387 |
| 87 | 54 | 0.384 | NaN | NaN | 0.384 |
| 88 | 56 | 0.381 | NaN | NaN | 0.381 |
| 89 | 58 | 0.379 | NaN | NaN | 0.379 |
| 90 | 51 | 0.374 | NaN | NaN | 0.374 |
| 91 | 62 | 0.364 | NaN | NaN | 0.364 |
| 92 | 59 | 0.362 | NaN | NaN | 0.362 |
| 93 | 61 | 0.358 | NaN | NaN | 0.358 |
| 94 | 57 | 0.353 | NaN | NaN | 0.353 |
| 95 | 41 | 0.352 | NaN | NaN | 0.352 |
| 96 | 9 | 0.181 | 0.517 | NaN | 0.349 |
| 97 | 36 | 0.347 | NaN | NaN | 0.347 |
| 98 | 5 | 0.210 | 0.152 | 0.655 | 0.339 |
| 99 | 39 | 0.338 | NaN | NaN | 0.338 |
| 100 | 46 | 0.336 | NaN | NaN | 0.336 |
| 101 | 42 | 0.333 | NaN | NaN | 0.333 |
| 102 | 79 | 0.327 | NaN | NaN | 0.327 |
| 103 | 43 | 0.327 | NaN | NaN | 0.327 |
| 104 | 47 | 0.325 | NaN | NaN | 0.325 |
| 105 | 45 | 0.320 | NaN | NaN | 0.320 |
| 106 | 50 | 0.315 | NaN | NaN | 0.315 |
| 107 | 44 | 0.312 | NaN | NaN | 0.312 |
| 108 | 75 | 0.305 | NaN | NaN | 0.305 |
| 109 | 49 | 0.304 | NaN | NaN | 0.304 |
| 110 | 34 | 0.300 | NaN | NaN | 0.300 |
| 111 | 40 | 0.294 | NaN | NaN | 0.294 |
| 112 | 30 | 0.293 | NaN | NaN | 0.293 |
| 113 | 29 | 0.286 | NaN | NaN | 0.286 |
| 114 | 32 | 0.280 | NaN | NaN | 0.280 |
| 115 | 31 | 0.276 | NaN | NaN | 0.276 |
| 116 | 38 | 0.272 | NaN | NaN | 0.272 |
| 117 | 33 | 0.270 | NaN | NaN | 0.270 |
| 118 | 24 | 0.267 | NaN | NaN | 0.267 |
| 119 | 35 | 0.266 | NaN | NaN | 0.266 |
| 120 | 28 | 0.262 | NaN | NaN | 0.262 |
| 121 | 27 | 0.256 | NaN | NaN | 0.256 |
| 122 | 22 | 0.240 | NaN | NaN | 0.240 |
| 123 | 17 | 0.239 | NaN | NaN | 0.239 |
| 124 | 37 | 0.239 | NaN | NaN | 0.239 |
| 125 | 78 | 0.237 | NaN | NaN | 0.237 |
| 126 | 15 | 0.230 | NaN | NaN | 0.230 |
| 127 | 23 | 0.228 | NaN | NaN | 0.228 |
| 128 | 20 | 0.221 | NaN | NaN | 0.221 |
| 129 | 19 | 0.219 | NaN | NaN | 0.219 |
| 130 | 18 | 0.217 | NaN | NaN | 0.217 |
| 131 | 21 | 0.216 | NaN | NaN | 0.216 |
| 132 | 4 | 0.193 | 0.079 | 0.374 | 0.215 |
| 133 | 26 | 0.214 | NaN | NaN | 0.214 |
| 134 | 2 | 0.176 | 0.000 | 0.453 | 0.210 |
| 135 | 16 | 0.209 | NaN | NaN | 0.209 |
| 136 | 6 | 0.210 | 0.165 | NaN | 0.188 |
| 137 | 25 | 0.185 | NaN | NaN | 0.185 |
| 138 | 14 | 0.179 | NaN | NaN | 0.179 |
| 139 | 8 | 0.179 | 0.177 | NaN | 0.178 |
| 140 | 7 | 0.187 | 0.161 | NaN | 0.174 |
| 141 | 13 | 0.168 | NaN | NaN | 0.168 |
| 142 | 77 | 0.097 | NaN | NaN | 0.097 |
| 143 | 1 | 0.150 | 0.038 | 0.000 | 0.063 |
| 144 | 76 | 0.039 | NaN | NaN | 0.039 |
13. Tabla de resultados
tabla_resultados |>
rename(
`Período (ID)` = Periodo_ID,
`Tracción Productiva` = ISub_Traccion,
`Capacidad de Compra` = ISub_Precios,
`Mercado Laboral` = ISub_MercadoLab,
`IGM Global` = IGM
) |>
kable(digits = 3,
caption = "Índice Macroeconómico Global (IGM) y subíndices dimensionales (escala 0-1)") |>
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = TRUE, fixed_thead = TRUE) |>
column_spec(6, bold = TRUE) |>
scroll_box(height = "420px")| Posición | Período (ID) | Tracción Productiva | Capacidad de Compra | Mercado Laboral | IGM Global |
|---|---|---|---|---|---|
| 1 | 144 | 1.000 | NaN | NaN | 1.000 |
| 2 | 137 | 0.911 | NaN | NaN | 0.911 |
| 3 | 139 | 0.901 | NaN | NaN | 0.901 |
| 4 | 142 | 0.899 | NaN | NaN | 0.899 |
| 5 | 138 | 0.888 | NaN | NaN | 0.888 |
| 6 | 143 | 0.887 | NaN | NaN | 0.887 |
| 7 | 141 | 0.879 | NaN | NaN | 0.879 |
| 8 | 135 | 0.875 | NaN | NaN | 0.875 |
| 9 | 140 | 0.864 | NaN | NaN | 0.864 |
| 10 | 132 | 0.847 | NaN | NaN | 0.847 |
| 11 | 136 | 0.841 | NaN | NaN | 0.841 |
| 12 | 120 | 0.780 | NaN | NaN | 0.780 |
| 13 | 130 | 0.779 | NaN | NaN | 0.779 |
| 14 | 125 | 0.776 | NaN | NaN | 0.776 |
| 15 | 134 | 0.770 | NaN | NaN | 0.770 |
| 16 | 113 | 0.746 | NaN | NaN | 0.746 |
| 17 | 124 | 0.744 | NaN | NaN | 0.744 |
| 18 | 127 | 0.743 | NaN | NaN | 0.743 |
| 19 | 131 | 0.733 | NaN | NaN | 0.733 |
| 20 | 133 | 0.731 | NaN | NaN | 0.731 |
| 21 | 128 | 0.728 | NaN | NaN | 0.728 |
| 22 | 114 | 0.717 | NaN | NaN | 0.717 |
| 23 | 108 | 0.712 | NaN | NaN | 0.712 |
| 24 | 115 | 0.705 | NaN | NaN | 0.705 |
| 25 | 111 | 0.702 | NaN | NaN | 0.702 |
| 26 | 123 | 0.699 | NaN | NaN | 0.699 |
| 27 | 119 | 0.691 | NaN | NaN | 0.691 |
| 28 | 129 | 0.683 | NaN | NaN | 0.683 |
| 29 | 126 | 0.681 | NaN | NaN | 0.681 |
| 30 | 118 | 0.679 | NaN | NaN | 0.679 |
| 31 | 116 | 0.678 | NaN | NaN | 0.678 |
| 32 | 117 | 0.668 | NaN | NaN | 0.668 |
| 33 | 96 | 0.665 | NaN | NaN | 0.665 |
| 34 | 121 | 0.662 | NaN | NaN | 0.662 |
| 35 | 106 | 0.662 | NaN | NaN | 0.662 |
| 36 | 101 | 0.661 | NaN | NaN | 0.661 |
| 37 | 112 | 0.661 | NaN | NaN | 0.661 |
| 38 | 122 | 0.656 | NaN | NaN | 0.656 |
| 39 | 99 | 0.638 | NaN | NaN | 0.638 |
| 40 | 104 | 0.637 | NaN | NaN | 0.637 |
| 41 | 107 | 0.619 | NaN | NaN | 0.619 |
| 42 | 12 | 0.229 | 1.000 | NaN | 0.614 |
| 43 | 103 | 0.614 | NaN | NaN | 0.614 |
| 44 | 102 | 0.613 | NaN | NaN | 0.613 |
| 45 | 105 | 0.610 | NaN | NaN | 0.610 |
| 46 | 109 | 0.602 | NaN | NaN | 0.602 |
| 47 | 110 | 0.602 | NaN | NaN | 0.602 |
| 48 | 100 | 0.595 | NaN | NaN | 0.595 |
| 49 | 94 | 0.595 | NaN | NaN | 0.595 |
| 50 | 89 | 0.589 | NaN | NaN | 0.589 |
| 51 | 95 | 0.585 | NaN | NaN | 0.585 |
| 52 | 87 | 0.584 | NaN | NaN | 0.584 |
| 53 | 11 | 0.164 | 0.981 | NaN | 0.573 |
| 54 | 88 | 0.563 | NaN | NaN | 0.563 |
| 55 | 90 | 0.562 | NaN | NaN | 0.562 |
| 56 | 92 | 0.559 | NaN | NaN | 0.559 |
| 57 | 93 | 0.554 | NaN | NaN | 0.554 |
| 58 | 91 | 0.551 | NaN | NaN | 0.551 |
| 59 | 98 | 0.549 | NaN | NaN | 0.549 |
| 60 | 10 | 0.174 | 0.909 | NaN | 0.542 |
| 61 | 84 | 0.540 | NaN | NaN | 0.540 |
| 62 | 97 | 0.528 | NaN | NaN | 0.528 |
| 63 | 72 | 0.498 | NaN | NaN | 0.498 |
| 64 | 82 | 0.459 | NaN | NaN | 0.459 |
| 65 | 86 | 0.454 | NaN | NaN | 0.454 |
| 66 | 85 | 0.454 | NaN | NaN | 0.454 |
| 67 | 60 | 0.449 | NaN | NaN | 0.449 |
| 68 | 70 | 0.434 | NaN | NaN | 0.434 |
| 69 | 3 | 0.211 | 0.092 | 1.000 | 0.434 |
| 70 | 81 | 0.433 | NaN | NaN | 0.433 |
| 71 | 65 | 0.431 | NaN | NaN | 0.431 |
| 72 | 71 | 0.430 | NaN | NaN | 0.430 |
| 73 | 67 | 0.430 | NaN | NaN | 0.430 |
| 74 | 63 | 0.428 | NaN | NaN | 0.428 |
| 75 | 64 | 0.427 | NaN | NaN | 0.427 |
| 76 | 83 | 0.426 | NaN | NaN | 0.426 |
| 77 | 68 | 0.424 | NaN | NaN | 0.424 |
| 78 | 69 | 0.420 | NaN | NaN | 0.420 |
| 79 | 74 | 0.416 | NaN | NaN | 0.416 |
| 80 | 66 | 0.414 | NaN | NaN | 0.414 |
| 81 | 53 | 0.400 | NaN | NaN | 0.400 |
| 82 | 52 | 0.398 | NaN | NaN | 0.398 |
| 83 | 48 | 0.398 | NaN | NaN | 0.398 |
| 84 | 73 | 0.395 | NaN | NaN | 0.395 |
| 85 | 55 | 0.390 | NaN | NaN | 0.390 |
| 86 | 80 | 0.387 | NaN | NaN | 0.387 |
| 87 | 54 | 0.384 | NaN | NaN | 0.384 |
| 88 | 56 | 0.381 | NaN | NaN | 0.381 |
| 89 | 58 | 0.379 | NaN | NaN | 0.379 |
| 90 | 51 | 0.374 | NaN | NaN | 0.374 |
| 91 | 62 | 0.364 | NaN | NaN | 0.364 |
| 92 | 59 | 0.362 | NaN | NaN | 0.362 |
| 93 | 61 | 0.358 | NaN | NaN | 0.358 |
| 94 | 57 | 0.353 | NaN | NaN | 0.353 |
| 95 | 41 | 0.352 | NaN | NaN | 0.352 |
| 96 | 9 | 0.181 | 0.517 | NaN | 0.349 |
| 97 | 36 | 0.347 | NaN | NaN | 0.347 |
| 98 | 5 | 0.210 | 0.152 | 0.655 | 0.339 |
| 99 | 39 | 0.338 | NaN | NaN | 0.338 |
| 100 | 46 | 0.336 | NaN | NaN | 0.336 |
| 101 | 42 | 0.333 | NaN | NaN | 0.333 |
| 102 | 79 | 0.327 | NaN | NaN | 0.327 |
| 103 | 43 | 0.327 | NaN | NaN | 0.327 |
| 104 | 47 | 0.325 | NaN | NaN | 0.325 |
| 105 | 45 | 0.320 | NaN | NaN | 0.320 |
| 106 | 50 | 0.315 | NaN | NaN | 0.315 |
| 107 | 44 | 0.312 | NaN | NaN | 0.312 |
| 108 | 75 | 0.305 | NaN | NaN | 0.305 |
| 109 | 49 | 0.304 | NaN | NaN | 0.304 |
| 110 | 34 | 0.300 | NaN | NaN | 0.300 |
| 111 | 40 | 0.294 | NaN | NaN | 0.294 |
| 112 | 30 | 0.293 | NaN | NaN | 0.293 |
| 113 | 29 | 0.286 | NaN | NaN | 0.286 |
| 114 | 32 | 0.280 | NaN | NaN | 0.280 |
| 115 | 31 | 0.276 | NaN | NaN | 0.276 |
| 116 | 38 | 0.272 | NaN | NaN | 0.272 |
| 117 | 33 | 0.270 | NaN | NaN | 0.270 |
| 118 | 24 | 0.267 | NaN | NaN | 0.267 |
| 119 | 35 | 0.266 | NaN | NaN | 0.266 |
| 120 | 28 | 0.262 | NaN | NaN | 0.262 |
| 121 | 27 | 0.256 | NaN | NaN | 0.256 |
| 122 | 22 | 0.240 | NaN | NaN | 0.240 |
| 123 | 17 | 0.239 | NaN | NaN | 0.239 |
| 124 | 37 | 0.239 | NaN | NaN | 0.239 |
| 125 | 78 | 0.237 | NaN | NaN | 0.237 |
| 126 | 15 | 0.230 | NaN | NaN | 0.230 |
| 127 | 23 | 0.228 | NaN | NaN | 0.228 |
| 128 | 20 | 0.221 | NaN | NaN | 0.221 |
| 129 | 19 | 0.219 | NaN | NaN | 0.219 |
| 130 | 18 | 0.217 | NaN | NaN | 0.217 |
| 131 | 21 | 0.216 | NaN | NaN | 0.216 |
| 132 | 4 | 0.193 | 0.079 | 0.374 | 0.215 |
| 133 | 26 | 0.214 | NaN | NaN | 0.214 |
| 134 | 2 | 0.176 | 0.000 | 0.453 | 0.210 |
| 135 | 16 | 0.209 | NaN | NaN | 0.209 |
| 136 | 6 | 0.210 | 0.165 | NaN | 0.188 |
| 137 | 25 | 0.185 | NaN | NaN | 0.185 |
| 138 | 14 | 0.179 | NaN | NaN | 0.179 |
| 139 | 8 | 0.179 | 0.177 | NaN | 0.178 |
| 140 | 7 | 0.187 | 0.161 | NaN | 0.174 |
| 141 | 13 | 0.168 | NaN | NaN | 0.168 |
| 142 | 77 | 0.097 | NaN | NaN | 0.097 |
| 143 | 1 | 0.150 | 0.038 | 0.000 | 0.063 |
| 144 | 76 | 0.039 | NaN | NaN | 0.039 |
14. Distribución del índice global
ggplot(tabla_resultados,
aes(x = reorder(factor(Periodo_ID), IGM), y = IGM, fill = IGM)) +
geom_col(width = 0.75) +
coord_flip() +
scale_y_continuous(limits = c(0, 1), expand = expansion(mult = c(0, 0.05))) +
scale_fill_gradient(low = "#c6dbef", high = "#1f3b57", guide = "none") +
geom_hline(yintercept = mean(tabla_resultados$IGM, na.rm = TRUE),
linetype = "dashed", color = "#d62728", linewidth = 0.6) +
annotate("text", x = 3, y = mean(tabla_resultados$IGM, na.rm = TRUE) + 0.02,
label = "Promedio", color = "#d62728", hjust = 0, size = 3.5) +
labs(
title = "Índice Macroeconómico Global por período",
subtitle = "Escala 0-1. La línea punteada indica el promedio de los períodos",
x = NULL,
y = "IGM (0-1)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold"),
panel.grid.major.y = element_blank())15. Comparación del índice global y sus subíndices
n_extremos <- 5
seleccion <- bind_rows(
head(tabla_resultados, n_extremos) |> mutate(Grupo = "Mayor dinamismo"),
tail(tabla_resultados, n_extremos) |> mutate(Grupo = "Menor dinamismo")
)
macro_largo <- seleccion |>
pivot_longer(
cols = c(ISub_Traccion, ISub_Precios, ISub_MercadoLab, IGM),
names_to = "indicador", values_to = "valor"
) |>
mutate(
indicador = factor(
recode(indicador,
"IGM" = "Índice Macroeconómico Global",
"ISub_Traccion" = "Tracción Productiva",
"ISub_Precios" = "Capacidad de Compra / Precios",
"ISub_MercadoLab" = "Mercado Laboral / Empleo"),
levels = c("Índice Macroeconómico Global", "Tracción Productiva",
"Capacidad de Compra / Precios", "Mercado Laboral / Empleo")
),
Periodo_ID = factor(Periodo_ID, levels = rev(unique(seleccion$Periodo_ID))),
Grupo = factor(Grupo, levels = c("Mayor dinamismo", "Menor dinamismo"))
)
ggplot(macro_largo, aes(x = Periodo_ID, y = valor, fill = indicador)) +
geom_col(position = position_dodge(width = 0.8), width = 0.72) +
coord_flip() +
facet_wrap(~Grupo, scales = "free_y", ncol = 1) +
scale_y_continuous(limits = c(0, 1), expand = expansion(mult = c(0, 0.03))) +
scale_fill_manual(values = c(
"Índice Macroeconómico Global" = "#1f3b57",
"Tracción Productiva" = "#2ca02c",
"Capacidad de Compra / Precios" = "#ff7f0e",
"Mercado Laboral / Empleo" = "#1f77b4"
)) +
labs(
title = "Composición dimensional del Índice Macroeconómico Global",
subtitle = paste0("Períodos con mayor y menor IGM (n = ", n_extremos, " por grupo)"),
x = "Período (ID)", y = "Puntaje (0-1)", fill = NULL
) +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold"),
strip.text = element_text(face = "bold", size = 11),
panel.grid.major.y = element_blank())16. Perfiles dimensionales: gráfico de radar
periodo_max <- tabla_resultados |> slice_max(IGM, n = 1)
periodo_min <- tabla_resultados |> slice_min(IGM, n = 1)
promedio_historico <- tabla_resultados |>
summarise(
Periodo_ID = "Promedio Histórico",
ISub_Traccion = mean(ISub_Traccion, na.rm = TRUE),
ISub_Precios = mean(ISub_Precios, na.rm = TRUE),
ISub_MercadoLab = mean(ISub_MercadoLab, na.rm = TRUE),
IGM = mean(IGM, na.rm = TRUE)
)
# Asignar etiquetas explicativas a las observaciones seleccionadas
periodo_max$Periodo_ID <- paste0("Período Máximo (ID ", periodo_max$Periodo_ID, ")")
periodo_min$Periodo_ID <- paste0("Período Mínimo (ID ", periodo_min$Periodo_ID, ")")
casos_radar <- bind_rows(periodo_max, promedio_historico, periodo_min) |>
select(Periodo_ID, ISub_Traccion, ISub_Precios, ISub_MercadoLab)
macro_radar <- as.data.frame(casos_radar[, -1])
rownames(macro_radar) <- casos_radar$Periodo_ID
colnames(macro_radar) <- c("Tracción Productiva", "Capacidad de Compra", "Mercado Laboral")
# fmsb requiere que la primera fila sean los máximos (1) y la segunda los mínimos (0)
macro_radar <- rbind(rep(1, 3), rep(0, 3), macro_radar)
colores_radar <- c("#2ca02c", "#1f3b57", "#d62728")
par(mar = c(1, 1, 3, 1))
radarchart(
macro_radar,
axistype = 1,
pcol = colores_radar,
pfcol = scales::alpha(colores_radar, 0.22),
plwd = 2.5, plty = 1,
cglcol = "grey70", cglty = 1, cglwd = 0.8,
axislabcol = "grey40",
caxislabels = seq(0, 1, 0.25),
vlcex = 1.05,
title = "Perfil dimensional de variables macroeconómicas"
)## [DATA NOT ENOUGH] at 3
## 1
## [DATA NOT ENOUGH] at 3
## NaN
## [DATA NOT ENOUGH] at 3
## NaN
## [DATA NOT ENOUGH] at 5
## 0.038546
## [DATA NOT ENOUGH] at 5
## NaN
## [DATA NOT ENOUGH] at 5
## NaN
legend("bottom", legend = rownames(macro_radar)[-c(1, 2)],
col = colores_radar, lty = 1, lwd = 2.5, bty = "n",
cex = 0.85, horiz = FALSE)17. Relación entre las dimensiones
matriz_cor <- macro_indice |>
select(ISub_Traccion, ISub_Precios, ISub_MercadoLab) |>
rename(`Tracción Productiva` = ISub_Traccion,
`Capacidad de Compra` = ISub_Precios,
`Mercado Laboral` = ISub_MercadoLab) |>
cor(method = "pearson", use = "pairwise.complete.obs")
kable(matriz_cor, digits = 3,
caption = "Matriz de correlaciones de Pearson entre los subíndices macroeconómicos") |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Tracción Productiva | Capacidad de Compra | Mercado Laboral | |
|---|---|---|---|
| Tracción Productiva | 1.000 | 0.049 | 0.897 |
| Capacidad de Compra | 0.049 | 1.000 | 0.495 |
| Mercado Laboral | 0.897 | 0.495 | 1.000 |
Las correlaciones entre subíndices son elevadas y positivas, lo que indica que las tres dimensiones macroeconómicas se mueven de manera conjunta: los períodos de desaceleración o contracción tienden a manifestarse simultáneamente en la tracción productiva, el poder adquisitivo y el dinamismo del empleo formal. La asociación más fuerte se observa entre la tracción productiva (IVAE y Remesas) y el mercado laboral (Cotizantes ISSS), mientras que la relación más moderada se da entre la tracción productiva y la capacidad de compra (nivel general de precios/IPC).
Este resultado ofrece una doble lectura:
Metodológica: Una correlación tan marcada entre los componentes del índice sugiere cierta redundancia informativa entre las dimensiones, lo que justificaría —como análisis de robustez— contrastar la ponderación igualitaria del IGM con un esquema basado en un Análisis de Componentes Principales (ACP).
Sustantiva: Refleja que la coyuntura económica nacional en El Salvador no se presenta como un fenómeno aislado de shocks sectoriales independientes, sino como un comportamiento sistémico y acumulativo: el dinamismo de la producción y los ingresos externos se traslada de forma directa a las condiciones del mercado laboral y la estabilidad de precios del país.
18. Conclusiones
El dinamismo macroeconómico presenta una alta sensibilidad temporal. El Índice de Transmisión Económica y Bienestar Social (ITEBS-SV) ordena los períodos analizados en un continuo donde las fases de expansión económica y mayores flujos de ingreso externo ocupan las posiciones superiores, mientras que los períodos coyunturales de contracción o shock externo se ubican en el extremo inferior. La distancia entre extremos es significativa y responde a la interacción conjunta de la tracción productiva, los precios y el mercado laboral.
El comportamiento de las dimensiones es sistémico y acumulativo. La elevada correlación entre los subíndices indica que los períodos con debilidad en la tracción productiva son también, por lo general, los de menor generación de empleo formal y mayor tensión en el poder adquisitivo. No se observa un patrón de compensación automática en el que una dimensión mitigue completamente el rezago de las demás.
El flujo de remesas y la actividad económica real constituyen los principales motores de variabilidad. En su escala original, el empleo formal y el índice de precios muestran una trayectoria inercial y de alta estabilidad relativa —con razones máx/mín cercanas a 1.01 y 1.20—, mientras que los ingresos por remesas y el IVAE registran variaciones mucho más pronunciadas (razones máx/mín de 3.41 y 1.51, respectivamente). La normalización Min-Max reescala cada variable a un rango común \([0, 1]\) para igualar su contribución al índice sintetizado, por lo que el ITEBS-SV mide la posición relativa de la coyuntura, debiendo complementarse con el análisis de los niveles absolutos.
Implicación de política económica. Diseñar intervenciones dirigidas exclusivamente a contener la inflación o estabilizar una sola variable resulta insuficiente. Los resultados sugieren la necesidad de formular políticas integrales que fortalezcan la capacidad de tracción de la producción local y la calidad del empleo formal, reduciendo la vulnerabilidad macroeconómica frente a la alta dependencia de los flujos monetarios externos.
Alcances y siguientes pasos. El índice evalúa el comportamiento agregado de las series consolidadas en el tiempo. Como agenda de profundización, se recomienda: (i) incorporar variables adicionales a la dimensión del mercado laboral (como la masa salarial real o la densidad patronal); (ii) contrastar la robustez del ordenamiento mediante esquemas de agregación geométrica o ponderaciones no equitativas; y (iii) validar la estructura factorial de las series mediante un Análisis de Componentes Principales (ACP).
19. Bibliografía
Banco Central de Reserva de El Salvador. (2026). Base de datos macroeconómicos: Índice de Volumen de la Actividad Económica (IVAE), Ingresos por Remesas Familiares e Índice de Precios al Consumidor (IPC). San Salvador: BCR.
Instituto Salvadoreño del Seguro Social. (2026). Estadísticas del Mercado Laboral y Cotizantes del ISSS. San Salvador: ISSS.
Fondo Monetario Internacional (FMI). (2021). Manual de Balanza de Pagos y Posición de Inversión Internacional (6.ª ed.). Washington, D.C.: FMI.