En este tercer cuaderno de R Markdown del curso de
Geomática Básica 2026 analizaremos las estadisticas de varios años para
un grupo determinado de cultivos en el departamento del meta.
Utilizaremos como fuente principal de datos las Evaluaciones
Agropecuarias Municipales (EVA), un conjunto de datos agrícolas
del periodo 2007-2018 proporcionado por el Ministerio de Agricultura y
Desarrollo Rural.
En este paso, instalaremos y cargaremos las bibliotecas de R necesarias.
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readxl)
library(sf)
## Linking to GEOS 3.14.1, GDAL 3.12.1, PROJ 9.7.1; sf_use_s2() is TRUE
Ingresamos a Evaluaciones Agropecuarias Municipales (EVA) para encontrar el conjunto de datos.
En el sitio web enlazado (datos.gov.co), visualiza los datos y aplica un filtro para obtener únicamente la información correspondiente al departamento del Meta. Luego, exporta los datos en formato CSV.
Ahora, dirígete a la carpeta de descargas para localizar el archivo Evaluaciones_Agropecuarias_Municipales_EVA.csv. Muévelo a tu directorio de trabajo.
list.files("./datos", pattern = "csv")
## [1] "Evaluaciones_Agropecuarias_Municipales_EVA_20261022.csv"
library(readr)
eva <- read_csv(
"./datos/Evaluaciones_Agropecuarias_Municipales_EVA_20261022.csv",
show_col_types = FALSE
)
eva <- read_csv(
"C:/Users/juane/OneDrive/Documentos/datos/Evaluaciones_Agropecuarias_Municipales_EVA_20261022.csv",
col_names = TRUE,
show_col_types = FALSE
)
head(eva)
Observa la tabla y confirma que contiene estadísticas agrícolas de diferentes años. ¿Puedes decir cuál es el período de tiempo que abarcan estos datos?nnEs muy importante conocer los nombres que reconoce el programa. Estos pueden ser diferentes de los que nosotros vemos. Vamos a averiguarlo:
names(eva)
## [1] "CÓD. \nDEP."
## [2] "DEPARTAMENTO"
## [3] "CÓD. MUN."
## [4] "MUNICIPIO"
## [5] "GRUPO \nDE CULTIVO"
## [6] "SUBGRUPO \nDE CULTIVO"
## [7] "CULTIVO"
## [8] "DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO"
## [9] "AÑO"
## [10] "PERIODO"
## [11] "Área Sembrada\n(ha)"
## [12] "Área Cosechada\n(ha)"
## [13] "Producción\n(t)"
## [14] "Rendimiento\n(t/ha)"
## [15] "ESTADO FISICO PRODUCCION"
## [16] "NOMBRE \nCIENTIFICO"
## [17] "CICLO DE CULTIVO"
Seleccionemos algunos atributos para limpiar el objeto eva.
library(dplyr)
eva %>%
dplyr::select('CÓD. MUN.':'ESTADO FISICO PRODUCCION') -> eva.tmp
eva.tmp
Ahora, cambia los nombres de varias columnas que contienen caracteres vacíos o «ruidosos» (caracteres que pueden dificultar su uso en el código).
eva.tmp %>%
dplyr::rename(
Cod_Mun = `CÓD. MUN.`,
Grupo = `GRUPO \nDE CULTIVO`,
Subgrupo = `SUBGRUPO \nDE CULTIVO`,
Year = AÑO,
AreaSembrada = `Área Sembrada\n(ha)`,
AreaCosechada = `Área Cosechada\n(ha)`,
Produccion = `Producción\n(t)`,
Rendimiento = `Rendimiento\n(t/ha)`,
Sistema = `DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO`,
Estado = `ESTADO FISICO PRODUCCION`
) -> new_eva
new_eva$Produccion <- as.numeric(new_eva$Produccion)
## Warning: NAs introducidos por coerción
new_eva
Revisa la tabla anterior y verifica que los atributos cuantitativos estén almacenados como tipos de datos numéricos y no como cadenas de texto.
Muchas tareas de análisis de datos se pueden abordar mediante el paradigma dividir-aplicar-combinar: dividir los datos en grupos, aplicar un análisis a cada grupo y, finalmente, combinar los resultados.
La biblioteca dplyr facilita mucho este proceso mediante la función group_by(), que divide los datos en grupos. Cuando los datos están agrupados de esta manera, se puede utilizar summarize() para resumir cada grupo en una sola fila. Esta función lo hace aplicando una función de agregación o resumen a cada grupo. # 5.1 Los cultivos más importantes entre 2007 y 2018 La producción total corresponde a la suma de la producción registrada para cada grupo de cultivos en el departamento del Meta durante el período de 2007 a 2018. A partir de estos datos, identificaremos los grupos de cultivos que tienen la mayor producción total.
new_eva %>%
group_by(Grupo) %>%
summarize(
total_produccion = sum(Produccion, na.rm = TRUE)
) %>%
arrange(desc(total_produccion))
new_eva$Produccion <- as.numeric(new_eva$Produccion)
sum(is.na(new_eva$Produccion))
## [1] 3
new_eva %>%
filter(is.na(Produccion))
new_eva %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion, na.rm = TRUE)) %>%
arrange(desc(total_produccion))
la producción total corresponde a la suma de la producción de cada grupo de cultivos entre 2007 y 2018. En Meta, los dos grupos de cultivos con mayor producción fueron «Frutales» y «Tubérculos y cereales».
Para guardar la producción total en un objeto:
new_eva %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion, na.rm = TRUE)) -> PT
PT
Para filtrar los cultivos más importantes.
PT %>%
arrange(desc(total_produccion))
PT %>%
filter(total_produccion > 100000) -> main.groups
main.groups
Para conocer la producción total de los principales grupos de cultivos:
(value = sum(main.groups$total_produccion))
## [1] 733830.5
Este paso permite calcular qué proporción de la producción total de los principales grupos de cultivos del Meta corresponde a cada grupo seleccionado.
main.groups$percent = main.groups$total_produccion/value
library(ggplot2)
Para crear un gráfico circular de la producción total de los principales grupos de cultivos del Meta:
library(ggplot2)
# Gráfico de barras
bp <- ggplot(main.groups, aes(x = "", y = percent, fill = Grupo)) +
geom_bar(width = 1, stat = "identity")
# Gráfico circular
pie <- bp + coord_polar("y", start = 0)
pie
#5.2. Municipios con mayor producción para cada grupo de cultivos Primero, vamos a identificar los municipios del Meta que registran la mayor producción agrícola para cada grupo de cultivos durante el período de 2007 a 2018.
Para identificar los municipios que lideran la producción de cada grupo de cultivos entre 2007 y 2018:
new_eva %>%
group_by(Grupo, MUNICIPIO) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
slice(which.max(total_prod)) %>%
arrange(desc(total_prod))
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by Grupo and MUNICIPIO.
## ℹ Output is grouped by Grupo.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(Grupo, MUNICIPIO))` for per-operation grouping
## (`?dplyr::dplyr_by`) instead.
Para guardar el objeto:
new_eva %>%
group_by(Grupo, MUNICIPIO) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
slice(which.max(total_prod)) -> leaders
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by Grupo and MUNICIPIO.
## ℹ Output is grouped by Grupo.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(Grupo, MUNICIPIO))` for per-operation grouping
## (`?dplyr::dplyr_by`) instead.
leaders
Para filtrar los municipios más importantes desde el punto de vista agrícola:
leaders %>%
filter(total_prod > 50000) -> main.leaders
main.leaders
leaders %>%
arrange(desc(total_prod))
Para filtrar los municipios más importantes desde el punto de vista agrícola en el Meta:
leaders %>%
filter(total_prod > 10000) -> main.leaders
main.leaders
Para representar gráficamente los municipios líderes que hemos filtrado: El gráfico de barras permitirá comparar la producción de los cuatro municipios seleccionados. Cada barra representa la producción total del grupo de cultivos en el municipio que lidera ese grupo.
# Gráfico de barras básico
p <- ggplot(data = main.leaders, aes(x = MUNICIPIO, y = total_prod)) +
geom_bar(stat = "identity")
p
Ahora vamos a estudiar cómo ha cambiado la producción de un cultivo específico a lo largo del tiempo en un municipio del Meta.
new_eva %>%
group_by(MUNICIPIO, CULTIVO) %>%
summarize(total_produccion = sum(Produccion, na.rm = TRUE)) %>%
arrange(desc(total_produccion))
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by MUNICIPIO and CULTIVO.
## ℹ Output is grouped by MUNICIPIO.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(MUNICIPIO, CULTIVO))` for per-operation grouping
## (`?dplyr::dplyr_by`) instead.
Esto nos permite identificar un cultivo con producción relevante en el Meta que es el maiz y elegirlo para analizar su evolución entre 2007 y 2018.
new_eva %>%
filter(MUNICIPIO == "SAN JUAN DE ARAMA" & CULTIVO == "MAIZ") %>%
group_by(Year, CULTIVO) %>%
select(MUNICIPIO, CULTIVO, Produccion, Year) -> sanjuan_maiz
Para revisar los resultados:
sanjuan_maiz
Para representar la producción de maíz en San Juan de Arama durante el período cubierto por los datos EVA:
g <- ggplot(data = sanjuan_maiz,
aes(x = Year, y = Produccion / 1000)) +
geom_bar(stat = "identity") +
labs(y = "Producción de maíz [miles de toneladas]")
g
g + ggtitle("Evolución de la producción de maíz en San Juan de Arama, Meta, entre 2007 y 2018") +
labs(caption = "Fuente: datos EVA de MinAgricultura")
información de tu sesión de R, como la versión de R y los paquetes utilizados:
sessionInfo()
## R version 4.6.1 (2026-06-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
##
## Matrix products: default
## LAPACK version 3.12.1
##
## locale:
## [1] LC_COLLATE=Spanish_Spain.utf8 LC_CTYPE=Spanish_Spain.utf8
## [3] LC_MONETARY=Spanish_Spain.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Spain.utf8
##
## time zone: America/Bogota
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] ggplot2_4.0.3 readr_2.2.0 sf_1.1-3 readxl_1.6.0 dplyr_1.2.1
##
## loaded via a namespace (and not attached):
## [1] sass_0.4.10 generics_0.1.4 class_7.3-23 KernSmooth_2.23-26
## [5] hms_1.1.4 digest_0.6.39 magrittr_2.0.5 RColorBrewer_1.1-3
## [9] evaluate_1.0.5 grid_4.6.1 fastmap_1.2.0 cellranger_1.1.0
## [13] jsonlite_2.0.0 e1071_1.7-17 DBI_1.3.0 scales_1.4.0
## [17] jquerylib_0.1.4 cli_3.6.6 rlang_1.3.0 crayon_1.5.3
## [21] units_1.0-1 bit64_4.8.6 withr_3.0.3 cachem_1.1.0
## [25] yaml_2.3.12 tools_4.6.1 parallel_4.6.1 tzdb_0.5.0
## [29] vctrs_0.7.3 R6_2.6.1 proxy_0.4-29 lifecycle_1.0.5
## [33] classInt_0.4-11 bit_4.6.0 vroom_1.7.1 pkgconfig_2.0.3
## [37] pillar_1.11.1 bslib_0.12.0 gtable_0.3.6 glue_1.8.1
## [41] Rcpp_1.1.2 xfun_0.61 tibble_3.3.1 tidyselect_1.2.1
## [45] rstudioapi_0.19.0 knitr_1.52 farver_2.1.2 htmltools_0.5.9
## [49] labeling_0.4.3 rmarkdown_2.32 compiler_4.6.1 S7_0.2.2