Análisis de Información Geográfica y Espacial
Maestría en Ciencia de Datos
Pontificia Universidad Javeriana de Cali
Con el objetivo de construir mapas de aptitud climática para el cultivo de la caña de azúcar, se descargaron los datos de precipitación y temperatura de la fuente de datos abierta y confiable WorldClim Global. Estos datos proporcionan información climática precisa y actualizada a nivel global, lo que permite realizar un análisis detallado sobre las zonas con condiciones óptimas para el cultivo. Los mapas de temperatura media anual y precipitación media anual generados a partir de estos datos permiten obtener un primer bosquejo de las regiones que podrían ser más aptas para el cultivo de la caña de azúcar con condiciones ideales de cultivo, donde la temperatura debe oscilar entre 22.5 y 28.0 °C y la precipitación debe estar entre 125 y 250 mm mensuales, o entre 1500 y 3500 mm anuales.
El análisis inicial muestra que las zonas con mayor potencial para el cultivo de la caña de azúcar suelen ubicarse en regiones tropicales y subtropicales, especialmente en América Latina, el Sudeste Asiático y algunas áreas de África. Según datos históricos y estudios agrícolas, los principales países productores de caña de azúcar incluyen Colombia, Brasil, India, China, Tailandia y México. Estos países se caracterizan por tener climas cálidos y húmedos, con temperaturas favorables durante todo el año y una distribución de precipitaciones adecuada para el crecimiento continuo del cultivo.
Brasil es el principal productor mundial de caña de azúcar, gracias a sus vastas regiones cálidas y la presencia de lluvias bien distribuidas. India, que ocupa el segundo lugar en producción, se beneficia de un clima monzónico que aporta precipitaciones significativas durante la temporada de cultivo. En Tailandia y China, el cultivo de caña de azúcar se concentra en regiones con estaciones húmedas y cálidas. En México, las áreas del Golfo y el sur del país presentan condiciones favorables debido a sus climas cálidos y la precipitación abundante durante varios meses del año. En Colombia, el clima cálido y húmedo del Valle del Cauca, con temperaturas promedio entre 22.5 y 28 °C y precipitaciones anuales entre 1500 y 3500 mm, hace que esta zona sea ideal para el cultivo de caña de azúcar durante todo el año por lo que la industria azucarera colombiana no solo abastece el mercado interno, sino que también exporta azúcar y productos derivados a diversos países.
temp_min <- 22.5
temp_max <- 28.0
prec_min_anual <- 1500
prec_max_anual <- 3500
prec_min_mensual <- 125
prec_max_mensual <- 250
clima_temp <- worldclim_global(var = 'tavg', res = 10, path = tempdir())
clima_prec <- worldclim_global(var = 'prec', res = 10, path = tempdir())
meses <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
puntos <- data.frame(nombre = c("Cali", "Palmira", "Buga"),
lat = c(3.4516, 3.5394, 3.9022),
lon = c(-76.5320, -76.2975, -76.2970))
# Crear el promedio anual de temperatura y precipitación
temp_anual <- mean(clima_temp)
prec_anual <- sum(clima_prec) / 12
# Convertir los rasters a data frames para ggplot2
temp_df <- as.data.frame(temp_anual, xy = TRUE)
colnames(temp_df) <- c("lon", "lat", "temp")
prec_df <- as.data.frame(prec_anual, xy = TRUE)
colnames(prec_df) <- c("lon", "lat", "prec")
# Graficar el mapa de temperatura
ggplot(temp_df, aes(x = lon, y = lat, fill = temp)) +
geom_tile() +
scale_fill_viridis_c(option = "plasma", name = "Temperatura (°C)") +
labs(title = "Mapa Global de Temperatura Media Anual") +
coord_fixed() +
theme_minimal()
# Graficar el mapa de precipitación
ggplot(prec_df, aes(x = lon, y = lat, fill = prec)) +
geom_tile() +
scale_fill_viridis_c(option = "inferno", name = "Precipitación (mm)") +
labs(title = "Mapa Global de Precipitación Media Anual") +
coord_fixed() +
theme_minimal()
Para determinar los países con mayor potencial para el cultivo de caña de azúcar, se realizó un análisis basado en las condiciones climáticas óptimas para este cultivo. Se establecieron criterios específicos de temperatura y precipitación que deben cumplirse durante al menos nueve meses al año para considerar una región como apta.Luego, se analizaron los datos climáticos globales de temperatura y precipitación mes a mes, identificando aquellas regiones que cumplían simultáneamente con los rangos óptimos definidos. Posteriormente, se combinaron los resultados de todos los meses para identificar aquellas zonas que mantienen condiciones favorables durante la mayor parte del año.
El resultado del análisis permitió identificar los países que cuentan con la mayor cantidad de regiones aptas para el cultivo de caña de azúcar. Entre estos países destacan Brasil, Colombia, Cameroon, República Dominicana, Indonesia y la República Democrática del Congo, los cuales se presentan en el mapa con un color verde intenso, indicando su alta aptitud climática para la producción de caña.
# Número mínimo de meses que deben cumplir los criterios para considerar apto
min_meses <- 9
# Inicializar una lista de rasters para almacenar los meses aptos
aptitud_mensual <- list()
# Evaluar mes a mes si cumplen los criterios de temperatura y precipitación
for (mes in 1:12) {
# Evaluar la temperatura mensual
aptitud_temp <- (clima_temp[[mes]] >= temp_min) & (clima_temp[[mes]] <= temp_max)
# Evaluar la precipitación mensual
aptitud_prec <- (clima_prec[[mes]] >= prec_min_mensual) & (clima_prec[[mes]] <= prec_max_mensual)
# Determinar si el mes es apto combinando ambos criterios
aptitud_mensual[[mes]] <- aptitud_temp & aptitud_prec
}
# Combinar las capas de los 12 meses en un solo objeto raster
aptitud_raster <- do.call(c, aptitud_mensual)
# Calcular la suma de meses aptos para cada celda
aptitud_sum <- sum(aptitud_raster)
# Crear una máscara para las regiones que cumplen en al menos 'min_meses' meses
aptitud_temp_anual <- aptitud_sum >= min_meses
# Convertir el raster de aptitud a un objeto espacial (polígonos)
aptitud_sf <- as.polygons(aptitud_temp_anual)
aptitud_sf <- st_as_sf(aptitud_sf)
# Corregir geometrías inválidas
aptitud_sf <- st_make_valid(aptitud_sf)
# Filtrar solo las geometrías válidas
aptitud_sf <- aptitud_sf[st_is_valid(aptitud_sf), ]
# Descargar los límites de los países
countries <- ne_countries(scale = "medium", returnclass = "sf")
# Realizar la intersección para obtener los países con zonas óptimas
intersected <- st_intersection(aptitud_sf, countries)
# Calcular el área de zonas aptas por país
aptitud_summary <- intersected %>%
group_by(name) %>%
summarize(
zona_optima = n() # Cantidad de zonas aptas
) %>%
arrange(desc(zona_optima))
# Mostrar la tabla resumen
print(aptitud_summary)
## Simple feature collection with 241 features and 2 fields
## Geometry type: GEOMETRY
## Dimension: XY
## Bounding box: xmin: -180 ymin: -89.99893 xmax: 180 ymax: 83.59961
## Geodetic CRS: WGS 84
## # A tibble: 241 × 3
## name zona_optima geometry
## <chr> <int> <GEOMETRY [°]>
## 1 Brazil 2 MULTIPOLYGON (((-50.83301 2.666667, -50.827…
## 2 Cameroon 2 POLYGON ((16.05928 2.772998, 16.08213 2.678…
## 3 Central African Rep. 2 POLYGON ((16.1834 2.270068, 16.13613 2.3637…
## 4 Colombia 2 MULTIPOLYGON (((-72.58672 -2.365137, -72.62…
## 5 Congo 2 POLYGON ((17.10762 -1.064453, 16.97471 -1.1…
## 6 Dem. Rep. Congo 2 POLYGON ((18.59668 3.678711, 18.63369 3.954…
## 7 Dominica 2 POLYGON ((-61.32002 15.58506, -61.27725 15.…
## 8 Dominican Rep. 2 POLYGON ((-69.5 19.31569, -69.32495 19.3277…
## 9 Ecuador 2 MULTIPOLYGON (((-80.27217 -2.951758, -80.24…
## 10 Fr. Polynesia 2 MULTIPOLYGON (((-140.6854 -18.37988, -140.6…
## # ℹ 231 more rows
# Seleccionar los 3 países con mayor área de aptitud
top_paises <- aptitud_summary %>%
slice_max(zona_optima, n = 3)
# Filtrar el objeto espacial para estos países
paises_sf <- countries %>% filter(name %in% top_paises$name)
# Graficar el mapa de los países con mayor potencial
plot(st_geometry(countries), col = "lightgray", main = "Países con Mayor Potencial para Caña de Azúcar")
plot(st_geometry(paises_sf), col = "darkgreen", add = TRUE)
# Número mínimo de meses que deben cumplir los criterios para considerar apto
min_meses <- 9
# Inicializar una lista de rasters para almacenar los meses aptos
aptitud_mensual <- list()
# Evaluar mes a mes si cumplen los criterios de temperatura y precipitación
for (mes in 1:12) {
# Evaluar la temperatura mensual
aptitud_temp <- (clima_temp[[mes]] >= temp_min) & (clima_temp[[mes]] <= temp_max)
# Evaluar la precipitación mensual
aptitud_prec <- (clima_prec[[mes]] >= prec_min_mensual) & (clima_prec[[mes]] <= prec_max_mensual)
# Determinar si el mes es apto combinando ambos criterios
aptitud_mensual[[mes]] <- aptitud_temp & aptitud_prec
}
# Combinar las capas de los 12 meses en un solo objeto raster
aptitud_raster <- do.call(c, aptitud_mensual)
# Calcular la suma de meses aptos para cada celda
aptitud_sum <- sum(aptitud_raster)
# Convertir el raster de aptitud a un data frame
aptitud_df <- as.data.frame(aptitud_sum, xy = TRUE)
colnames(aptitud_df) <- c("lon", "lat", "meses_aptos")
# Descargar los límites de los países
countries <- ne_countries(scale = "medium", returnclass = "sf")
# Crear el mapa usando ggplot2
ggplot(data = aptitud_df, aes(x = lon, y = lat)) +
geom_tile(aes(fill = meses_aptos)) +
scale_fill_gradient(low = "lightyellow", high = "darkgreen", name = "Meses Aptos") +
ggtitle("Mapa de Zonas Aptas para Caña de Azúcar (Número de Meses Aptos)") +
theme_minimal() +
coord_fixed()
Las gráficas presentadas muestran la variación mensual de la temperatura y la precipitación en tres localidades del Valle del Cauca: Buga, Cali y Palmira. En la gráfica de temperatura, se observa que Palmira presenta consistentemente las temperaturas más altas durante el año, alcanzando picos cercanos a los 23°C en los primeros meses, mientras que hacia finales del año las temperaturas tienden a disminuir ligeramente. Buga, por su parte, muestra temperaturas ligeramente más bajas en comparación con Palmira, con un rango que fluctúa alrededor de los 22°C en los meses más cálidos. Cali registra las temperaturas más bajas de las tres localidades, con valores promedio cercanos a los 20°C durante gran parte del año.
# Inicializar los data frames
temp_series <- data.frame(Punto = character(), Mes = factor(levels = meses), Temperatura = numeric(), stringsAsFactors = FALSE)
prec_series <- data.frame(Punto = character(), Mes = factor(levels = meses), Precipitacion = numeric(), stringsAsFactors = FALSE)
# Extraer la información climática para los puntos seleccionados
for (i in 1:nrow(puntos)) {
coord <- vect(cbind(x = puntos$lon[i], y = puntos$lat[i]), crs = crs(clima_temp))
# Extraer datos de temperatura y precipitación correctamente
temp_values <- unlist(extract(clima_temp, coord)[1, -1])
prec_values <- unlist(extract(clima_prec, coord)[1, -1])
# Verificar longitud y corregir si es necesario
if (length(temp_values) == 12 && length(prec_values) == 12) {
temp_series <- rbind(temp_series, data.frame(Punto = rep(puntos$nombre[i], 12), Mes = factor(meses, levels = meses), Temperatura = temp_values))
prec_series <- rbind(prec_series, data.frame(Punto = rep(puntos$nombre[i], 12), Mes = factor(meses, levels = meses), Precipitacion = prec_values))
} else {
warning(paste("Datos faltantes para el punto:", puntos$nombre[i]))
}
}
# Ajustar el formato de los meses como factor ordenado para el gráfico
temp_series$Mes <- factor(temp_series$Mes, levels = meses)
prec_series$Mes <- factor(prec_series$Mes, levels = meses)
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## List of 1
## $ axis.text.x:List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 1
## ..$ vjust : NULL
## ..$ angle : num 45
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi FALSE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi FALSE
## - attr(*, "validate")= logi TRUE
# Crear el gráfico de temperatura usando ggplot2 y plotly
p_temp <- ggplot(temp_series, aes(x = Mes, y = Temperatura, color = Punto, group = Punto, text = paste("Temperatura:", Temperatura, "<br>Punto:", Punto, "<br>Mes:", Mes))) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
labs(title = "Temperatura Mensual en el Valle del Cauca", x = "Mes", y = "Temperatura (°C)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
p_temp_interactive <- ggplotly(p_temp, tooltip = "text")
p_temp_interactive
# Crear el gráfico de precipitación ggplot2 y plotly
p_prec <- ggplot(prec_series, aes(x = Mes, y = Precipitacion, color = Punto, group = Punto, text = paste("Precipitación:", Precipitacion, "<br>Punto:", Punto, "<br>Mes:", Mes))) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
labs(title = "Precipitación Mensual en el Valle del Cauca", x = "Mes", y = "Precipitación (mm)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotación de los meses
# Hacer el gráfico interactivo con plotly
p_prec_interactive <- ggplotly(p_prec, tooltip = "text")
p_prec_interactive
# Calcular los promedios mensuales de temperatura y precipitación
temp_ref <- sapply(1:12, function(mes) mean(temp_series$Temperatura[temp_series$Mes == meses[mes]], na.rm = TRUE))
prec_ref <- sapply(1:12, function(mes) mean(prec_series$Precipitacion[prec_series$Mes == meses[mes]], na.rm = TRUE))
La gráfica de precipitación muestra variaciones significativas a lo largo del año. Cali presenta los picos de precipitación más altos, especialmente en los meses de abril y noviembre, donde las precipitaciones superan los 200 mm, destacándose como la localidad con mayores acumulaciones de lluvia. Buga y Palmira siguen un patrón similar, aunque con menores valores máximos de precipitación alrededor de 150 a 180 mm en los meses más lluviosos. Es evidente una disminución significativa de las precipitaciones en los meses de julio y agosto para todas las localidades, indicando un periodo más seco en medio del año.
En conjunto ambas gráficas muestran que el Valle del Cauca presenta un clima bimodal, con dos estaciones lluviosas marcadas (abril-mayo y octubre-noviembre) y un periodo seco en el medio del año. Palmira destaca por sus temperaturas más cálidas, mientras que Cali se caracteriza por una mayor variabilidad térmica y picos de precipitación más pronunciados. Buga muestra un comportamiento intermedio en ambas variables, lo que podría sugerir una localización geográfica con influencias tanto de la topografía como de la cercanía a fuentes de humedad, lo que favorece el cultivo de caña de azucar.
# Distancia Euclidiana
distancia_euclidiana <- function(temp, prec) {
sqrt((temp - temp_ref)^2 + (prec - prec_ref)^2)
}
# Correlación de Pearson
calcular_correlacion <- function(x) {
if (all(is.na(x))) return(NA) # Evitar errores con celdas vacías
# Verificar si el vector x tiene longitud 12
if (length(x) != length(temp_ref)) return(NA)
return(cor(x, temp_ref, use = "complete.obs"))
}
# Distancia Coseno
distancia_coseno <- function(x) {
if (all(is.na(x))) return(NA)
num <- sum(x * temp_ref, na.rm = TRUE)
denom <- sqrt(sum(x^2, na.rm = TRUE)) * sqrt(sum(temp_ref^2, na.rm = TRUE))
if (denom == 0) return(NA)
sim <- num / denom
return(sim)
}
# Crear raster anual
temp_anual <- mean(clima_temp)
prec_anual <- sum(clima_prec) / 12
# Calcular las similitudes
similaridad_euclidiana <- sqrt((temp_anual - temp_ref)^2 + (prec_anual - prec_ref)^2)
similaridad_pearson <- app(clima_temp, calcular_correlacion)
similaridad_coseno <- app(clima_temp, distancia_coseno)
Para identificar regiones similares las comparadas anteriormente en el Valle del Cauca, se ejecutó un análisis de similaridad climática global por medio de tres métodos, distancia euclidiana, coeficiente de correlación de Pearson y distancia del coseno. Cada uno de estos métodos aporta una perspectiva distinta sobre cómo identificar regiones con patrones climáticos similares. La distancia euclidiana, que mide la distancia geométrica directa entre los puntos de temperatura y precipitación, destaca por su sencillez y capacidad de capturar diferencias absolutas. Sin embargo, esta métrica es altamente sensible a la escala de los datos, lo que provoca que zonas con valores altos en ambas variables aparezcan como similares, aunque sus patrones temporales difieran considerablemente. Por esta razón, el mapa generado con este método muestra una predominancia de zonas verdes, lo que sugiere un sesgo que minimiza la variación real, reduciendo su valor interpretativo en un contexto climático.
# Crear una ventana gráfica con 3 filas y 4 columnas
par(mfrow = c(4, 3))
# Graficar los mapas en el panel
for (mes in 1:12) {
plot(
similaridad_euclidiana[[mes]],
col = colorRampPalette(c("darkgreen", "yellow", "red"))(100),
main = paste(meses[mes]),
legend = TRUE,
axes = TRUE
)
}
El coeficiente de correlación de Pearson, por otro lado, permite identificar relaciones lineales entre la temperatura y la precipitación a lo largo del año. Esta métrica es útil para detectar patrones similares en series temporales y es menos influenciada por la magnitud de los datos que la distancia euclidiana. Sin embargo, tiene el inconveniente de que solo captura relaciones lineales, dejando de lado patrones no lineales que pueden ser significativos en la variación climática. El mapa basado en Pearson refleja zonas con valores intermedios en gran parte del mundo, destacando regiones que correlacionan positivamente con los puntos de referencia, pero no identifica claramente la similitud en términos de cambio estacional o dirección de variación.
# Correlación de Pearson (anual)
plot(
similaridad_pearson,
col = colorRampPalette(c("red", "yellow", "green"))(20),
main = "Mapa de Similaridad Climática (Correlación de Pearson)",
legend = TRUE,
axes = TRUE
)
# Distancia Coseno (anual)
plot(
similaridad_coseno,
col = colorRampPalette(c("red", "yellow", "green"))(20),
main = "Mapa de Similaridad Climática (Distancia Coseno)",
legend = TRUE,
axes = TRUE
)
La distancia del coseno, en contraste, se enfoca en la orientación del cambio de condiciones más que en su magnitud absoluta, lo que la hace particularmente adecuada para analizar patrones estacionales. Esta métrica resulta menos afectada por diferencias de escala entre temperatura y precipitación, permitiendo una representación más precisa de la similitud en la variación anual. El mapa resultante de la distancia coseno muestra un contraste claro y diferenciado, destacando regiones que mantienen patrones de variación similares incluso si los valores absolutos difieren. Esta capacidad de capturar la direccionalidad hace que la distancia coseno sea la opción más robusta y significativa para identificar la similitud climática global, ya que refleja con mayor precisión cómo cambian conjuntamente las variables a lo largo del año.
El análisis de los mapas generados permitió confirmar que las zonas tropicales y subtropicales siguen siendo las regiones más aptas para el cultivo de la caña de azúcar debido a su combinación de temperatura y precipitación adecuadas. Estos resultados son coherentes con los patrones de producción actuales y respaldan la elección de estas zonas para el establecimiento de cultivos intensivos de caña de azúcar.
El análisis de similaridad climática permitió identificar regiones con condiciones climáticas similares a un conjunto de puntos de referencia. En este trabajo, se analizarán los puntos Cali, Palmira y Buga en el Valle del Cauca, utilizando métricas de distancia euclidiana, correlación de Pearson y distancia coseno. El objetivo fue identificar áreas que presentan condiciones similares a estas ciudades para el cultivo de caña de azúcar donde cada una de las métricas complementó el análisis.