En este documento, se presenta el paso a paso para llevar a cabo el requerimiento solicitado para cumplimiento de la actividad del módulo 2, Unidad 1:

Nota: A lo largo del documento, por sección, se realizan las interpretaciones y conclusiones pertinentes para cumplir los requerimientos de la rúbrica

Como primera medida, se realiza el análisis exploratorio a la base de datos: “Datos_Completos_Aguacates.xlsx”

suppressMessages(library(readxl))
suppressMessages(library(dplyr))
suppressMessages(library(ggplot2))
suppressMessages(library(sp))
suppressMessages(library(gstat))
suppressMessages(library(automap))
suppressMessages(library(sf))
suppressMessages(library(summarytools))
suppressMessages(library(corrplot))

# Leer la base de datos
file_path <- "C:/Users/jlafaurie/Dropbox/Datos personales/Maestría ciencia de datos/2. Segundo Semestre/4. Análisis de información geográfica y espacial/Módulo 2/Unidad 1/Datos_Completos_Aguacate.xlsx"
data <- read_excel(file_path)

# Convertir la columna de fecha a tipo Date y filtrar por el periodo 01/10/2020
data <- data %>%
  mutate(Date = as.Date(FORMATTED_DATE_TIME, format = "%d/%m/%Y")) %>%
  filter(Date == as.Date("2020-10-01"))

# Mostrar las primeras filas del dataset
head(data)
## # A tibble: 6 × 22
##   id_arbol Latitude Longitude FORMATTED_DATE_TIME        Psychro_Wet_Bulb_Temp…¹
##   <chr>       <dbl>     <dbl> <chr>                                        <dbl>
## 1 1            2.39     -76.7 01/10/2020  10:11:12 a, m,                    22  
## 2 2            2.39     -76.7 01/10/2020  10:11:12 a, m,                    21.4
## 3 3            2.39     -76.7 01/10/2020  10:11:12 a, m,                    21.8
## 4 4            2.39     -76.7 01/10/2020  10:11:12 a, m,                    22.8
## 5 5            2.39     -76.7 01/10/2020  10:11:12 a, m,                    22.6
## 6 6            2.39     -76.7 01/10/2020  10:11:12 a, m,                    21.5
## # ℹ abbreviated name: ¹​Psychro_Wet_Bulb_Temperature
## # ℹ 17 more variables: Station_Pressure <dbl>, Relative_Humidity <dbl>,
## #   Crosswind <dbl>, Temperature <dbl>, Barometric_Pressure <dbl>,
## #   Headwind <dbl>, Direction_True <dbl>, Direction_Mag <dbl>,
## #   Wind_Speed <dbl>, Heat_Stress_Index <dbl>, Altitude <dbl>, Dew_Point <dbl>,
## #   Density_Altitude <dbl>, Wind_Chill <dbl>,
## #   Estado_Fenologico_Predominante <dbl>, Frutos_Afectados <dbl>, Date <date>
# Resumen estadístico de todas las variables

summary(data)
##    id_arbol            Latitude       Longitude      FORMATTED_DATE_TIME
##  Length:534         Min.   :2.392   Min.   :-76.71   Length:534         
##  Class :character   1st Qu.:2.393   1st Qu.:-76.71   Class :character   
##  Mode  :character   Median :2.393   Median :-76.71   Mode  :character   
##                     Mean   :2.393   Mean   :-76.71                      
##                     3rd Qu.:2.393   3rd Qu.:-76.71                      
##                     Max.   :2.394   Max.   :-76.71                      
##  Psychro_Wet_Bulb_Temperature Station_Pressure Relative_Humidity
##  Min.   :19.00                Min.   :822.4    Min.   :59.50    
##  1st Qu.:20.80                1st Qu.:824.8    1st Qu.:67.33    
##  Median :21.50                Median :825.7    Median :71.25    
##  Mean   :21.63                Mean   :825.5    Mean   :71.17    
##  3rd Qu.:22.40                3rd Qu.:826.5    3rd Qu.:75.30    
##  Max.   :24.90                Max.   :827.4    Max.   :91.60    
##    Crosswind       Temperature    Barometric_Pressure    Headwind      
##  Min.   :0.0000   Min.   :22.20   Min.   :822.4       Min.   :-0.7000  
##  1st Qu.:0.0000   1st Qu.:24.50   1st Qu.:824.7       1st Qu.: 0.0000  
##  Median :0.1000   Median :25.80   Median :825.7       Median : 0.1000  
##  Mean   :0.1989   Mean   :25.83   Mean   :825.5       Mean   : 0.1906  
##  3rd Qu.:0.3750   3rd Qu.:27.18   3rd Qu.:826.5       3rd Qu.: 0.3750  
##  Max.   :1.5000   Max.   :29.70   Max.   :827.4       Max.   : 1.3000  
##  Direction_True  Direction_Mag     Wind_Speed     Heat_Stress_Index
##  Min.   :  0.0   Min.   :  0.0   Min.   :0.0000   Min.   :22.80    
##  1st Qu.: 66.0   1st Qu.: 66.0   1st Qu.:0.0000   1st Qu.:25.20    
##  Median :287.5   Median :287.5   Median :0.4000   Median :27.20    
##  Mean   :222.5   Mean   :223.3   Mean   :0.3315   Mean   :27.40    
##  3rd Qu.:311.8   3rd Qu.:312.0   3rd Qu.:0.5000   3rd Qu.:29.18    
##  Max.   :359.0   Max.   :359.0   Max.   :1.8000   Max.   :34.50    
##     Altitude      Dew_Point     Density_Altitude   Wind_Chill   
##  Min.   :1675   Min.   :17.70   Min.   :2.409    Min.   :22.20  
##  1st Qu.:1684   1st Qu.:19.40   1st Qu.:2.506    1st Qu.:24.50  
##  Median :1692   Median :20.00   Median :2.551    Median :25.80  
##  Mean   :1693   Mean   :20.16   Mean   :2.556    Mean   :25.79  
##  3rd Qu.:1700   3rd Qu.:20.80   3rd Qu.:2.605    3rd Qu.:27.10  
##  Max.   :1724   Max.   :24.00   Max.   :2.723    Max.   :29.60  
##  Estado_Fenologico_Predominante Frutos_Afectados        Date           
##  Min.   :717.0                  Min.   :0.000000   Min.   :2020-10-01  
##  1st Qu.:717.0                  1st Qu.:0.000000   1st Qu.:2020-10-01  
##  Median :718.0                  Median :0.000000   Median :2020-10-01  
##  Mean   :717.8                  Mean   :0.005618   Mean   :2020-10-01  
##  3rd Qu.:718.0                  3rd Qu.:0.000000   3rd Qu.:2020-10-01  
##  Max.   :719.0                  Max.   :1.000000   Max.   :2020-10-01
  • Análisis e interpretación de variables más relevantes:

  • Variables Categóricas

    • id_arbol y FORMATTED_DATE_TIME

    • id_arbol: Identificadores únicos de los árboles, con un total de 534 registros.

    • FORMATTED_DATE_TIME: Fecha y hora en formato de caracteres, todos los registros corresponden a una única fecha: 01/10/2020.

  • Variables Numéricas

    • Latitude: Valores entre 2.392 y 2.394, con una media de 2.393. La dispersión de los datos es muy pequeña, indicando que los árboles están ubicados en una área geográfica muy específica.

    • Longitude: Valores entre -76.71 y -76.71, con una media de -76.71. Similar a la latitud, la dispersión es mínima.

    • Relative_Humidity (Humedad relativa): Rango: 59.50 a 91.60. Media: 71.17. Mediana: 71.25. La mayoría de los valores se encuentran entre 67.33 y 75.30, con algunos valores más altos.

    • Wind_Speed (Velocidad del viento): Rango: 0.0000 a 1.8000. Media: 0.3315. Mediana: 0.4000. La velocidad del viento es generalmente baja.

    • Temperature (Temperatura): Rango: 22.20 a 29.70. Media: 25.83. Mediana: 25.80. La distribución de la temperatura es bastante centrada.

Una vez analizada la información y sus estadísticos, se procede a presentar diagramas de frecuencia de las variables más relevantes:

ggplot(data, aes(x = Temperature)) +
  geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Histograma de la Temperatura", x = "Temperatura", y = "Frecuencia") +
  theme_minimal()

#Boxplot de Temperature

ggplot(data, aes(y = Temperature)) +
  geom_boxplot(fill = "orange", color = "black") +
  labs(title = "Boxplot de la Temperatura", y = "Temperatura") +
  theme_minimal()

  • Intepretación y conclusiones del gráfico

    • El histograma muestra temperaturas que varían aproximadamente entre 23 y 29 grados Celsius.
    • La distribución de temperaturas muestra una forma que se asemeja a una distribución normal, pero ligeramente sesgada hacia la derecha (temperaturas más altas)
    • Las temperaturas en los extremos del rango, cerca de 23 y 29 grados, son menos frecuentes. Esto sugiere que las condiciones extremadamente frías o calientes son menos comunes
    • El lugar de estudio podría caracterizarse por tener un clima templado con variaciones moderadas en temperatura durante el período de observación. Lo cual podría ser útil para actividades que dependen de la temperatura, como la agricultura.
ggplot(data, aes(x = Relative_Humidity)) +
  geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Histograma de Humedad Relativa", x = "Humedad Relativa", y = "Frecuencia") +
  theme_minimal()

  • Intepretación y conclusiones del gráfico

    • El histograma abarca un rango de humedad relativa del 60% al 90%, con la mayoría de las observaciones concentradas entre aproximadamente el 70% y el 85%
    • Las humedades relativas muy bajas (60% a 70%) y muy altas (más del 85%) son menos frecuentes, indicando que las condiciones extremadamente secas o muy húmedas son menos comunes
    • La concentración de valores en el rango medio-alto de humedad relativa sugiere que el lugar o periodo representado por los datos tiende a ser húmedo.
ggplot(data, aes(x = Wind_Speed)) +
  geom_histogram(binwidth = 0.1, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Histograma de Velocidad del Viento", x = "Velocidad del Viento", y = "Frecuencia") +
  theme_minimal()

  • Intepretación y conclusiones del gráfico

    • El histograma abarca un rango de velocidad del viento desde 0 hasta aproximadamente 1.5 metros por segundo, con la mayoría de las observaciones concentradas cerca del extremo inferior del rango.
    • La mayoría de las velocidades de viento registradas son muy bajas, cerca de 0 m/s.
    • Las velocidades de viento superiores a 1 m/s son significativamente menos frecuentes, lo que sugiere que las condiciones de viento fuerte son raras en el conjunto de datos.
    • El área o periodo representado por los datos se caracteriza por vientos con velocidades cercanas a cero.

Seguido, se realiza un análsis de correlación de todas las variables:

# Seleccionar variables numéricas relevantes para la correlación
variables_seleccionadas <- data %>% select(Temperature, Latitude, Longitude, 
                                           Psychro_Wet_Bulb_Temperature, 
                                           Station_Pressure, 
                                           Relative_Humidity, 
                                           Wind_Speed, 
                                           Heat_Stress_Index, 
                                           Dew_Point)

# Calcular la matriz de correlación
correlation_matrix <- cor(variables_seleccionadas, use = "complete.obs")

# Visualizar la matriz de correlación
corrplot(correlation_matrix, method = "circle")

  • Interpretación y conclusiones

La gráfica muestra una matriz de correlación entre variables climáticas y geográficas en el dataset. Aquí hay un análisis detallado de la gráfica:

  • Los círculos azules indican una correlación positiva, mientras que los círculos rojos indican una correlación negativa.

  • El tamaño del círculo y la intensidad del color reflejan la magnitud de la correlación. Un círculo más grande y un color más oscuro indican una correlación más fuerte.

  • Los valores en la matriz varían entre -1 y 1, donde: 1 indica una correlación positiva perfecta, -1 indica una correlación negativa perfecta y 0 indica que no hay correlación.

  • La correlación entre Latitude y Longitude es cercana a cero, indicando que estas dos variables no están relacionadas entre sí, lo cual tiene sentido geográficamente.

  • Temperature (Temperatura) Vs:

    • Psychro_Wet_Bulb_Temperature (Temperatura de bulbo húmedo psicrométrico): Alta correlación positiva (cercana a 1), lo cual es esperado ya que ambas son medidas relacionadas con la temperatura.

    • Heat_Stress_Index (Índice de estrés por calor): Alta correlación positiva, ya que el índice de estrés por calor está influenciado directamente por la temperatura.

    • Dew_Point (Punto de rocío): Alta correlación positiva, indicando que a mayor temperatura, también aumenta el punto de rocío.

  • Conclusiones

    • La temperatura está fuertemente correlacionada con la temperatura de bulbo húmedo psicrométrico, el índice de estrés por calor y el punto de rocío.
    • La humedad relativa muestra una correlación negativa con la temperatura, lo cual es esperado.
    • La velocidad del viento y la presión en la estación no muestran correlaciones significativas con otras variables.
    • La matriz de correlación es útil para identificar variables que están fuertemente relacionadas y que puede apoyar la construcción de modelos predictivos.

Una vez analizada toda la base de datos, se procede a continuar con los requerimientos planteados. Como primera medida, se selecciona únicamente las vairables Temperatura, Latitude y Longitude, que serán utilizadas para el desarrollo de todo el ejercicio:

# Seleccionar las variables de interés
data_selected <- data %>%
  select(Temperature, Latitude, Longitude)

# Verificar la información de la base de datos resultante
print(head(data_selected))
## # A tibble: 6 × 3
##   Temperature Latitude Longitude
##         <dbl>    <dbl>     <dbl>
## 1        23.9     2.39     -76.7
## 2        23.5     2.39     -76.7
## 3        24.5     2.39     -76.7
## 4        25.9     2.39     -76.7
## 5        26       2.39     -76.7
## 6        24.5     2.39     -76.7
# Gráfico de dispersión con la latitud y longitud
ggplot(data_selected, aes(x = Longitude, y = Latitude)) +
  geom_point(aes(color = Temperature)) +
  labs(title = "Diagrama de dispersión de Latitude and Longitude",
       x = "Longitude",
       y = "Latitude",
       color = "Temperature") +
  theme_minimal()

  • Interpretación y conclusiones del Gráfico de Dispersión de Latitud y Longitud

El gráfico de dispersión muestra la distribución geográfica de los árboles en función de su latitud y longitud, en una escala de colores marcada por la temperatura. A continuación, se procede a realizar la interpretación de este:

  • Distribución Geográfica:

    • Los árboles están distribuidos en un área geográfica específica con coordenadas de latitud que van de aproximadamente 2.3924 a 2.3936 y coordenadas de longitud que van de aproximadamente -76.7115 a -76.7105.

    • La distribución de los puntos sugiere una cobertura uniforme del área con algunas concentraciones más densas en ciertos lugares.

  • Rango de Temperatura:

    • Los colores de los puntos varían de azul claro a azul oscuro, indicando las diferentes temperaturas registradas.
    • La leyenda muestra que las temperaturas varían de aproximadamente 24°C a 28°C.
  • Patrones de Temperatura:

    • No se observa un patrón claro de temperatura relacionado con la posición geográfica dentro del área de estudio.
    • Los puntos de diferentes colores están dispersos de manera relativamente uniforme, lo que sugiere que la temperatura es bastante homogénea en esta región.
  • Conclusiones

    • La temperatura es uniforme en toda el área de estudio, con variaciones menores entre 24°C y 28°C. Esto sugiere que no hay variaciones de temperatura considerables en la región en las fechas registradas.

    • Los árboles están distribuidos uniformemente en la región estudiada.

    • Dado que no se observan grandes variaciones en la temperatura en función de la ubicación, puede ser necesario investigar otros factores que podrían influir en la temperatura local, como la altitud, la cobertura del suelo, entre otros.

    • Podría ser útil realizar un análisis de variabilidad espacial más detallado, como kriging, para ver si hay patrones espaciales más sutiles que no son evidentes en el gráfico de dispersión.

A continuación, se presenta la creación del geodata y su interpretación:

# Crear el objeto spatial data
coordinates(data_selected) <- ~ Longitude + Latitude
proj4string(data_selected) <- CRS("+proj=longlat +datum=WGS84")

# Semivariograma
variogram <- variogram(Temperature ~ 1, data_selected)
plot(variogram)

  • Interpretación del Semivariograma

    • Eje Y (Semivarianza):

      • La semivarianza es una medida de la similitud entre los valores de la variable a medida que aumenta la distancia entre ellos.

      • Valores más altos de semivarianza indican una mayor diferencia entre los valores de la variable a medida que aumenta la distancia.

    • Eje X (Distancia):

      • La distancia representa la separación espacial entre los puntos de muestreo.

      • A medida que aumenta la distancia, esperamos que la similitud entre los puntos disminuya, reflejándose en un aumento de la semivarianza.

    • Forma del Semivariograma:

      • Pendiente Inicial: La semivarianza aumenta rápidamente a distancias cortas, lo que indica que los puntos cercanos tienden a ser más similares entre sí.

      • Meseta: La semivarianza parece estabilizarse alrededor de una distancia de 0.06 a 0.08. Esto se conoce como el “sill” y representa la distancia a partir de la cual los puntos ya no muestran dependencia espacial significativa, es decir, se vuelven independientes entre sí.

      • Rango: La distancia en la que la semivarianza se estabiliza (alrededor de 0.06 a 0.08) es conocida como el “range” y representa la extensión de la dependencia espacial. Más allá de esta distancia, los puntos no están correlacionados espacialmente.

    • Conclusiones

      • La variable analizada muestra dependencia espacial a distancias cortas, lo que significa que los valores cercanos entre sí tienden a ser más similares que los valores más distantes.

      • La dependencia espacial disminuye y se estabiliza alrededor de una distancia de 0.06 a 0.08, sugiriendo que más allá de esta distancia, los puntos son prácticamente independientes.

      • A distancias mayores, la semivarianza se estabiliza, indicando que la variabilidad de la variable es constante a gran escala. Esto sugiere una estructura espacial homogénea a partir de una cierta distancia.

      • El semivariograma es útil para seleccionar un modelo teórico adecuado (como el modelo esférico, exponencial o gaussiano) para describir la variabilidad espacial. Este modelo puede ser utilizado para la interpolación espacial mediante kriging.

Una vez analizado el gráfico de semivariograma, se procede con la identificación del mejor modelo teórico (Se usarán los modelos exponencial, gaussiano y esférico), por medio de la comparación de gráficos de semivariogramada:

suppressMessages(library(gstat))
suppressMessages(library(sp))

# Ajuste de modelos teóricos
vfit_exp <- fit.variogram(variogram, model = vgm(psill = 3, "Exp", range = 0.05, nugget = 1))
vfit_gau <- fit.variogram(variogram, model = vgm(psill = 3, "Gau", range = 0.05, nugget = 1))
vfit_sph <- fit.variogram(variogram, model = vgm(psill = 3, "Sph", range = 0.05, nugget = 1))

# Crear data frames para cada modelo teórico
exp_model <- variogramLine(vfit_exp, maxdist = max(variogram$dist), n = 100)
exp_model$model <- "Exponential"
gau_model <- variogramLine(vfit_gau, maxdist = max(variogram$dist), n = 100)
gau_model$model <- "Gaussian"
sph_model <- variogramLine(vfit_sph, maxdist = max(variogram$dist), n = 100)
sph_model$model <- "Spherical"

# Combinar los modelos teóricos en un solo data frame
models <- rbind(exp_model, gau_model, sph_model)

# Crear el gráfico combinado usando ggplot2
ggplot() +
  geom_point(data = as.data.frame(variogram), aes(x = dist, y = gamma), size = 2) +
  geom_line(data = models, aes(x = dist, y = gamma, color = model), size = 1) +
  scale_color_manual(values = c("red", "green", "blue")) +
  labs(title = "Comparison of Variogram Models",
       x = "Distance",
       y = "Semivariance",
       color = "Model") +
  theme_minimal()

  • Interpretación y conclusión del Gráfico

El gráfico muestra la comparación de los tres modelos teóricos de semivariogramas (exponencial, gaussiano y esférico) superpuestos sobre el semivariograma empírico. A continuación, se presenta el análisis detallado:

  • Los puntos negros representan la semivarianza empírica en función de la distancia entre las muestras.

  • La semivarianza aumenta con la distancia y parece estabilizarse alrededor de una distancia de 0.06 a 0.08, indicando el rango de la dependencia espacial.

  • Modelo Exponencial (línea roja): Muestra un ajuste razonable a los datos empíricos, especialmente en distancias más cortas.

  • Modelo Gaussiano (línea verde): Tiene un comportamiento inusual al principio con una pendiente muy pronunciada, pero se estabiliza rápidamente. Este modelo parece no ajustarse bien a los datos empíricos en las distancias cortas e intermedias.

  • Modelo Esférico (línea azul): Muestra un buen ajuste a los datos empíricos, capturando bien la variabilidad en las distancias cortas e intermedias, y estabilizándose correctamente en el rango observado.

  • Conclusiones

    • De los tres modelos, el modelo esférico parece proporcionar el mejor ajuste general a los datos empíricos, capturando tanto las distancias cortas como las intermedias de manera adecuada.

    • El modelo exponencial también es un buen ajuste, especialmente en distancias cortas, aunque tiene incovenientes en distancias intermedias.

    • El modelo no parece ser el más adecuado para estos datos debido a su comportamiento inusual y su incapacidad para capturar correctamente la variabilidad en las distancias intermedias.

Por último, se realiza la proyección espacial utilizando la metodología kriging y su correspondiente imagen:

suppressMessages(library(automap))

# Re-proyectar los datos a un sistema de coordenadas proyectadas (por ejemplo, UTM)
data_selected_proj <- spTransform(data_selected, CRS("+proj=utm +zone=18 +datum=WGS84 +units=m +no_defs"))

# Crear una malla (grid) de nuevos puntos para la interpolación
# Definir un rango más apropiado para la malla
bbox <- bbox(data_selected_proj)
x.range <- seq(bbox[1,1], bbox[1,2], by = 1)  
y.range <- seq(bbox[2,1], bbox[2,2], by = 1) 

grd <- expand.grid(x = x.range, y = y.range)
coordinates(grd) <- ~ x + y
gridded(grd) <- TRUE
proj4string(grd) <- proj4string(data_selected_proj)

# Realizar el kriging
kriging_result <- autoKrige(Temperature ~ 1, data_selected_proj, new_data = grd)
## [using ordinary kriging]
# Plotear los resultados
spplot(kriging_result$krige_output, "var1.pred", main = "Kriging Prediction")

  • Interpretación y conclusión del Gráfico

El gráfico actualizado muestra una interpolación de Kriging y un mapa de temperatura. A continuación, se presenta el análisis detallado:

  • El gráfico muestra una distribución continua de la temperatura en el área de estudio, con colores que van del azul oscuro (temperaturas más bajas) al amarillo brillante (temperaturas más altas).

  • La variabilidad espacial de la temperatura está delineada, con zonas de transición suave y otras con cambios más abruptos.

  • Se observan varios patrones de temperatura en forma de bandas o franjas, lo que sugiere que la temperatura varía de manera sistemática en el área.

  • Las áreas con temperaturas más altas (colores amarillos) y más bajas (colores azules oscuros) están distribuidas de manera que parecen seguir un patrón geográfico o ambiental.

  • Las áreas con temperaturas extremas son identificables. Estas zonas, pueden ser críticas para la gestión agrícola, especialmente en relación con el crecimiento de cultivos sensibles a la temperatura.

  • Las áreas de alta temperatura (amarillo brillante) podrían requerir prácticas de manejo específicas, como riego adicional o sombra, para proteger los cultivos de altas temperaturas.

  • Los patrones espaciales observados en el gráfico pueden estar influenciados por factores ambientales o topográficos, como la altitud, la exposición al sol, la proximidad a cuerpos de agua, entre otros.

  • El modelo de Kriging proporciona un mapa detallado y continuo de la temperatura, que es valioso para la planificación y la toma de decisiones en la gestión agrícola.