Caso 1.

En el análisis del Caso 1, el foco estará en estudiar la variabilidad espacial de dos variables climáticas fundamentales: la humedad relativa y la temperatura. Para este análisis se cuenta con un conjunto de 394 registros recopilados en una finca ubicada en una región específica de Colombia. El objetivo principal de este estudio es explorar y modelar la distribución espacial de estas variables utilizando herramientas avanzadas de geoestadística implementadas en el software R.

Este caso abordará diferentes etapas clave del análisis de datos espaciales, permitiendo una comprensión profunda de las dinámicas climáticas en la finca estudiada:

  • Análisis Exploratorio: Se evaluará el comportamiento general de las variables mediante indicadores estadísticos, como la media, desviación estándar y otros análisis descriptivos que ayudarán a identificar las tendencias centrales, la dispersión y la variabilidad de los datos. Además, se utilizarán gráficos descriptivos para una visualización inicial que facilite la comprensión de las distribuciones de las variables.

  • Análisis Exploratorio Espacial: Se generarán mapas que ilustren la distribución espacial de la temperatura y la humedad relativa, proporcionando una representación visual de los patrones geográficos en el área de estudio. Esto permitirá interpretar cómo estas variables se distribuyen en el espacio y la posible influencia de factores geográficos sobre su variabilidad.

  • Análisis Estructural: En esta etapa, se estudiará la autocorrelación espacial de cada variable utilizando semivariogramas. Este análisis incluirá la evaluación de la estacionariedad de los datos y el uso de métodos como Monte Carlo para validar la existencia de correlación espacial. El objetivo es entender la relación entre las mediciones de humedad y temperatura en diferentes ubicaciones dentro de la finca y si hay patrones significativos que sugieran dependencia espacial.

  • Ajuste de Modelo Teórico: Se probarán diversos modelos teóricos de semivariograma para evaluar su ajuste a los datos recolectados. Este proceso no solo incluye análisis gráficos para visualizar los modelos sino también el uso de métricas cuantitativas para seleccionar el modelo que mejor representa las relaciones espaciales entre las variables.

  • Predicción Espacial: Con el modelo ajustado, se realizará una predicción espacial que permitirá interpolar las variables y representar su comportamiento en el espacio de manera clara y visualmente comprensible. Esto no solo proporciona una imagen detallada de cómo varían la humedad y la temperatura en el área de estudio, sino que también ayuda a identificar zonas de influencia climática y posibles riesgos asociados, facilitando la toma de decisiones en gestión ambiental y planificación territorial.

Este enfoque integral, que combina análisis estadísticos, geoestadísticos y de visualización, no solo describe las características climáticas de la finca sino que también permite generar modelos predictivos que pueden ser aplicados en la gestión de recursos naturales y la planificación estratégica para comprender mejor las dinámicas espaciales de las variables climáticas.

El análisis comienza con la preparación del entorno de trabajo, lo que incluye la carga de librerías específicas que facilitan las tareas de manipulación de datos, análisis visual y espacial. Estas librerías son fundamentales para asegurar una transición fluida y eficiente entre las diferentes etapas del análisis. Se utilizan las siguientes herramientas:

  • dplyr: Esta librería se utiliza para el manejo eficiente de datos tabulares, permitiendo la selección, filtrado, agrupación y manipulación de datos de manera rápida y sencilla.

  • ggplot2 y plotly: Estas herramientas son esenciales para la visualización interactiva y descriptiva de los datos. ggplot2 proporciona gráficos estáticos que permiten explorar patrones y tendencias en los datos, mientras que plotly ofrece la capacidad de crear gráficos interactivos que facilitan la exploración detallada y la comunicación de resultados.

  • sf: Se emplea para manejar y analizar datos espaciales. sf permite trabajar con capas espaciales en formato geoespacial, realizando operaciones geográficas como uniones, intersecciones y transformaciones. Esta librería facilita la integración de datos espaciales con análisis estadísticos, permitiendo generar mapas y realizar análisis de autocorrelación espacial.

# Carga de librerías necesarias
library(dplyr)  # Manipulación de datos
## 
## 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(ggplot2) # Gráficos
library(sf)     # Manejo de datos espaciales
## Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE
library(tmap)   # Mapas
## Breaking News: tmap 3.x is retiring. Please test v4, e.g. with
## remotes::install_github('r-tmap/tmap')
library(patchwork) #
library(plotly)
## 
## Adjuntando el paquete: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(tidyr)
library(sp)
library(gstat)
library(tmap)
library(geoR)
## --------------------------------------------------------------
##  Analysis of Geostatistical Data
##  For an Introduction to geoR go to http://www.leg.ufpr.br/geoR
##  geoR version 1.9-4 (built on 2024-02-14) is now loaded
## --------------------------------------------------------------
library(raster)
## 
## Adjuntando el paquete: 'raster'
## The following object is masked from 'package:plotly':
## 
##     select
## The following object is masked from 'package:dplyr':
## 
##     select

Seguido de esto, los datos necesarios para el análisis se cargaron desde dos fuentes principales: un archivo RData que contiene variables climáticas y un archivo shapefile que representa la delimitación geográfica de la zona de estudio. La carga de los datos se llevó a cabo con las funciones load y st_read, asegurando la correcta importación y estructuración de la información.

# Carga de datos climáticos
load("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Insumos/caso 1/datos_geo.RData")

datos_climaticos <- datos_geo

# Carga de la zona de estudio en shapefile
zona_estudio <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Insumos/caso 1/zona/area.shp")  # Ajusta la ruta del archivo shapefile
## Reading layer `area' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Insumos\caso 1\zona\area.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 1 field
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.61417 ymin: 2.380766 xmax: -76.61251 ymax: 2.382726
## Geodetic CRS:  WGS 84

Fase 1: Análisis Exploratorio

En esta primera etapa, el objetivo es explorar las variables climáticas disponibles, específicamente la humedad relativa y la temperatura, para identificar patrones estadísticos básicos, como la tendencia central, la variabilidad y la distribución. Este paso proporciona una comprensión inicial de los datos y sienta las bases para las fases posteriores.

La metodología comienza con el cálculo de estadísticas descriptivas para las dos variables clave del conjunto de datos: Humedad Relativa y Temperatura. Estas estadísticas descriptivas se obtienen utilizando las funciones summary() de R, que proporcionan un resumen detallado de las variables, incluyendo el mínimo, el máximo, la mediana y diversos percentiles. Este análisis es crucial para comprender la variabilidad y la distribución de las variables dentro del conjunto de datos, permitiendo una visualización clara de las características centrales y las dispersiones de cada una.

Posteriormente, los resultados de estas estadísticas descriptivas se consolidan en una tabla para facilitar su visualización y análisis. La tabla incluye las métricas principales junto con sus valores correspondientes para cada variable (Humedad Relativa y Temperatura). Esta consolidación permite una rápida comparación entre las variables y facilita la identificación de patrones y diferencias significativas en su distribución.

Para crear esta tabla, se utiliza la función data.frame() de R para asociar cada estadística descriptiva (mínimo, máximo, mediana, percentiles) con sus valores correspondientes para las variables de interés. Luego, se aplica la función knitr::kable() para formatear la tabla en formato HTML. Este formato hace que la tabla sea accesible y visualmente atractiva, especialmente al presentar grandes cantidades de datos en un formato claro y organizado. Para mejorar aún más la visualización, se utiliza la opción bootstrap_options = c(“striped”, “hover”) dentro de knitr::kable(). Estas opciones estilísticas permiten resaltar las filas alternas y habilitar la interacción mediante clics en las celdas, mejorando la legibilidad y la navegación dentro de la tabla.

# Resumen de las variables climáticas
# Calcula los resúmenes
resumen_humedad <- summary(datos_climaticos$Relative_Humidity)
resumen_temperatura <- summary(datos_climaticos$Temperature)

# Combina los resúmenes en una tabla
tabla_resumen <- data.frame(
  Métrica = names(resumen_humedad),
  Humedad_Relativa = as.numeric(resumen_humedad),
  Temperatura = as.numeric(resumen_temperatura)
)

# Presenta la tabla de forma más estética
knitr::kable(tabla_resumen, format = "html", caption = "Resumen de Datos Climáticos") %>%
  kableExtra::kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Resumen de Datos Climáticos
Métrica Humedad_Relativa Temperatura
Min. 28.50000 16.0000
1st Qu. 41.65000 19.2250
Median 63.25000 21.3000
Mean 58.08503 22.6203
3rd Qu. 68.97500 26.4750
Max. 91.40000 34.6000

El resultado final, presentado en la Tabla 1, resume la variabilidad observada en cada métrica de las variables analizadas, proporcionando un panorama claro de las características fundamentales de los datos climáticos utilizados en el estudio.

Para continuar a cabo el análisis exploratorio de datos de las variables climáticas, se generaron gráficos de histograma y densidad para visualizar la distribución de la Humedad Relativa y la Temperatura en el conjunto de datos. Este paso es esencial para entender la forma y la dispersión de los datos, permitiendo identificar patrones y posibles anomalías.

Primero, se utilizaron las herramientas de ggplot2, una biblioteca en R que facilita la creación de gráficos complejos y detallados. Para la variable de Humedad Relativa, se generó un histograma que muestra la densidad acumulativa de los datos. Se utilizó ggplot() para inicializar la gráfica y se especificó la variable de interés como el eje x (aes(x = Relative_Humidity)). Luego, se aplicó geom_histogram(aes(y = ..density..), fill = “blue”, alpha = 0.5, binwidth = 5), creando un histograma con una densidad acumulativa y un color azul, junto con una transparencia de alpha = 0.5. El binwidth de 5 se ajustó para obtener un buen detalle en la visualización. Además, se agregó una curva de densidad (geom_density(color = “blue”, linetype = “solid”)) que representa la distribución continua de los datos. El título del gráfico se definió con labs(title = “Distribución de la Humedad Relativa”).

Se repitió el mismo proceso para la variable Temperatura. Utilizando ggplot(), se especificó Temperature como la variable de interés y se generó un histograma similar con un color rojo (fill = “red”), una transparencia de alpha = 0.5, y un binwidth de 1 para obtener una resolución mayor en la visualización. La curva de densidad (geom_density(color = “red”, linetype = “solid”) se agregó para mostrar la distribución continua de los datos y el título del gráfico se estableció con labs(title = “Distribución de la Temperatura”).

Para facilitar la exploración de las distribuciones generadas, las gráficas fueron convertidas a formatos interactivos utilizando ggplotly() de la librería plotly. Esto permitió a los usuarios realizar zoom, panear y obtener detalles adicionales haciendo clic en las áreas del gráfico. Finalmente, ambas gráficas interactivas se presentaron en una misma ventana utilizando subplot(), con nrows = 1 para una visualización horizontal y shareX = FALSE, shareY = FALSE para evitar la compartición de ejes entre los gráficos, facilitando así una comparación visual directa de las distribuciones de Humedad Relativa y Temperatura en el conjunto de datos.

# Crear las gráficas de histograma
grafica_humedad <- ggplot(datos_climaticos, aes(x = Relative_Humidity)) +
  geom_histogram(aes(y = ..density..), fill = "blue", alpha = 0.5, binwidth = 5) +
  geom_density(color = "blue", linetype = "solid") +
  labs(title = "Distribución de la Humedad Relativa")

grafica_temperatura <- ggplot(datos_climaticos, aes(x = Temperature)) +
  geom_histogram(aes(y = ..density..), fill = "red", alpha = 0.5, binwidth = 1) +
  geom_density(color = "red", linetype = "solid") +
  labs(title = "Distribución de la Temperatura y Humedad Relativa")

# Convertir cada gráfica a interactiva
grafica_humedad_interactiva <- ggplotly(grafica_humedad)
grafica_temperatura_interactiva <- ggplotly(grafica_temperatura)

# Mostrar ambos gráficos interactivos en la misma ventana
subplot(
  grafica_humedad_interactiva, 
  grafica_temperatura_interactiva, 
  nrows = 1,  # Número de filas 
  shareX = FALSE, 
  shareY = FALSE
)

Análisis del Gráfico Los análisis de las variables de temperatura y humedad relativa (gráfico anterior) revelan patrones y características interesantes en su distribución. En el caso de la temperatura, se identifican índices más altos a partir de 18.6°C, con una frecuencia de 38, alcanzando un pico máximo en 19.8°C con una frecuencia de 49. La dispersión de los datos abarca un rango desde 16°C hasta 34.6°C, donde algunas temperaturas muestran frecuencias intermedias a bajas, destacando valores como 17.9°C y aquellos superiores a 31.4°C que tienden a ser muy poco frecuentes. Aunque la distribución no presenta un patrón de tendencia bien definido, se observa una clara disminución en las frecuencias de las temperaturas superiores a 26.3°C. La asimetría en los datos sugiere que no están distribuidos normalmente.

Por otro lado, la humedad relativa presenta un comportamiento bimodal, con dos picos de frecuencia situados en torno al 39% y al 67.2%, con frecuencias de 41 y 42 respectivamente, siendo este último el intervalo con mayor concentración de datos. Este patrón permite identificar dos grupos principales dentro de la distribución: el primero entre 30% y 45% de humedad relativa, y el segundo entre 55% y 78%. La dispersión de los datos se extiende desde 28% hasta 91%, evidenciando una distribución asimétrica.

En el análisis exploratorio de datos, se realizó la normalización de las variables climáticas Relative_Humidity y Temperature para hacerlas comparables y reducir los efectos de las escalas originales. Esta normalización se llevó a cabo utilizando la función scale() en R, que centra las variables alrededor de la media y las escala de manera que la desviación estándar sea 1. Los resultados de esta transformación fueron guardados en nuevas columnas, Relative_Humidity_Normalized y Temperature_Normalized. Posteriormente, se empleó la función gather() para reorganizar estas variables en un formato largo, facilitando la creación de gráficos y la comparación visual.

Se crearon gráficos de boxplot para comparar las distribuciones de las variables normalizadas. Utilizando ggplot(), se especificó variable como la variable categórica para el eje x y value para el eje y. Los boxplots fueron llenados con colores distintos para cada variable (Relative_Humidity_Normalized y Temperature_Normalized). Se añadieron títulos y etiquetas para los ejes con labs(), y se aplicó un tema mínimo con theme_minimal() para mejorar la presentación visual. Para hacer el gráfico interactivo, se utilizó ggplotly(), lo que permitió a los usuarios realizar zoom, seleccionar y obtener más detalles sobre las distribuciones visualizadas en el boxplot. Este paso proporciona una forma accesible de explorar las diferencias en la variabilidad y las distribuciones entre la humedad relativa y la temperatura en el conjunto de datos.

# Normalizar las variables
datos_climaticos_normalizados <- datos_climaticos %>%
  mutate(Relative_Humidity_Normalized = scale(Relative_Humidity),
         Temperature_Normalized = scale(Temperature)) %>%
  gather(key = "variable", value = "value", c(Relative_Humidity_Normalized, Temperature_Normalized))

# Crear gráficos de boxplot
grafico <- ggplot(datos_climaticos_normalizados) +
  geom_boxplot(aes(x = variable, y = value, fill = variable), alpha = 0.5) +
  labs(title = "Comparación Normalizada de Humedad Relativa y Temperatura",
       x = "Variable",
       y = "Valor Normalizado",
       fill = "Variable") +
  theme_minimal()

# Hacer el gráfico interactivo con plotly
grafico_interactivo <- ggplotly(grafico)

# Mostrar el gráfico interactivo
grafico_interactivo

Análisis del Gráfico La mediana (Q2) de la temperatura registrada es de 21.3°C, lo que indica que la mitad de los muestreos se sitúan por encima y la otra mitad por debajo de este valor. La mayor parte de las observaciones se encuentran en un rango de 19.2°C a 26.5°C, aunque se presentan valores extremos que oscilan entre un mínimo de 16°C y un máximo de 34.6°C, evidenciando una dispersión significativa en los datos.

En cuanto a la humedad relativa, la mediana es de 63.25%, lo que refleja que los valores están distribuidos en torno a este punto central. La mayoría de las mediciones se concentran entre 41.6% y 69%, con casos aislados que alcanzan niveles tan bajos como 28.5% y tan altos como 91.4%, indicando también una notable variabilidad en la distribución.

En el análisis exploratorio de datos, se generó un gráfico de dispersión para examinar la relación entre las variables Relative_Humidity y Temperature en el conjunto de datos climáticos. Utilizando la función ggplot(), se representó Relative_Humidity en el eje x y Temperature en el eje y, con puntos de color morado para indicar las observaciones individuales y un alto nivel de transparencia para reducir el solapamiento visual. Además, se añadió una línea de tendencia calculada mediante el método de regresión lineal (geom_smooth()), representada con una línea discontinua azul. Esta línea permite visualizar la dirección y la fuerza de la relación entre las variables, ayudando a identificar patrones generales y posibles correlaciones.

Para facilitar la interacción con los datos, el gráfico de dispersión fue convertido a un formato interactivo utilizando ggplotly(). Este proceso permite a los usuarios explorar el gráfico en detalle, realizar zoom, seleccionar puntos individuales para obtener información más específica y comprender mejor las relaciones entre las variables. Al presentar el gráfico de esta manera, se proporciona una herramienta visual eficaz para el análisis exploratorio, permitiendo una mayor comprensión de las tendencias y las correlaciones en los datos climáticos estudiados.

# Crear el gráfico de dispersion
grafico_base <- ggplot(datos_climaticos, aes(x = Relative_Humidity, y = Temperature)) +
  geom_point(color = "purple", alpha = 0.6) +  # Puntos
  geom_smooth(method = "lm", color = "blue", se = TRUE, linetype = "dashed") +  # Línea de tendencia
  labs(
    title = "Relación entre Humedad Relativa y Temperatura",
    x = "Humedad Relativa (%)",
    y = "Temperatura (°C)"
  ) +
  theme_minimal()

# Convertir el gráfico a interactivo
grafico_interactivo <- ggplotly(grafico_base)
## `geom_smooth()` using formula = 'y ~ x'
# Mostrar el gráfico interactivo
grafico_interactivo
# Correlacion existente
cor(datos_climaticos$Relative_Humidity, datos_climaticos$Temperature)
## [1] -0.913527

Análisis del Gráfico El análisis del gráfico revela una relación inversa o de tendencia negativa entre las variables temperatura y humedad relativa. A medida que la temperatura aumenta, la humedad relativa tiende a disminuir. Esta relación se caracteriza por ser generalmente fuerte, ya que los datos se distribuyen de forma que se aproximan a una línea recta en gran parte del gráfico. Además, se identifican dos concentraciones principales de puntos: una alrededor de los 20°C y otra en el rango de 25°C a 30°C, lo que refuerza la percepción de una correlación entre estas variables.

El coeficiente de correlación de Pearson, con un valor cercano a -1, confirma la existencia de una fuerte correlación negativa entre la temperatura y la humedad relativa. Esto implica que la temperatura tiene una influencia directa sobre la humedad relativa, o, en términos equivalentes, que la humedad relativa depende de los cambios en la temperatura. Este comportamiento es consistente con los principios físicos de la interacción entre ambas variables en un contexto ambiental.

Fase 2: Análisis Espacial

La fase 2 del proyecto se centra en el análisis espacial de los datos, con el objetivo de explorar patrones geográficos y relaciones espaciales entre las variables climáticas. En esta etapa, se incorporan técnicas de visualización espacial y modelado para contextualizar los datos en un marco geográfico. Esto incluye la generación de mapas temáticos y gráficos espaciales que permiten identificar variaciones en las variables de interés en función de su ubicación, facilitando así la comprensión de cómo factores ambientales pueden influir en las mediciones registradas.

En esta fase del análisis espacial, se generó un mapa temático para visualizar la distribución de las temperaturas medidas en la zona de estudio, utilizando un enfoque geográfico. Primero, se cargaron las librerías necesarias, como ggplot2 para la creación de gráficos y sf para el manejo de datos espaciales. Luego, se representaron los polígonos correspondientes a los límites de la zona de estudio a partir de un shapefile, el cual se incluyó como fondo en el mapa para proporcionar un contexto geográfico adecuado.

A continuación, se añadieron puntos georreferenciados correspondientes a las ubicaciones de las mediciones climáticas, aplicando un gradiente de color y un ajuste en el tamaño de los puntos para reflejar los valores de temperatura registrados en cada sitio. Las escalas de color se configuraron para mostrar temperaturas bajas en azul y altas en rojo, mientras que el tamaño de los puntos varió de acuerdo con la magnitud de los valores. El resultado fue un mapa claro y descriptivo, titulado “Fapa de Puntos de los Sitios Medidos y Temperatura Registrada”, que permite identificar patrones espaciales en las temperaturas de manera visual y efectiva.

# Cargar librerías necesarias
library(ggplot2)
library(sf)

# Crear el mapa
mapa_temperatura <- ggplot() +
  # Agregar el polígono del shapefile
  geom_sf(data = zona_estudio, fill = "grey90", color = "black", size = 0.2) +
  # Agregar los puntos con gradiente de color y tamaño según la temperatura
  geom_point(data = datos_climaticos, 
             aes(x = Longitude, y = Latitude, color = Temperature, size = Temperature), 
             alpha = 0.8) +
  # Escalas de color y tamaño
  scale_color_gradient(low = "blue", high = "red", name = "Temperatura") +
  scale_size(range = c(1, 5), name = "Temperatura") +
  # Títulos y etiquetas
  labs(title = "Mapa de Puntos de los Sitios Medidos y Temperatura Registrada",
       x = "lat", y = "long") +
  # Tema para un diseño limpio
  theme_minimal()

mapa_temperatura

Análisis del Mapa El mapa analizado muestra un gradiente de temperatura en la zona de estudio, con temperaturas más bajas, entre 15°C y 20°C, predominando en el noroeste. A medida que se avanza hacia el sureste, se observa un incremento en los valores, alcanzando rangos de 30°C a 35°C, mientras que la región central se caracteriza por temperaturas intermedias, aproximadamente entre 20°C y 25°C. Este patrón general sugiere un comportamiento en franjas, con una tendencia creciente de las temperaturas hacia el sureste. No obstante, esta tendencia no es completamente uniforme, ya que se identifican fluctuaciones y variaciones en los valores a lo largo de toda la extensión de la zona de estudio.

De manera similar al análisis realizado para la variable de temperatura, se procedió a generar un mapa temático que muestra la distribución espacial de la humedad relativa en la zona de estudio. Utilizando las mismas librerías, ggplot2 y sf, se representaron los límites de la región mediante un shapefile como contexto geográfico, sobre el cual se ubicaron los puntos correspondientes a las mediciones.

mapa_humedad <- ggplot() +
  # Agregar el polígono del shapefile
  geom_sf(data = zona_estudio, fill = "grey90", color = "black", size = 0.2) +
  # Agregar los puntos con gradiente de color y tamaño según la Humedad Relativa
  geom_point(data = datos_climaticos, 
             aes(x = Longitude, y = Latitude, color = Relative_Humidity, size = Relative_Humidity), 
             alpha = 0.8) +
  # Escalas de color y tamaño
  scale_color_gradient(low = "blue", high = "red", name = "Humedad Relativa") +
  scale_size(range = c(1, 5), name = "Humedad Relativa") +
  # Títulos y etiquetas
  labs(title = "Figura 1. Mapa de Puntos de los Sitios Medidos y Humedad Relativa Registrada",
       x = "lat", y = "long") +
  # Tema para un diseño limpio
  theme_minimal()


mapa_humedad

Análisis del Mapa El mapa analizado revela un gradiente de humedad relativa en la zona de estudio. En el noroeste, los valores son predominantemente altos, oscilando entre el 65% y el 80%, con algunos sectores aislados alcanzando el 90%. Hacia la región central, la humedad relativa varía de alta a intermedia, con valores en el rango de 60% a 70%. En el sureste, los niveles de humedad son generalmente bajos a muy bajos, fluctuando principalmente entre el 50% y el 30%. Este patrón sugiere un comportamiento en franjas, con una tendencia general de incremento de la humedad relativa hacia el noroeste. Sin embargo, esta tendencia no es completamente uniforme, ya que se observan fluctuaciones y altibajos a lo largo de la zona de estudio.

Fase 3: Ajustes Estructural

La fase 3 del proyecto se centra en el análisis estructural, cuyo objetivo principal es identificar y comprender las relaciones subyacentes entre las variables climáticas, así como posibles patrones o estructuras que puedan ser utilizados para modelado o interpretación. En esta etapa, se emplearon técnicas como correlaciones, matrices de dispersión y análisis estadístico multivariado, permitiendo evaluar la conexión entre las variables y detectar tendencias generales o comportamientos anómalos.

En el análisis estructural, se procesaron los datos climáticos para explorar la distribución espacial de la temperatura en la zona de estudio. Esto implicó convertir el conjunto de datos en un objeto espacial adecuado para el análisis geoestadístico mediante la función as.geodata del paquete geoR. Para ello, se seleccionaron las columnas correspondientes a las coordenadas (latitud y longitud) y los valores de temperatura, generando así un objeto espacial que permite examinar los patrones espaciales de esta variable.

Posteriormente, se utilizó la función plot para generar una visualización inicial del objeto espacial, lo que permitió observar la disposición de los puntos de muestreo en el área de estudio, así como identificar posibles tendencias o irregularidades en la distribución de la temperatura. Este paso inicial es esencial para evaluar la calidad y coherencia espacial de los datos antes de proceder con análisis más avanzados.

#Temperatura
geo_datosT=as.geodata(datos_climaticos,coords.col=4:3,data.col=1)

plot(geo_datosT)

Análisis de los Gráficos Del análisis del primer gráfico de temperatura, se concluye que la variable no es estacionaria, ya que presenta una clara tendencia espacial. Los valores más altos se concentran en ciertos sectores específicos, mientras que otros muestran valores considerablemente más bajos, lo que indica una distribución no uniforme. Este comportamiento se refleja en la agrupación de los datos en franjas que siguen una dirección particular dentro de la zona de estudio.

Además, al observar el histograma, se evidencia un comportamiento bimodal en la distribución de los datos, aunque predomina la concentración de valores en torno a los 20°C. Este análisis permite destacar tanto las variaciones espaciales como la forma en que los valores de temperatura se distribuyen en el área evaluada.

De manera similar al procedimiento realizado para la variable de temperatura, se procesaron los datos climáticos correspondientes a la humedad relativa. Utilizando nuevamente la función as.geodata del paquete geoR, se construyó un objeto espacial que incluye las coordenadas geográficas (latitud y longitud) y los valores de humedad relativa. Este objeto permitió examinar la distribución espacial de esta variable en la zona de estudio.

geo_datosR=as.geodata(datos_climaticos,coords.col=4:3,data.col=2)

plot(geo_datosR)

Análisis de los Gráficos Del análisis del primer gráfico de humedad relativa, se concluye que la variable no es estacionaria, ya que muestra una tendencia a nivel espacial. Los valores más altos se concentran en ciertos sectores específicos, mientras que otros presentan valores más bajos, evidenciando una distribución desigual. Este patrón se refleja en la agrupación de los datos en franjas que siguen una dirección particular dentro de la zona de estudio.

Por otro lado, al analizar el histograma, se identifica un comportamiento bimodal en la distribución de la humedad relativa, con predominancia de datos en torno a los valores de 37% y 67%. Esto resalta tanto la variabilidad espacial como la forma en que los valores se distribuyen dentro del área analizada.

En esta etapa del análisis estructural, se investigó la estructura de dependencia espacial para la variable temperatura mediante la estimación y visualización de su semivariograma. En primer lugar, se calculó un resumen estadístico de las distancias entre los puntos muestreados utilizando la función dist. Esto permitió definir los rangos de distancia adecuados para la construcción del semivariograma experimental, asegurando que la variabilidad espacial se analice de manera precisa.

Posteriormente, con la función variog del paquete geoR, se calculó el semivariograma experimental utilizando un esquema de agrupación en bins, definido por un vector de distancias (uvec). Además, se generaron intervalos de confianza para el semivariograma mediante simulaciones Monte Carlo (variog.mc.env), lo que permitió evaluar si las variaciones observadas en los datos se desvían significativamente del comportamiento aleatorio esperado. Finalmente, se graficó el semivariograma junto con su envolvente de confianza, facilitando la interpretación visual de la dependencia espacial en la temperatura.

summary(dist(geo_datosT$coords))
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 3.302e-05 4.017e-04 6.544e-04 7.038e-04 9.703e-04 1.912e-03
variog_T=variog(geo_datosT,option = "bin",uvec=seq(0,0.0009680,0.00003305))
## variog: computing omnidirectional variogram
geo_datosT.env=variog.mc.env(geo_datosT,obj=variog_T)
## variog.env: generating 99 simulations by permutating data values
## variog.env: computing the empirical variogram for the 99 simulations
## variog.env: computing the envelops
plot(variog_T,pch=16,main="Temperatura",envelope =geo_datosT.env)

Análisis del Gráfico El análisis del semivariograma de temperatura permite determinar la presencia de autocorrelación espacial, ya que los puntos del semivariograma experimental (puntos negros) no se encuentran dentro de los límites de no correlación generados mediante el método de Monte Carlo (líneas punteadas). En términos generales, se observa que la semivarianza aumenta ligeramente a medida que incrementa la distancia entre los muestreos, y después de una distancia de aproximadamente 0.0004, este incremento se vuelve más proporcional, lo que indica que las observaciones se vuelven menos similares conforme aumenta la distancia entre ellas.

Para interpretar el semivariograma experimental, se considera que a menor distancia entre los sitios de muestreo, mayor será la similitud o correlación espacial entre las observaciones. Por lo tanto, en presencia de autocorrelación, el semivariograma tiende a mostrar valores de semivarianza menores para distancias pequeñas (h), aumentando conforme las distancias incrementan. Este comportamiento refuerza la relación espacial entre las observaciones cercanas y la disminución de similitud con el aumento de la separación espacial.

De manera similar al procedimiento realizado para la temperatura, se aplicó el análisis estructural para la variable de humedad relativa, generando su semivariograma experimental y la envolvente de confianza para evaluar su dependencia espacial.

summary(dist(geo_datosR$coords))
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 3.302e-05 4.017e-04 6.544e-04 7.038e-04 9.703e-04 1.912e-03
variog_R=variog(geo_datosR,option = "bin",uvec=seq(0,0.0009680,0.00003305))
## variog: computing omnidirectional variogram
geo_datosR.env=variog.mc.env(geo_datosR,obj=variog_R)
## variog.env: generating 99 simulations by permutating data values
## variog.env: computing the empirical variogram for the 99 simulations
## variog.env: computing the envelops
plot(variog_R,pch=16,main="Humedad Relativa",envelope =geo_datosR.env)

Análisis del Gráfico El análisis del semivariograma de la humedad relativa muestra que, de manera general, la semivarianza incrementa a medida que aumenta la distancia entre los muestreos. Esto sugiere que las observaciones se vuelven menos similares conforme aumenta la separación espacial. Se determina la presencia de autocorrelación espacial en la variable, ya que los datos del semivariograma experimental no se encuentran dentro de los límites de no correlación establecidos mediante el método de Monte Carlo, el cual genera escenarios desordenados mediante permutaciones.

Para interpretar el semivariograma experimental, se utiliza el criterio de que a menor distancia entre los sitios de muestreo, mayor será la similitud o correlación espacial entre las observaciones. En presencia de autocorrelación espacial, se espera que el semivariograma experimental tenga valores de semivarianza más bajos para distancias pequeñas (h), aumentando a medida que las distancias entre los muestreos se incrementan. Este comportamiento confirma la dependencia espacial de los valores de humedad relativa en el área estudiada.

Fase 4: Ajuste del Modelo Teórico al Semivariograma Experimental

En esta fase se procede al ajuste del modelo teórico al semivariograma experimental obtenido previamente. Este ajuste es esencial para entender las estructuras espaciales de las variables estudiadas, como la temperatura y la humedad relativa, en datos geoespaciales. Utilizando las técnicas de modelado geoespacial, se determina la estructura de dependencia espacial entre las observaciones, permitiendo identificar patrones y niveles de autocorrelación que influyen en los datos. A través de la elección de modelos teóricos adecuados, se evalúa la bondad de ajuste, permitiendo obtener una representación precisa de las interacciones espaciales en las variables climáticas analizadas.

Para el ajuste del modelo teórico, se seleccionaron tres de los modelos más comunes en geoestadística: el modelo exponencial, el modelo gaussiano y el modelo esférico. Estos modelos fueron aplicados tanto a los datos de temperatura como a los de humedad relativa, con el objetivo de identificar el que mejor se ajusta a la estructura de variabilidad espacial de las variables. El ajuste de estos modelos permite evaluar la pérdida de valor (o disimilaridad) en función de la distancia, representada en el semivariograma.

El proceso se implementó utilizando la función variofit() en R, que optimiza los parámetros del modelo (nugget, sill y rango) para minimizar la diferencia entre el semivariograma empírico y el teórico. A continuación, se presenta un fragmento del código utilizado para ajustar el modelo exponencial a los datos de temperatura, definiendo un rango inicial de valores para los parámetros mediante la función expand.grid():

TEMPERATURA

ini.vals_T=expand.grid(seq(97,100,l=10), seq(0.0015,0.0017,l=10))
model_mco_expo=variofit(variog_T, ini=ini.vals_T, cov.model="exponential", wei="npair", min="optim")
## variofit: covariance model used is exponential 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "97"    "0"   "0"   "0.5"
## status        "est"   "est" "est" "fix"
## loss value: 13833630.4943553
model_mco_gauss=variofit(variog_T, ini=ini.vals_T, cov.model="gaussian", wei="npair", min="optim",nugget =1.5)
## variofit: covariance model used is gaussian 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "97"    "0"   "1.5" "0.5"
## status        "est"   "est" "est" "fix"
## loss value: 182312.527094231
model_mco_spea=variofit(variog_T, ini=ini.vals_T, cov.model="spheric",fix.nug=TRUE, wei="npair", min="optim")
## variofit: covariance model used is spherical 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "97"    "0"   "0"   "0.5"
## status        "est"   "est" "fix" "fix"
## loss value: 69750092.3916377
plot(variog_T,pch=16,main=names(datos_geo)[1],envelope =geo_datosT.env)
lines(model_mco_expo,col="blue")
lines(model_mco_gauss,col="red")
lines(model_mco_spea,col="green")

Análisis del Gráfico En esta gráfica se realiza una comparación entre tres modelos teóricos para el ajuste de los datos del semivariograma. Se determina que el modelo que mejor se ajusta a los puntos de la muestra es el Modelo Gaussiano, ya que arrojó un valor de error o suma de cuadrados de peso minimizada igual a 52,241.11. Este valor es significativamente menor en comparación con los valores obtenidos por los métodos exponencial (548,409) y esférico (457,090.9), los cuales son aproximadamente ocho a diez veces mayores que el error obtenido por el método gaussiano. Esto sugiere que el modelo Gaussiano es el más adecuado para representar la variabilidad espacial de los datos de temperatura en este análisis.

HUMEDAD RELATIVA

ini.vals_R=expand.grid(seq(550,600,l=10), seq(0.0013,0.0017,l=10))
model_mco_expo2=variofit(variog_R, ini=ini.vals_R, cov.model="exponential", wei="npair", min="optim")
## variofit: covariance model used is exponential 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "550"   "0"   "0"   "0.5"
## status        "est"   "est" "est" "fix"
## loss value: 53672994.7822817
model_mco_gauss2=variofit(variog_R, ini=ini.vals_R, cov.model="gaussian", wei="npair", min="optim",nugget =20)
## variofit: covariance model used is gaussian 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "600"   "0"   "20"  "0.5"
## status        "est"   "est" "est" "fix"
## loss value: 3195602.84576612
model_mco_spea2=variofit(variog_R, ini=ini.vals_R, cov.model="spheric",fix.nug=TRUE, wei="npair", min="optim")
## variofit: covariance model used is spherical 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "550"   "0"   "0"   "0.5"
## status        "est"   "est" "fix" "fix"
## loss value: 880937797.441904
plot(variog_R,pch=16,main=names(datos_geo)[2],envelope =geo_datosR.env)
lines(model_mco_expo2,col="blue")
lines(model_mco_gauss2,col="red")
lines(model_mco_spea2,col="green")

Análisis del Gráfico En esta gráfica se realiza una comparación entre tres modelos teóricos para ajustar los datos del semivariograma de la humedad relativa. Se determina que el Modelo Gaussiano es el que mejor se ajusta a los puntos de la muestra, dado que arrojó un valor de error o suma de cuadrados de peso minimizada igual a 3,195,603. Este valor es significativamente menor en comparación con los valores obtenidos por los métodos exponencial (46,291,921) y esférico (36,027,449), que son alrededor de 110 a 145 veces mayores que el error obtenido por el método Gaussiano. Esto sugiere que el modelo Gaussiano es el más adecuado para representar la variabilidad espacial de los datos de humedad relativa en este análisis.

Fase 5: Predicción Espacial

En esta fase se enfoca en la predicción espacial de las variables climáticas, como la temperatura y la humedad relativa, utilizando modelos estadísticos y geoestadísticos. El objetivo principal es estimar valores para áreas no observadas o para momentos futuros en el tiempo, basándose en los patrones y relaciones identificadas en las fases anteriores del análisis. A través de técnicas como el krigeo espacial, se busca generar mapas de predicción que permitan visualizar la variabilidad espacial y temporal de las variables estudiadas. Este paso es crucial para entender la distribución de las variables climáticas en el espacio, proporcionando información valiosa para la toma de decisiones en gestión ambiental y planificación territorial.

TEMPERATURA En la fase de predicción espacial, el análisis se centró en utilizar el método de krigeo para estimar los valores climáticos, específicamente la temperatura, en áreas no observadas dentro del espacio de estudio. Para ello, primero se generó una cuadrícula de predicción utilizando la función expand.grid() en R, creando una malla de puntos que abarca el área de interés en términos de longitud y latitud. Con las observaciones disponibles de las variables geo-referenciadas (geo_datosT), se aplicó el método de krigeo para interpolar los valores de temperatura en esta cuadrícula.

Los resultados de la interpolación se almacenaron en un data frame que contiene las coordenadas de la cuadrícula y las predicciones. A partir de estos datos, se crearon mapas raster que mostraban tanto las predicciones (Temp_predict) como la varianza de predicción (error) (Temp_error). Estos mapas permiten visualizar la distribución espacial de la temperatura estimada en el área de estudio, así como la variabilidad de los errores asociados a estas estimaciones. Los resultados se presentaron en dos gráficos, donde se mostraba el mapa de predicción espacial junto con las líneas de delimitación del área de estudio, y el mapa de varianza de predicción para ilustrar las áreas con mayor incertidumbre en las estimaciones. Esta metodología es esencial para evaluar la capacidad del modelo para generalizar y predecir en nuevas ubicaciones y escenarios, proporcionando una visión clara de la precisión y confiabilidad de las predicciones generadas.

geodatos_gridT=expand.grid(Este=seq(-76.6145, -76.6123,l=100), Norte=seq(2.3804,2.3830,l=100))

geodatos_koT=krige.conv(geo_datosT, loc=geodatos_gridT,
      krige= krige.control(nugget=0,trend.d="cte", 
      trend.l="cte",cov.pars=c(sigmasq=97.0000, phi=0.0018)))
## krige.conv: model with constant mean
## krige.conv: Kriging performed using global neighbourhood
predT=cbind(geodatos_gridT,geodatos_koT$predict)
Temp_predict=rasterFromXYZ(cbind(geodatos_gridT,geodatos_koT$predict))
Temp_error=rasterFromXYZ(cbind(geodatos_gridT,geodatos_koT$krige.var))

par(mfrow=c(1,1))
plot(Temp_predict, main="Mapa de predicción espacial")
lines(zona_estudio)

En el primer mapa se observa la predicción espacial de la temperatura, donde se presentan valores intermedios a altos hacia el sureste, mostrando una mayor frecuencia de temperaturas elevadas (superiores a los 25°C). Por el contrario, la zona noroeste presenta valores bajos de predicción, correspondientes a muestreos con temperaturas bajas (menores a los 23°C) que son menos frecuentes. Esto sugiere que hacia el sureste de la zona de estudio hay mayor certeza en la predicción espacial debido a la mayor distribución de datos. Esto otorga mayor confianza al momento de hacer la predicción en comparación con la zona noroeste, aunque no significa que no sea posible predecir en esta última área.

plot(Temp_error, main="Mapa varianza de predicción (error)")
lines(zona_estudio)

En el segundo mapa se observa la varianza en cuanto a la predicción o grado de error. Se puede constatar que el error es cero en los puntos de muestreo y muy mínimo entre estos, y a medida que se aleja de la zona de estudio, el error incrementa considerablemente. Esto permite concluir que prácticamente en toda la zona de estudio se puede hacer una buena predicción espacial de la temperatura, con un grado de error muy bajo o nulo. Alrededor de esta zona, el grado de error es bajo, aclarando que en el sureste, donde hay mayor frecuencia de datos, las predicciones serán más confiables.

HUMEDAD RELATIVA De manera similar al procedimiento realizado para la temperatura, se aplicó la predicción espacial para la variable de humedad relativa, generando su mapa de prediccion y mapa de error.

geodatos_gridHR=expand.grid(Este=seq(-76.6145, -76.6123,l=100), Norte=seq(2.3804,2.3830,l=100))

geodatos_koHR=krige.conv(geo_datosR, loc=geodatos_gridHR,
              krige= krige.control(nugget=20,trend.d="cte", 
              trend.l="cte",cov.pars=c(sigmasq=600, phi=0.0013)))
## krige.conv: model with constant mean
## krige.conv: Kriging performed using global neighbourhood
predHR=cbind(geodatos_gridHR,geodatos_koHR$predict)
HumR_predict=rasterFromXYZ(cbind(geodatos_gridHR,geodatos_koHR$predict))
HumR_error=rasterFromXYZ(cbind(geodatos_gridHR,geodatos_koHR$krige.var))

par(mfrow=c(1,1))
plot(HumR_predict, main="Mapa de predicción espacial")
lines(zona_estudio)

En el primer mapa se observa la predicción espacial de la Humedad Relativa, mostrando valores intermedios a altos (>50%) hacia el noroeste, donde se encuentra una mayor frecuencia de elevados porcentajes de humedad (superiores al 50%). Por el contrario, la zona sureste presenta valores bajos de predicción, correspondientes a muestreos con porcentajes de humedad bajos (menores al 50%) que son menos frecuentes. Esto sugiere que hacia el noroeste de la zona de estudio hay mayor certeza en la predicción espacial debido a una mayor distribución de datos, permitiendo tener mayor confianza al momento de hacer la predicción en comparación con la zona sureste. No obstante, esto no significa que no sea posible hacer una predicción en esta última área.

plot(HumR_error, main="Mapa varianza de predicción (error)")
lines(zona_estudio)

En el segundo mapa se observa la varianza en cuanto al grado de error en la predicción espacial. Se puede constatar que el error es cero en los puntos de muestreo y muy bajo entre ellos, y a medida que nos alejamos de la zona de estudio, el error incrementa considerablemente. Esto permite concluir que en prácticamente toda la zona de estudio se puede realizar una buena predicción espacial de la humedad relativa, con un grado de error muy bajo o incluso nulo. En las áreas circundantes, el grado de error es bajo, destacando que hacia el noroeste, donde hay mayor frecuencia de datos, las predicciones son más confiables.

Caso 2.

Contexto del caso

La ciudad de Cali, ha enfrentado numerosos desafíos relacionados con la violencia y la seguridad pública en las últimas décadas. La magnitud y la persistencia de los homicidios han convertido este problema en una preocupación crítica tanto para las autoridades locales como para la comunidad en general.

Propósito

Según lo anterior, este caso de estudio se centra en el análisis de los homicidios registrados en un periodo determinado en la ciudad de Cali. A través de la identificación de características relevantes a nivel individual y espacial, se busca establecer las áreas prioritarias para intervenir y mejorar la seguridad en la ciudad. El objetivo es utilizar la información obtenida para diseñar estrategias efectivas de prevención y control de la violencia, basadas en datos.

Metodología

Para alcanzar estos objetivos, se analizarán los datos de homicidios utilizando patrones puntuales, que permiten una comprensión detallada de la distribución espacial y temporal de estos eventos. Esta metodología ayudará a destacar las zonas críticas y a identificar posibles factores de riesgo asociados a la violencia en Cali.

# Instalar y cargar el paquete necesario
if (!requireNamespace("spatstat", quietly = TRUE)) {
  install.packages("spatstat")
}
library(spatstat)
## Cargando paquete requerido: spatstat.data
## Cargando paquete requerido: spatstat.univar
## spatstat.univar 3.0-1
## Cargando paquete requerido: spatstat.geom
## spatstat.geom 3.3-3
## 
## Adjuntando el paquete: 'spatstat.geom'
## The following objects are masked from 'package:raster':
## 
##     area, rotate, shift
## The following object is masked from 'package:patchwork':
## 
##     area
## Cargando paquete requerido: spatstat.random
## spatstat.random 3.3-2
## Cargando paquete requerido: spatstat.explore
## Cargando paquete requerido: nlme
## 
## Adjuntando el paquete: 'nlme'
## The following object is masked from 'package:raster':
## 
##     getData
## The following object is masked from 'package:dplyr':
## 
##     collapse
## spatstat.explore 3.3-2
## 
## Adjuntando el paquete: 'spatstat.explore'
## The following object is masked from 'package:gstat':
## 
##     idw
## Cargando paquete requerido: spatstat.model
## Cargando paquete requerido: rpart
## spatstat.model 3.3-2
## Cargando paquete requerido: spatstat.linnet
## spatstat.linnet 3.2-2
## 
## spatstat 3.2-1 
## For an introduction to spatstat, type 'beginner'
library(sf)
homicidios <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Mariana caso 2/Taller Final/Taller Final/Insumos/caso 2/Homicidios/homicidios.shp")
## Reading layer `homicidios' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Mariana caso 2\Taller Final\Taller Final\Insumos\caso 2\Homicidios\homicidios.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 4736 features and 49 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -76.59018 ymin: 3.336343 xmax: -76.46134 ymax: 3.50128
## Geodetic CRS:  WGS 84
homicidios_sf <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Mariana caso 2/Taller Final/Taller Final/Insumos/caso 2/Homicidios")
## Reading layer `homicidios' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Mariana caso 2\Taller Final\Taller Final\Insumos\caso 2\Homicidios' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 4736 features and 49 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -76.59018 ymin: 3.336343 xmax: -76.46134 ymax: 3.50128
## Geodetic CRS:  WGS 84
homicidios_ppp <- as.ppp(st_coordinates(homicidios), owin(range(st_bbox(homicidios_sf)[c(1, 3)]), 
                                                            range(st_bbox(homicidios_sf)[c(2, 4)])))

# Visualizar el patrón de puntos
plot(homicidios_ppp, main = "Patrón de Homicidios en Cali")

# Crear cuadrantes para realizar el análisis de CSR
# Aquí usamos una cuadrícula de 4x3 como ejemplo; puedes ajustar las divisiones
nx <- 4  # Número de cuadrantes en la dirección x
ny <- 3  # Número de cuadrantes en la dirección y
Q <- quadratcount(homicidios_ppp, nx = nx, ny = ny)

# Visualizar los cuadrantes con conteos
plot(homicidios_ppp, main = "Cuadrantes y Conteos de Homicidios")
plot(Q, add = TRUE, col = "blue", cex = 2)

# Realizar la prueba de Chi-cuadrado para CSR
# Hipótesis alternativa: regularidad, agrupamiento o ambas
csr_test <- quadrat.test(Q, alternative = "two.sided")

# Resultados de la prueba
print(csr_test)
## 
##  Chi-squared test of CSR using quadrat counts
## 
## data:  
## X2 = 6671.6, df = 11, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 
## Quadrats: 4 by 3 grid of tiles
# Cálculo manual del estadístico de prueba y el p-valor (opcional)
n <- npoints(homicidios_ppp)       # Número total de puntos
m <- nx * ny                       # Número total de cuadrantes
n_star <- n / m                    # Número esperado de puntos por cuadrante
ni <- as.vector(as.table(Q))       # Conteos observados por cuadrante
chi2 <- sum((ni - n_star)^2 / n_star) # Estadístico chi-cuadrado
p_value <- 2 * min(pchisq(chi2, df = m - 1), 1 - pchisq(chi2, df = m - 1))

# Mostrar resultados calculados manualmente
cat("Estadístico Chi-cuadrado:", chi2, "\n")
## Estadístico Chi-cuadrado: 6671.601
cat("p-valor:", p_value, "\n")
## p-valor: 0
# Interpretación:
if (p_value < 0.05) {
  cat("Se rechaza la hipótesis nula: el patrón no es aleatorio.\n")
} else {
  cat("No hay evidencia suficiente para rechazar la hipótesis nula: el patrón puede ser aleatorio.\n")
}
## Se rechaza la hipótesis nula: el patrón no es aleatorio.

El patrón de homicidios en Cali presenta agrupamiento espacial. Este tipo de patrón es típico cuando ciertos factores (sociales, económicos, ambientales, etc.) influyen en la concentración de eventos en ciertas ubicaciones específicas.

Fase 1: Preparación y exploración de los datos

#install.packages(c("sf", "tidyverse", "spatstat", "ggplot2", "units", "lwgeom"))

library(sf)          # Para leer y manipular datos espaciales vectoriales
library(tidyverse)   # Conjunto de herramientas para manipulación y visualización de datos
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ lubridate 1.9.3     ✔ stringr   1.5.1
## ✔ purrr     1.0.2     ✔ tibble    3.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ nlme::collapse()  masks dplyr::collapse()
## ✖ raster::extract() masks tidyr::extract()
## ✖ plotly::filter()  masks dplyr::filter(), stats::filter()
## ✖ dplyr::lag()      masks stats::lag()
## ✖ raster::select()  masks plotly::select(), dplyr::select()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(spatstat)    # Análisis espacial avanzado como densidad de Kernel y función K
library(ggplot2)     # Visualización avanzada, incluyendo mapas temáticos
library(units)       # Manejo de unidades espaciales
## udunits database from C:/Users/nicol/AppData/Local/R/win-library/4.4/units/share/udunits/udunits2.xml
library(lwgeom)      # Complemento para geometrías avanzadas y cálculos espaciales
## Linking to liblwgeom 3.0.0beta1 r16016, GEOS 3.12.1, PROJ 9.3.1
## 
## Adjuntando el paquete: 'lwgeom'
## 
## The following object is masked from 'package:sf':
## 
##     st_perimeter

1.1. Carga de datos y reproyección al mismo sistema de referencia.

Es necesario asegurarse de que todos los datos estén en el mismo sistema de referencia espacial (CRS). Por ejemplo, EPSG:4326 (WGS84).

# Leer y reproyectar datos

comunas <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Mariana caso 2/Taller Final/Taller Final/Insumos/caso 2/Comunas") %>% st_transform(crs = 4326)
## Reading layer `bcs_lim_comunas_WGS84' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Mariana caso 2\Taller Final\Taller Final\Insumos\caso 2\Comunas' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 22 features and 5 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.59076 ymin: 3.331819 xmax: -76.46125 ymax: 3.505871
## Geodetic CRS:  WGS 84
homicidios <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Mariana caso 2/Taller Final/Taller Final/Insumos/caso 2/Homicidios") %>% st_transform(crs = 4326)
## Reading layer `homicidios' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Mariana caso 2\Taller Final\Taller Final\Insumos\caso 2\Homicidios' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 4736 features and 49 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -76.59018 ymin: 3.336343 xmax: -76.46134 ymax: 3.50128
## Geodetic CRS:  WGS 84
seguridad <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Mariana caso 2/Taller Final/Taller Final/Insumos/caso 2/Seguridad_Ciudadana") %>% st_transform(crs = 4326)
## Reading layer `Seguridad_ciudadana' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Mariana caso 2\Taller Final\Taller Final\Insumos\caso 2\Seguridad_Ciudadana' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 89 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 1054407 ymin: 860970 xmax: 1068030 ymax: 878152.3
## Projected CRS: MAGNA-SIRGAS / Cali urban grid
puentes <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Mariana caso 2/Taller Final/Taller Final/Insumos/caso 2/Puentes") %>% st_transform(crs = 4326)
## Reading layer `puentes' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Mariana caso 2\Taller Final\Taller Final\Insumos\caso 2\Puentes' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 387 features and 6 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 1047855 ymin: 857967.8 xmax: 1067904 ymax: 880709.4
## Projected CRS: MAGNA-SIRGAS / Cali urban grid
barrios <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Mariana caso 2/Taller Final/Taller Final/Insumos/caso 2/Barrios") %>% st_transform(crs = 4326)
## Reading layer `Barrios' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Mariana caso 2\Taller Final\Taller Final\Insumos\caso 2\Barrios' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 337 features and 4 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 1054098 ymin: 860192.1 xmax: 1068492 ymax: 879000.7
## Projected CRS: MAGNA-SIRGAS / Cali urban grid

1.2. Exploración inicial de atributos

Ahora, se revisa los nombres de los campos de cada capa para identificar los que serán relevantes para el análisis:

# Ver atributos de cada capa
names(comunas)
## [1] "OBJECTID"   "COMUNA"     "NOMBRE"     "Shape_Leng" "Shape_Area"
## [6] "geometry"
names(homicidios)
##  [1] "OBJECTID_1" "OBJECTID"   "semana"     "spoa"       "direccion" 
##  [6] "barrio"     "com"        "dcom"       "idcombar"   "cuadrante" 
## [11] "modalidad"  "ocupacion"  "SEXO"       "EDAD"       "gedad"     
## [16] "horah"      "fechao"     "fechah"     "diasem"     "mes"       
## [21] "jornadarh8" "est28xrang" "fh8"        "dn8"        "est32xdian"
## [26] "est124xran" "est124xr_1" "diasanio"   "horam"      "fecham"    
## [31] "horai"      "fechai"     "lugar_hech" "nom_lugar_" "inspeccion"
## [36] "direcion_d" "barrio_res" "comuna_res" "levantamie" "estado_civ"
## [41] "escolarida" "droga"      "tipo_viole" "categoria_" "subcategor"
## [46] "tipo_agres" "jornada"    "x"          "y"          "geometry"
names(seguridad)
## [1] "nombre"     "localizaci" "tipo"       "propiedad"  "escala"    
## [6] "permanenci" "estruc_eco" "url1"       "geometry"
names(puentes)
## [1] "id_puente"  "barrio_nom" "direccion"  "tipo"       "comuna"    
## [6] "url"        "geometry"
names(barrios)
## [1] "id_barrio"  "barrio"     "shape_leng" "shape_area" "geometry"

1.3. Visualización inicial

Se crea un mapa base para verificar que las capas están correctamente alineadas y para obtener un panorama general de los datos.

library(ggplot2)
ggplot() +
  geom_sf(data = comunas, fill = "lightgray", color = "black") +
  geom_sf(data = homicidios, color = "red", size = 1, alpha = 0.7) +
  geom_sf(data = seguridad, color = "blue", size = 2) +
  geom_sf(data = puentes, color = "green", size = 1) +
  theme_minimal()

Fase 2: Análisis de patrones espaciales de homicidios

2.1. Distribución espacial y densidad

Como siguiente paso se analiza la distribución espacial de los homicidios dentro de las comunas y barrios, con métodos como:

Densidad de Kernel: para identificar áreas de concentración. Función K de Ripley: para analizar agrupamientos espaciales.

library(spatstat)

# Convertir homicidios a un objeto ppp para análisis espacial
homicidios_ppp <- as.ppp(st_coordinates(homicidios), W = as.owin(st_bbox(comunas)))

# Densidad de Kernel
kde <- density(homicidios_ppp, sigma = 500)
plot(kde, main = "Densidad de homicidios", col = rev(heat.colors(10)))
plot(st_geometry(comunas), add = TRUE, border = "black")

El diagrama de densidad de homicidios en Cali revela una clara concentración espacial del fenómeno en ciertas áreas específicas, principalmente en el centro y oriente de la ciudad, donde se observan las mayores densidades (zonas rojas). Estas áreas pueden estar asociadas con condiciones socioeconómicas desfavorables, alta actividad poblacional o factores estructurales relacionados con violencia urbana.

2.2. Asociación con comunas

Ahora se cuantifica los homicidios por comuna y realiza un análisis descriptivo.

Fase 3: Relación con variables de interés

# Cargar librerías
library(ggplot2)
library(sf)
library(dplyr)
library(plotly) # Asegúrate de cargar plotly

# Unir homicidios con comunas y calcular el conteo por comuna
conteo_homicidios <- st_join(comunas, homicidios, join = st_contains) %>%
  group_by(COMUNA) %>%
  summarize(homicidios = n(), .groups = "drop")

# Crear gráfico base con ggplot2
grafico <- ggplot(conteo_homicidios) +
  geom_bar(aes(x = reorder(COMUNA, -homicidios), y = homicidios), 
           stat = "identity", 
           fill = "steelblue") +
  theme_minimal() +
  labs(
    title = "Número de homicidios por comuna",
    x = "Comuna",
    y = "Número de homicidios"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Convertir el gráfico a interactivo con plotly
grafico_interactivo <- ggplotly(grafico)

# Mostrar el gráfico interactivo
grafico_interactivo

La comuna 15 es la que presenta más datos con registro de homicidios en la ciudad de Cali.

####3.1. Distancia a infraestructura de seguridad Se calcularon las distancias mínimas de los homicidios a las entidades de seguridad (por ejemplo, CAI, Defensa Civil).

# Reproyectar las capas al sistema EPSG:3115
homicidios_proj <- st_transform(homicidios, crs = 3115)
seguridad_proj <- st_transform(seguridad, crs = 3115)
comunas_proj <- st_transform(comunas, crs = 3115)

# Calcular las distancias al punto de seguridad más cercano
homicidios_proj$dist_seguridad <- apply(st_distance(homicidios_proj, seguridad_proj), 1, min)

# Agrupar por comuna y calcular la distancia promedio
dist_seguridad_comuna <- homicidios_proj %>%
  st_join(comunas_proj) %>%
  group_by(COMUNA) %>%
  summarise(distancia_promedio = mean(dist_seguridad, na.rm = TRUE))

# Ver los resultados
print(dist_seguridad_comuna)
## Simple feature collection with 22 features and 2 fields
## Geometry type: MULTIPOINT
## Dimension:     XY
## Bounding box:  xmin: 1054151 ymin: 860701.2 xmax: 1068471 ymax: 878944.2
## Projected CRS: MAGNA-SIRGAS / Colombia West zone
## # A tibble: 22 × 3
##    COMUNA distancia_promedio                                            geometry
##     <dbl>              <dbl>                                    <MULTIPOINT [m]>
##  1      1               760. ((1054151 875015.5), (1054329 874742.1), (1054493 …
##  2      2               488. ((1057905 873142.6), (1058163 873217.6), (1058264 …
##  3      3               319. ((1059054 872630.2), (1059057 872619.6), (1059233 …
##  4      4               443. ((1062076 873963.6), (1062130 873787), (1062130 87…
##  5      5               493. ((1063701 875290.1), (1063719 876143.8), (1063742 …
##  6      6               504. ((1064029 877478.8), (1064094 877601.3), (1064181 …
##  7      7               608. ((1065247 872627.4), (1065254 874425.4), (1065306 …
##  8      8               553. ((1062044 871718.7), (1062059 871716.5), (1062110 …
##  9      9               424. ((1060086 872133.1), (1060175 871792.2), (1060272 …
## 10     10               449. ((1060005 868996.7), (1060054 869313.4), (1060207 …
## # ℹ 12 more rows

Conclusiones

Identificación de Zonas Prioritarias: Las comunas con mayores distancias promedio pueden ser áreas prioritarias para mejorar la distribución de puntos de seguridad. Como la comuna 15 y la comuna 22.

Distribución de Recursos: El análisis ayuda a planificar la distribución de recursos de seguridad, asignando más puntos de control en áreas con mayores distancias promedio.

Estrategias de Seguridad: Se identificó no solo las áreas con mayores incidentes de homicidios, sino también aquellas donde los recursos de seguridad están más alejados.

Caso 3: Construcción de Mapas de Aptitud Climática para la Caña de Azúcar

En este caso, se utilizó la base de datos climática global proporcionada por WorldClim para generar mapas de aptitud climática para la caña de azúcar. Los rangos óptimos de temperatura y precipitación para la caña de azúcar son esenciales para identificar áreas con un potencial agrícola alto. Utilizando los datos climáticos a nivel mundial disponibles en WorldClim (https://www.worldclim.org/data/worldclim21.html), se extrajeron variables como la temperatura media anual, las precipitaciones anuales, y otras variables climáticas relevantes que influyen en el cultivo de la caña de azúcar.

Con esta información, se crearon mapas en R que permiten visualizar áreas con condiciones climáticas favorables para la caña de azúcar en diferentes países. Se identificaron 2 o 3 países con alto potencial agrícola para la caña de azúcar, realizando un corte utilizando un shape global para estas zonas específicas. Los mapas generados se representaron de forma interactiva utilizando Leaflet o Mapview, lo que permite una visualización detallada y un análisis espacial claro de las áreas con mayor aptitud climática para el cultivo de caña de azúcar. Este enfoque facilita la toma de decisiones en términos de planificación agrícola y manejo de cultivos en zonas con climas propicios para el desarrollo de la caña de azúcar.

Para llevar a cabo el análisis y construir mapas de aptitud climática para la caña de azúcar, es necesario utilizar varias librerías en R que nos permitan manejar, analizar y visualizar datos climáticos y espaciales de manera efectiva. Utilizaremos las siguientes librerías:

  • raster: Esta librería es fundamental para trabajar con datos raster, permitiendo leer, escribir y manipular archivos raster. Ofrece herramientas para realizar análisis espaciales como cálculos de distancia, promédios, y operaciones matemáticas entre capas, esenciales para el procesamiento de datos climáticos.

  • terra: Es una alternativa moderna al paquete raster, con una interfaz más eficiente y rápida. Esta librería permite operaciones avanzadas sobre datos raster, optimizando el manejo de grandes conjuntos de datos y proporcionando funciones para el análisis espacial detallado, como la conversión entre diferentes proyecciones y la creación de nuevos archivos raster a partir de operaciones de espacio.

  • tmap: Se utiliza para la visualización de mapas, facilitando la creación de mapas temáticos interactivos y estáticos. Esta librería es crucial para la representación visual de datos climáticos y su interpretación geoespacial, permitiendo la personalización de las escalas de color, etiquetas y leyendas para una comunicación clara de los resultados.

  • sf: Permite manejar y manipular datos espaciales en formatos vectoriales como shapefiles, crucial para trabajar con datos geoespaciales como la forma y ubicación de países y regiones. sf facilita la superposición de capas, el análisis espacial detallado y la conversión de coordenadas entre diferentes sistemas de referencia.

  • dplyr: Esta librería se utiliza para la manipulación de datos, facilitando tareas como la selección, filtrado, agrupación y transformación de datos. Es esencial para preparar los datos climáticos y ajustar los conjuntos de datos según las necesidades específicas del análisis, garantizando la coherencia y el formato adecuado para el análisis espacial.

  • kableExtra: Esta librería permite la creación de tablas en R con un formato visual atractivo, con opciones avanzadas de personalización. Es útil para presentar resultados de análisis en informes y documentos, mejorando la claridad y la presentación de los datos climáticos procesados.

Estas librerías colaboran de manera integral para acceder, analizar y visualizar datos climáticos globales, permitiendo la construcción de mapas de aptitud climática para la caña de azúcar en diferentes regiones del mundo y su representación interactiva.

library(raster)
library(terra)  # Para manejar datos raster
## terra 1.7.78
## 
## Adjuntando el paquete: 'terra'
## The following objects are masked from 'package:spatstat.geom':
## 
##     area, delaunay, is.empty, rescale, rotate, shift, where.max,
##     where.min
## The following object is masked from 'package:tidyr':
## 
##     extract
## The following object is masked from 'package:patchwork':
## 
##     area
library(tmap)   # Para visualización cartográfica
library(sf)
library(dplyr)
library(kableExtra)
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(knitr)
## 
## Adjuntando el paquete: 'knitr'
## The following object is masked from 'package:terra':
## 
##     spin
library(leaflet)

La metodología para preparar los datos climáticos en este caso implica varios pasos clave. Primero, se obtienen las rutas de los archivos raster de temperatura, precipitación y radiación anual desde las carpetas especificadas en el sistema de archivos local. Luego, se leen estos archivos utilizando la función list.files() para identificar los archivos .tif que contienen la información climática requerida. Posteriormente, estos archivos se apilan en objetos RasterStack usando la función stack(), lo que facilita la manipulación conjunta de los datos climáticos.

Una vez que los datos se agrupan en un solo objeto, se calcula el promedio anual para cada una de las capas rasters utilizando la función calc(). Este cálculo permite obtener un valor representativo de la temperatura, precipitación y radiación media para cada pixel en el raster, filtrando los valores nulos con na.rm = TRUE para asegurar que los datos sean precisos y completos. Luego, estos promedios se guardan en archivos raster individuales con la extensión .tif, utilizando la función writeRaster(). Finalmente, se proyectan los resultados a un Sistema de Referencia Coordenada común utilizando projectRaster(), lo que alinea los datos para su comparación y análisis espacial en un sistema de coordenadas global. Para la visualización, se utilizan herramientas de tmap para generar mapas interactivos que muestran las variables climáticas de manera clara y accesible. Estos mapas permiten una visualización comparativa de las distintas capas de temperatura, precipitación y radiación, facilitando así el análisis espacial y la identificación de patrones climáticos a nivel global.

# Preparacion de los datos
temperatura_files <- list.files(path = "C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Insumos/caso 3/raster del clima/Temperatura Anual", pattern = "\\.tif$", full.names = TRUE)

precipitacion_files <- list.files(path = "C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Insumos/caso 3/raster del clima/Precipitacion Anual", pattern = "\\.tif$", full.names = TRUE)

radiacion_files <- list.files(path = "C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Insumos/caso 3/raster del clima/Radiacion Anual", pattern = "\\.tif$", full.names = TRUE)


# Leer los rasters y apilarlos en un objeto RasterStack
temp_raster_stack <- stack(temperatura_files)
prec_raster_stack <- stack(precipitacion_files)
rad_raster_stack <- stack(radiacion_files)

temperatura_promedio <- calc(temp_raster_stack, mean, na.rm = TRUE)
precipitacion_promedio <- calc(prec_raster_stack, mean, na.rm = TRUE) * 12
radiacion_promedio <- calc(rad_raster_stack, mean, na.rm = TRUE)

# Guardar los raster promedios
writeRaster(temperatura_promedio, "temperatura_promedio.tif", format = "GTiff", overwrite = TRUE)
writeRaster(precipitacion_promedio, "temperatura_promedio.tif", format = "GTiff", overwrite = TRUE)
writeRaster(radiacion_promedio, "temperatura_promedio.tif", format = "GTiff", overwrite = TRUE)

# Visualizar el raster promedio
# Configuración del sistema CRS
temperatura_promedio <- projectRaster(temperatura_promedio, crs = CRS("+proj=longlat +datum=WGS84"))
precipitacion_promedio <- projectRaster(precipitacion_promedio, crs = CRS("+proj=longlat +datum=WGS84"))
radiacion_promedio <- projectRaster(radiacion_promedio, crs = CRS("+proj=longlat +datum=WGS84"))

# Modo interactivo
tmap_mode("view")
## tmap mode set to interactive viewing
# Visualización individual para pruebas
mapa_temperatura <- tm_shape(temperatura_promedio) +
  tm_raster(title = "Temperatura (°C)", palette = "-RdYlBu", style = "cont")

mapa_precipitacion <- tm_shape(precipitacion_promedio) +
  tm_raster(title = "Precipitación (mm)", palette = "Blues", style = "cont")

mapa_radiacion <- tm_shape(radiacion_promedio) +
  tm_raster(title = "Radiación (W/m²)", palette = "YlOrRd", style = "cont")


# Visualizarlos interactivos en una sola ventana comparativa
tmap_arrange(mapa_temperatura, mapa_precipitacion, mapa_radiacion, ncol = 1) 
## stars object downsampled to 1413 by 708 cells. See tm_shape manual (argument raster.downsample)
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Variable(s) "NA" contains positive and negative values, so midpoint is set to 0. Set midpoint = NA to show the full spectrum of the color palette.
## stars object downsampled to 1413 by 708 cells. See tm_shape manual (argument raster.downsample)
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## stars object downsampled to 1413 by 708 cells. See tm_shape manual (argument raster.downsample)
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data
## Warning in st_is_longlat(x): bounding box has potentially an invalid value
## range for longlat data

Análisis de Gráficos Los tres mapas muestran la distribución global de temperatura, precipitación y radiación solar, variables climáticas clave para entender los patrones ambientales. La temperatura presenta un gradiente latitudinal claro: las zonas ecuatoriales tienen valores superiores a 20 °C, mientras que las regiones polares muestran temperaturas inferiores a -30 °C. La precipitación es más alta en áreas tropicales como la cuenca del Amazonas y el sudeste asiático, mientras que los desiertos y regiones continentales alejadas del océano muestran valores bajos. Por otro lado, la radiación solar es más intensa en los trópicos y desiertos, como el Sahara, debido a cielos despejados, mientras que disminuye hacia los polos. Estas variables están interrelacionadas: las zonas con alta radiación suelen ser cálidas, pero pueden ser áridas, como los desiertos, mientras que las regiones húmedas, con mayor precipitación, tienen una menor radiación debido a la nubosidad. Este análisis es fundamental para aplicaciones como agricultura o estudios de cambio climático.

Para esta sección de la metodología, primero se cargan los archivos raster de precipitación, temperatura y radiación que representan las variables climáticas utilizadas en el análisis. Estas capas raster se guardan en las variables precipitation, temperature y radiation, respectivamente. Luego, se define una función calculate_score() que calcula un puntaje para cada pixel en las capas raster, basado en su ajuste a rangos óptimos específicos para cada variable climática.

La función calculate_score() recibe como argumentos un raster y un rango de valores mínimo y máximo (por ejemplo, para temperatura, 22 a 28 grados Celsius). Extrae los valores del raster, calcula el rango de valores presentes, y asigna un puntaje de 10 a los valores que están dentro del rango óptimo. Los valores por debajo del rango óptimo reciben un puntaje proporcionalmente menor, mientras que los valores por encima del rango óptimo reciben un puntaje menor también, de acuerdo a una función lineal. La función también maneja valores nulos (NA) sin afectar el cálculo.

Después de calcular los puntajes para cada variable utilizando esta función, se generan los mapas interactivos para cada variable usando tmap. Cada mapa muestra la distribución espacial de la variable correspondiente en una escala de 1 a 10, donde 10 representa los mejores valores para la caña de azúcar. La visualización interactiva se habilita con tmap_mode(“view”), permitiendo a los usuarios explorar los mapas de manera detallada y comparativa. Finalmente, se usa tmap_arrange() para organizar los mapas de precipitación, temperatura y radiación en una disposición vertical, facilitando la comparación visual entre las variables climáticas óptimas.

# Cargar los rasters (modifica las rutas según tus datos)
precipitation <- precipitacion_promedio
temperature <- temperatura_promedio
radiation <- radiacion_promedio

# Función para calcular puntajes
calculate_score <- function(raster, min_opt, max_opt) {
  # Extraer los valores del raster
  values <- as.numeric(getValues(raster))
  
  # Calcular el rango válido
  valid_values <- values[!is.na(values)]
  min_val <- min(valid_values, na.rm = TRUE)
  max_val <- max(valid_values, na.rm = TRUE)
  
  # Inicializar puntajes con NA
  score <- rep(NA, length(values))
  
  # Calcular puntajes dentro del rango óptimo
  is_within_range <- !is.na(values) & values >= min_opt & values <= max_opt
  score[is_within_range] <- 10
  
  # Calcular puntajes por debajo del rango óptimo
  below_min <- !is.na(values) & values < min_opt
  score[below_min] <- 1 + 9 * ((values[below_min] - min_val) / (min_opt - min_val))
  
  # Calcular puntajes por encima del rango óptimo
  above_max <- !is.na(values) & values > max_opt
  score[above_max] <- 1 + 9 * ((max_val - values[above_max]) / (max_val - max_opt))
  
  # Devolver el raster con los puntajes calculados
  return(setValues(raster, score))
}

# Calcular puntajes para cada variable
precipitation_score <- calculate_score(precipitation, 1500, 3500)
temperature_score <- calculate_score(temperature, 22, 28)
radiation_score <- calculate_score(radiation, 16000, 25000)

# Activar el modo interactivo en tmap
tmap_mode("view")  # Habilita visualización interactiva
## tmap mode set to interactive viewing
# Crear mapas interactivos con tmap
precip_map <- tm_shape(precipitation_score) + 
  tm_raster(
    title = "Precipitación (1-10)", 
    palette = "viridis", 
    style = "cont", 
    breaks = seq(1, 10, by = 1)
  ) +
  tm_layout(
    title = "Precipitación Óptima", 
    legend.outside = TRUE
  )

temp_map <- tm_shape(temperature_score) + 
  tm_raster(
    title = "Temperatura (1-10)", 
    palette = "viridis", 
    style = "cont", 
    breaks = seq(1, 10, by = 1)
  ) +
  tm_layout(
    title = "Temperatura Óptima", 
    legend.outside = TRUE
  )

radi_map <- tm_shape(radiation_score) + 
  tm_raster(
    title = "Radiación Solar (1-10)", 
    palette = "viridis", 
    style = "cont", 
    breaks = seq(1, 10, by = 1)
  ) +
  tm_layout(
    title = "Radiación Óptima", 
    legend.outside = TRUE
  )

# Visualización interactiva de los tres mapas
tmap_arrange(precip_map, temp_map, radi_map, ncol = 1)  # Disposición vertical (ajusta ncol según necesidad)
## stars object downsampled to 1413 by 708 cells. See tm_shape manual (argument raster.downsample)
## stars object downsampled to 1413 by 708 cells. See tm_shape manual (argument raster.downsample)
## stars object downsampled to 1413 by 708 cells. See tm_shape manual (argument raster.downsample)

Análisis de los Gráficos En los tres mapas se observa la distribución de precipitación, temperatura y radiación solar, normalizadas en una escala de 1 a 10. En el caso de la precipitación, los valores más altos se concentran en áreas tropicales como la cuenca del Amazonas y el sudeste asiático (amarillo), mientras que las regiones desérticas presentan valores bajos (morado). La temperatura sigue un patrón similar, con valores más altos en zonas ecuatoriales y subtropicales, mientras que los valores más bajos están en regiones polares. Por otro lado, la radiación solar muestra una intensidad alta en los desiertos y trópicos (amarillo), mientras que es más baja en áreas de mayor latitud y regiones húmedas con alta nubosidad (morado). Este análisis confirma la correlación entre las tres variables: las zonas con alta radiación suelen ser cálidas pero áridas, mientras que las áreas húmedas presentan menor radiación. Estos patrones son clave para evaluar la idoneidad climática en actividades como la agricultura.

Para esta sección de la metodología, se define el CRS objetivo (target_crs) en el sistema de coordenadas global WGS84. Se verifican que los rasters de precipitación, temperatura y radiación tengan las mismas dimensiones y extensiones para asegurar la consistencia en las operaciones de análisis y visualización.

Luego, se realiza la reproyección de estos rasters al CRS objetivo para asegurar que todos los datos estén alineados correctamente. Tras esto, se suma los rasters re-proyectados para crear un índice combinado que representa la aptitud climática para la caña de azúcar en función de las variables de precipitación, temperatura y radiación.

Finalmente, se calcula una transformación lineal para estandarizar los valores del índice combinado en un rango de 0 a 100, lo que facilita la interpretación visual en un mapa interactivo que muestra las zonas óptimas para la caña de azúcar. Este mapa utiliza una paleta de colores verde-amarillenta para resaltar las zonas con alta aptitud climática, y la leyenda se coloca fuera del mapa para mejorar la legibilidad.

# Definir el CRS objetivo
target_crs <- "+proj=longlat +datum=WGS84 +no_defs"


# Comprobación de dimensiones y extensiones
if (!identical(dim(precipitation_score), dim(radiation_score)) || 
    !identical(dim(precipitation_score), dim(temperature_score))) {
  stop("Los rásters no tienen las mismas dimensiones")
}

# Verificación de extensiones
extent_precip <- extent(precipitation_score)
extent_rad <- extent(radiation_score)
extent_temp <- extent(temperature_score)

if (!identical(extent_precip, extent_rad) || !identical(extent_precip, extent_temp)) {
  stop("Las extensiones de los rásters no coinciden")
}

# Reproyección (si es necesario)
precipitation_score <- projectRaster(precipitation_score, crs = target_crs)
radiation_score <- projectRaster(radiation_score, crs = target_crs)
temperature_score <- projectRaster(temperature_score, crs = target_crs)

# Combinación de rásters
combined_score <- precipitation_score + temperature_score + radiation_score

# Definir los valores mínimos y máximos originales y los nuevos valores deseados
min_val <- 3
max_val <- 30
new_min <- 0
new_max <- 100

# Calcular la transformación lineal
reclassified_score <- calc(combined_score, fun = function(x) {
  ((x - min_val) / (max_val - min_val)) * (new_max - new_min) + new_min
})

# Activar el modo interactivo
tmap_mode("view")
## tmap mode set to interactive viewing
# Crear un mapa del puntaje combinado
combined_map <- tm_shape(reclassified_score) + 
  tm_raster(
    title = "Índice combinado (%)", 
    palette = "YlGn",  # Paleta sugerente de vegetación
    style = "cont", 
    breaks = seq(0, 100, by = 10)  # Intervalos de 10%
  ) +
  tm_layout(
    title = "Zonas Óptimas para Caña de Azúcar", 
    legend.outside = TRUE,  # Colocar leyenda fuera del mapa
    legend.outside.position = "right"  # Ajustar posición de la leyenda
  )

# Visualizar el mapa combinado
combined_map
## stars object downsampled to 1413 by 708 cells. See tm_shape manual (argument raster.downsample)

Análisis del Gráfico El mapa de zonas óptimas para el cultivo de caña de azúcar presenta una zonificación a nivel global, identificando las regiones con las condiciones climáticas más favorables para este cultivo. Esta zonificación se obtuvo mediante la combinación de modelos digitales del terreno (MDT) que representan la distribución espacial de variables climáticas clave, como temperatura, precipitación y radiación solar. Los resultados muestran una clara concentración de zonas altamente aptas en regiones tropicales y subtropicales, donde las condiciones de temperatura y radiación solar son más favorables para el desarrollo de la caña de azúcar. Sin embargo, es importante resaltar que la precipitación también juega un papel crucial, ya que un suministro adecuado de agua es esencial para el crecimiento de la planta. Esta herramienta visual permite a los productores, investigadores y tomadores de decisiones identificar las áreas con mayor potencial para el cultivo de caña de azúcar, optimizando así los recursos y maximizando la producción.

En esta metodología, primero se carga el shapefile de los países y se reproyecta para que coincida con el CRS del raster clasificacion_zonas. Luego, se realiza una estadística zonal para calcular el promedio del raster en cada zona (país). Este promedio se convierte en un data frame para agregar las estadísticas a las geometrías del shapefile de países.

Después, se filtra y ordena este data frame para obtener un ranking de los cinco países con los valores más altos de porcentaje de zona óptima para la caña de azúcar. Este ranking se muestra en un formato atractivo utilizando knitr::kable, con opciones de estilización bootstrap para mejor visualización en HTML.

# Cargar shapefile de los países
countries <- st_read("C:/Users/nicol/OneDrive/Documentos/Universidad/Semetre 5/Análisis de Datos Espaciales/Taller Final/Insumos/caso 3/shape_global/paises_mundo.shp")
## Reading layer `paises_mundo' from data source 
##   `C:\Users\nicol\OneDrive\Documentos\Universidad\Semetre 5\Análisis de Datos Espaciales\Taller Final\Insumos\caso 3\shape_global\paises_mundo.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 183 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -180 ymin: -55.72333 xmax: 180 ymax: 83.62742
## Geodetic CRS:  WGS 84
clasificacion_zonas <- rast(reclassified_score)

# Reproyectar shapefile si es necesario para coincidir con el CRS del raster
countries <- st_transform(countries, crs(clasificacion_zonas))

# Realizar la estadística zonal
zonal_stats <- extract(clasificacion_zonas, countries, fun=mean, na.rm=TRUE)

# Convertir las estadísticas zonales a un data frame si es necesario
zonal_stats_df <- as.data.frame(zonal_stats)

# Agregar las estadísticas al shapefile
countries$porcen_zonaoptima <- zonal_stats_df$layer  # Ajustar según el nombre de la capa en zonal_stats
# Ordenar por mean_value
ranking <- countries %>%
  st_drop_geometry() %>%  # Elimina la geometría temporalmente para trabajar solo con los atributos
  arrange(desc(porcen_zonaoptima)) %>%  # Ordenar de mayor a menor
  slice_head(n = 5)  # Seleccionar los 5 primeros

# Crear una tabla con solo las columnas necesarias
ranking_table <- data.frame(
  Pais = ranking$ADM0_NAME,         # Nombre del país
  Continente = ranking$CONTINENT,    # Nombre del continente
  Zona_Optima = ranking$porcen_zonaoptima  # Valor de la zona óptima
)

# Mostrar la tabla con kableExtra
library(kableExtra)

ranking_table %>%
  kable(format = "html", caption = "Top 5 Countries by Optimal Zone Percentage") %>%
  kable_styling(full_width = FALSE)
Top 5 Countries by Optimal Zone Percentage
Pais Continente Zona_Optima
French Guiana Americas 100.00000
Trinidad and Tobago Americas 100.00000
Suriname Americas 100.00000
Guyana Americas 99.99730
Fiji Oceania 99.99078

Análisis de la Tabla La tabla presentada evidencia que los cinco países con el porcentaje más alto de zonas óptimas para el cultivo de caña de azúcar se encuentran en las Américas y Oceanía. El valor numérico en la columna “Zona_Optima” representa un índice que indica la proporción del territorio de cada país que cuenta con las condiciones climáticas ideales para este cultivo, según los parámetros de temperatura, precipitación y radiación solar utilizados en el análisis.

En este código, primero se seleccionan los tres países con los valores más altos del ranking. Luego, se recorta el raster reclassified_score para cada país usando su geometría y se aplica una máscara para limitar el área de interés. Cada recorte se almacena en una lista. Posteriormente, se crea un mapa interactivo usando leaflet para cada país con un color diferente (paleta viridis) y una leyenda correspondiente al país. Finalmente, los tres mapas se combinan en una cuadrícula para su visualización conjunta en una página web interactiva.

# Seleccionar los 3 países con valores más altos del ranking
top_3_countries <- countries %>%
  filter(ADM0_NAME %in% ranking$ADM0_NAME[1:3])  # Extraer geometrías de los top 3

# Inicializar una lista para almacenar los recortes del raster
raster_crops <- list()

for (i in 1:3) {
  country_name <- top_3_countries$ADM0_NAME[i]  # Usar la columna correcta para el nombre del país
  country_geom <- top_3_countries[i, ]         # Extraer la geometría directamente
  
  # Recorte del raster usando la geometría
  raster_crop <- crop(reclassified_score, country_geom)
  
  # Aplicar máscara al raster recortado
  raster_crops[[country_name]] <- mask(raster_crop, country_geom)
}

library(htmltools)

# Crear mapas individuales en objetos separados
map1 <- leaflet() %>%
  addTiles() %>%
  addRasterImage(
    raster_crops[[1]], 
    colors = colorNumeric(palette = "viridis", domain = range(na.omit(values(raster_crops[[1]])), na.rm = TRUE)), 
    opacity = 0.8
  ) %>%
  addLegend(
    pal = colorNumeric(palette = "viridis", domain = range(na.omit(values(raster_crops[[1]])), na.rm = TRUE)), 
    values = values(raster_crops[[1]]),
    title = "French Guiana"
  )

map2 <- leaflet() %>%
  addTiles() %>%
  addRasterImage(
    raster_crops[[2]], 
    colors = colorNumeric(palette = "viridis", domain = range(na.omit(values(raster_crops[[2]])), na.rm = TRUE)), 
    opacity = 0.8
  ) %>%
  addLegend(
    pal = colorNumeric(palette = "viridis", domain = range(na.omit(values(raster_crops[[2]])), na.rm = TRUE)), 
    values = values(raster_crops[[2]]),
    title = "Trinidad and Tobago"
  )

map3 <- leaflet() %>%
  addTiles() %>%
  addRasterImage(
    raster_crops[[3]], 
    colors = colorNumeric(palette = "viridis", domain = range(na.omit(values(raster_crops[[3]])), na.rm = TRUE)), 
    opacity = 0.8
  ) %>%
  addLegend(
    pal = colorNumeric(palette = "viridis", domain = range(na.omit(values(raster_crops[[3]])), na.rm = TRUE)), 
    values = values(raster_crops[[3]]),
    title = "Suriname"
  )

# Combinar los mapas en una cuadrícula
htmltools::browsable(
  htmltools::tagList(
    htmltools::tags$div(style = "display: flex; justify-content: space-between;",
                        htmltools::tags$div(style = "width: 50%;", map1),
                        htmltools::tags$div(style = "width: 50%;", map2),
                        htmltools::tags$div(style = "width: 50%;", map3))
  )
)

Los mapas presentados ofrecen una visualización más detallada del potencial para el cultivo de caña de azúcar en los tres países con el índice más alto según la tabla anterior.