Introduction

Explicación del proyecto

Hoy en día, la mayoría de los productos que consumimos generan contaminación (ya sea de forma directa o indirecta).

Convivimos a diario con la contaminación atmosférica, generalmente producida por el trafico y las producciones de las industrias.

Esta situación ha generado otros fenómenos de impactos muy negativos, así como, el cambio climático y el calentamiento global. Además es responsable de muchas muertes prematuras y enfermedades respiratorias en nuestras ciudades.

Para vigilar la calidad del aire, el ayuntamiento de Valencia ha decidido crear distintas estaciones. Tenemos información de la contaminación del aire de cada estación desde el año 2014 hasta el 2021. Hemos utilizado R para trabajar con los datos, llegar a distintas conclusiones y responder a las preguntas planteadas.

Cargar librerias, funciones, y los datos

# Especificamos las librerías necesarias en esta lista

packages = c("tidyverse",'leaflet','htmltools','leaflet.extras')

package.check <- lapply(packages, FUN = function(x) {
  if (!require(x, character.only = TRUE)) {
    install.packages(x, dependencies = TRUE,repos='http://cran.rediris.es')
  }
  library(x, character.only = TRUE)
})
## Warning: package 'tidyverse' was built under R version 4.0.5
## Warning: package 'ggplot2' was built under R version 4.0.5
## Warning: package 'tidyr' was built under R version 4.0.5
## Warning: package 'dplyr' was built under R version 4.0.5
## Warning: package 'leaflet' was built under R version 4.0.5
## Warning: package 'leaflet.extras' was built under R version 4.0.5
#Comprobamos que se han cargado
search()
##  [1] ".GlobalEnv"             "package:leaflet.extras" "package:htmltools"     
##  [4] "package:leaflet"        "package:forcats"        "package:stringr"       
##  [7] "package:dplyr"          "package:purrr"          "package:readr"         
## [10] "package:tidyr"          "package:tibble"         "package:ggplot2"       
## [13] "package:tidyverse"      "package:stats"          "package:graphics"      
## [16] "package:grDevices"      "package:utils"          "package:datasets"      
## [19] "package:methods"        "Autoloads"              "package:base"
rm(package.check)

Importar y unir dataframes

name  = list.files('data')
datasetfinal<-data.frame()

for (nom in name){
  datos <- paste("data/", nom , sep = "") 
  df.primario <- read_csv2(datos, locale = locale(encoding = "WINDOWS-1252"))
  df.primario<-df.primario %>% gather(key = 'Tipos',value = 'Unidad',-Fecha,factor_key = T)
  lugar<-substr(nom,1,nchar(nom)-4)
  df.primario2<-cbind(df.primario,Lugar = c(lugar))

  datasetfinal<-datasetfinal %>%bind_rows(df.primario2)
}
rm(df.primario)
rm(df.primario2)
datasetfinal$Fecha <- as.Date(datasetfinal$Fecha, '%d/%m/%Y')
head(datasetfinal)
##        Fecha        Tipos Unidad Lugar
## 1 2014-01-01 PM2.5(µg/m³)      1    1A
## 2 2014-01-02 PM2.5(µg/m³)      2    1A
## 3 2014-01-03 PM2.5(µg/m³)      2    1A
## 4 2014-01-04 PM2.5(µg/m³)      1    1A
## 5 2014-01-05 PM2.5(µg/m³)      2    1A
## 6 2014-01-06 PM2.5(µg/m³)      2    1A

Limpiar datasets

datasetfinal <- datasetfinal  %>% group_by(Tipos,Lugar) %>%
mutate(Unidad = ifelse(is.na(Unidad),mean(Unidad, na.rm = T), Unidad))

#Sustituimos los datos vacias por la media de los datos completos agrupado por cada estación y tipo
sum(complete.cases(datasetfinal))
## [1] 151367
sum(complete.cases(datasetfinal))/(dim(datasetfinal)[1])*100
## [1] 100
#Comprobamos que se sustituye correctamente
#x<-datasetfinal%>%filter( Lugar == '5A' & grepl('Pb',Tipos))

Preguntas que planteamos

¿ Los gases contaminantes más habituales están relacionados con la combustión de motores ?

gases_coches = c('SO2','CO2','CO','NOx')

todos_gases = c('PM2.5','SO2','NO','NO2','PM10','NOx','Ozono','PM1','CO','Xileno','Tolueno','Benceno',
                'Ruido','Ni','As','PB','Cd','Veloc','BaP')


gases_cont<- c('SO2','PM2.5','PM10','Ozono','NO2')
media_gases = c()
todos_gases[7]
## [1] "Ozono"
for(i in 1:length(todos_gases)) {
  df<-datasetfinal%>%filter(grepl(todos_gases[i],Tipos))
  mean(df$Unidad)
  media_gases<-c(media_gases,mean(df$Unidad))

}
media_gases
##  [1] 12.5199547  3.6062408 27.3276147 26.8760853 20.1238910 43.8359556
##  [7] 49.9962122 18.8212975  0.1692708  2.3197928  5.0312944  1.5788950
## [13] 59.6231654  3.1329109  0.4412339        NaN  0.1163678  1.3030944
## [19]  0.1074684
df_plt<-data.frame(todos_gases,media_gases)
df_plt<- na.omit(df_plt)
df_plt<-df_plt %>% filter(todos_gases != 'Ruido' & todos_gases != 'Veloc')


ggplot(df_plt,aes(x =todos_gases,y =media_gases)) + geom_col(aes(fill = todos_gases),alpha = 0.7)+theme_bw()+labs(x="Gases", y="Media")+ggtitle("Grafico de la media de los gases")

El índice de calidad del aire se calcula para cinco contaminantes criterio contemplados en la normativa nacional:

https://www.boe.es/boe/dias/2020/09/10/pdfs/BOE-A-2020-10426.pdf

http://www.ica.miteco.es/

Ozono (O3), material particulado (PM10 y PM2.5), dióxido de azufre (SO2) y dióxido de nitrógeno (NO2).

gases_cont<- c('SO2','PM2.5','PM10','Ozono','NO2')
media_gases<- c()
df_cont_final<-data.frame()
df_cont2<- data.frame()


#PM2.5

df_cont <- datasetfinal  %>% filter(grepl('PM2.5',Tipos)) %>%
mutate(Unidad,Niveles = Unidad)%>%
mutate(Niveles = ifelse(Niveles<=10,5, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>10 & Niveles<=20 ,4, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>20 & Niveles<=25 ,3, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>25 & Niveles<=50 ,2, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>50 & Niveles<=75 ,1, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>75 & Niveles<=800,0, Niveles))

for(i in 1:length(unique(datasetfinal$Lugar))) {
  df<-df_cont%>%filter(Lugar==unique(datasetfinal$Lugar)[i])
  media_gases<-c(media_gases,mean(df$Niveles))
}
Estacion <- unique(datasetfinal$Lugar)
df_cont_final.0<-data.frame(Estacion)
df_cont_final.0<-cbind(df_cont_final.0,Media = c(media_gases))
df_cont_final.0<-cbind(df_cont_final.0,Gases = c('PM2.5'))
df_cont_final<-df_cont_final %>% bind_rows(df_cont_final.0)
df_cont2<- df_cont2 %>% bind_rows(df_cont)


#SO2
media_gases<- c()
df_cont <- datasetfinal  %>% filter(grepl('SO2',Tipos)) %>%
mutate(Unidad,Niveles = Unidad)%>%
mutate(Niveles = ifelse(Niveles<=100,5, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>100 & Niveles<=200 ,4, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>200 & Niveles<=350 ,3, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>350 & Niveles<=500 ,2, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>500 & Niveles<=750 ,1, Niveles)) %>%
mutate(Niveles = ifelse(Niveles>750 & Niveles<=1250,0, Niveles))


for(i in 1:length(unique(datasetfinal$Lugar))) {
  df<-df_cont%>%filter(Lugar==unique(datasetfinal$Lugar)[i])
  media_gases<-c(media_gases,mean(df$Niveles))
}
Estacion <- unique(datasetfinal$Lugar)
df_cont_final.0<-data.frame()
df_cont_final.0<-data.frame(Estacion)
media_gases
## [1] 5 5 5 5 5 5
df_cont_final.0<-cbind(df_cont_final.0,Media = c(media_gases))
df_cont_final.0<-cbind(df_cont_final.0,Gases = c('SO2'))

df_cont_final<-df_cont_final %>% bind_rows(df_cont_final.0)
df_cont2<- df_cont2 %>% bind_rows(df_cont)


#PM10
media_gases<- c()
df_cont <- datasetfinal  %>% filter(grepl('PM10',Tipos)) %>%
mutate(Unidad,Niveles = Unidad)%>%
mutate(Niveles = ifelse(Niveles <= 20, 5, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 20 & Niveles <= 40, 4, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 40 & Niveles <= 50, 3, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 50 & Niveles <= 100, 2, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 100 & Niveles <= 150, 1, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 150 & Niveles <= 1200, 0, Niveles))


for(i in 1:length(unique(datasetfinal$Lugar))) {
  df<-df_cont%>%filter(Lugar==unique(datasetfinal$Lugar)[i])
  media_gases<-c(media_gases,mean(df$Niveles))
}
Estacion <- unique(datasetfinal$Lugar)
df_cont_final.0<-data.frame()
df_cont_final.0<-data.frame(Estacion)
media_gases
## [1] 4.679813 4.685192 4.454723 4.236321 4.804935 4.146979
df_cont_final.0<-cbind(df_cont_final.0,Media = c(media_gases))
df_cont_final.0<-cbind(df_cont_final.0,Gases = c('PM10'))

df_cont_final<-df_cont_final %>% bind_rows(df_cont_final.0)
df_cont2<- df_cont2 %>% bind_rows(df_cont)


#OZONO
media_gases<- c()
df_cont <- datasetfinal  %>% filter(grepl('Ozono',Tipos)) %>%
mutate(Unidad,Niveles = Unidad)%>%
mutate(Niveles = ifelse(Niveles <= 50, 5, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 50 & Niveles <= 100, 4, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 100 & Niveles <= 130, 3, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 130 & Niveles <= 240, 2, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 240 & Niveles <= 380, 1, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 380 & Niveles <= 800, 0, Niveles))


for(i in 1:length(unique(datasetfinal$Lugar))) {
  df<-df_cont%>%filter(Lugar==unique(datasetfinal$Lugar)[i])
  media_gases<-c(media_gases,mean(df$Niveles))
}
Estacion <- unique(datasetfinal$Lugar)
df_cont_final.0<-data.frame()
df_cont_final.0<-data.frame(Estacion)
media_gases
## [1] 4.354939 4.429848 4.619828 4.417540 4.448884 4.508382
df_cont_final.0<-cbind(df_cont_final.0,Media = c(media_gases))
df_cont_final.0<-cbind(df_cont_final.0,Gases = c('Ozono'))

df_cont_final<-df_cont_final %>% bind_rows(df_cont_final.0)
df_cont2<- df_cont2 %>% bind_rows(df_cont)


#NO2
media_gases<- c()
df_cont <- datasetfinal  %>% filter(grepl('NO2',Tipos)) %>%
mutate(Unidad,Niveles = Unidad)%>%
mutate(Niveles = ifelse(Niveles <= 40, 5, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 40 & Niveles <= 90, 4, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 90 & Niveles <= 120, 3, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 120 & Niveles <= 230, 2, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 230 & Niveles <= 340, 1, Niveles)) %>%
mutate(Niveles = ifelse(Niveles > 340 & Niveles <= 1000, 0, Niveles))

for(i in 1:length(unique(datasetfinal$Lugar))) {
  df<-df_cont%>%filter(Lugar==unique(datasetfinal$Lugar)[i])
  media_gases<-c(media_gases,mean(df$Niveles))
}
Estacion <- unique(datasetfinal$Lugar)
df_cont_final.0<-data.frame()
df_cont_final.0<-data.frame(Estacion)
media_gases
## [1] 4.891839 4.905169 4.626464 4.889406 4.827654 4.769591
df_cont_final.0<-cbind(df_cont_final.0,Media = c(media_gases))
df_cont_final.0<-cbind(df_cont_final.0,Gases = c('NO2'))
df_cont2<- df_cont2 %>% bind_rows(df_cont)



df_cont_final<-df_cont_final %>% bind_rows(df_cont_final.0)

¿Cual es lugar donde más y menos contaminación hay?

media_estac<-c()
for(i in 1:length(unique(datasetfinal$Lugar))) {
  df<-df_cont_final%>%filter(Estacion==unique(datasetfinal$Lugar)[i])
  media_estac<-c(media_estac,mean(df$Media, na.rm = T))
}
media_estac
## [1] 4.658180 4.614536 4.613349 4.512844 4.686800 4.606238
df_pt_estac<- data.frame(Estacion)
df_pt_estac<-cbind(df_pt_estac,media_estac)


ggplot(df_pt_estac,aes(x =Estacion,y =media_estac)) + geom_col(aes(fill = Estacion),alpha = 0.7)+theme_bw()+ggtitle("Grafico de medias de nivel de cada lugar")+labs(x="Lugares", y="Media de nivel por lugar")+ylim(0,5)

#7A tiene 10000 variables y el resto 12.000, esto es porque en 7A no recoge PM2.5
ggplot(df_cont2,aes(x =Fecha,y =Niveles)) + geom_jitter(aes(color = Lugar),size = 0.1)+facet_wrap(~Lugar)+theme_bw()

¿ Hay diferencias entre los niveles de contaminantes según la estación meteorológica considerada ?

Estacion
## [1] "1A" "3A" "4A" "5A" "6A" "7A"
Colores <- c('#f39495','#997400','#4daf4a','#1ae4e2','#377eb8','#e21ae4')
pal <- colorFactor(Colores, domain = Estacion)

longitud<-c(-0.3426224601815117,-0.4174272804438407,-0.36900353363160016,-0.36791047737296617,-0.347904833195743,-0.381512477374152)
latitud<-c(39.47934032044312,39.48068039955423,39.445641134121246,39.48116543990263,39.45963008156421,39.44600668090378)

mapa<-data.frame(Estacion)
mapa<-cbind(mapa,latitud,longitud)
mapa<- mapa %>% bind_rows(mapa) %>% bind_rows(mapa)




map<-leaflet()%>% addTiles() %>%  addCircleMarkers(data = mapa, lat = ~latitud, 
    lng = ~longitud,label = ~Estacion , color = ~pal(Estacion), popup = ~Estacion)
#Generamos una leyenda

map <- map %>% addLegend(data = mapa, "bottomright", pal = pal, 
    values = ~Estacion, title = "Estacion", 
    opacity = 1, group = "Leyenda")
map

¿ha aumentado la contaminacion a lo largo de estos ultimos años?

df_dia_lugar<-df_cont2 %>% group_by(Fecha,Lugar)%>%mutate(Niveles,Niveles_dia = mean(Niveles, na.rm = T))
ggplot(df_dia_lugar,aes(x=Fecha, y=Niveles_dia,colour=Lugar))+geom_smooth(aes(ymin=0,ymax=5))+ylim(0,5)+labs(x="Años", y="Niveles")+ggtitle("Grafico de los niveles durante los años")+theme_bw()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

¿bajo el nivel de comtaminacion durante el confinamiento?

ggplot(df_dia_lugar,aes(x=Fecha, y=Niveles_dia,colour=Lugar))+geom_smooth(aes(ymin=0,ymax=5))+ylim(0,5)+labs(x="Años", y="Niveles")+ggtitle("Grafico de los niveles durante los años")+facet_wrap(~Lugar)+theme_bw()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

¿Que está causando la contaminación atmosférica?

ggplot(df_cont_final,aes(x =Estacion,y =Media, fill = Gases)) + geom_col(position = 'dodge')+theme_bw()+ggtitle("Grafico de medias de nivel de cada lugar")+labs(x="Lugares", y="Media de nivel por lugar")+ylim(0,5)
## Warning: Removed 1 rows containing missing values (geom_col).