# Asegúrate de tener las librerías necesarias
#install.packages("dplyr")
#install.packages("stringr")
library(tidyr) #para la manipulación de datos en formato largo y ancho.
library(dplyr) #para la manipulación y resumen de datos.
library(stringr) #para operaciones con cadenas de texto.
library(ggplot2) #para la creación de gráficos.
library(readxl) #para leer archivos Excel
file_path <- setwd('C://Users//john//Desktop//Practica DS//Universidad del Bosque//2. Probabilidad y estadistica//Taller 1') #setwd(): Establece el directorio de trabajo a la ruta especificada. Esto define dónde se buscarán y guardarán los archivos.
library(readxl) #para leer archivos Excel
#Importa los datos a un objeto llamado df
df <- read.csv2('C://Users//john//Desktop//Practica DS//Universidad del Bosque//2. Probabilidad y estadistica//Taller 1//s54a-sgyg.csv')
glimpse(df)
## Rows: 1,000
## Columns: 1
## $ codigoestacion.codigosensor.fechaobservacion.valorobservado.nombreestacion.departamento.municipio.zonahidrografica.latitud.longitud.descripcionsensor.unidadmedida <chr> …
#install.packages("data.table")
library(data.table)
Adjuntando el paquete: 'data.table'
The following objects are masked from 'package:dplyr':
between, first, last
datos <- fread("s54a-sgyg.csv", sep = ",")
datos
codigoestacion codigosensor fechaobservacion valorobservado
<i64> <int> <POSc> <num>
1: 21057050 240 2019-04-20 17:30:00 0.0
2: 53115502 240 2018-08-05 04:00:00 0.1
3: 21197430 240 2017-12-14 10:40:00 0.0
4: 11045010 240 2018-06-25 00:10:00 2.4
5: 21015050 240 2014-11-07 11:10:00 0.1
---
996: 16015110 240 2010-10-31 02:50:00 0.0
997: 21202240 240 2013-09-21 00:25:00 0.0
998: 54020020 240 2019-06-27 19:10:00 0.0
999: 53115502 240 2018-09-06 07:50:00 0.0
1000: 13095010 240 2008-09-21 17:10:00 0.0
nombreestacion departamento
<char> <char>
1: VEGA EL SALADO - AUT HUILA
2: JULIO FERNANDEZ - AUT VALLE DEL CAUCA
3: PROVIDENCIA - PROVIDENCIA CUNDINAMARCA
4: PR CHOCO: APTO EL CARANO CHOCO
5: PURACE - AUT HUILA
---
996: UNIVERSIDAD FRANCISO DE PAULA SANTANDER - AUT NORTE DE SANTANDER
997: UAN SEDE CIRCUNVALAR - FOPAE BOGOTA D.C.
998: PR CHOCO: NOVITA CHOCÓ
999: JULIO FERNANDEZ - AUT VALLE DEL CAUCA
1000: COVEÑAS - DIMAR SUCRE
municipio zonahidrografica latitud longitud
<char> <char> <num> <num>
1: LA PLATA ALTO MAGDALENA 2.331444 -75.94217
2: RESTREPO TAPAJE - DAGUA - DIRECTOS 3.809164 -76.53306
3: FUSAGASUGÁ ALTO MAGDALENA 4.367000 -74.30000
4: QUIBDÓ ATRATO - DARIÉN 5.691000 -76.64400
5: SAN AGUSTÍN ALTO MAGDALENA 1.925917 -76.42756
---
996: CÚCUTA CATATUMBO 7.898778 -72.48717
997: BOGOTA, D.C ALTO MAGDALENA 4.633000 -74.05000
998: NÓVITA SAN JUÁN 4.956000 -76.60600
999: RESTREPO TAPAJE - DAGUA - DIRECTOS 3.809164 -76.53306
1000: TOLÚ CARIBE - LITORAL 9.383000 -75.66700
descripcionsensor unidadmedida
<char> <char>
1: Precipitacion mm
2: Precipitacion mm
3: Precipitacion mm
4: Precipitacion mm
5: Precipitacion mm
---
996: Precipitacion mm
997: Precipitacion mm
998: Precipitacion mm
999: Precipitacion mm
1000: Precipitacion mm
as.data.frame(sort(names(datos)))
sort(names(datos))
1 codigoestacion
2 codigosensor
3 departamento
4 descripcionsensor
5 fechaobservacion
6 latitud
7 longitud
8 municipio
9 nombreestacion
10 unidadmedida
11 valorobservado
12 zonahidrografica
str(datos)
Classes 'data.table' and 'data.frame': 1000 obs. of 12 variables:
$ codigoestacion :integer64 21057050 53115502 21197430 11045010 21015050 23025501 26155270 2302500064 ...
$ codigosensor : int 240 240 240 240 240 240 240 240 240 240 ...
$ fechaobservacion : POSIXct, format: "2019-04-20 17:30:00" "2018-08-05 04:00:00" ...
$ valorobservado : num 0 0.1 0 2.4 0.1 0 0 0 0 0 ...
$ nombreestacion : chr "VEGA EL SALADO - AUT" "JULIO FERNANDEZ - AUT" "PROVIDENCIA - PROVIDENCIA" "PR CHOCO: APTO EL CARANO" ...
$ departamento : chr "HUILA" "VALLE DEL CAUCA" "CUNDINAMARCA" "CHOCO" ...
$ municipio : chr "LA PLATA" "RESTREPO" "FUSAGASUGÁ" "QUIBDÓ" ...
$ zonahidrografica : chr "ALTO MAGDALENA" "TAPAJE - DAGUA - DIRECTOS" "ALTO MAGDALENA" "ATRATO - DARIÉN" ...
$ latitud : num 2.33 3.81 4.37 5.69 1.93 ...
$ longitud : num -75.9 -76.5 -74.3 -76.6 -76.4 ...
$ descripcionsensor: chr "Precipitacion" "Precipitacion" "Precipitacion" "Precipitacion" ...
$ unidadmedida : chr "mm" "mm" "mm" "mm" ...
- attr(*, ".internal.selfref")=<externalptr>
glimpse(datos)
Rows: 1,000
Columns: 12
$ codigoestacion <int64> 21057050, 53115502, 21197430, 11045010, 21015050, …
$ codigosensor <int> 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 24…
$ fechaobservacion <dttm> 2019-04-20 17:30:00, 2018-08-05 04:00:00, 2017-12-1…
$ valorobservado <dbl> 0.0, 0.1, 0.0, 2.4, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.…
$ nombreestacion <chr> "VEGA EL SALADO - AUT", "JULIO FERNANDEZ - AUT", "…
$ departamento <chr> "HUILA", "VALLE DEL CAUCA", "CUNDINAMARCA", "CHOCO",…
$ municipio <chr> "LA PLATA", "RESTREPO", "FUSAGASUGÁ", "QUIBDÓ", "SAN…
$ zonahidrografica <chr> "ALTO MAGDALENA", "TAPAJE - DAGUA - DIRECTOS", "ALTO…
$ latitud <dbl> 2.331444, 3.809164, 4.367000, 5.691000, 1.925917, 5.…
$ longitud <dbl> -75.94217, -76.53306, -74.30000, -76.64400, -76.4275…
$ descripcionsensor <chr> "Precipitacion", "Precipitacion", "Precipitacion", "…
$ unidadmedida <chr> "mm", "mm", "mm", "mm", "mm", "mm", "mm", "mm", "mm"…
Conclusiones:
Datos de Observación Meteorológica: El conjunto de datos contiene información relacionada con la observación meteorológica, tal como se indica por la presencia de columnas como valorobservado, descripcionsensor y unidadmedida. Esto sugiere que los datos se centran en medir y registrar variables meteorológicas, como la precipitación.
Estructura del Conjunto de Datos: El conjunto de datos tiene 1,000 filas y 12 columnas, lo que indica un tamaño moderado. Las columnas incluyen identificadores, fechas, y datos geoespaciales, lo cual es típico para conjuntos de datos que registran observaciones en diferentes estaciones y ubicaciones geográficas.
Fechas y Horarios: La columna fechaobservacion está
en formato de fecha y hora (
Información Geográfica: Las columnas latitud y longitud proporcionan coordenadas geográficas, permitiendo la ubicación precisa de las estaciones de observación. Además, las columnas departamento, municipio, y zonahidrografica ofrecen un contexto adicional sobre la ubicación de las estaciones, lo que puede ser útil para análisis espaciales y regionales.
Detalles del Sensor: La columna descripcionsensor indica el tipo de sensor utilizado en las estaciones, y unidadmedida especifica la unidad en la que se reportan los valores (como “mm” para milímetros). Esto es importante para la interpretación correcta de los datos y para asegurar que las comparaciones entre diferentes estaciones y sensores sean válidas.
Calidad de datos: Estadísticos básicos
Hacemos un summary, con lapply que sale en formato de lista y se lee mejor
lapply(datos,summary)
$codigoestacion
integer64
Min. 1st Qu. Median Mean 3rd Qu. Max.
11017020 21195170 22057010 176590461 26155502 3701500117
$codigosensor
Min. 1st Qu. Median Mean 3rd Qu. Max.
240 240 240 240 240 240
$fechaobservacion
Min. 1st Qu. Median
"2005-01-23 04:00:00.000" "2012-11-29 05:53:45.000" "2017-03-14 12:45:00.000"
Mean 3rd Qu. Max.
"2015-07-23 04:02:26.053" "2018-10-04 11:27:30.000" "2019-08-27 21:25:00.000"
$valorobservado
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00000 0.00000 0.00000 0.07865 0.00000 29.90000
$nombreestacion
Length Class Mode
1000 character character
$departamento
Length Class Mode
1000 character character
$municipio
Length Class Mode
1000 character character
$zonahidrografica
Length Class Mode
1000 character character
$latitud
Min. 1st Qu. Median Mean 3rd Qu. Max.
-4.194 4.467 5.086 5.645 6.581 12.599
$longitud
Min. 1st Qu. Median Mean 3rd Qu. Max.
-81.73 -75.60 -74.38 -74.64 -73.88 -67.93
$descripcionsensor
Length Class Mode
1000 character character
$unidadmedida
Length Class Mode
1000 character character
# Modificando los nombres de las variables
colnames(datos) # names(datos)
[1] "codigoestacion" "codigosensor" "fechaobservacion"
[4] "valorobservado" "nombreestacion" "departamento"
[7] "municipio" "zonahidrografica" "latitud"
[10] "longitud" "descripcionsensor" "unidadmedida"
Calidad de datos: Análisis de nulos
data.frame(colSums(is.na(df)))
colSums.is.na.df..
codigoestacion.codigosensor.fechaobservacion.valorobservado.nombreestacion.departamento.municipio.zonahidrografica.latitud.longitud.descripcionsensor.unidadmedida 0
No hay Nulos.
# Nuevos nombres para las columnas
nuevos_nombres <- c(
"Código", # cambio de codigoestacion
"Sensor", # cambio de codigosensor
"Fecha", # cambio de fechaobservacion
"Precipitación", # cambio de valorobservado
"Estación", # cambio de nombreestacion
"Dpto", # cambio de departamento
"Municipio", # cambio de municipio
"Zona", # cambio de zonahidrografica
"Latitud", # cambio de latitud
"Longitud", # cambio de longitud
"Descripción", # cambio de descripcionsensor
"Unidad" # cambio de unidadmedida
)
# Aplicar los nuevos nombres de columnas
colnames(datos) <- nuevos_nombres
# Verificar los nombres de las columnas
colnames(datos)
[1] "Código" "Sensor" "Fecha" "Precipitación"
[5] "Estación" "Dpto" "Municipio" "Zona"
[9] "Latitud" "Longitud" "Descripción" "Unidad"
# Verifica las columnas originales
print(colnames(datos))
[1] "Código" "Sensor" "Fecha" "Precipitación"
[5] "Estación" "Dpto" "Municipio" "Zona"
[9] "Latitud" "Longitud" "Descripción" "Unidad"
# Identificar columnas con un único valor
unico_valor <- sapply(datos, function(x) length(unique(x)) == 1)
print(unico_valor)
Código Sensor Fecha Precipitación Estación
FALSE TRUE FALSE FALSE FALSE
Dpto Municipio Zona Latitud Longitud
FALSE FALSE FALSE FALSE FALSE
Descripción Unidad
TRUE TRUE
Conclusiones:
Sensor: TRUE — Esta columna tiene un único valor en todas sus celdas. Descripción: TRUE — Esta columna tiene un único valor en todas sus celdas. Unidad: TRUE — Esta columna tiene un único valor en todas sus celdas.
# Eliminando las variables Sensor, Descripción y Unidad
datos <- subset(datos, select = -c(2,11,12))
# Reemplazar inconsistencias y <nil> en la columna `departamento`
datos <- datos %>%
mutate(
Dpto = case_when(
str_detect(Dpto, "ATLANTICO") ~ "ATLÁNTICO",
str_detect(Dpto, "SAN ANDRÉS") ~ "SAN ANDRÉS",
str_detect(Dpto, "BOGOTÁ") ~ "BOGOTÁ",
str_detect(Dpto, "BOLÍVAR") ~ "BOLÍVAR",
str_detect(Dpto, "CHOCÓ") ~ "CHOCÓ",
str_detect(Dpto, "CÓRDOBA") ~ "CÓRDOBA",
str_detect(Dpto, "NARIÑO") ~ "NARIÑO",
Dpto == "<nil>" ~ NA_character_,
TRUE ~ Dpto
)
)
datos
Código Fecha Precipitación
<i64> <POSc> <num>
1: 21057050 2019-04-20 17:30:00 0.0
2: 53115502 2018-08-05 04:00:00 0.1
3: 21197430 2017-12-14 10:40:00 0.0
4: 11045010 2018-06-25 00:10:00 2.4
5: 21015050 2014-11-07 11:10:00 0.1
---
996: 16015110 2010-10-31 02:50:00 0.0
997: 21202240 2013-09-21 00:25:00 0.0
998: 54020020 2019-06-27 19:10:00 0.0
999: 53115502 2018-09-06 07:50:00 0.0
1000: 13095010 2008-09-21 17:10:00 0.0
Estación Dpto
<char> <char>
1: VEGA EL SALADO - AUT HUILA
2: JULIO FERNANDEZ - AUT VALLE DEL CAUCA
3: PROVIDENCIA - PROVIDENCIA CUNDINAMARCA
4: PR CHOCO: APTO EL CARANO CHOCO
5: PURACE - AUT HUILA
---
996: UNIVERSIDAD FRANCISO DE PAULA SANTANDER - AUT NORTE DE SANTANDER
997: UAN SEDE CIRCUNVALAR - FOPAE BOGOTA D.C.
998: PR CHOCO: NOVITA CHOCÓ
999: JULIO FERNANDEZ - AUT VALLE DEL CAUCA
1000: COVEÑAS - DIMAR SUCRE
Municipio Zona Latitud Longitud
<char> <char> <num> <num>
1: LA PLATA ALTO MAGDALENA 2.331444 -75.94217
2: RESTREPO TAPAJE - DAGUA - DIRECTOS 3.809164 -76.53306
3: FUSAGASUGÁ ALTO MAGDALENA 4.367000 -74.30000
4: QUIBDÓ ATRATO - DARIÉN 5.691000 -76.64400
5: SAN AGUSTÍN ALTO MAGDALENA 1.925917 -76.42756
---
996: CÚCUTA CATATUMBO 7.898778 -72.48717
997: BOGOTA, D.C ALTO MAGDALENA 4.633000 -74.05000
998: NÓVITA SAN JUÁN 4.956000 -76.60600
999: RESTREPO TAPAJE - DAGUA - DIRECTOS 3.809164 -76.53306
1000: TOLÚ CARIBE - LITORAL 9.383000 -75.66700
# Instalar y cargar los paquetes necesarios
#install.packages("dplyr")
library(dplyr)
# Supongamos que tu dataframe se llama `datos`
datos <- datos %>%
mutate(
Dpto = as.factor(Dpto), # Convertir la columna Dpto a factor
Zona = as.factor(Zona) # Convertir la columna Zona a factor
)
# Verificar la estructura del dataframe para asegurarse de que las columnas son factores
glimpse(datos)
Rows: 1,000
Columns: 9
$ Código <int64> 21057050, 53115502, 21197430, 11045010, 21015050, 2302…
$ Fecha <dttm> 2019-04-20 17:30:00, 2018-08-05 04:00:00, 2017-12-14 10…
$ Precipitación <dbl> 0.0, 0.1, 0.0, 2.4, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1…
$ Estación <chr> "VEGA EL SALADO - AUT", "JULIO FERNANDEZ - AUT", "PROV…
$ Dpto <fct> HUILA, VALLE DEL CAUCA, CUNDINAMARCA, CHOCO, HUILA, CALD…
$ Municipio <chr> "LA PLATA", "RESTREPO", "FUSAGASUGÁ", "QUIBDÓ", "SAN AGU…
$ Zona <fct> ALTO MAGDALENA, TAPAJE - DAGUA - DIRECTOS, ALTO MAGDALEN…
$ Latitud <dbl> 2.331444, 3.809164, 4.367000, 5.691000, 1.925917, 5.1639…
$ Longitud <dbl> -75.94217, -76.53306, -74.30000, -76.64400, -76.42756, -…
library(ggplot2)
# Crear el gráfico de dispersión
ggplot(datos, aes(x = Longitud, y = Latitud, color = Dpto, size = Precipitación)) +
geom_point(alpha = 0.7) + # alpha para la transparencia de los puntos
scale_size_continuous(range = c(1, 10)) + # Ajusta el rango del tamaño de los puntos
labs(
title = "Gráfico de Dispersión de Precipitación",
x = "Longitud",
y = "Latitud",
color = "Departamento",
size = "Precipitación"
) +
theme_minimal() # Cambia el tema a minimalista para una visualización más limpia
# Crear el gráfico de dispersión con ggplot2
library(ggplot2)
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
grafico <- ggplot(datos, aes(x = Longitud, y = Latitud, color = Dpto, size = Precipitación)) +
geom_point(alpha = 0.7) + # alpha para la transparencia de los puntos
scale_size_continuous(range = c(1, 10)) + # Ajusta el rango del tamaño de los puntos
labs(
title = "Gráfico de Dispersión de Precipitación",
x = "Longitud",
y = "Latitud",
color = "Departamento",
size = "Precipitación"
) +
theme_minimal() # Cambia el tema a minimalista para una visualización más limpia
# Convertir el gráfico a interactivo con plotly
grafico_interactivo <- ggplotly(grafico)
# Mostrar el gráfico interactivo
grafico_interactivo
# Instalar y cargar los paquetes necesarios
#install.packages("dplyr")
#install.packages("lubridate")
library(dplyr)
library(lubridate)
Adjuntando el paquete: 'lubridate'
The following objects are masked from 'package:data.table':
hour, isoweek, mday, minute, month, quarter, second, wday, week,
yday, year
The following objects are masked from 'package:base':
date, intersect, setdiff, union
# Supongamos que ya has leído el dataframe y se llama datos
# Convertir la columna Fecha a formato datetime si está en texto
datos <- datos %>%
mutate(
Fecha = ymd_hms(Fecha) # Convierte Fecha si está en formato "YYYY-MM-DD HH:MM:SS"
)
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `Fecha = ymd_hms(Fecha)`.
Caused by warning:
! 6 failed to parse.
# Extraer el año de la columna Fecha y convertirlo a factor ordenado
datos <- datos %>%
mutate(
Año = as.factor(year(Fecha)) # Extrae el año y lo convierte en factor
) %>%
mutate(
Año = factor(Año, levels = unique(sort(Año))) # Ordena los niveles del factor
)
datos
Código Fecha Precipitación
<i64> <POSc> <num>
1: 21057050 2019-04-20 17:30:00 0.0
2: 53115502 2018-08-05 04:00:00 0.1
3: 21197430 2017-12-14 10:40:00 0.0
4: 11045010 2018-06-25 00:10:00 2.4
5: 21015050 2014-11-07 11:10:00 0.1
---
996: 16015110 2010-10-31 02:50:00 0.0
997: 21202240 2013-09-21 00:25:00 0.0
998: 54020020 2019-06-27 19:10:00 0.0
999: 53115502 2018-09-06 07:50:00 0.0
1000: 13095010 2008-09-21 17:10:00 0.0
Estación Dpto
<char> <fctr>
1: VEGA EL SALADO - AUT HUILA
2: JULIO FERNANDEZ - AUT VALLE DEL CAUCA
3: PROVIDENCIA - PROVIDENCIA CUNDINAMARCA
4: PR CHOCO: APTO EL CARANO CHOCO
5: PURACE - AUT HUILA
---
996: UNIVERSIDAD FRANCISO DE PAULA SANTANDER - AUT NORTE DE SANTANDER
997: UAN SEDE CIRCUNVALAR - FOPAE BOGOTA D.C.
998: PR CHOCO: NOVITA CHOCÓ
999: JULIO FERNANDEZ - AUT VALLE DEL CAUCA
1000: COVEÑAS - DIMAR SUCRE
Municipio Zona Latitud Longitud Año
<char> <fctr> <num> <num> <fctr>
1: LA PLATA ALTO MAGDALENA 2.331444 -75.94217 2019
2: RESTREPO TAPAJE - DAGUA - DIRECTOS 3.809164 -76.53306 2018
3: FUSAGASUGÁ ALTO MAGDALENA 4.367000 -74.30000 2017
4: QUIBDÓ ATRATO - DARIÉN 5.691000 -76.64400 2018
5: SAN AGUSTÍN ALTO MAGDALENA 1.925917 -76.42756 2014
---
996: CÚCUTA CATATUMBO 7.898778 -72.48717 2010
997: BOGOTA, D.C ALTO MAGDALENA 4.633000 -74.05000 2013
998: NÓVITA SAN JUÁN 4.956000 -76.60600 2019
999: RESTREPO TAPAJE - DAGUA - DIRECTOS 3.809164 -76.53306 2018
1000: TOLÚ CARIBE - LITORAL 9.383000 -75.66700 2008
# Calcular estadísticas para cada año
estadisticas <- datos %>%
group_by(Año) %>%
summarise(
Promedio_Precipitación = mean(Precipitación, na.rm = TRUE),
Desviación_Estándar = sd(Precipitación, na.rm = TRUE),
Coeficiente_Variación = sd(Precipitación, na.rm = TRUE) / mean(Precipitación, na.rm = TRUE) * 100
)
# Ver el resultado
print(estadisticas)
# A tibble: 16 × 4
Año Promedio_Precipitación Desviación_Estándar Coeficiente_Variación
<fct> <dbl> <dbl> <dbl>
1 2005 0.00714 0.0267 374.
2 2006 0.0294 0.121 412.
3 2007 0.0167 0.0707 424.
4 2008 0.0368 0.195 530.
5 2009 0.00556 0.0232 418.
6 2010 0.0197 0.129 655.
7 2011 0.00333 0.0183 548.
8 2012 1.02 4.95 484.
9 2013 0.08 0.537 671.
10 2014 0.006 0.0240 400.
11 2015 0.0132 0.0667 504.
12 2016 0 0 NaN
13 2017 0.0199 0.195 978.
14 2018 0.128 1.17 916.
15 2019 0.0178 0.130 731.
16 <NA> 0 0 NaN
Conclusiones:
En 2012, se observa un valor promedio de precipitación significativamente alto (1.02) y una desviación estándar extremadamente alta (4.95). Esto indica que, durante ese año, hubo una precipitación muy variable y excepcionalmente alta en comparación con otros años, lo que podría señalar eventos climáticos extremos o errores en los datos.
Exceptuando el año 2012, la mayoría de los años presentan valores promedio de precipitación muy bajos, la mayoría inferiores a 0.05. Esto sugiere una tendencia general de baja precipitación en el período analizado, lo cual podría estar asociado con condiciones secas o cambios climáticos prolongados.
Los años con desviación estándar alta (por ejemplo, 2008 y 2017) indican una gran variabilidad en las precipitaciones. En estos años, la precipitación fue menos predecible y tuvo fluctuaciones más marcadas, lo cual puede reflejar eventos meteorológicos irregulares o extremos.
En los años 2016 y el año sin datos (NA), la precipitación promedio es 0, lo que sugiere que no se registraron precipitaciones o los datos no están disponibles. Esto podría ser un indicio de años muy secos o posibles problemas en la recopilación de datos.
En 2018, el promedio de precipitación es relativamente alto (0.128) y la desviación estándar también es alta (1.17). Esto podría indicar que, aunque no tan extremo como en 2012, el año 2018 experimentó variaciones inusuales en las precipitaciones, lo que podría estar relacionado con fenómenos climáticos específicos o patrones meteorológicos inusuales.