EJERCICIO. Manipule los dataframe según se solicite

Se tiene el conjuntos de datos de precipitación diaria (período 1980 - 2013) de ciertas estaciones meteorológicas (raingaugeDataset.csv), donde cada una de estas están asociadas a un código único (p.e. qc00000208). Asimismo, se tiene una lista con los nombres, códigos, coordenadas y elevación de cada una de las estaciones (listRaingauge.csv).

A cada grupo le corresponde la siguiente estación:

De lo descrito anteriormente, se solicita:

  1. Determine la cantidad de missing values de la serie de tiempo a paso diario.
  2. Calcule la serie de tiempo de precipitación acumulada mensual (si el # de días con missing values, en un mes, supera el 10%, la precipitación acumulada mensual será considerado como un NA).
  3. Determine la cantidad de missing values de la serie de tiempo a paso mensual.
  4. Cree una función que calcule, a partir de los datos de preicpitación mensual, la climatología (Ene-Dic) para el período 1980-2010.
  5. Poltear (boxplot) la variabilidad de los valores mensuales (Ene-Dic) para el período 1980-2013.

 

Antes de comenzar con el desarollo extraemos las librerias que necesitaremos.

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.2     v dplyr   1.0.7
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(dplyr)
library(leaflet)
library(sp)
library(sf)
## Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1

Definimos los archivos de trabajo y los asignamos a un objeto.

names_table <- read_csv("../ProgramacionR-master/data/listRaingauge.csv")
##
## -- Column specification --------------------------------------------------------
## cols(
##   DEPARTAMENTO = col_character(),
##   NOM_EST = col_character(),
##   CODIGO = col_character(),
##   LON = col_double(),
##   LAT = col_double(),
##   ALT = col_double()
## )
names(names_table) #Extraemos los nombres de nuestrso archivos para observar la forma de escritura para nuestra conuslota, si estan en altas, bajas o una combinacion de estas.
## [1] "DEPARTAMENTO" "NOM_EST"      "CODIGO"       "LON"          "LAT"
## [6] "ALT"
estacion <- names_table %>% # Estraer el código de la estacion en base al nombre.
  dplyr::filter(NOM_EST == "SAN MIGUEL") %>%
  dplyr::select(CODIGO) %>%
  as.character()

data <-
  read_csv("../ProgramacionR-master/data/raingaugeDataset.csv")%>%
  dplyr::select(date, all_of(estacion)) %>%
  mutate(date = as.Date(date, format = "%d/%m/%Y")) %>%
  rename(pp = all_of(estacion)) %>%
  arrange(date)
##
## -- Column specification --------------------------------------------------------
## cols(
##   .default = col_double(),
##   date = col_character()
## )
## i Use `spec()` for the full column specifications.

Georreferenciamos nuestra estación en base a la información brindada

leaflet()%>%addTiles()%>%
  addMarkers(
    lng = -80.7,
    lat = -5.25,
    popup = paste(sep = "<br/>",
                   "<b>ESTACIÓN SAN MIGUEL</b>",
                   "Departamento: Piura",
                   "Código: qc00000247",
                  "Antitud: 24"))

Comprobamos la completud de nuestros datos con:

tail(data) #con esto podre saber la fecha final(la inicial lo podemos obtener solo llamando al archivo data).
## # A tibble: 6 x 2
##   date          pp
##   <date>     <dbl>
## 1 2013-12-26     0
## 2 2013-12-27     0
## 3 2013-12-28     0
## 4 2013-12-29     0
## 5 2013-12-30     0
## 6 2013-12-31     0
#mediante una Secuencia diaria comprombamos si la cantidadd de elementos en el dataframe estan completos.
seq(as.Date("1980-01-01"), as.Date("2013-12-31"), by = "day") %>%
length()
## [1] 12419
# CINCIDE CON LA CANTIDAD DEL DATAFRAME, EXCELENTE ...!!!!

 

En el ejercicio se pide:

  1. Determinar la cantidad de missing values de la serie de tiempo a paso diario.
(NA_diario <-
  data %>%
  mutate(
    cantidad_NA =  sum(is.na(pp))
  ) %>%
  summarise(
    cantidad_NA = unique(cantidad_NA)
  ))
## # A tibble: 1 x 1
##   cantidad_NA
##         <int>
## 1         608

Comentario: El resultado nos muestra la cantidad de Missing Values o valores NA que existe dentro de nuestra estructura de datos con una serio a paso diario.

 

  1. Calcule la serie de tiempo de precipitación acumulada mensual (si el # de días con missing values, en un mes, supera el 10%, la precipitación acumulada mensual será considerado como un NA).
#1. determinamos los valores para las pp mensual.
pp_month <-
  data %>%
  group_by(date = str_sub(date, 1, 7)) %>% #agrupamos los caracteres de 1 al 7 donde abarca los años y meses.
  mutate(
    valores_NA =  sum(is.na(pp))*100/n()  #indicrá nos numeros de NA en un nuevo campo llamado missval(en porcentaje). la funcion n me arroja el numero de dias.
  ) %>%
  summarise(   #Tabla resumen
    pp = sum(pp, na.rm = T), #realizamos la pp acumulada
    valores_NA = unique(valores_NA), #Genera un unico valor, la funcion unique me devuelve valores únicos
  )%>%
  mutate(
    pp = ifelse(valores_NA >= 10, NA, pp), #Los porcentajes que no cumples con el criterio se consideraran como NA
    date = as.Date(sprintf("%1$s-01", date)),
    meses = str_sub(date,6,7)#Creamos una variable que nos muestre los meses. variabilidad para cada mes por todos los años.
  )

#2. Ploteamos los valores
ggplot(pp_month, aes(date, pp)) +
  geom_line(color = "#048ABF")+
  labs(y="precipitación (mm)", x = "Años analizados")+
  ggtitle("Precipitación acumulada mensual")+
  theme(plot.title = element_text(vjust =2, hjust = 0.5))+
  theme(axis.title.y = element_text(vjust = 2.5))+
  theme(axis.title.x = element_text(vjust = -0.5))

Comentario: La gráfica nos permite tener un analisis visual de la precipitación acumulada por meses para todos los rangos de años en el cual estamos trabajando, es decir muetra la variacion de lluvia registrada en mm y sumada por meses para los años que van de 1980 al 2013. Resulta relevante además recalcar que los valores faltantes que son mayores al 10% dentro de cada mes se ha asignado un valor de NA a todo el mes, motivo por el cual la gráfica muestra secciones incompletas de secuencia que en si representa la existencia de valores faltantes para ese periodo.

 

  1. Determine la cantidad de missing values de la serie de tiempo a paso mensual.
#Cantidad de missing values por meses donde los que tiene NA mayores al 10% se contabilizan como Na tambien.
(NA_mensual<- sum(is.na(pp_month$pp)))
## [1] 21

Comentario: El resultado nos muestra la cantidad de Missing Values o valores NA que existe dentro de nuestra estructura de datos, agrupadas por meses. Resulta importante tambien mencionar que para los meses donde existe un porcentaje mayor al 10% de valores faltantes, se le ha asignado una categoría de Na a todo ese periodo.

 

  1. Cree una función que calcule, a partir de los datos de preicpitación mensual, la climatología (Ene-Dic) para el período 1980-2010.
#Definimos el periodo de trabajo y lo asignamos a un objeto pp_periodo.
pp_periodo <-
  pp_month%>%
  dplyr::filter(date >= "1980-01-01" & date < "2010-12-31")%>%
  group_by(date = str_sub(date, 6,7)) %>%
  mutate(
    valores_NA =  sum(is.na(pp))*100/n()  #indicrá nos numeros de NA en un nuevo campo llamado missval(en porcentaje). la funcion n me arroja el numero de dias.
  )%>%
  summarise(   #Tabla resumen
    pp = mean(pp, na.rm = T), #realizamos la pp acumulada
    valores_NA = unique(valores_NA), #Genera un unico valor, la funcion unique me devuelve valores únicos
  )%>%
  mutate(
    pp = ifelse(valores_NA >= 10, NA, pp), #Los porcentajes que no cumples con el criterio se consideraran como NA
    date = as.Date(sprintf("2000-%1$s-01", date)),
    meses = str_sub(date,6,7))#Creamos una variable que nos muestre los meses. variabilidad para cada mes por todos los años.


#Ploteamos el resultado
ggplot(pp_periodo, aes(x=meses, y=pp, fill = pp_perido$pp))+
  geom_bar(stat = "identity", fill = "#3CA27A")+
  scale_x_discrete(
    labels = month.abb
  )+
  ggtitle("climatología (Ene-Dic) del período 1980-2010")+
  theme(plot.title = element_text(vjust =2, hjust = 0.5))+
  labs(y="precipitación (mm)") +
  theme(axis.title.y = element_text(vjust = 2.5))

Comentario: La gráfica nos muestra la precipitacion promedio por cada mes, durante el periodo 1980 y 2010. En este gráfico a primera vista se puede observar que las precipitaciones mas altas corresponden a los primeros mese del año entre enero y abril con un promedio de 35mm miestras que la temporada seca o de pocas precipitaciones se registran durante los meses de julio y octubre.

 

  1. Poltear (boxplot) la variabilidad de los valores mensuales (Ene-Dic) para el período 1980-2013.
pp_month2 <-
  pp_month%>%
  dplyr::filter(date >= "1980-01-01" & date < "2013-12-31")

ggplot(pp_month2, aes(meses, pp)) +
geom_boxplot(fill = "#048ABF") +
theme_bw() +
scale_x_discrete(
  labels = month.abb
) +
ggtitle("Variabilidad de la precipitación mensual - periodo 1980-2013")+
  theme(plot.title = element_text(vjust =2, hjust = 0.5))+
labs(y="precipitación (mm)") +
theme(axis.title.y = element_text(vjust = 2.5))
## Warning: Removed 21 rows containing non-finite values (stat_boxplot).

Comentario: El diagrama de cajas nos muestra los datos de precipitación por mes a travez de cuartiles, mostrándonos la mediada para cada mes y los cuartiles, mientras que los puntos que sobresalen del diagrama representan a los valores atípicos de precipitación que se registraron.