1 Introducción

En las últimas décadas el cambio climático ha provocado alteraciones en la variabilidad climática natural del planeta, lo que trae como resultado el incremento de temperaturas (incluso en valores promedio), que se manifiesta en olas de calor extremas, baja producción en los ecosistemas, eventos climáticos extremos y eventualmente afectará la seguridada alimentaria.

En este trabajo mostramos una aplicación de modelación estadística y geoestadística utilizando los datos temperaturas promedio para el mayo de 2023, obtenidas del Servicio Meteorológico Nacional (SMN) (https://smn.conagua.gob.mx/es/climatologia/temperaturas-y-lluvias/resumenes-mensuales-de-temperaturas-y-lluvias).

En este documento (Parte 1) nos enfocaremos en un análisis exploratorio de datos (EDA) de nivel global, es decir para México. Posteriormente (Parte 2), delimitaremos un subconjunto de Estados y realizaremos el EDA como insumo para investigar diferencias promedio en sus temperaturas. Es importante precisar que este ejercicio NO ES UN TRABAJO DE INVESTIGACIÓN RIGUROSO ó EXHAUSTIVO DE LAS TEMPERATURAS PROMEDIO, pero si se enfoca en una aplicación correcta de modelación estadística con fines educativos de estadística aplicada, caso particular Geoestadística.


2 Instalación y activación de la paquetería R

list.of.packages <- c("tidyverse","ggplot2","writexl","here","glue","car","leaflet","readr")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)


library(tidyverse)
library(ggplot2)
library(here)
library(glue)
library(writexl)
library(car)
library(leaflet)
library(readr)

3 Obtención de la base de datos del SMN

rm(list = ls()) #Se limpia el ambiente de trabajo
datos <- read.csv('https://smn.conagua.gob.mx/tools/RESOURCES/com_archivo_datos_resumenes/202305010000TMed.csv')
here() #Para conocer la ubicación de trabajo
#> [1] "G:/Mi unidad/R/Projects/2024_GeoestU2 _ConAgregadosHMB"

4 Exportar a excel una base de datos

exportados <- glue(here(),'/Exportados/') # especifico la ubicación pora exportar archivos
datos_originales <- glue(here(),'/DatosOriginales/')  # especifico la ubicación pora  archivos originales
bases_modificadas <- glue(here(),'/BasesModificadas/') # especifico la ubicación pora bases modificadas
write_xlsx(datos,glue(datos_originales,'/2305_Tmed.xlsx')) #Guardo la base original

5 Análisis univariado a nivel México


######Resumen general
summary(datos$Tmed)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   7.147  21.607  24.619  24.451  27.901  34.664


#######Boxplot
#R-base
boxplot(datos$Tmed,main = "Distribución de temperatura promedio",xlab = "ºC",ylab = "Frecuencia") 

#ggplot2
ggplot(
  data = datos, aes(x = 1 , y = Tmed)
       ) +
  geom_boxplot() +
  scale_x_discrete(name = "ºC") +
  scale_y_continuous(name =  "Frecuencia")

  

#######Histograma con diferentes opciones
# Histograma con ggplot2
hist(datos$Tmed, nclass=5,main = "Distribución de temperatura promedio",xlab = "ºC",ylab = "Frecuencia") 


hist(datos$Tmed, nclass=10,main = "Distribución de temperatura promedio",xlab = "ºC",ylab = "Frecuencia") 


hist(datos$Tmed, breaks = 20, col = "blue", border = "white",main = "Distribución de temperatura promedio",xlab = "ºC",ylab = "Frecuencia")


# Histograma con ggplot2
ggplot(datos, aes(x = Tmed)) + 
  geom_histogram() +
  ggtitle("Distribución de temperatura promedio")

6 Análisis univariado por Estado

#Resumen por Estado
tapply(datos$Tmed, datos$Edo, summary)
#> $AGS
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   19.69   19.69   19.69   19.69   19.69   19.69 
#> 
#> $BC
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   9.913  16.342  17.517  18.950  22.623  28.127 
#> 
#> $BCS
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   16.42   21.40   24.45   23.12   24.74   27.77 
#> 
#> $CAMP
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   29.00   29.74   29.98   30.20   30.74   31.47 
#> 
#> $CDMX
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   15.03   18.56   20.13   19.44   20.79   21.39 
#> 
#> $CHIH
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   13.08   15.82   20.58   21.09   26.17   30.20 
#> 
#> $CHIS
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   21.39   26.97   29.72   28.18   30.70   31.67 
#> 
#> $COAH
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   22.90   26.15   27.16   26.71   27.41   28.60 
#> 
#> $COL
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   25.40   27.88   28.38   28.54   29.59   30.75 
#> 
#> $DGO
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   15.05   19.89   22.15   22.15   25.73   26.99 
#> 
#> $GRO
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   18.46   25.28   27.97   27.81   30.09   34.66 
#> 
#> $GTO
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   18.44   21.61   22.65   22.54   23.63   26.05 
#> 
#> $HGO
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   14.73   20.23   21.29   22.51   24.96   28.69 
#> 
#> $JAL
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   20.85   23.18   24.46   24.67   25.62   29.11 
#> 
#> $MEX
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   7.147  17.444  18.838  18.502  19.583  28.905 
#> 
#> $MICH
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   18.09   21.86   22.77   24.35   24.80   34.05 
#> 
#> $MOR
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   14.29   24.79   26.15   25.65   28.00   30.67 
#> 
#> $NAY
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   22.94   25.86   28.53   27.91   29.59   32.47 
#> 
#> $NL
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   25.55   25.77   25.98   26.51   26.99   27.99 
#> 
#> $OAX
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   17.27   22.90   24.92   25.12   28.95   30.12 
#> 
#> $PUE
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   11.48   18.26   20.40   21.23   26.06   28.69 
#> 
#> $QRO
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   19.67   22.93   23.56   23.61   23.96   28.02 
#> 
#> $QROO
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   27.07   28.35   29.16   28.95   29.69   30.27 
#> 
#> $SIN
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   24.45   26.06   26.77   26.75   27.58   29.53 
#> 
#> $SLP
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   19.41   25.55   27.26   26.17   28.22   29.73 
#> 
#> $SON
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   15.58   22.69   23.74   23.71   24.62   29.18 
#> 
#> $TAB
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   29.07   29.87   30.15   30.22   30.34   31.78 
#> 
#> $TAMPS
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   24.43   26.36   27.43   27.35   28.22   31.22 
#> 
#> $TLAX
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   15.76   17.08   17.43   17.77   18.91   19.54 
#> 
#> $VER
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   15.55   22.16   27.93   25.89   29.16   30.94 
#> 
#> $YUC
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   27.40   28.83   29.68   29.64   30.24   32.26 
#> 
#> $ZAC
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   17.84   19.88   21.19   21.33   21.87   28.16

Tabla1 <- datos %>% 
  group_by(Edo) %>% 
  summarize(
    Min = min(Tmed),
    Mediana = median(Tmed),
    Media = mean(Tmed),
    sd = sd(Tmed),
    Max = max(Tmed))
Tabla1
#> # A tibble: 32 × 6
#>    Edo     Min Mediana Media     sd   Max
#>    <chr> <dbl>   <dbl> <dbl>  <dbl> <dbl>
#>  1 AGS   19.7     19.7  19.7 NA      19.7
#>  2 BC     9.91    17.5  19.0  4.56   28.1
#>  3 BCS   16.4     24.5  23.1  2.95   27.8
#>  4 CAMP  29       30.0  30.2  0.736  31.5
#>  5 CDMX  15.0     20.1  19.4  1.77   21.4
#>  6 CHIH  13.1     20.6  21.1  5.51   30.2
#>  7 CHIS  21.4     29.7  28.2  3.61   31.7
#>  8 COAH  22.9     27.2  26.7  1.67   28.6
#>  9 COL   25.4     28.4  28.5  1.42   30.8
#> 10 DGO   15.1     22.2  22.2  3.89   27.0
#> # ℹ 22 more rows

7 Exportar a CSV y EXCEL una tabla

write.table(Tabla1,glue(exportados,'/Tabla1.csv'))
write_xlsx(Tabla1,glue(exportados,'/Tabla1.xlsx'))

8 Boxplot de temperaturas promedio con R-base


boxplot(datos$Tmed ~ datos$Edo, data = datos, col = "white")
stripchart(datos$Tmed ~ datos$Edo,
           data = datos,
           method = "jitter",
           pch = 19,
           col = 2:4,
           vertical = TRUE,
           add = TRUE)

9 Boxplot de temperaturas promedio con ggplot2


#Con outliers
ggplot(
  data = datos,
  aes(x = Edo , y = Tmed)
) +
  geom_boxplot() +
  geom_point(
    aes(color = Edo),
      position = 
      position_jitter(width = 0.2),
    alpha = 0.6
    ) + 
  scale_x_discrete(name="Estado") 




#Sin outliers
ggplot(
  data = datos,
  aes(x = Edo , y = Tmed)
) +
  geom_boxplot(outlier.shape = NA) +
  geom_point(
    aes(color = Edo),
    position = 
      position_jitter(width = 0.2),
    alpha = 0.6
  ) + 
  scale_x_discrete(name="Estado") +
  scale_color_hue(guide = FALSE)

10 Visualización de estaciones meteorológicas con ggplot2


ggplot(datos) +
  aes(x = Lon, y = Lat, colour = Edo) +
  geom_point(shape = "circle") +
  scale_color_hue(direction = 1) +
  theme_minimal()

11 Visualización de estaciones meteorológicas con leaflet


point_data <- datos
leaflet(point_data) %>% 
  fitBounds(lng1 = min(point_data$Lon) - 0.11, 
            lat1 = min(point_data$Lat) - 0.11,
            lng2 = max(point_data$Lon) + 0.11, 
            lat2 = max(point_data$Lat) + 0.11) %>% 
  addCircleMarkers(~Lon, ~Lat,
                   radius = 1,
                   opacity = 10,
                   color = "red", 
                   label = as.character(point_data$Tmed), 
                   labelOptions = labelOptions(noHide = FALSE, 
                                               textOnly = TRUE, 
                                               style = list(color = "blue"),
                                               direction = "right",
                                               offset = c(0, -10))) %>% 
  addScaleBar(options = list(imperial = FALSE)) %>%
  addProviderTiles(providers$Esri.WorldTopoMap)

Se ha mostrado cómo realizar un análisis estadístico y geoestadístico con énfasis en el EDA que nos ayudará a definir de mejor forma la información a emplear en un modelo espacial.