# 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> …

Cargamos los datos: Usamos fread de data.table para una lectura mucho mas rapida

#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

Analisis exploratorio

Analisis exploratorio general y tipo de datos

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 (), lo que sugiere que los datos incluyen una dimensión temporal precisa. Esto permite análisis detallados basados en el tiempo, como la evolución de variables meteorológicas a lo largo del tiempo.

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.

ELABORACION DEL TALLER: Introducción a la Estadística y Probabilidad

1. (2.0 pts) Modifique la base de datos, reciclando el nombre que le asignó al descargarla para no crear nuevos objetos, de acuerdo a los siguientes parámetros:

(a) (0.5 pts) Modifique los nombres de las variables como se indica en la siguiente tabla:

# 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"       

(b) (0.5 pts) Identifique aquellas variables con un único valor registrado en todas las celdas y elimínelas de la base de datos

# 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))

(c) (0.5 pts) En la variable Dpto corrija los siguientes errores como se indica:

# 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

(d) (0.5 pts) Convierta las variables Dpto y Zona en tipo factor

# 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, -…

2. (1.5 pts) Para visualizar el comportamiento de la variable Precipitación realice un gráfico de dispersión entre la Latitud y la Longitud, donde el color de cada punto corresponda al departamento y el tamaño de los puntos corresponda al valor de la precipitación.

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

3. (1.5 pts) La función substring() permite extraer un subconjunto de caracteres de una cadena de caracteres,por ejemplo substring(“Palabra”, 1, 3) devuelve “Pal”. Use esta función, junto con el dplyr, para crear una nueva variable que contenga solo el año de medición (como factor ordenado) a partir de la variable Fecha, y calcule la Precipitación promedio, así como la desviación estándar y el coeficiente de variación de la Precipitación para cada año.

# 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.