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.
# 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)
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
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))
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
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)
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()
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
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")'
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")'
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).