UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONOMICAS

ESCUELA DE ECONOMIA

MATERIA: MÉTODOS PARA EL ANÁLISIS ECONÓMICO

TEMA: Uso de APIs en R para el Acceso a Datos Económicos

SECCIÓN: Organización para la Cooperación y el Desarrollo Económico (OCDE)

DOCENTE: JEFFRY ISAAC BONILLA MELARA

INTEGRANTES:

APELLIDOS NOMBRES CARNET PARTICIPACIÓN
PANIAGUA MUÑOZ CHRISTIAN ALEXANDER PM24066 \(100\%\)
MENDOZA CRUZ ENRIQUE ADOLFO MC24059 \(100\%\)
DELGADO CUELLAR GISELLE ABIGAIL DC24008 \(100\%\)
AGUILAR HERNÁNDEZ ANDREA SARAÍ AH22006 \(100\%\)
MORALES MONZÓN VANESSA MARÍA MM24056 \(100\%\)
ASCENCIO RAMÍREZ MATTHEW JEREMY AR23037 \(100\%\)

CICLO: II-2026

FECHA: 13 DE SEPTIEMBRE DE 2026

CIUDAD UNIVERSITARIA, SAN SALVADOR, EL SALVADOR, CENTROAMERICA

library(rsdmx)
library(dplyr)
library(tidyr)
library(kableExtra)
library(tsbox)
library(ggplot2)

Conceptos generales sobre APIs

Una interfaz de programación de aplicaciones (API, por sus siglas en inglés) es el mecanismo que permite que dos sistemas informáticos distintos intercambien información de manera automática, sin intervención manual ni descarga de archivos completos. En el campo económico, las APIs permiten conectar directamente un script de R (u otro lenguaje) con las bases de datos de organismos internacionales, de modo que los indicadores se actualizan cada vez que se ejecuta la consulta.

Existen distintos tipos de API según su alcance de acceso: privadas (uso interno de una institución), públicas (abiertas a cualquier usuario, con o sin restricciones), de socios (acceso restringido a desarrolladores autorizados) y compuestas (combinan varias APIs para resolver una necesidad más compleja). La mayoría de organismos económicos —OCDE, Banco Mundial, FMI, Eurostat, UN Comtrade— ofrecen APIs públicas basadas en el estándar SDMX (Statistical Data and Metadata eXchange), que estandariza la forma en que se estructuran y solicitan los datos estadísticos.

Acceso a la API de la OCDE

La OCDE distribuye toda su información estadística a través de su plataforma OECD Data Explorer, cuyo motor de consultas sigue el estándar SDMX. El flujo de trabajo para acceder a un indicador es el siguiente:

  1. Buscar el indicador de interés en el catálogo de indicadores de la OCDE.
  2. Aplicar los filtros deseados (países, período, frecuencia) directamente en el explorador.
  3. Presionar el botón “Developer API”, que genera automáticamente la URL de consulta en formato SDMX.
  4. Copiar esa URL y usarla con readSDMX() de la librería rsdmx en R para traer los datos directamente a un data frame.

La URL de una consulta a la API de datos de la OCDE sigue siempre la misma sintaxis:

{Host URL}/{Identificador de agencia},{Identificador de dataset},{Versión}/{Selección de datos}?{parámetros opcionales}

  • Identificador de agencia y dataset: identifican de forma única la fuente de los datos (ej. OECD.SDD.STES,DSD_KEI).
  • Selección de datos: lista de valores por dimensión separados por punto (.); varios valores de una misma dimensión se separan con +. Dejar una dimensión vacía trae todos sus valores disponibles.
  • startPeriod / endPeriod: delimitan el rango de tiempo de la consulta (acepta años, trimestres o meses, ej. 2015, 2015-Q1, 2015-01).
  • El acceso es gratuito, sujeto a los Términos y Condiciones de la OCDE, y con límites de tasa (rate limiting) para un uso responsable del servicio.
  • La respuesta puede pedirse en XML (format=genericdata), JSON (format=jsondata) o CSV (format=csvfile / csvfilewithlabels); readSDMX() de rsdmx trabaja directamente con el formato XML por defecto.
  • Antes de armar la consulta de datos, es una buena práctica hacer primero una consulta de estructura ({Host URL}/{Agencia},{Dataset},{Versión} sin selección de datos) para conocer el orden exacto y los códigos válidos de cada dimensión; esto evita errores 404 por dimensiones mal ordenadas.
library(rsdmx)
library(dplyr)

# Ejemplo de estructura de una URL de la API de la OCDE
url <- "https://sdmx.oecd.org/public/rest/data/OECD.SDD.STES,DSD_KEI@DF_KEI,/.M.PRVM.IX.C..?startPeriod=2015-01&dimensionAtObservation=AllDimensions"

datos <- readSDMX(url) %>% as_tibble()

Amplitud de la base de datos de la OCDE

El catálogo de indicadores de la OCDE (oecd.org/en/data/indicators) está organizado en 16 grandes categorías temáticas, cada una con decenas de sub-indicadores. Esto permite dimensionar qué tan amplia es la información disponible a través de la API:

categorias <- tribble(
  ~Categoría, ~`Ejemplos de sub-indicadores`,
  "Agricultura y pesca", "Comercio agrícola, sostenibilidad ambiental, acuicultura",
  "Desarrollo", "Ayuda Oficial al Desarrollo, indicadores de informalidad, África",
  "Economía", "Sector corporativo, sector externo, cuentas nacionales, precios",
  "Educación y habilidades", "Logro educativo, recursos educativos, mercado laboral juvenil",
  "Empleo", "Salarios, indicadores de empleo/desempleo, protección laboral",
  "Medio ambiente y clima", "Aire y clima, biodiversidad, economía circular",
  "Finanzas e inversión", "Pensiones y seguros, inversión extranjera directa (IED)",
  "Gobernanza pública", "Confianza pública, finanzas públicas, gobierno digital",
  "Salud", "Gasto en salud, cobertura sanitaria, recursos humanos en salud",
  "Industria, negocios y emprendimiento", "PyMEs, dinámica industrial, turismo",
  "Ciencia, tecnología e innovación", "TIC, I+D, propiedad intelectual",
  "Sociedad", "Demografía, migración, desigualdad de género",
  "Desarrollo regional, rural y urbano", "Finanzas subnacionales, áreas urbanas funcionales",
  "Comercio", "Comercio de bienes y servicios, cadenas de valor globales",
  "Transporte", "Indicadores de transporte, inversión en infraestructura",
  "Impuestos", "Impuesto corporativo, ingresos fiscales globales"
)

categorias %>%
  kable(caption = "Categorías de indicadores disponibles en la API de la OCDE") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado del catálogo de indicadores de la OCDE (oecd.org/en/data/indicators)",
               notation = "symbol") %>%
  kable_styling()
Categorías de indicadores disponibles en la API de la OCDE
Categoría Ejemplos de sub-indicadores
Agricultura y pesca Comercio agrícola, sostenibilidad ambiental, acuicultura
Desarrollo Ayuda Oficial al Desarrollo, indicadores de informalidad, África
Economía Sector corporativo, sector externo, cuentas nacionales, precios
Educación y habilidades Logro educativo, recursos educativos, mercado laboral juvenil
Empleo Salarios, indicadores de empleo/desempleo, protección laboral
Medio ambiente y clima Aire y clima, biodiversidad, economía circular
Finanzas e inversión Pensiones y seguros, inversión extranjera directa (IED)
Gobernanza pública Confianza pública, finanzas públicas, gobierno digital
Salud Gasto en salud, cobertura sanitaria, recursos humanos en salud
Industria, negocios y emprendimiento PyMEs, dinámica industrial, turismo
Ciencia, tecnología e innovación TIC, I+D, propiedad intelectual
Sociedad Demografía, migración, desigualdad de género
Desarrollo regional, rural y urbano Finanzas subnacionales, áreas urbanas funcionales
Comercio Comercio de bienes y servicios, cadenas de valor globales
Transporte Indicadores de transporte, inversión en infraestructura
Impuestos Impuesto corporativo, ingresos fiscales globales
* Tomado del catálogo de indicadores de la OCDE (oecd.org/en/data/indicators)

Catálogo de variables (diccionario técnico SDMX)

Los datasets de la OCDE en formato SDMX comparten un conjunto común de columnas (dimensiones y atributos). Antes de interpretar cualquier tabla, es necesario conocer qué significa cada una:

diccionario <- tribble(
  ~Variable, ~Significado,
  "REF_AREA", "Código ISO del país o región reportante (ej. SLV, USA, DEU)",
  "FREQ", "Frecuencia de la observación: A (anual), Q (trimestral), M (mensual)",
  "MEASURE", "Código del indicador o medida específica que se está consultando",
  "UNIT_MEASURE", "Unidad de medida del valor observado (índice, %, USD, etc.)",
  "TRANSFORMATION", "Tipo de transformación aplicada al dato (nivel, variación %, etc.)",
  "ADJUSTMENT", "Indica si el dato está ajustado estacionalmente (Y = sí, N = no)",
  "ACTIVITY", "Sector o actividad económica a la que corresponde el dato",
  "OBS_VALUE / obsValue", "Valor numérico observado para esa combinación de dimensiones",
  "UNIT_MULT", "Múltiplo aplicado al valor (0 = unidades, 3 = miles, 6 = millones)",
  "DECIMALS", "Número de decimales con el que se reporta el valor",
  "TIME_PERIOD", "Periodo de tiempo al que corresponde la observación",
  "OBS_STATUS", "Estado de la observación (A = normal, P = provisional, E = estimado)"
)

diccionario %>%
  kable(caption = "Diccionario de variables del formato SDMX de la OCDE") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado de la documentación de la API de la OCDE",
               notation = "symbol") %>%
  kable_styling()
Diccionario de variables del formato SDMX de la OCDE
Variable Significado
REF_AREA Código ISO del país o región reportante (ej. SLV, USA, DEU)
FREQ Frecuencia de la observación: A (anual), Q (trimestral), M (mensual)
MEASURE Código del indicador o medida específica que se está consultando
UNIT_MEASURE Unidad de medida del valor observado (índice, %, USD, etc.)
TRANSFORMATION Tipo de transformación aplicada al dato (nivel, variación %, etc.)
ADJUSTMENT Indica si el dato está ajustado estacionalmente (Y = sí, N = no)
ACTIVITY Sector o actividad económica a la que corresponde el dato
OBS_VALUE / obsValue Valor numérico observado para esa combinación de dimensiones
UNIT_MULT Múltiplo aplicado al valor (0 = unidades, 3 = miles, 6 = millones)
DECIMALS Número de decimales con el que se reporta el valor
TIME_PERIOD Periodo de tiempo al que corresponde la observación
OBS_STATUS Estado de la observación (A = normal, P = provisional, E = estimado)
* Tomado de la documentación de la API de la OCDE

Nota sobre las URLs de consulta: el orden exacto de las dimensiones dentro de la URL (después del listado de países) varía según el dataset. Para cada indicador de esta sección, ese orden se obtuvo directamente del botón “Developer API” del OECD Data Explorer; se recomienda siempre confirmarlo ahí antes de ejecutar la consulta final, ya que la OCDE actualiza periódicamente sus dataflows.

Indicadores clave

Se seleccionó un indicador representativo de cinco categorías distintas del catálogo de la OCDE, para un grupo de países que incluye miembros latinoamericanos de la organización (Costa Rica, México, Colombia) junto con España, Estados Unidos y Alemania como referencia.

Economía: Índice de Producción Manufacturera

url_manuf <- "https://sdmx.oecd.org/public/rest/data/OECD.SDD.STES,DSD_KEI@DF_KEI,/CRI+MEX+COL+ESP+USA+DEU.M.PRVM.IX.C..?startPeriod=2015-01&dimensionAtObservation=AllDimensions"

manufactura <- readSDMX(url_manuf) %>% as_tibble()

manufactura %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  filter(Anio %in% c(2015, 2025)) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Indice_Promedio = round(mean(obsValue, na.rm = TRUE), 2), .groups = "drop") %>%
  arrange(Anio, REF_AREA) %>%
  kable(caption = "Índice de Volumen de la Producción Manufacturera (2015 vs. 2025)") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Índice de Volumen de la Producción Manufacturera (2015 vs. 2025)
Anio REF_AREA Indice_Promedio
2015 COL 100.50
2015 CRI 100.00
2015 DEU 102.70
2015 ESP 100.00
2015 MEX 100.03
2015 USA 100.00
2025 COL 121.50
2025 CRI 163.11
2025 DEU 93.12
2025 ESP 107.50
2025 MEX 111.29
2025 USA 96.30
* Tomado de la API de la OCDE
manufactura %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Indice_Promedio = mean(obsValue, na.rm = TRUE), .groups = "drop") %>%
  group_by(REF_AREA) %>%
  mutate(Indice_Base_2015 = round(Indice_Promedio / Indice_Promedio[Anio == 2015] * 100, 2)) %>%
  ungroup() %>%
  ggplot(aes(x = Anio, y = Indice_Base_2015, color = REF_AREA)) +
  geom_line(linewidth = 1) +
  geom_point() +
  labs(title = "Índice de Producción Manufacturera (Base 2015 = 100)",
       x = "Año", y = "Índice", color = "País") +
  theme_minimal()

Ejercicio aplicado: análisis con tsbox

La librería tsbox permite convertir fácilmente un data frame en formato “largo” a un objeto de serie de tiempo (ts) y viceversa, además de calcular transformaciones comunes como la variación porcentual interanual con una sola función. A modo de ejercicio, se aplica esta librería —cargada desde el inicio pero sin usar hasta ahora— a la serie mensual de producción manufacturera de España:

serie_manuf_esp <- manufactura %>%
  filter(REF_AREA == "ESP") %>%
  mutate(time = as.Date(paste0(TIME_PERIOD, "-01"))) %>%
  select(time, value = obsValue) %>%
  arrange(time)

ts_manuf_esp <- ts_ts(serie_manuf_esp)

ts_pc(ts_manuf_esp) %>%
  ts_plot(title = "Variación % interanual - Producción Manufacturera (España)",
          ylab = "Variación % interanual")

Este tipo de transformación es muy usada en análisis económico porque permite comparar el ritmo de crecimiento de una variable entre distintos periodos, sin depender de su nivel absoluto.

Empleo: Tasa de Desempleo

url_desempleo <- "https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_LFS@DF_IALFS_UNE_M,1.0/CRI+MEX+COL+ESP+USA+DEU..PT_LF_SUB._Z.Y._T.Y_GE15..M?startPeriod=2015-01&dimensionAtObservation=AllDimensions"

desempleo <- readSDMX(url_desempleo) %>% as_tibble()

desempleo %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  filter(Anio %in% c(2015, 2025)) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Tasa_Promedio = round(mean(obsValue, na.rm = TRUE), 2), .groups = "drop") %>%
  arrange(Anio, REF_AREA) %>%
  kable(caption = "Tasa de Desempleo (2015 vs. 2025, promedio anual)") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Tasa de Desempleo (2015 vs. 2025, promedio anual)
Anio REF_AREA Tasa_Promedio
2015 COL 8.94
2015 CRI 9.61
2015 DEU 4.35
2015 ESP 22.07
2015 MEX 4.35
2015 USA 5.28
2025 COL 8.89
2025 CRI 6.70
2025 DEU 3.73
2025 ESP 10.51
2025 MEX 2.65
2025 USA 4.26
* Tomado de la API de la OCDE
desempleo %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Tasa_Promedio = round(mean(obsValue, na.rm = TRUE), 2), .groups = "drop") %>%
  ggplot(aes(x = Anio, y = Tasa_Promedio, color = REF_AREA)) +
  geom_line(linewidth = 1) +
  geom_point() +
  labs(title = "Tasa de Desempleo (promedio anual)",
       x = "Año", y = "Tasa de Desempleo (%)", color = "País") +
  theme_minimal()

Ejercicio aplicado: variación anual del desempleo

Además del nivel de la tasa de desempleo, es útil calcular su variación año contra año en puntos porcentuales, para identificar en qué momentos hubo un deterioro o una mejora más marcada del mercado laboral en cada país:

desempleo %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Tasa_Promedio = mean(obsValue, na.rm = TRUE), .groups = "drop") %>%
  arrange(REF_AREA, Anio) %>%
  group_by(REF_AREA) %>%
  mutate(Variacion_pp = round(Tasa_Promedio - lag(Tasa_Promedio), 2)) %>%
  ungroup() %>%
  filter(Anio == 2025) %>%
  kable(caption = "Variación de la Tasa de Desempleo, 2025 vs. 2024 (puntos porcentuales)") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Cálculo propio a partir de datos de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Variación de la Tasa de Desempleo, 2025 vs. 2024 (puntos porcentuales)
Anio REF_AREA Tasa_Promedio Variacion_pp
2025 COL 8.894092 -1.27
2025 CRI 6.704065 -0.78
2025 DEU 3.733333 0.37
2025 ESP 10.508333 -0.85
2025 MEX 2.646433 -0.03
2025 USA 4.263636 0.24
* Cálculo propio a partir de datos de la API de la OCDE

Ejercicio aplicado: correlación entre producción manufacturera y desempleo

Con los datos ya descargados de ambos indicadores, se puede cruzar la información para evaluar si existe una relación inversa entre la producción manufacturera y el desempleo, tal como sugiere la teoría económica (a mayor producción, se esperaría menor desempleo):

manuf_anual <- manufactura %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Indice_Manuf = mean(obsValue, na.rm = TRUE), .groups = "drop")

desem_anual <- desempleo %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Tasa_Desempleo = mean(obsValue, na.rm = TRUE), .groups = "drop")

cruce <- inner_join(manuf_anual, desem_anual, by = c("Anio", "REF_AREA"))

cruce %>%
  group_by(REF_AREA) %>%
  summarise(Correlacion = round(cor(Indice_Manuf, Tasa_Desempleo, use = "complete.obs"), 3), .groups = "drop") %>%
  kable(caption = "Correlación entre Producción Manufacturera y Tasa de Desempleo, por país") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Cálculo propio a partir de datos de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Correlación entre Producción Manufacturera y Tasa de Desempleo, por país
REF_AREA Correlacion
COL -0.175
CRI -0.436
DEU -0.219
ESP -0.653
MEX -0.915
USA -0.543
* Cálculo propio a partir de datos de la API de la OCDE

Un coeficiente negativo confirmaría la relación esperada por la teoría; un coeficiente positivo o cercano a cero indicaría que, en ese país y periodo, otros factores (choques externos, composición sectorial, políticas públicas) están dominando la relación entre ambas variables.

Salud: Gasto en Salud (% del PIB)

Base de datos: Health Expenditure and Financing

url_salud <- "https://sdmx.oecd.org/public/rest/data/OECD.ELS.HD,DSD_SHA@DF_SHA,1.1/.A.EXP_HEALTH.PT_B1GQ._T.._T.._T...?startPeriod=2015&dimensionAtObservation=AllDimensions"

gasto_salud <- readSDMX(url_salud) %>% as_tibble()

gasto_salud %>%
  filter(REF_AREA %in% c("CRI", "MEX", "COL", "ESP", "USA", "DEU")) %>%
  filter(TIME_PERIOD %in% c("2015", "2025")) %>%
  arrange(TIME_PERIOD, REF_AREA) %>%
  select(TIME_PERIOD, REF_AREA, obsValue) %>%
  kable(caption = "Gasto en Salud como Porcentaje del PIB (2015 vs. 2025)") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Gasto en Salud como Porcentaje del PIB (2015 vs. 2025)
TIME_PERIOD REF_AREA obsValue
2015 COL 7.523
2015 CRI 7.592
2015 DEU 10.918
2015 ESP 9.176
2015 MEX 5.434
2015 USA 16.465
2025 COL 8.519
2025 CRI 6.776
2025 DEU 12.735
2025 ESP 8.855
2025 MEX 6.171
2025 USA 17.598
* Tomado de la API de la OCDE

Ejercicio aplicado: ranking de países por gasto en salud

Para facilitar la comparación entre países se construye un ranking con el último dato disponible de gasto en salud como porcentaje del PIB:

gasto_salud %>%
  filter(REF_AREA %in% c("CRI", "MEX", "COL", "ESP", "USA", "DEU")) %>%
  group_by(REF_AREA) %>%
  filter(TIME_PERIOD == max(TIME_PERIOD)) %>%
  ungroup() %>%
  ggplot(aes(x = reorder(REF_AREA, obsValue), y = obsValue, fill = REF_AREA)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(title = "Gasto en Salud como % del PIB (último dato disponible)",
       x = "País", y = "% del PIB") +
  theme_minimal()

Comercio: Comercio Internacional de Mercancías

Base de datos: International Merchandise Trade Statistics

url_comercio <- "https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_IMTS@DF_IMTS,1.0/....M.USD_EXC.Y.?startPeriod=2015-01&dimensionAtObservation=AllDimensions"

comercio <- readSDMX(url_comercio) %>% as_tibble()

comercio %>%
  filter(REF_AREA %in% c("CRI", "MEX", "COL", "ESP", "USA", "DEU")) %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  filter(Anio %in% c(2015, 2025)) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Total_Anual = round(sum(obsValue, na.rm = TRUE), 2), .groups = "drop") %>%
  arrange(Anio, REF_AREA) %>%
  kable(caption = "Exportaciones Totales Anuales de Mercancías (2015 vs. 2025, millones de USD)") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Exportaciones Totales Anuales de Mercancías (2015 vs. 2025, millones de USD)
Anio REF_AREA Total_Anual
2015 COL 72.04
2015 CRI 18.83
2015 DEU 2633.29
2015 ESP 563.41
2015 MEX 760.75
2015 USA 3006.20
2025 COL 100.29
2025 CRI 53.26
2025 DEU 3527.62
2025 ESP 889.27
2025 MEX 1325.98
2025 USA 4359.78
* Tomado de la API de la OCDE

Educación: Gasto en Educación (% del PIB)

Base de datos: Expenditure on educational institutions

url_educacion <- "https://sdmx.oecd.org/public/rest/data/OECD.EDU.IMEP,DSD_EAG_UOE_FIN@DF_UOE_FIN_SOURCE_GV_PR_NDOM,3.2/.EXP.ISCED11_1T8._T+S13+S1D_NON_EDU+S2.INST_EDU..Q+_Z.USD_PPP+PT_EXP+PT_B1GQ.?startPeriod=2015&endPeriod=2023&dimensionAtObservation=AllDimensions"

gasto_educacion <- readSDMX(url_educacion) %>% as_tibble()

gasto_educacion %>%
  filter(REF_AREA %in% c("CRI", "MEX", "COL", "ESP", "USA", "DEU")) %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  filter(Anio %in% c(2015, 2023)) %>%
  group_by(Anio, REF_AREA, MEASURE) %>%
  summarise(Valor_Promedio = round(mean(obsValue, na.rm = TRUE), 2), .groups = "drop") %>%
  arrange(Anio, REF_AREA, MEASURE) %>%
  kable(caption = "Gasto en Educación (2015 vs. 2023): PT_B1GQ = % del PIB, PT_EXP = % del gasto público, USD_PPP = monto en USD PPA") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Gasto en Educación (2015 vs. 2023): PT_B1GQ = % del PIB, PT_EXP = % del gasto público, USD_PPP = monto en USD PPA
Anio REF_AREA MEASURE Valor_Promedio
2015 CRI EXP 3251.84
2015 DEU EXP 35953.02
2015 ESP EXP 14884.26
2015 MEX EXP 32320.85
2015 USA EXP 293060.85
2023 COL EXP 8184.64
2023 CRI EXP 3095.89
2023 DEU EXP 40644.70
2023 ESP EXP 18521.75
2023 MEX EXP 36212.50
* Tomado de la API de la OCDE

Ejemplo práctico integrador

Balanza comercial de países europeos

Se calcula la balanza comercial (exportaciones menos importaciones) para cinco países europeos miembros de la OCDE, y se grafica su evolución en el tiempo.

# Se reutiliza el mismo dataset de la sección de Comercio (IMTS) para
# exportaciones, y se agrega una segunda consulta con el mismo dataset
# pero filtrando por el flujo de IMPORTACIONES.
paises_europa <- c("FRA", "DEU", "ESP", "ITA", "NLD")

url_importaciones <- "https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_IMTS@DF_IMTS,1.0/..M..M.USD_EXC.Y.?startPeriod=2015-01&dimensionAtObservation=AllDimensions"
importaciones <- readSDMX(url_importaciones) %>% as_tibble()

exportaciones_europa <- comercio %>%
  filter(REF_AREA %in% paises_europa) %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Exportaciones = round(sum(obsValue, na.rm = TRUE), 2), .groups = "drop")

importaciones_europa <- importaciones %>%
  filter(REF_AREA %in% paises_europa) %>%
  mutate(Anio = as.integer(substr(TIME_PERIOD, 1, 4))) %>%
  group_by(Anio, REF_AREA) %>%
  summarise(Importaciones = round(sum(obsValue, na.rm = TRUE), 2), .groups = "drop")

balanza_europa <- exportaciones_europa %>%
  left_join(importaciones_europa, by = c("Anio", "REF_AREA")) %>%
  mutate(Balanza = round(Exportaciones - Importaciones, 2)) %>%
  arrange(Anio, REF_AREA)

# Tabla: solo 2015 y 2025
balanza_europa %>%
  filter(Anio %in% c(2015, 2025)) %>%
  kable(caption = "Balanza Comercial de Países Europeos (2015 vs. 2025, millones de USD)") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Balanza Comercial de Países Europeos (2015 vs. 2025, millones de USD)
Anio REF_AREA Exportaciones Importaciones Balanza
2015 DEU 2633.29 1047.25 1586.04
2015 ESP 563.41 311.11 252.30
2015 FRA 1013.19 570.85 442.34
2015 ITA 910.47 410.60 499.87
2015 NLD 1142.46 512.26 630.20
2025 DEU 3527.62 1538.91 1988.71
2025 ESP 889.27 519.98 369.29
2025 FRA 1375.28 792.59 582.69
2025 ITA 1459.29 670.69 788.60
2025 NLD 1978.16 873.74 1104.42
* Tomado de la API de la OCDE
# Gráfico: se deja con la serie completa para mostrar la evolución
balanza_europa %>%
  ggplot(aes(x = Anio, y = Balanza, color = REF_AREA)) +
  geom_line(linewidth = 1) +
  geom_point() +
  labs(title = "Balanza Comercial de Países Europeos",
       x = "Año", y = "Balanza Comercial (millones de USD)", color = "País") +
  theme_minimal()

Índice de Gini (ingreso disponible)

Se compara el índice de Gini del ingreso disponible entre los países del grupo, usando la Base de Datos de Distribución del Ingreso (IDD) de la OCDE.

url_gini <- "https://sdmx.oecd.org/public/rest/data/OECD.WISE.INE,DSD_WISE_IDD@DF_IDD,1.0/CRI+MEX+COL+ESP+USA+DEU.A.INC_DISP_GINI._Z.0_TO_1._T.METH2012.D_CUR._Z?startPeriod=2015&dimensionAtObservation=AllDimensions"

gini <- readSDMX(url_gini) %>% as_tibble()

gini %>%
  select(TIME_PERIOD, REF_AREA, obsValue) %>%
  arrange(TIME_PERIOD, REF_AREA) %>%
  pivot_wider(names_from = REF_AREA, values_from = obsValue) %>%
  kable(caption = "Índice de Gini del Ingreso Disponible") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Tomado de la API de la OCDE (Income Distribution Database)",
               notation = "symbol") %>%
  kable_styling()
Índice de Gini del Ingreso Disponible
TIME_PERIOD CRI DEU ESP USA MEX
2015 0.4790619 0.29318 0.3444658 0.3895599 NA
2016 0.4837733 0.29441 0.3405853 0.3912322 0.4586722
2017 0.4802840 0.28916 0.3325125 0.3899000 NA
2018 0.4789755 0.28934 0.3304905 0.3927000 0.4179922
2019 0.4783687 0.29590 0.3203372 0.3949000 NA
2020 0.4967260 0.30256 0.3294777 0.3773000 0.4204694
2021 0.4873102 0.31254 0.3195570 0.3752000 NA
2022 0.4718672 0.30915 0.3156711 0.3961000 0.4001119
2023 0.4703244 0.30700 0.3124321 0.3944025 NA
2024 0.4602209 NA NA NA NA
2025 0.4576662 NA NA NA NA
* Tomado de la API de la OCDE (Income Distribution Database)
rangos <- tribble(
  ~REF_AREA, ~Anio_min, ~Anio_max,
  "CRI", 2015, 2025,
  "DEU", 2015, 2023,
  "ESP", 2015, 2023,
  "USA", 2015, 2023
)

gini %>%
  mutate(Anio = as.integer(TIME_PERIOD)) %>%
  inner_join(rangos, by = "REF_AREA") %>%
  filter(Anio >= Anio_min, Anio <= Anio_max) %>%
  ggplot(aes(x = Anio, y = obsValue, color = REF_AREA)) +
  geom_line(linewidth = 1) +
  geom_point() +
  labs(title = "Índice de Gini del Ingreso Disponible",
       x = "Año", y = "Índice de Gini", color = "País") +
  theme_minimal()

Ejercicio aplicado: tabla resumen comparativa (dashboard)

Como cierre antes de las conclusiones, se integra en una sola tabla el último dato disponible de dos de los indicadores trabajados (producción manufacturera y desempleo) para los seis países del grupo, a manera de resumen comparativo tipo “dashboard”:

resumen <- manuf_anual %>%
  filter(Anio == 2025) %>%
  select(Anio_Manuf = Anio, REF_AREA, Indice_Manuf) %>%
  full_join(
    desem_anual %>% filter(Anio == 2025) %>%
      select(Anio_Desempleo = Anio, REF_AREA, Tasa_Desempleo),
    by = "REF_AREA"
  ) %>%
  arrange(REF_AREA)

resumen %>%
  kable(caption = "Resumen comparativo de indicadores (año 2025)") %>%
  kable_classic(html_font = "Times New Roman", font_size = 14) %>%
  add_footnote(label = "Cálculo propio a partir de datos de la API de la OCDE", notation = "symbol") %>%
  kable_styling()
Resumen comparativo de indicadores (año 2025)
Anio_Manuf REF_AREA Indice_Manuf Anio_Desempleo Tasa_Desempleo
2025 COL 121.50178 2025 8.894092
2025 CRI 163.11307 2025 6.704065
2025 DEU 93.11667 2025 3.733333
2025 ESP 107.50219 2025 10.508333
2025 MEX 111.28529 2025 2.646433
2025 USA 96.29627 2025 4.263636
* Cálculo propio a partir de datos de la API de la OCDE

Conclusiones

La API de la OCDE, al estar basada en el estándar SDMX, permite integrar directamente en R más de una decena de dominios temáticos —desde producción industrial hasta desigualdad de ingresos— usando una misma lógica de consulta (readSDMX() + una URL construida desde el Developer API). Esto facilita comparar indicadores entre países de forma reproducible y actualizable, sin depender de descargas manuales de archivos.

Los ejercicios aplicados adicionales —variación anual, correlación entre indicadores, ranking comparativo, transformación de series con tsbox y una tabla resumen tipo dashboard— muestran que, una vez descargados los datos desde la API, es posible generar análisis propios sin necesidad de nuevas consultas: basta con manipular en R los data frames ya obtenidos. Esto refuerza la ventaja principal de trabajar con APIs frente a la descarga manual de archivos: los datos quedan disponibles para cualquier análisis adicional que se quiera construir sobre ellos.

Bibliografía

Amazon Web Services. (2023). ¿Qué es una interfaz de programación de aplicaciones (API)? https://aws.amazon.com/es/what-is/api/

Axway. (n.d.). Different types of APIs. https://blog.axway.com/learning-center/apis/basics/different-types-apis

OCDE. (2024). OECD Data API documentation. https://www.oecd.org/en/data/insights/data-explainers/2024/09/api.html

OCDE. (n.d.). OECD Data Explorer. https://data-explorer.oecd.org/

Summary, R. (2024). rsdmx: R package for SDMX data. https://cran.r-project.org/web/packages/rsdmx/rsdmx.pdf