Metodología de extracción y visualización de indicadores extraídos de FAOSTAT

Author

Náyuha Palenzuela

Objetivo

Este documento presenta el procedimiento utilizado para construir los indicadores empleados en el estudio “Innovación agrícola como política económica: lecciones del modelo brasileño para fortalecer la productividad y diversificación productiva en Venezuela”.

Cargar librerías

Code
library(tidyverse)
library(FAOSTAT)
library(readxl)
library(ggrepel)
library(scales)
library(dplyr)
library(ggplot2)
library(DT)
library(ggrepel)

Obtención de datos desde FAOSTAT

Como primer paso para la obtención de datos es necesario tener creado una cuenta en FAOSTAT para poder ingresar y realizar la desacarga de datos, para eso se usará el siguiente código, a fines prácticos no se ejecutará, debido a que cada usuario y contraseña es personal.

Code
df_qcl_bulk <- get_faostat_bulk(code = "QCL",
                                data_folder = tempdir())

saveRDS(df_qcl_bulk,"datos/faostat_qcl.rds")

Los datos del rendimiento agrícola se obtuvieron del dominio de (QCL) de FAOSTAT. El cual contiene una base de datos de información anual sobre productos agrícolas, producción, superficie cosechada y rendimiento para los diferentes países. Para garantizar la reproducibilidad del análisis y evitar que el renderizador del documento dependa de una conexión activa de la API de FAOSTAT, se descargo la información y se almacenan los datos de forma local en formato RDS, por lo que posteriormente se utilizaran la copia de estos datos.

Code
# Cargar la base de FAOSTAT previamente descargada

df_qcl <- readRDS("datos/faostat_qcl.rds")

# Comprobar estructura
dim(df_qcl)
[1] 4209110      14

Exploración inicial de los datos

Antes de seleccionar los países y cultivos que serán utilizados en el análisis, es importante realizar una exploración de la base de datos para identificar los códigos correspondientes a cada unidad, evitando así la asignación arbitraria de los mismos.

Code
paises <- df_qcl %>%
  distinct(area_code, area) %>%
  arrange(area)
Code
DT::datatable(paises,
              rownames = FALSE,
              options = list(pageLength = 10,
                             lengthMenu = c(10, 25, 50, 100),
                             scrollX = TRUE))

En nuestro caso trabajaremos con Brasil (21) y Venezuela (236).

Exploración de los productos agrícolas

Una vez identificados los países de interés, se procedió a explorar los productos disponibles en la base QCL de FAOSTAT. Para el análisis se seleccionaron tres cultivos: arroz, maíz y caña de azúcar.

Code
cultivos <- df_qcl %>%
  distinct(item_code, item) %>%
  arrange(item)

DT::datatable(cultivos,
              rownames = FALSE,
              options = list(pageLength = 10,
                             lengthMenu = c(10, 25, 50, 100),
                             scrollX = TRUE))

Exploración de indicadores

La base QCL contiene diferentes indicadores asociados a los productos agrícolas. Antes de seleccionar la variable utilizada en el análisis, se revisaron los indicadores disponibles para identificar el correspondiente al rendimiento agrícola.

Code
indicadores <- df_qcl %>%
  distinct(element_code, element) %>%
  arrange(element)

DT::datatable(indicadores,
              rownames = FALSE,
              options = list(pageLength = 10,
                             lengthMenu = c(10, 25, 50, 100),
                             scrollX = TRUE))

Exploración de las unidades de medida

Esta comprobación permite identificar la unidad original en la que FAOSTAT reporta el rendimiento agrícola y establecer, cuando sea necesario, la transformación utilizada posteriormente en el análisis.

Code
unidades <- df_qcl %>%
  distinct(element_code, element, unit) %>%
  arrange(element, unit)

DT::datatable(unidades,
              rownames = FALSE,
              options = list(pageLength = 10,
                             lengthMenu = c(10, 25, 50, 100),
                             scrollX = TRUE))

El indicador seleccionado para medir la productividad física de los cultivos es “yield”, identificado en la base de FAOSTAT por el código 5412 expresados en kilogramos por hectárea (kg/ha). La selección de esta unidad permite comparar directamente la cantidad producida por unidad de superficie entre Brasil y Venezuela, facilitando así la interpretación de los resultados, donde, posteriormente serán transformados a toneladas por hectáreas (t/ha).

Rendimiento (t/ha)= (rendimiento (kg/ha)) / 1000

Exploración de los períodos disponibles

Revisaremos los años disponibles en la base para determinar el período temporal que usaremos en el estudio.

Code
anios <- df_qcl %>% 
  distinct(year) %>%
  arrange(year)

range(df_qcl$year, na.rm = TRUE)
[1] 1961 2024

Realizaremos una exploración rápida en los países seleccionados para verificar si ambos tienen disponibilidad de los datos.

Code
cobertura <- df_qcl %>%
  filter(area_code %in% c(21, 236),
         item_code %in% c(27, 56, 156),
         element_code == 5412) %>%
  count(area, item, name = "observaciones") %>%
  arrange(area, item)

cobertura
                                area         item observaciones
1                             Brazil Maize (corn)            64
2                             Brazil         Rice            64
3                             Brazil   Sugar cane            64
4 Venezuela (Bolivarian Republic of) Maize (corn)            64
5 Venezuela (Bolivarian Republic of)         Rice            64
6 Venezuela (Bolivarian Republic of)   Sugar cane            64

La comprobación de la cobertura muestra que la combinación de país-cultivo seleccionado cuentan con 64 observaciones anuales es decir de 1961 hasta 2024.

El análisis se concentrará en un período de 2000-2024, esta delimitación temporal permite examinar la evolución reciente de la productividad agrícola y mantener la coherencia en el estudio comparativo.

Una vez que ya tenemos identificados los países, productos, indicadores, unidad de medida y período, construiremos la base para el estudio del rendimiento agrícola.

Code
paises_estudio <- c(21, 236)
cultivos_estudio <- c(27, 56, 156)
indicador_rendimiento <- 5412
Code
rendimientos <- df_qcl %>%
  filter(area_code %in% paises_estudio,
         item_code %in% cultivos_estudio,
         element_code == indicador_rendimiento,
         year >= 2000,
         year <= 2024) %>%
  transmute( País = area,
             Cultivo = item,
             Año = year,
             Rendimiento_kg_ha = value)

dim(rendimientos)
[1] 150   4
Code
rendimientos %>% 
  count(País, Cultivo)
                                País      Cultivo  n
1                             Brazil Maize (corn) 25
2                             Brazil         Rice 25
3                             Brazil   Sugar cane 25
4 Venezuela (Bolivarian Republic of) Maize (corn) 25
5 Venezuela (Bolivarian Republic of)         Rice 25
6 Venezuela (Bolivarian Republic of)   Sugar cane 25
Code
rendimientos <- rendimientos %>%
  mutate(País = recode(País,
                       "Brazil" = "Brasil",
                       "Venezuela (Bolivarian Republic of)" = "Venezuela"))

head(rendimientos)
    País      Cultivo  Año Rendimiento_kg_ha
1 Brasil Maize (corn) 2000            2718.2
2 Brasil Maize (corn) 2001            3401.9
3 Brasil Maize (corn) 2002            3055.9
4 Brasil Maize (corn) 2003            3727.3
5 Brasil Maize (corn) 2004            3367.1
6 Brasil Maize (corn) 2005            3040.3

Conversión del rendimiento agrícola

Los valores obtenidos se encuentran expresados en (kg/ha). Para facilitar los resultados trabajaremos en toneladas por hectáreas (t/ha).

Code
rendimientos <- rendimientos %>%
  mutate(Rendimiento_t_ha = Rendimiento_kg_ha / 1000)

head(rendimientos)
    País      Cultivo  Año Rendimiento_kg_ha Rendimiento_t_ha
1 Brasil Maize (corn) 2000            2718.2           2.7182
2 Brasil Maize (corn) 2001            3401.9           3.4019
3 Brasil Maize (corn) 2002            3055.9           3.0559
4 Brasil Maize (corn) 2003            3727.3           3.7273
5 Brasil Maize (corn) 2004            3367.1           3.3671
6 Brasil Maize (corn) 2005            3040.3           3.0403
Code
rendimientos %>% count(País, Cultivo)
       País      Cultivo  n
1    Brasil Maize (corn) 25
2    Brasil         Rice 25
3    Brasil   Sugar cane 25
4 Venezuela Maize (corn) 25
5 Venezuela         Rice 25
6 Venezuela   Sugar cane 25
Code
rendimientos <- rendimientos %>%
  mutate(Cultivo_es = recode(Cultivo,
      "Maize (corn)" = "Maíz",
      "Rice" = "Arroz",
      "Sugar cane" = "Caña de azúcar"))

head(rendimientos)
    País      Cultivo  Año Rendimiento_kg_ha Rendimiento_t_ha Cultivo_es
1 Brasil Maize (corn) 2000            2718.2           2.7182       Maíz
2 Brasil Maize (corn) 2001            3401.9           3.4019       Maíz
3 Brasil Maize (corn) 2002            3055.9           3.0559       Maíz
4 Brasil Maize (corn) 2003            3727.3           3.7273       Maíz
5 Brasil Maize (corn) 2004            3367.1           3.3671       Maíz
6 Brasil Maize (corn) 2005            3040.3           3.0403       Maíz
Code
rendimientos %>%
  count(Cultivo, Cultivo_es)
       Cultivo     Cultivo_es  n
1 Maize (corn)           Maíz 50
2         Rice          Arroz 50
3   Sugar cane Caña de azúcar 50
Code
rendimientos <- rendimientos %>%
  arrange(País, Cultivo_es, Año)

head(rendimientos)
    País Cultivo  Año Rendimiento_kg_ha Rendimiento_t_ha Cultivo_es
1 Brasil    Rice 2000            3038.2           3.0382      Arroz
2 Brasil    Rice 2001            3240.5           3.2405      Arroz
3 Brasil    Rice 2002            3324.6           3.3246      Arroz
4 Brasil    Rice 2003            3249.0           3.2490      Arroz
5 Brasil    Rice 2004            3556.5           3.5565      Arroz
6 Brasil    Rice 2005            3369.1           3.3691      Arroz

Creación de función genérica para los gráficos de rendimeinto agrícola

Para comparar la trayectoria productiva de Brasil y Venezuela se construyeron series temporales del rendimiento agrícola expresado en toneladas por hectárea (t/ha) en un período establecido entre el 2000 y el 2024 como se había mencionado anteriormente.

Code
grafico_rendimiento <- function(datos, cultivo_nombre){
  
  datos_grafico <- datos %>%
    filter(Cultivo_es == cultivo_nombre)
  
  
  # Seleccionar años importantes para etiquetas
  etiquetas <- datos_grafico %>%
    filter(Año %in% c(2000, 2005, 2010, 2015, 2020, 2024))
  
  
  ggplot(datos_grafico,aes(x = Año, 
                           y = Rendimiento_t_ha,
                           color = País,
                           group = País)) +
    geom_line(linewidth = 1.3) +
    geom_point(size = 3) +
    geom_text_repel(
      data = etiquetas,
      aes(label = paste0(round(Rendimiento_t_ha,1)," t/ha")),
      size = 3.3,
      fontface = "bold",
      box.padding = 0.8,
      point.padding = 0.2,
      max.overlaps = Inf,
      direction = "both",
      seed = 123) +
    
    scale_color_manual(values = c("Brasil" = "#116458",
                                  "Venezuela" = "#0613CB")) +
    
    scale_x_continuous(breaks = seq(2000,2024,2),
                       expand = expansion(mult = c(0.05,0.08))) +
    
    scale_y_continuous(labels = label_comma()) +
    
    labs(title = paste0("Gráfico: Rendimiento físico en cultivo de ",
        cultivo_nombre," (2000-2024). (t/ha)."),
        x = "Año",
        y = "Rendimiento (t/ha)",
        color = NULL,
        caption ="Fuente: Elaboración propia con datos de FAOSTAT (Dominio QCL).") +
    
    theme_minimal(base_size = 12) +
    theme(
      plot.title = element_text(face = "bold",
                                size = 13,
                                hjust = 0.5,
                                margin = margin(b = 15)),
      
      legend.position = "top",
      
      legend.text = element_text(size = 12,
                                 face = "bold"),
      
      axis.title = element_text(face = "bold"),
      
      panel.grid.major = element_line(linewidth = 0.35,
                                      color = "grey80"),
      
      panel.grid.minor = element_blank(),
      
      plot.caption = element_text(hjust = 0, 
                                  size = 11),
      
      plot.margin =
        margin(
          t = 30,
          r = 30,
          b = 20,
          l = 20
        )
    )
}
Code
grafico_rendimiento(rendimientos,"Arroz")

Code
grafico_rendimiento(rendimientos,"Maíz")

Code
grafico_rendimiento(rendimientos,"Caña de azúcar")

Gasto en investigación y desarrollo agrícola

Esta variable permite aproximarse a la capacidad de ambos países para generar y sostener conocimiento científico y tecnológico aplicado al sector agropecuario.

De acuerdo con el ensayo, la comparación se realiza mediante el gasto real en I+D agrícola, expresado en millones de dólares estadounidenses constantes a precios de 2015 y ajustados por paridad de poder adquisitivo (PPA). Esta unidad permite realizar una comparación entre países evitando que las diferencias cambiarias y de precios internos distorsionen la magnitud de la inversión.

Para este análisis se utiliza el dominio (AE – Agricultural Science and Technology Indicators (ASTI)) de FAOSTAT.

A diferencia de los gráficos de productividad agrícola, que utilizan el dominio QCL de FAOSTAT, el análisis de la inversión en investigación agrícola requiere utilizar el dominio (AE–ASTI).

Primero se consulta el catálogo de conjuntos de datos de FAOSTAT para identificar la ubicación oficial del dominio AE. Posteriormente, se descarga el archivo correspondiente, se descomprime y se importa a R para realizar la exploración y selección de las variables necesarias.

El resultado de este procedimiento es una base denominada `df_ae_raw`, que contiene los registros disponibles del dominio AE–ASTI.

Code
# Catálogo de dominios de FAOSTAT
catalogo_url <- "https://fenixservices.fao.org/faostat/static/bulkdownloads/datasets_E.json"

catalogo <- jsonlite::fromJSON(catalogo_url)

df_datasets <- tibble::as_tibble(catalogo$Datasets$Dataset)


# Identificar el dominio AE - ASTI
url_ae <- df_datasets %>%
  dplyr::filter(DatasetCode == "AE") %>%
  dplyr::pull(FileLocation)


# Descargar el archivo
temp_zip <- tempfile(fileext = ".zip")
temp_dir <- tempdir()

download.file(url_ae,
              destfile = temp_zip,
              mode = "wb")

# Descomprimir
archivos <- unzip(temp_zip,
                  exdir = temp_dir)

# Identificar el archivo CSV
archivo_csv <- archivos[grepl("\\.csv$", 
                              archivos, 
                              ignore.case = TRUE)][1]

# Leer los datos
df_ae_raw <- readr::read_csv(archivo_csv,
                             show_col_types = FALSE)

# Estandarizar nombres de columnas
names(df_ae_raw) <- tolower(
  gsub("[ ._]+", "_", names(df_ae_raw)))


# Comprobar el resultado
dim(df_ae_raw)
[1] 7789   15

Una vez cargada la base, se identifican los indicadores disponibles para Brasil y Venezuela. Este procedimiento permite seleccionar la variable que corresponde específicamente al gasto total en investigación y desarrollo agrícola expresado en dólares estadounidenses PPA a precios de 2015.

Code
# Indicadores disponibles para Brasil y Venezuela

df_id_agr <- df_ae_raw %>%
  filter(area_code %in% c(21, 236))


indicadores_asti <- df_id_agr %>%
  distinct(indicator_code,
           indicator,
           unit) %>%
  arrange(indicator_code)


DT::datatable(indicadores_asti,
              options = list(pageLength = 10,
                             scrollX = TRUE), 
              rownames = FALSE)

La exploración de los indicadores permitió identificar el indicador 8003: “Total Expenditure in Agricultural R&D (US$, PPP, 2015 prices)”, cuya unidad de medida es millones de USD.

Code
# Filtrar el gasto total en I+D agrícola
# Indicador 8003: USD PPP, precios de 2015

gasto_id <- df_ae_raw %>%
  filter(area_code %in% c(21, 236),
         indicator_code == 8003) %>%
  select(Pais = area,
         Año = year,
         Gasto_ID = value) %>%
  mutate(Año = as.integer(Año),
         Gasto_ID = as.numeric(Gasto_ID))


# Revisar las primeras observaciones
head(gasto_id)
# A tibble: 6 × 3
  Pais     Año Gasto_ID
  <chr>  <int>    <dbl>
1 Brazil  2004    1767.
2 Brazil  2005    1744.
3 Brazil  2006    1820.
4 Brazil  2007    1851.
5 Brazil  2008    2071.
6 Brazil  2009    2473.

Antes de elaborar el gráfico se verifica la disponibilidad de información para cada país. Esta comprobación es importante debido a que la cobertura de los datos no es homogénea entre Brasil y Venezuela.

Los datos disponibles abarcan el período 2004–2023 para Brasil, mientras que para Venezuela existen únicamente cinco observaciones entre 2009 y 2013.

Por esta razón, los años para los cuales no existe información de Venezuela no se completan mediante interpolaciones o estimaciones. Se mantienen únicamente las observaciones efectivamente disponibles en la base de FAOSTAT.

Code
# Cobertura de datos por país

cobertura_id <- gasto_id %>%
  group_by(Pais) %>%
  summarise(
    Año_inicio = min(Año, na.rm = TRUE),
    Año_final = max(Año, na.rm = TRUE),
    Observaciones = sum(!is.na(Gasto_ID)),
    .groups = "drop"
  )

cobertura_id
# A tibble: 2 × 4
  Pais                               Año_inicio Año_final Observaciones
  <chr>                                   <int>     <int>         <int>
1 Brazil                                   2004      2023            20
2 Venezuela (Bolivarian Republic of)       2009      2013             5
Code
# Valores disponibles para Venezuela

gasto_id %>%
  filter(Pais == "Venezuela (Bolivarian Republic of)") %>%
  arrange(Año)
# A tibble: 5 × 3
  Pais                                 Año Gasto_ID
  <chr>                              <int>    <dbl>
1 Venezuela (Bolivarian Republic of)  2009     55.7
2 Venezuela (Bolivarian Republic of)  2010     92.0
3 Venezuela (Bolivarian Republic of)  2011     47.5
4 Venezuela (Bolivarian Republic of)  2012    119. 
5 Venezuela (Bolivarian Republic of)  2013     86.2
Code
# Preparar la base definitiva para el gráfico

gasto_id <- gasto_id %>%
  mutate(
    Pais = recode(
      Pais,
      "Brazil" = "Brasil",
      "Venezuela (Bolivarian Republic of)" = "Venezuela"
    )
  ) %>%
  arrange(Pais, Año)


# Comprobar los países y años disponibles
gasto_id %>%
  group_by(Pais) %>%
  summarise(
    Año_inicio = min(Año),
    Año_final = max(Año),
    Observaciones = n(),
    .groups = "drop"
  )
# A tibble: 2 × 4
  Pais      Año_inicio Año_final Observaciones
  <chr>          <int>     <int>         <int>
1 Brasil          2004      2023            20
2 Venezuela       2009      2013             5

El gráfico presenta la evolución del gasto real en investigación y desarrollo agrícola de Brasil y Venezuela. Los valores están expresados en millones de dólares estadounidenses constantes, calculados a precios PPA de 2015.

Code
# Gráfico: Gasto real en I+D agrícola

gasto_id_grafico <- ggplot(gasto_id,
                           aes(x = Año,
                               y = Gasto_ID,
                               color = Pais,
                               group = Pais )) +
  
  geom_line(linewidth = 1.3) +
  
  geom_point(size = 3) +
  
  geom_text_repel(aes(label = paste0(round(Gasto_ID, 1),
        " M$")),
    size = 3.2,
    fontface = "bold",
    show.legend = FALSE,
    box.padding = 0.8,
    point.padding = 0.2,
    max.overlaps = Inf,
    seed = 123) +
  
  scale_color_manual(
    breaks = c("Brasil", "Venezuela"),
    values = c("Brasil" = "#116458",
               "Venezuela" = "#0613CB")) +
  
  scale_x_continuous(
    breaks = seq(2004, 2023, 2),
    expand = expansion(mult = c(0.05, 0.08))) +
  
  scale_y_continuous(
    labels = scales::label_comma()) +
  
  labs(
    title = "Gráfico 6: Gasto real en I+D agrícola",
    subtitle = "Inversión agropecuaria en millones de USD constantes (precios PPA de 2015)",
    x = "Año",
    y = "Millones de USD PPA",
    color = NULL,
    caption = "Fuente: Elaboración propia con datos de FAOSTAT (Dominio AE - ASTI).") +
  
  theme_minimal(base_size = 12) +
  
  theme(
    plot.title = element_text(
      face = "bold",
      size = 13,
      hjust = 0.5,
      margin = margin(b = 10)),
    
    plot.subtitle = element_text(
      size = 10,
      hjust = 0.5,
      margin = margin(b = 15)),
    
    legend.position = "top",
    
    legend.text = element_text(
      size = 11,
      face = "bold"),
    
    axis.title = element_text(
      face = "bold"),
    
    panel.grid.major = element_line(
      linewidth = 0.35,
      color = "grey80"),
    
    panel.grid.minor = element_blank(),
    
    plot.caption = element_text(
      hjust = 0,
      size = 10),
    
    plot.margin = margin(
      t = 25,
      r = 30,
      b = 20,
      l = 20))


gasto_id_grafico 

Identificar la capacidad científica agrícola

Para este análisis se utiliza el dominio AF – Agricultural Science and Technology: ASTI – Researchers de FAOSTAT. Este dominio permite obtener información sobre los investigadores dedicados a actividades de investigación y desarrollo agrícola.

La selección de este indicador permite complementar el análisis realizado en el gráfico anterior sobre el gasto destinado a investigación y desarrollo agrícola.

Code
# Identificar los dominios de FAOSTAT relacionados con investigadores

dominios_investigadores <- df_datasets %>%
  filter(grepl("research|researcher|ASTI",
               paste(DatasetCode, DatasetName),
               ignore.case = TRUE)) %>%
  select(DatasetCode,
         DatasetName,
         FileLocation)

dominios_investigadores
# A tibble: 2 × 3
  DatasetCode DatasetName                                           FileLocation
  <chr>       <chr>                                                 <chr>       
1 AE          Agricultural Science and Technology: ASTI - Expendit… https://bul…
2 AF          Agricultural Science and Technology: ASTI - Research… https://bul…

A partir del catálogo de conjuntos de datos de FAOSTAT se identifican los dominios relacionados con los indicadores de ciencia y tecnología agrícola.

La exploración permite distinguir entre el dominio AE – ASTI – Expenditures, utilizado para analizar el gasto en investigación y desarrollo agrícola, y el dominio AF – ASTI – Researchers, utilizado en este gráfico para analizar la cantidad de investigadores agrícolas.

Code
# Revisar los nombres completos de los dominios AE y AF

dominios_investigadores %>%
  select(DatasetCode,
         DatasetName)
# A tibble: 2 × 2
  DatasetCode DatasetName                                             
  <chr>       <chr>                                                   
1 AE          Agricultural Science and Technology: ASTI - Expenditures
2 AF          Agricultural Science and Technology: ASTI - Researchers 

AF corresponde al conjunto de datos correspondiente a los investigadores agrícolas.

Una vez identificado el dominio AF, se obtiene su ubicación en el catálogo de FAOSTAT y se descarga el archivo correspondiente.

El archivo se descomprime y posteriormente se importa a R. La base resultante se denomina `df_af_raw` y contiene los registros disponibles del dominio ASTI – Researchers.

Code
# Obtener la ubicación del dominio AF - ASTI Researchers

url_af <- df_datasets %>%
  filter(DatasetCode == "AF") %>%
  pull(FileLocation)


# Descargar el archivo
temp_zip_af <- tempfile(fileext = ".zip")
temp_dir_af <- tempdir()

download.file(url_af,
              destfile = temp_zip_af,
              mode = "wb")


# Descomprimir
archivos_af <- unzip(temp_zip_af,
                     exdir = temp_dir_af)


# Identificar el archivo CSV
archivo_csv_af <- archivos_af[grepl("\\.csv$",
                                    archivos_af,
                                    ignore.case = TRUE)][1]


# Leer los datos
df_af_raw <- readr::read_csv(archivo_csv_af,
                             show_col_types = FALSE)

# Estandarizar nombres de columnas
names(df_af_raw) <- tolower(gsub("[ ._]+",
                                 "_",names(df_af_raw)))


# Comprobar dimensiones
dim(df_af_raw)
[1] 3800   18

Antes de seleccionar la variable utilizada en el gráfico, se revisan los indicadores disponibles para Brasil y Venezuela.

Code
# Indicadores disponibles para Brasil y Venezuela
# Dominio AF - ASTI Researchers

df_investigadores <- df_af_raw %>%
  filter(area_code %in% c(21, 236))


indicadores_investigadores <- df_investigadores %>%
  distinct(indicator_code,indicator,
    unit) %>%
  arrange(indicator_code)


DT::datatable(indicadores_investigadores,
  options = list(pageLength = 10,
                 scrollX = TRUE),
  rownames = FALSE)

El indicador a utilizar será el 8100, ya que corresponde al número de investigadores agrícolas expresados en equivalentes a tiempo completo (FTE).

Code
# Seleccionar investigadores agrícolas en equivalente a tiempo completo (FTE)

investigadores <- df_af_raw %>%
  filter(area_code %in% c(21, 236),
         indicator_code == 8100) %>%
  select(Pais = area,
         Año = year,
         Investigadores_FTE = value) %>%
  mutate(Año = as.integer(Año),
         Investigadores_FTE = as.numeric(Investigadores_FTE))

# Revisar las primeras observaciones
head(investigadores)
# A tibble: 6 × 3
  Pais     Año Investigadores_FTE
  <chr>  <int>              <dbl>
1 Brazil  2004              4950.
2 Brazil  2005              5228.
3 Brazil  2006              5359.
4 Brazil  2007              5296.
5 Brazil  2008              5297.
6 Brazil  2009              5262.

Se seleccionan los registros correspondientes a Brasil y Venezuela y se conserva exclusivamente el indicador 8100.

Antes de elaborar el gráfico se verifica la disponibilidad temporal de los datos para ambos países.

Code
# Cobertura de datos por país

cobertura_investigadores <- investigadores %>%
  group_by(Pais) %>%
  summarise(
    Año_inicio = min(Año, na.rm = TRUE),
    Año_final = max(Año, na.rm = TRUE),
    Observaciones = sum(!is.na(Investigadores_FTE)),
    .groups = "drop")

cobertura_investigadores
# A tibble: 2 × 4
  Pais                               Año_inicio Año_final Observaciones
  <chr>                                   <int>     <int>         <int>
1 Brazil                                   2004      2023            20
2 Venezuela (Bolivarian Republic of)       2007      2023             8
Code
investigadores <- investigadores %>%
  mutate(Pais = recode(Pais,
                       "Brazil" = "Brasil",
                       "Venezuela (Bolivarian Republic of)" = "Venezuela")) %>%
  arrange(Pais, Año)


# Verificar resultado

unique(investigadores$Pais)
[1] "Brasil"    "Venezuela"
Code
grafico_investigadores <- function(datos){
  
  # Seleccionar años importantes para etiquetas
  etiquetas <- datos %>%
    filter(
      Año %in% c(2004, 2006, 2008, 2010,
                 2012, 2014, 2016, 2018,
                 2020, 2023))
  
  
  ggplot(datos,aes(x = Año,
                   y = Investigadores_FTE,
                   color = Pais,
                   group = Pais)) +
    
    # Líneas
    geom_line(linewidth = 1.3, na.rm = TRUE) +
    
    # Puntos
    geom_point(size = 3) +
    
    # Etiquetas
    geom_text_repel(data = etiquetas,
                    aes(label = paste0(
                      format(round(Investigadores_FTE, 0),
                             big.mark = ".",
                             decimal.mark = ",",
                             scientific = FALSE),
                      " FTE")),
      size = 3.2,
      fontface = "bold",
      box.padding = 0.8,
      point.padding = 0.2,
      max.overlaps = Inf,
      seed = 123) +
    
    # Colores
    scale_color_manual(
      values = c("Brasil" = "#116458",
                 "Venezuela" = "#0613CB")) +
    
    # Eje X
    scale_x_continuous(
      breaks = seq(2004, 2024, 2),
      expand = expansion(
        mult = c(0.05, 0.08))) +
    
    # Eje Y
    scale_y_continuous(
      labels = label_comma(
        big.mark = ".",
        decimal.mark = ",")) +
    
    # Títulos y fuente
    labs(
      title = "Gráfico 7: Capacidad científica agrícola (2004-2023)",
      subtitle = "Investigadores agrícolas en equivalente a tiempo completo (FTE)",
      x = "Año",
      y = "Investigadores FTE",
      color = NULL,
      caption = "Fuente: Elaboración propia con datos de FAOSTAT (Dominio AF - ASTI).") +
    
    # Tema
    theme_minimal(base_size = 12) +
    theme(
      plot.title = element_text(
        face = "bold",
        size = 14,
        hjust = 0.5),
      plot.subtitle = element_text(
        size = 12,
        hjust = 0.5),
      legend.position = "top",
      legend.text = element_text(
        size = 12,
        face = "bold"),
      axis.title = element_text(
        face = "bold"),
      panel.grid.major = element_line(
        linewidth = 0.35,
        color = "grey80"),
      panel.grid.minor = element_blank(),
      plot.caption = element_text(
        hjust = 0,
        size = 10),
      plot.margin = margin(
        t = 25,
        r = 30,
        b = 20,
        l = 20))}


# Generar el Gráfico 7

grafico_investigadores(investigadores)