Introducción

Información obtenida del Automated Surface Observing System (ASOS) de los aeropuertos de todo el mundo.

Instalar paquetes y llamar librerías

# install.packages("riem")
library(riem)
# install.packages("tidyverse")
library(tidyverse) 
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   4.0.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.1
## ✔ purrr     1.2.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# install.packages("ggplot2")
library(ggplot2)
# install.packages("lubridate")
library(lubridate)

Obtener y graficar la información

# PASO 1. Buscar la red (país) - Ejemplo: México, y copiar CODE
#view(riem_networks())
# PASO 2. Buscar la estación (ciudad) - Ejemplo: Monterrey, y copiar ID
#view(riem_stations("MX__ASOS"))
# PASO 3. Obtener información de la estación
monterrey <- riem_measures("MMMY", date_start = "2025-12-01", date_end = "2025-12-31")
# Análisis Descriptivo
summary(monterrey)
##    station              valid                          tmpf      
##  Length:747         Min.   :2025-12-01 00:40:00   Min.   :44.60  
##  Class :character   1st Qu.:2025-12-08 18:10:30   1st Qu.:55.40  
##  Mode  :character   Median :2025-12-16 07:41:00   Median :60.80  
##                     Mean   :2025-12-16 05:01:45   Mean   :62.97  
##                     3rd Qu.:2025-12-23 15:10:00   3rd Qu.:69.80  
##                     Max.   :2025-12-30 23:40:00   Max.   :91.40  
##                                                                  
##       dwpf            relh             drct            sknt             p01i  
##  Min.   :17.60   Min.   : 13.84   Min.   :  0.0   Min.   : 0.000   Min.   :0  
##  1st Qu.:46.40   1st Qu.: 54.37   1st Qu.: 60.0   1st Qu.: 2.000   1st Qu.:0  
##  Median :51.80   Median : 73.30   Median :130.0   Median : 5.000   Median :0  
##  Mean   :51.14   Mean   : 70.00   Mean   :165.7   Mean   : 5.009   Mean   :0  
##  3rd Qu.:59.00   3rd Qu.: 88.23   3rd Qu.:290.0   3rd Qu.: 7.000   3rd Qu.:0  
##  Max.   :66.20   Max.   :100.00   Max.   :360.0   Max.   :25.000   Max.   :0  
##                                   NA's   :2                                   
##       alti            mslp           vsby             gust      
##  Min.   :29.84   Min.   :1009   Min.   : 0.250   Min.   :13.00  
##  1st Qu.:30.00   1st Qu.:1016   1st Qu.: 5.000   1st Qu.:18.25  
##  Median :30.09   Median :1019   Median : 8.000   Median :23.00  
##  Mean   :30.12   Mean   :1020   Mean   : 7.596   Mean   :23.46  
##  3rd Qu.:30.21   3rd Qu.:1023   3rd Qu.:10.000   3rd Qu.:26.00  
##  Max.   :30.59   Max.   :1036   Max.   :15.000   Max.   :48.00  
##                  NA's   :507                     NA's   :701    
##     skyc1              skyc2              skyc3            skyc4        
##  Length:747         Length:747         Length:747         Mode:logical  
##  Class :character   Class :character   Class :character   NA's:747      
##  Mode  :character   Mode  :character   Mode  :character                 
##                                                                         
##                                                                         
##                                                                         
##                                                                         
##      skyl1           skyl2           skyl3        skyl4        
##  Min.   :  100   Min.   :  500   Min.   : 1600   Mode:logical  
##  1st Qu.: 1000   1st Qu.: 1200   1st Qu.:20000   NA's:747      
##  Median : 2000   Median : 3500   Median :20000                 
##  Mean   : 3499   Mean   : 5225   Mean   :17815                 
##  3rd Qu.: 3000   3rd Qu.: 7000   3rd Qu.:20000                 
##  Max.   :20000   Max.   :20000   Max.   :20000                 
##  NA's   :288     NA's   :512     NA's   :734                   
##    wxcodes          ice_accretion_1hr ice_accretion_3hr ice_accretion_6hr
##  Length:747         Mode:logical      Mode:logical      Mode:logical     
##  Class :character   NA's:747          NA's:747          NA's:747         
##  Mode  :character                                                        
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##  peak_wind_gust peak_wind_drct peak_wind_time      feel      
##  Mode:logical   Mode:logical   Mode:logical   Min.   :40.71  
##  NA's:747       NA's:747       NA's:747       1st Qu.:55.40  
##                                               Median :60.80  
##                                               Mean   :62.72  
##                                               3rd Qu.:69.80  
##                                               Max.   :87.17  
##                                                              
##     metar           snowdepth     
##  Length:747         Mode:logical  
##  Class :character   NA's:747      
##  Mode  :character                 
##                                   
##                                   
##                                   
## 
str(monterrey)
## tibble [747 × 30] (S3: tbl_df/tbl/data.frame)
##  $ station          : chr [1:747] "MMMY" "MMMY" "MMMY" "MMMY" ...
##  $ valid            : POSIXct[1:747], format: "2025-12-01 00:40:00" "2025-12-01 01:40:00" ...
##  $ tmpf             : num [1:747] 53.6 53.6 53.6 53.6 51.8 51.8 50 50 48.2 48.2 ...
##  $ dwpf             : num [1:747] 51.8 51.8 51.8 51.8 50 50 50 50 48.2 46.4 ...
##  $ relh             : num [1:747] 93.6 93.6 93.6 93.6 93.5 ...
##  $ drct             : num [1:747] 340 280 240 240 280 270 270 260 290 290 ...
##  $ sknt             : num [1:747] 3 5 5 6 8 6 6 4 6 6 ...
##  $ p01i             : num [1:747] 0 0 0 0 0 0 0 0 0 0 ...
##  $ alti             : num [1:747] 30.2 30.2 30.2 30.2 30.2 ...
##  $ mslp             : num [1:747] NA NA 1024 NA NA ...
##  $ vsby             : num [1:747] 2 3 3 3 3 3 3 3 3 2 ...
##  $ gust             : num [1:747] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc1            : chr [1:747] "BKN" "BKN" "OVC" "BKN" ...
##  $ skyc2            : chr [1:747] "OVC" "OVC" NA "OVC" ...
##  $ skyc3            : chr [1:747] NA NA NA NA ...
##  $ skyc4            : logi [1:747] NA NA NA NA NA NA ...
##  $ skyl1            : num [1:747] 800 800 1000 500 500 500 500 500 500 500 ...
##  $ skyl2            : num [1:747] 1200 1200 NA 800 800 800 800 800 800 800 ...
##  $ skyl3            : num [1:747] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl4            : logi [1:747] NA NA NA NA NA NA ...
##  $ wxcodes          : chr [1:747] "DZ BR" "-DZ BR" "-DZ BR" "-DZ BR" ...
##  $ ice_accretion_1hr: logi [1:747] NA NA NA NA NA NA ...
##  $ ice_accretion_3hr: logi [1:747] NA NA NA NA NA NA ...
##  $ ice_accretion_6hr: logi [1:747] NA NA NA NA NA NA ...
##  $ peak_wind_gust   : logi [1:747] NA NA NA NA NA NA ...
##  $ peak_wind_drct   : logi [1:747] NA NA NA NA NA NA ...
##  $ peak_wind_time   : logi [1:747] NA NA NA NA NA NA ...
##  $ feel             : num [1:747] 53.6 53.6 53.6 53.6 51.8 ...
##  $ metar            : chr [1:747] "MMMY 010040Z 34003KT 2SM DZ BR BKN008 OVC012 12/11 A3017 RMK 60025 8/7//" "MMMY 010140Z 28005KT 3SM -DZ BR BKN008 OVC012 12/11 A3020 RMK 60015 8/7//" "MMMY 010240Z 24005KT 3SM -DZ BR OVC010 12/11 A3022 RMK SLP235 52019 942 60005 8/7// DZ INTMT" "MMMY 010342Z 24006KT 3SM -DZ BR BKN005 OVC008 12/11 A3022 RMK 60005 8/6// -DZ INTMT" ...
##  $ snowdepth        : logi [1:747] NA NA NA NA NA NA ...
# Filtrar información del último mes
mty_dic_25 <- subset(monterrey, valid >= as.POSIXct("2025-12-01 00:00") & valid <= as.POSIXct("2025-12-31 23:59"))

# Ejercicio 1: Realizar una gráfica de barras de la temperatura promedio diario en agosto en Monterrey en °C.

# Promedio diario de temperatura en Fahrenheit (tmpf)
mty_dic_25$fecha <- as.Date(mty_dic_25$valid)

prom_temp_F <- by(mty_dic_25$tmpf, mty_dic_25$fecha, mean, na.rm = TRUE)

prom_diario_F <- data.frame(fecha = as.Date(names(prom_temp_F)), tmpf  = as.numeric(prom_temp_F))

# Convertir a °C
prom_diario_F$temp_C <- (prom_diario_F$tmpf - 32) * 5/9

# Gráficar
ggplot(prom_diario_F, aes(x = fecha, y = temp_C)) +
  geom_col(fill = "cyan") +
  geom_point(color = "blue") +
  labs(
    title = "Temperatura promedio diaria en Monterrey (Diciembre 2025)",
    x = "Día",
    y = "Temperatura promedio (°C)"
  ) +
  theme_minimal()

LS0tCnRpdGxlOiAiQVNPUyIKYXV0aG9yOiAiSmVzw7pzIEdlcmFyZG8gU29sYW5vIETDrWF6IEEwMDIyODE1NSIKZGF0ZTogIjIwMjYtMDItMjYiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogZGFya2x5Ci0tLQoKPGNlbnRlcj4KIVtdKGh0dHBzOi8vZmx5aW5nbWFnMS5iLWNkbi5uZXQvd3AtY29udGVudC91cGxvYWRzL3NpdGVzLzIvMjAyMS8wOC9odHRwc3d3dy5mbHlpbmdtYWcuY29tc2l0ZXNmbHlpbmdtYWcuY29tZmlsZXNpbWFnZXMyMDE4MDZjYXItYXNvcy0xLmpwZykKPC9jZW50ZXI+CgojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+SW50cm9kdWNjacOzbjwvc3Bhbj4KSW5mb3JtYWNpw7NuIG9idGVuaWRhIGRlbCAqQXV0b21hdGVkIFN1cmZhY2UgT2JzZXJ2aW5nIFN5c3RlbSAoQVNPUykqIGRlIGxvcyBhZXJvcHVlcnRvcyBkZSB0b2RvIGVsIG11bmRvLgoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+CmBgYHtyfQojIGluc3RhbGwucGFja2FnZXMoInJpZW0iKQpsaWJyYXJ5KHJpZW0pCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKbGlicmFyeSh0aWR5dmVyc2UpIAojIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQpsaWJyYXJ5KGdncGxvdDIpCiMgaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikKbGlicmFyeShsdWJyaWRhdGUpCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPk9idGVuZXIgeSBncmFmaWNhciBsYSBpbmZvcm1hY2nDs248L3NwYW4+CmBgYHtyfQojIFBBU08gMS4gQnVzY2FyIGxhIHJlZCAocGHDrXMpIC0gRWplbXBsbzogTcOpeGljbywgeSBjb3BpYXIgQ09ERQojdmlldyhyaWVtX25ldHdvcmtzKCkpCiMgUEFTTyAyLiBCdXNjYXIgbGEgZXN0YWNpw7NuIChjaXVkYWQpIC0gRWplbXBsbzogTW9udGVycmV5LCB5IGNvcGlhciBJRAojdmlldyhyaWVtX3N0YXRpb25zKCJNWF9fQVNPUyIpKQojIFBBU08gMy4gT2J0ZW5lciBpbmZvcm1hY2nDs24gZGUgbGEgZXN0YWNpw7NuCm1vbnRlcnJleSA8LSByaWVtX21lYXN1cmVzKCJNTU1ZIiwgZGF0ZV9zdGFydCA9ICIyMDI1LTEyLTAxIiwgZGF0ZV9lbmQgPSAiMjAyNS0xMi0zMSIpCiMgQW7DoWxpc2lzIERlc2NyaXB0aXZvCnN1bW1hcnkobW9udGVycmV5KQpzdHIobW9udGVycmV5KQojIEZpbHRyYXIgaW5mb3JtYWNpw7NuIGRlbCDDumx0aW1vIG1lcwptdHlfZGljXzI1IDwtIHN1YnNldChtb250ZXJyZXksIHZhbGlkID49IGFzLlBPU0lYY3QoIjIwMjUtMTItMDEgMDA6MDAiKSAmIHZhbGlkIDw9IGFzLlBPU0lYY3QoIjIwMjUtMTItMzEgMjM6NTkiKSkKCiMgRWplcmNpY2lvIDE6IFJlYWxpemFyIHVuYSBncsOhZmljYSBkZSBiYXJyYXMgZGUgbGEgdGVtcGVyYXR1cmEgcHJvbWVkaW8gZGlhcmlvIGVuIGFnb3N0byBlbiBNb250ZXJyZXkgZW4gwrBDLgoKIyBQcm9tZWRpbyBkaWFyaW8gZGUgdGVtcGVyYXR1cmEgZW4gRmFocmVuaGVpdCAodG1wZikKbXR5X2RpY18yNSRmZWNoYSA8LSBhcy5EYXRlKG10eV9kaWNfMjUkdmFsaWQpCgpwcm9tX3RlbXBfRiA8LSBieShtdHlfZGljXzI1JHRtcGYsIG10eV9kaWNfMjUkZmVjaGEsIG1lYW4sIG5hLnJtID0gVFJVRSkKCnByb21fZGlhcmlvX0YgPC0gZGF0YS5mcmFtZShmZWNoYSA9IGFzLkRhdGUobmFtZXMocHJvbV90ZW1wX0YpKSwgdG1wZiAgPSBhcy5udW1lcmljKHByb21fdGVtcF9GKSkKCiMgQ29udmVydGlyIGEgwrBDCnByb21fZGlhcmlvX0YkdGVtcF9DIDwtIChwcm9tX2RpYXJpb19GJHRtcGYgLSAzMikgKiA1LzkKCiMgR3LDoWZpY2FyCmdncGxvdChwcm9tX2RpYXJpb19GLCBhZXMoeCA9IGZlY2hhLCB5ID0gdGVtcF9DKSkgKwogIGdlb21fY29sKGZpbGwgPSAiY3lhbiIpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlRlbXBlcmF0dXJhIHByb21lZGlvIGRpYXJpYSBlbiBNb250ZXJyZXkgKERpY2llbWJyZSAyMDI1KSIsCiAgICB4ID0gIkTDrWEiLAogICAgeSA9ICJUZW1wZXJhdHVyYSBwcm9tZWRpbyAowrBDKSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCg==