Este Cuaderno de notas para el curso de geomatica ilustra como obtener estadisticas de multiples años para un grupo de cultivos dado en cualquier departamento. Usaremos como principal fuente de datos las Evaluaciones Agropecuarias Municipales (EVA), un set de datos agricolas del 2007-2018 otorgado por el Ministerio de Agricultura y Desarrollo Rural.
En este paso, intalaremos y cargaremos las librerias de R requeridas.
# correr las siguientes lineas desde la ventana de comando:
#install.packages('dplyr')
#install.packages('readxl')
#install.packages('sf')
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.1 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.3 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
library(readr)
library(ggplot2)
Dirigete hacia https://www.datos.gov.co/Agricultura-y-Desarrollo-Rural/Evaluaciones-Agropecuarias-Municipales-EVA/2pnw-mmge/data para encontrar el set de datos.
En el sitio web vinculado (i.e datos.gov.co), visualiza los datos y aplica un filtro para obtener unicamente la informacion correspondiente a su departamento. Luego exporte los datos a formato cvs.
Ahora ve al directorio de descargas para encontrar el archivo Evaluaciones_Agropecuarias_Municipales_EVA.csv. Muevelo a tu directorio de trabajo.
list.files("./datos", pattern=c('csv'))
## [1] "Evaluaciones_Agropecuarias_Municipales_EVA_20261028.csv"
Ahora vamos a proceder con la lectura del set de datos Eva 2007-2018:
# ajusta la ruta del archivo según tus propios datos
(eva = read_csv("C:/GB02-20260909T121559Z-1-001/GB02/R proyecto 2/datos/Evaluaciones_Agropecuarias_Municipales_EVA_20261028.csv", col_names = TRUE,
show_col_types = FALSE))
Mira la tabla y confirma que contiene distintas estadisticas para diferentes años. ¿Puedes decir cual es el periodo de tiempo para estos datos?
# la funcion range aplicada a la columna AÑO de la tabla eva
rango <- range(eva$AÑO)
rango
## [1] 2006 2018
Es muy importante conocer cuales nombre puede “ver” el software. Puede ser diferente a lo que 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"
Vamos a elegir algunos atributos para limpiar el objeto EVA:
# revisa la salida del objeto em el ultimo chunk y cambia los nombres de atributo de acuerdo a tus propios datos
# cambia el nombre de los atributos de acuerdo a tus datos
eva %>% dplyr::select('CÓD. MUN.':'ESTADO FISICO PRODUCCION') -> eva.tmp
eva.tmp
Revisa la salida y verifica que solo fueron seleccionadas las columnas relevantes.
Ahora, cambia nombres para varias columnas que contengan caracteres vacios o ‘ruidosos’:
# asegurate de usar los nombre de las columnas que estan en tu objeto eva.tmp
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 Sembrada\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
Revisemos la salida:
new_eva
Chequea la tabla arriva y verifica que los atributos cuantitativos estan guardados como tipos de datos numéricos (no como tipos de datos de cadena).
Muchos de las tareas de analisis de datos se pueden abordar usando el paradigma divide-aplica-combina: dividir los datos en grupos, aplicar algunos analisis a cada grupo, y entonces combinar los resultados.
La libreria de dplyr hace esto muy sencillo a traves del uso de la funcion group_by(), la cual divide los datos en grupos. Cuando los datos estan agrupados de esta forma, summarize() puede ser usada para contraer cada grupo en un resumen de una sola fila. summarize() hace esto al aplicar una funcion de agregacion o resumen para cada grupo.
Por ejemplo, si queremos encontrar la produccion total de cultivo por grupos, debemos ecribir:
## solo por grupo
new_eva %>%
group_by(Grupo)
## por grupo y resumido
new_eva %>%
## filtro (produccion > 0) %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion)) %>%
arrange (desc(total_produccion))
note que la produccion total contiene la suma de produccion de cada grupo de cultivo entre 2007 y 2018. En Boyacá, los 2 cultivos con la produccion mas alta fueron “tuberculos y platanos” y “hortalizas”.
Para guardar la produccion total en un objeto:
new_eva %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion)) -> PT
Para filtrar los cultivos mas importantes:
PT %>%
filter(total_produccion > 1000000) -> main.groups
main.groups %>%
arrange(desc(total_produccion))
Para conocer la produccion total de los principales grupos de productores:
(value=sum(main.groups$total_produccion))
## [1] 19212405
Para agregar un nuevo atributo con el porcentaje de produccion total:
main.groups$percent = main.groups$total_produccion/value
Para crear un grafico de torta de la produccion total de los grupos principales:
library(ggplot2)
# Barplot
bp<- ggplot(main.groups, aes(x="", y=percent, fill=Grupo))+
geom_bar(width = 1, stat = "identity")
# Piechart
pie <- bp + coord_polar("y", start=0)
pie
Para hallar cuales son los municipios encabezando la produccion para cada cultivo desde 2007 a 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 mas importantes desde el punto de vista agronomico:
leaders %>%
filter(total_prod > 50000) -> main.leaders
main.leaders %>%
arrange(desc(total_prod))
Vamos a graficar los lideres filtrados:
# Basic barplot
p<-ggplot(data=main.leaders, aes(x=MUNICIPIO, y=total_prod)) +
geom_bar(stat="identity")
p
## para saber que categoria usar
unique(new_eva$CULTIVO)
## [1] "ACELGA" "ACHIRA" "AGRAZ"
## [4] "AGUACATE" "AHUYAMA" "AJI"
## [7] "AJO" "ALBAHACA" "ALFALFA"
## [10] "APIO" "ARAZA" "ARRACACHA"
## [13] "ARVEJA" "AVENA" "BANANITO"
## [16] "BANANO" "BREVO" "BOROJO"
## [19] "BROCOLI" "CACAO" "CADUCIFOLIOS"
## [22] "CAFE" "CALABACIN" "CALABAZA"
## [25] "CAÑA MIEL" "CAÑA PANELERA" "CEBADA"
## [28] "CEBOLLA DE BULBO" "CENTENO" "CEBOLLA DE RAMA"
## [31] "CHACHAFRUTO" "CHAMBA" "CHIRIMOYA"
## [34] "CIRUELA" "CHONQUE" "CITRICOS"
## [37] "CILANTRO" "CLAVEL" "CURUBA"
## [40] "COLIFLOR" "DATIL" "DURAZNO"
## [43] "ESPARTO" "ESPINACA" "FEIJOA"
## [46] "FIQUE" "FLORES Y FOLLAJES" "FRESA"
## [49] "FRIJOL" "FRUTALES VARIOS" "GARBANZO"
## [52] "GIRASOL" "GRANADILLA" "GUANABANA"
## [55] "GUANDUL" "GUATILA" "GUAYABA"
## [58] "GULUPA" "HABA" "HABICHUELA"
## [61] "HELICONIA" "HIGO" "HORTALIZAS VARIAS"
## [64] "LAUREL" "LECHUGA" "LENTEJA"
## [67] "LIMON" "LULO" "MAIZ FORRAJERO"
## [70] "MAIZ" "MALANGA" "MAMONCILLO"
## [73] "MANDARINA" "MANGO" "MANGOSTINO"
## [76] "MANI" "MANZANA" "MARACUYA"
## [79] "MELON" "MENTA" "MORA"
## [82] "NABO" "NARANJA" "ORELLANA"
## [85] "PAPA" "PAPAYA" "PAPAYUELA"
## [88] "PATILLA" "PEPINO COHOMBRO" "PERA"
## [91] "PEPINO GUISO" "PEREJIL" "PIMENTON"
## [94] "PIÑA" "PITAHAYA" "PLANTAS AROMATICAS"
## [97] "QUINUA" "PLANTAS MEDICINALES" "PLATANO"
## [100] "CRISANTEMO" "REMOLACHA" "REPOLLO"
## [103] "ROSA" "RUBA" "RUDA"
## [106] "SABILA" "SACHA INCHI" "TABACO NEGRO"
## [109] "TABACO RUBIO" "TRIGO" "TOMATE"
## [112] "TOMATE DE ARBOL" "UCHUVA" "UVA"
## [115] "YACON" "YUCA" "ZANAHORIA"
## [118] "ZAPOTE"
new_eva %>%
filter(MUNICIPIO=="AQUITANIA" & CULTIVO=="CEBOLLA DE RAMA") %>%
group_by(Year, CULTIVO) %>%
select(MUNICIPIO, CULTIVO, Produccion, Year) -> aquitania_cebolla
Miremos la salida:
aquitania_cebolla
Rapidamente hagamos un grafico de la produccion de cebolla en Aquitania para todo el periodo de tiempo cubierto por el set de datos EVA:
g <- ggplot(aes(x=Year, y=Produccion/1000), data = aquitania_cebolla) + geom_bar(stat='identity') + labs(y='Produccion de Cebolla [Ton x 1000]')
añada un titulo y visualise:
g + ggtitle("Evolucion del cultivo de Cebolla de Rama en Aquitania desde 2007 hasta 2018") + labs(caption= "Basado en EVA data (Minagricultura, 2020)")
El profe ilustro algunos ejemplos de analisis. Yo podria analizar otras variables ademas de produccion.
En tu cuaderno de notas, cita este trabajo como Lizarazo, I., 2022. Understanding dynamic productivity of crops. Available at https://rpubs.com/ials2un/production_dyn_v1.
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_Mexico.utf8 LC_CTYPE=Spanish_Mexico.utf8
## [3] LC_MONETARY=Spanish_Mexico.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Mexico.utf8
##
## time zone: America/Bogota
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] lubridate_1.9.5 forcats_1.0.1 stringr_1.6.0 dplyr_1.2.1
## [5] purrr_1.2.2 readr_2.2.0 tidyr_1.3.2 tibble_3.3.1
## [9] ggplot2_4.0.3 tidyverse_2.0.0
##
## loaded via a namespace (and not attached):
## [1] bit_4.6.0 gtable_0.3.6 jsonlite_2.0.0 crayon_1.5.3
## [5] compiler_4.6.1 tidyselect_1.2.1 parallel_4.6.1 jquerylib_0.1.4
## [9] scales_1.4.0 yaml_2.3.12 fastmap_1.2.0 R6_2.6.1
## [13] labeling_0.4.3 generics_0.1.4 knitr_1.52 bslib_0.12.0
## [17] pillar_1.11.1 RColorBrewer_1.1-3 tzdb_0.5.0 rlang_1.3.0
## [21] stringi_1.8.9 cachem_1.1.0 xfun_0.62 sass_0.4.10
## [25] S7_0.2.2 bit64_4.8.6 otel_0.2.0 timechange_0.4.0
## [29] cli_3.6.6 withr_3.0.3 magrittr_2.0.5 digest_0.6.39
## [33] grid_4.6.1 vroom_1.7.1 rstudioapi_0.19.0 hms_1.1.4
## [37] lifecycle_1.0.5 vctrs_0.7.3 evaluate_1.0.5 glue_1.8.1
## [41] farver_2.1.2 rmarkdown_2.32 tools_4.6.1 pkgconfig_2.0.3
## [45] htmltools_0.5.9