Metodología trabajo final ODS grupo 4 GT-02
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
CICLO I-2025
Asignatura:
Economía del Desarrollo I.
Docente:
Jonnathan Moisés Salazar Serrano.
Actividad:
“Trabajo final - Desarrollo sostenible y ODS bajo enfoque ortodoxo”
Grupo Teórico:
2
Estudiante:
Bolaños Peña, Abel Antonio BP18001
Lemus Mejía, Gracia María LM21017
López Rivas, Roxana Beatriz LR12002
Mónico Rogel, Jacqueline Patricia MR15093
Ciudad Universitaria, viernes 13 de junio de 2025.
Este trabajo siguió un enfoque cuantitativo–crítico basado en la construcción de indicadores sintéticos multivariados y en la deconstrucción del paradigma ortodoxo del desarrollo. Se enfatizó la necesidad de sintetizar múltiples dimensiones de los ODS en índices compuestos para facilitar la comparación regional y temporal, a la vez que se evalúa la coherencia de estos resultados con la teoría del crecimiento económico y la distribución de la renta, base del enfoque ortodoxo.
1. Instalación y carga de librerías
Primero, se instalaron y cargaron las librerías necesarias en R: Como en el ejemplo original de Bonilla et al, se usaron también funciones propias de normalización y ponderación.
# Cargar librerías necesarias
library(wbstats)
library(dplyr)##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyverse)## -- Attaching core tidyverse packages ------------------------ tidyverse 2.0.0 --
## v forcats 1.0.0 v readr 2.1.4
## v ggplot2 3.3.6 v stringr 1.5.1
## v lubridate 1.9.2 v tibble 3.2.1
## v purrr 1.0.1 v tidyr 1.3.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
## i Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(magrittr)##
## Attaching package: 'magrittr'
##
## The following object is masked from 'package:purrr':
##
## set_names
##
## The following object is masked from 'package:tidyr':
##
## extract
library(ggplot2)
library(kableExtra)##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
library(writexl)
library(wbstats)
library(dplyr)
library(tidyverse)
library(magrittr)
library(hablar)##
## Attaching package: 'hablar'
##
## The following object is masked from 'package:forcats':
##
## fct
##
## The following object is masked from 'package:tibble':
##
## num
##
## The following object is masked from 'package:dplyr':
##
## na_if
library(ggplot2)
library(plotly)##
## Attaching package: 'plotly'
##
## The following object is masked from 'package:ggplot2':
##
## last_plot
##
## The following object is masked from 'package:stats':
##
## filter
##
## The following object is masked from 'package:graphics':
##
## layout
library(TSstudio)
library(readxl)
library(readr)
library(writexl)
library(kableExtra)
library(openxlsx)
library(ineq)
library(purrr)2. Inventario de datos (ejemplo ODS 9)
Cada miembro del grupo recopiló los indicadores oficiales de la base de datos del Banco Mundial, agrupándolos según los ODS de su competencia:
ODS 1 a ODS 17: se documentaron códigos, descripciones, tipo (económica / social) y dirección esperada de correlación con cada meta.
# Metadatos de todos los indicadores
indicadores_disponibles <- wb_indicators(lang = "es")
datos_ejemplo <- wb_data(
indicator = "NV.IND.MANF.ZS", # Manufactura % PIB (ODS 9)
country = "SLV",
start_date = 2010,
end_date = 2024,
lang = "es"
)
# # Selección de indicadores ODS 9
ods9_indicators <- c(
"NV.IND.MANF.ZS", # Manufactura (% del PIB)
"EG.ELC.ACCS.ZS", # Acceso a electricidad (% población)
"IT.NET.USER.ZS", # Usuarios de Internet (% población)
"GB.XPD.RSDV.GD.ZS" # Gasto en I+D (% del PIB)
)
# Validación de conteo\stopifnot(length(ods9_indicators)==5)- Se descargó
wb_indicators (lang = "es"){Esto limitó la obtención de datos ya que en “es” que son los datos en español la recopilación es menor que si se hubiera usado “en” que es en ingles, además que algunos países no tienen datos para los indicadores.} - Se filtraron indicadores por ODS (1–17).
- Se registró en un Word: código, descripción, tipo (económico/social) y dirección de correlación esperada.
3. Obtención y preparación de datos
# Países por región + El Salvador
countries_region <- c(
"CAN","USA","MEX", # Norteamérica
"BLZ","GTM","HND","NIC","CRI","PAN", # Centroamérica
"HTI","CUB","JAM","DOM", # Caribe
"COL","VEN","PER","CHL","BOL","ARG","BRA", # Sudamérica
"SLV" # El Salvador
)
# 3.4 Descargar datos ODS9 2010–2024
data_ods9 <- wb_data(
indicator = ods9_indicators,
country = countries_region,
start_date = 2010,
end_date = 2024,
lang = "es"
)
# 3.5 Asignar región
data_ods9 <- data_ods9 %>%
mutate(region = case_when(
iso3c %in% c("CAN","USA","MEX") ~ "Norteamérica",
iso3c %in% c("BLZ","GTM","HND","NIC","CRI","PAN") ~ "Centroamérica",
iso3c %in% c("HTI","CUB","JAM","DOM") ~ "Caribe",
iso3c %in% c("COL","VEN","PER","CHL","BOL","ARG","BRA") ~ "Sudamérica",
iso3c == "SLV" ~ "El Salvador"
))4. Resumen estadístico y visualizaciones
Con wb_data() se descargaron series entre los años
2010–2023 por país y región.
Limpieza: rellenado “down–up” de NA. Descriptivas: media, desviación,
min y max con summarize(across(...)). Boxplots y series
temporales con ggplot2.
Así se hizo en el ejemplo original para El Salvador .
# Estadísticas descriptivas por región
estad_ods9 <- data_ods9 %>%
group_by(region) %>%
summarize(across(all_of(ods9_indicators),
list(mean = ~mean(.x, na.rm=TRUE),
sd = ~sd(.x, na.rm=TRUE),
min = ~min(.x, na.rm=TRUE),
max = ~max(.x, na.rm=TRUE)),
.names = "{col}_{fn}"))
estad_ods9 %>% kable(format = "html", caption = "Descriptivas ODS9 por región")| region | NV.IND.MANF.ZS_mean | NV.IND.MANF.ZS_sd | NV.IND.MANF.ZS_min | NV.IND.MANF.ZS_max | EG.ELC.ACCS.ZS_mean | EG.ELC.ACCS.ZS_sd | EG.ELC.ACCS.ZS_min | EG.ELC.ACCS.ZS_max | IT.NET.USER.ZS_mean | IT.NET.USER.ZS_sd | IT.NET.USER.ZS_min | IT.NET.USER.ZS_max | GB.XPD.RSDV.GD.ZS_mean | GB.XPD.RSDV.GD.ZS_sd | GB.XPD.RSDV.GD.ZS_min | GB.XPD.RSDV.GD.ZS_max |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Caribe | 13.42832 | 3.9334461 | 7.673248 | 24.47841 | 84.23214 | 24.2925960 | 37.2 | 100 | 48.14750 | 24.33476 | 8.37 | 85.2 | 0.4361631 | 0.0988444 | 0.27192 | 0.60767 |
| Centroamérica | 11.94282 | 4.2783391 | 4.982167 | 19.42673 | 91.82143 | 5.8626256 | 80.1 | 100 | 44.64524 | 20.41581 | 10.00 | 85.4 | 0.1765940 | 0.1658248 | 0.01497 | 0.55627 |
| El Salvador | 15.67616 | 0.7099447 | 14.003302 | 16.38749 | 96.17857 | 2.4826098 | 91.6 | 100 | 38.32143 | 18.51325 | 15.90 | 67.7 | 0.1217500 | 0.0533814 | 0.03397 | 0.18078 |
| Norteamérica | 13.95116 | 4.5087747 | 9.015477 | 21.37379 | 99.81667 | 0.3348947 | 99.0 | 100 | 76.32381 | 17.81400 | 31.10 | 94.6 | 1.6636193 | 1.0947784 | 0.25782 | 3.58623 |
| Sudamérica | 11.92949 | 1.9675176 | 8.525428 | 16.31750 | 97.72551 | 3.3307784 | 88.0 | 100 | 60.42065 | 17.31381 | 22.40 | 94.5 | 0.4791794 | 0.3604816 | 0.05530 | 1.37093 |
# Boxplot: Manufactura % PIB
ggplot(data_ods9, aes(x = region, y = NV.IND.MANF.ZS, fill = region)) +
geom_boxplot() +
labs(title = "Manufactura (% PIB) por región", y = "% PIB") +
theme_minimal()## Warning: Removed 36 rows containing non-finite values (stat_boxplot).
# Serie temporal: Gasto en I+D
ggplot(data_ods9, aes(x = as.integer(date), y = GB.XPD.RSDV.GD.ZS, color = region)) +
geom_line() +
labs(title = "Gasto en I+D (% PIB) 2010–2024", x = "Año", y = "% PIB") +
theme_minimal()## Warning: Removed 39 row(s) containing missing values (geom_path).
5. Correlaciones teóricas vs. empíricas
Se definió la matriz teórica según la literatura ortodoxa:
PIB y exportaciones → correlación positiva. Gini y pobreza extrema → correlación negativa.
Con cor() se calculó la matriz empírica y se
compararon.
# Empírica
data_corr <- data_ods9 %>%
select(all_of(ods9_indicators)) %>%
drop_na()
cor_emp_ods9 <- cor(data_corr)
cor_emp_ods9 %>% round(2) %>% kable(caption = "Correlación empírica ODS9")| NV.IND.MANF.ZS | EG.ELC.ACCS.ZS | IT.NET.USER.ZS | GB.XPD.RSDV.GD.ZS | |
|---|---|---|---|---|
| NV.IND.MANF.ZS | 1.00 | -0.08 | -0.42 | -0.25 |
| EG.ELC.ACCS.ZS | -0.08 | 1.00 | 0.67 | 0.42 |
| IT.NET.USER.ZS | -0.42 | 0.67 | 1.00 | 0.54 |
| GB.XPD.RSDV.GD.ZS | -0.25 | 0.42 | 0.54 | 1.00 |
# Teóricas (comentarios):
# - Manufactura ↔ Electricidad (+)
# - I+D ↔ Internet (+)
# - Electricidad ↔ Internet (+)6. Estructura factorial (PCA)
Se propusieron tres factores:
- Crecimiento económico
- Bienestar social
- Sostenibilidad ambiental
Cada variable se asigna a un factor de acuerdo a estudios del Banco Mundial y la teoría clásica del desarrollo.
# Escalar datos
pca_data_ods9 <- scale(data_corr)
# PCA
pca_ods9 <- prcomp(pca_data_ods9, center = FALSE, scale. = FALSE)
# Cargas PC1-PC2
df_cargas_ods9 <- as.data.frame(pca_ods9$rotation[,1:2])
colnames(df_cargas_ods9) <- c("PC1","PC2")
df_cargas_ods9 %>% kable(caption = "Cargas factoriales ODS9")| PC1 | PC2 | |
|---|---|---|
| NV.IND.MANF.ZS | -0.3375451 | 0.8705741 |
| EG.ELC.ACCS.ZS | 0.5166514 | 0.4870955 |
| IT.NET.USER.ZS | 0.6055066 | 0.0129801 |
| GB.XPD.RSDV.GD.ZS | 0.5024902 | 0.0683393 |
# Scree Plot
plot(pca_ods9, type = "l", main = "Scree Plot PCA ODS9")7. Normalización y ponderación
Se implementaron dos métodos:
Min–max: (x – min)/(max – min). Z-score:
(x – μ)/σ.
En pruebas de sensibilidad, los rankings regionales apenas variaron, validando la robustez del método.
8. Ponderación de variables
Dos enfoques:
- Pesos iguales (1/n).
- PCA: tomamos el primer componente principal. En el ejemplo base, también se introdujo el método CRITIC de Pérez Alas (entropía y correlaciones) para comparar.
9. Construcción de índices sintéticos
Se calcularon:
Índice_eq: media de variables normalizadas. Índice_pca: suma ponderada por cargas de PCA.
Luego, se graficaron series 2010–2024 con ggplot2
para
# Normalización min-max
dat_norm_ods9 <- data_ods9 %>%
mutate(across(all_of(ods9_indicators), ~(. - min(., na.rm=TRUE))/(max(., na.rm=TRUE)-min(., na.rm=TRUE)),
.names = "min_{col}"))
# Pesos iguales
dat_norm_ods9 <- dat_norm_ods9 %>%
rowwise() %>%
mutate(IndexODS9_eq = mean(c_across(starts_with("min_")), na.rm=TRUE)) %>%
ungroup()
# Pesos PCA
pesos_ods9 <- pca_ods9$rotation[,1]
pesos_ods9 <- pesos_ods9 / sum(pesos_ods9)
# Calcular índice con pesos PCA
dat_norm_ods9 <- dat_norm_ods9 %>%
rowwise() %>%
mutate(IndexODS9_pca = sum(pesos_ods9 * c_across(all_of(ods9_indicators)), na.rm=TRUE)) %>%
ungroup()
# Gráfico de serie del índice PCA
ggplot(dat_norm_ods9, aes(x = as.integer(date), y = IndexODS9_pca, color = region)) +
geom_line() +
labs(title = "Índice Sintético ODS9 (PCA)", x = "Año", y = "Índice") +
theme_minimal()10. Resultados y trayectorias
Para visualización y manipulaicón de Índices en un entorno mas amigable, se exportaron los resultados a Excel
# Preparar tablas
tabla_resumen_ods9 <- estad_ods9
tabla_indice_ods9 <- dat_norm_ods9 %>% select(iso3c, country, date, IndexODS9_eq, IndexODS9_pca)
write_xlsx(
list(
"Descriptivas_ODS9" = tabla_resumen_ods9,
"Cargas_PCA_ODS9" = df_cargas_ods9,
"Indices_ODS9" = tabla_indice_ods9
),
path = "Resultados_Metodologia_ODS9.xlsx"
)El presente apartado metodológico en RMarkdown servío como base para la sección de análisis crítico y recomendaciones del informe final. El análisis final constituye un informe en formato PDF que integra los apartados metodológicos previas, incluyendo las críticas derivadas de la deconstrucción del enfoque ortodoxo del desarrollo, y se acompaño de una presentación que resume los principales hallazgos, conclusiones y recomendaciones de la investigación.