Antes de empezar a trabajar con los datos se ubica el directorio de trabajo.
getwd()
## [1] "/cloud/project"
#install.packages("readr")
#install.packages("ggplot2")
#install.packages("Hmisc")
#install.packages("corrplot")
#install.packages("plyr")
#install.packages("knitr")
library(readr)
library(ggplot2)
library(Hmisc)
library(corrplot)
library(plyr)
library(knitr)
library(dplyr)
Ahora se cargan todos los conjuntos de datos de interés en el entorno de desarrollo.
#calidad_aire <- read_delim("https://datosabiertos.jcyl.es/web/jcyl/risp/es/medio-ambiente/calidad_aire_historico/1284212629698.csv", delim=";", col_names = TRUE, locale = locale(encoding = "WINDOWS-1252"))
calidad_aire <- read_delim("calidad_del_aire.csv", delim=";", col_names = TRUE, locale = locale(encoding = "WINDOWS-1252"))
Se visualizan los datos que se cargaron:
kable(head(calidad_aire), caption = "Tabla de calidad del aire.")
| Fecha | CO (mg/m3) | NO (ug/m3) | NO2 (ug/m3) | O3 (ug/m3) | PM10 (ug/m3) | PM25 (ug/m3) | SO2 (ug/m3) | Provincia | Estación | Latitud | Longitud | Posición |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2020-12-31 | 0.6 | 8 | 16 | NA | 6 | NA | 1 | Burgos | Burgos1 | 42.35111 | -3.675556 | 42.3511111111,-3.67555555556 |
| 2020-12-31 | NA | 2 | 6 | NA | 8 | NA | 4 | León | C.T.L.R. - Naredo | 42.81667 | -5.533333 | 42.8166666667,-5.53333333333 |
| 2020-12-31 | NA | 8 | 2 | 65 | 4 | NA | 2 | León | Carracedelo | 42.55861 | -6.725556 | 42.5586111111,-6.72555555556 |
| 2020-12-31 | NA | 1 | 4 | 58 | 21 | NA | 17 | León | La Robla | 42.80167 | -5.625000 | 42.8016666667,-5.625 |
| 2020-12-31 | NA | 1 | 1 | NA | 6 | NA | 2 | León | Tudela Veguin-Tudela Veguin | 42.80167 | -5.648889 | 42.8016666667,-5.64888888889 |
| 2020-12-31 | NA | 2 | 2 | 62 | 6 | NA | 6 | León | Valderas | 42.07972 | -5.448889 | 42.0797222222,-5.44888888889 |
Se aplican medidas descriptivas para observar la estructura de la base de datos:
str(calidad_aire)
## spc_tbl_ [446,014 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Fecha : Date[1:446014], format: "2020-12-31" "2020-12-31" ...
## $ CO (mg/m3) : num [1:446014] 0.6 NA NA NA NA NA NA NA NA NA ...
## $ NO (ug/m3) : num [1:446014] 8 2 8 1 1 2 5 2 2 1 ...
## $ NO2 (ug/m3) : num [1:446014] 16 6 2 4 1 2 9 6 6 1 ...
## $ O3 (ug/m3) : num [1:446014] NA NA 65 58 NA 62 56 53 59 81 ...
## $ PM10 (ug/m3): num [1:446014] 6 8 4 21 6 6 5 6 5 NA ...
## $ PM25 (ug/m3): num [1:446014] NA NA NA NA NA NA NA NA NA NA ...
## $ SO2 (ug/m3) : num [1:446014] 1 4 2 17 2 6 5 5 NA 2 ...
## $ Provincia : chr [1:446014] "Burgos" "León" "León" "León" ...
## $ Estación : chr [1:446014] "Burgos1" "C.T.L.R. - Naredo" "Carracedelo" "La Robla" ...
## $ Latitud : num [1:446014] 42.4 42.8 42.6 42.8 42.8 ...
## $ Longitud : num [1:446014] -3.68 -5.53 -6.73 -5.63 -5.65 ...
## $ Posición : chr [1:446014] "42.3511111111,-3.67555555556" "42.8166666667,-5.53333333333" "42.5586111111,-6.72555555556" "42.8016666667,-5.625" ...
## - attr(*, "spec")=
## .. cols(
## .. Fecha = col_date(format = ""),
## .. `CO (mg/m3)` = col_double(),
## .. `NO (ug/m3)` = col_double(),
## .. `NO2 (ug/m3)` = col_double(),
## .. `O3 (ug/m3)` = col_double(),
## .. `PM10 (ug/m3)` = col_double(),
## .. `PM25 (ug/m3)` = col_double(),
## .. `SO2 (ug/m3)` = col_double(),
## .. Provincia = col_character(),
## .. `Estación` = col_character(),
## .. Latitud = col_double(),
## .. Longitud = col_double(),
## .. `Posición` = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
summary(calidad_aire)
## Fecha CO (mg/m3) NO (ug/m3) NO2 (ug/m3)
## Min. :1997-01-01 Min. : 0.0 Min. :-441.00 Min. : 0.00
## 1st Qu.:2004-07-26 1st Qu.: 0.3 1st Qu.: 2.00 1st Qu.: 8.00
## Median :2009-09-11 Median : 0.7 Median : 5.00 Median : 16.00
## Mean :2009-09-11 Mean : 0.9 Mean : 13.23 Mean : 21.41
## 3rd Qu.:2015-02-10 3rd Qu.: 1.1 3rd Qu.: 15.00 3rd Qu.: 29.00
## Max. :2020-12-31 Max. :25.1 Max. : 634.00 Max. :249.00
## NA's :344856 NA's :30984 NA's :32517
## O3 (ug/m3) PM10 (ug/m3) PM25 (ug/m3) SO2 (ug/m3)
## Min. : 0.00 Min. : 0.00 Min. : 0.0 Min. :-791.00
## 1st Qu.: 37.00 1st Qu.: 11.00 1st Qu.: 5.0 1st Qu.: 2.00
## Median : 54.00 Median : 18.00 Median : 9.0 Median : 5.00
## Mean : 52.62 Mean : 22.69 Mean : 13.7 Mean : 9.09
## 3rd Qu.: 68.00 3rd Qu.: 29.00 3rd Qu.: 15.0 3rd Qu.: 11.00
## Max. :999.00 Max. :557.00 Max. :223.0 Max. : 364.00
## NA's :170600 NA's :101435 NA's :392230 NA's :89737
## Provincia Estación Latitud Longitud
## Length:446014 Length:446014 Min. :38.94 Min. :-6.782
## Class :character Class :character 1st Qu.:41.65 1st Qu.:-6.484
## Mode :character Mode :character Median :42.54 Median :-4.909
## Mean :42.15 Mean :-5.179
## 3rd Qu.:42.69 3rd Qu.:-4.538
## Max. :43.60 Max. :-2.467
## NA's :226 NA's :226
## Posición
## Length:446014
## Class :character
## Mode :character
##
##
##
##
describe(calidad_aire)
## calidad_aire
##
## 13 Variables 446014 Observations
## --------------------------------------------------------------------------------
## Fecha
## n missing distinct Info Mean Gmd .05
## 446014 0 8766 1 2009-09-11 2704 1999-01-04
## .10 .25 .50 .75 .90 .95
## 2000-09-15 2004-07-26 2009-09-11 2015-02-10 2018-07-01 2019-09-10
##
## lowest : 1997-01-01 1997-01-02 1997-01-03 1997-01-04 1997-01-05
## highest: 2020-12-27 2020-12-28 2020-12-29 2020-12-30 2020-12-31
## --------------------------------------------------------------------------------
## CO (mg/m3)
## n missing distinct Info Mean Gmd .05 .10
## 101158 344856 100 0.996 0.8546 0.7515 0.1 0.1
## .25 .50 .75 .90 .95
## 0.3 0.7 1.1 1.7 2.3
##
## lowest : 0.0 0.1 0.2 0.3 0.4, highest: 11.1 12.1 13.1 15.5 25.1
## --------------------------------------------------------------------------------
## NO (ug/m3)
## n missing distinct Info Mean Gmd .05 .10
## 415030 30984 360 0.992 13.23 16.89 1 1
## .25 .50 .75 .90 .95
## 2 5 15 34 52
##
## lowest : -441 -374 -367 0 1, highest: 464 470 511 610 634
## --------------------------------------------------------------------------------
## NO2 (ug/m3)
## n missing distinct Info Mean Gmd .05 .10
## 413497 32517 207 0.999 21.41 19.35 2 4
## .25 .50 .75 .90 .95
## 8 16 29 46 59
##
## lowest : 0 1 2 3 4, highest: 221 222 228 238 249
## --------------------------------------------------------------------------------
## O3 (ug/m3)
## n missing distinct Info Mean Gmd .05 .10
## 275414 170600 185 1 52.62 24.95 15 22
## .25 .50 .75 .90 .95
## 37 54 68 80 87
##
## lowest : 0 1 2 3 4, highest: 934 965 976 991 999
## --------------------------------------------------------------------------------
## PM10 (ug/m3)
## n missing distinct Info Mean Gmd .05 .10
## 344579 101435 237 0.999 22.69 17.64 5 7
## .25 .50 .75 .90 .95
## 11 18 29 45 57
##
## lowest : 0 1 2 3 4, highest: 314 321 339 343 557
## --------------------------------------------------------------------------------
## PM25 (ug/m3)
## n missing distinct Info Mean Gmd .05 .10
## 53784 392230 177 0.997 13.68 13.33 2 3
## .25 .50 .75 .90 .95
## 5 9 15 31 46
##
## lowest : 0 1 2 3 4, highest: 196 205 216 218 223
## --------------------------------------------------------------------------------
## SO2 (ug/m3)
## n missing distinct Info Mean Gmd .05 .10
## 356277 89737 251 0.993 9.093 10.22 1 1
## .25 .50 .75 .90 .95
## 2 5 11 21 31
##
## lowest : -791 -783 -780 -773 -767, highest: 326 344 358 360 364
## --------------------------------------------------------------------------------
## Provincia
## n missing distinct
## 446014 0 10
##
## lowest : Avila Burgos León Madrid Palencia
## highest: Salamanca Segovia Soria Valladolid Zamora
##
## Value Avila Burgos León Madrid Palencia Salamanca
## Frequency 7389 57906 176821 3252 61857 31204
## Proportion 0.017 0.130 0.396 0.007 0.139 0.070
##
## Value Segovia Soria Valladolid Zamora
## Frequency 8245 10482 80460 8398
## Proportion 0.018 0.024 0.180 0.019
## --------------------------------------------------------------------------------
## Estación
## n missing distinct
## 446014 0 91
##
## lowest : Aranda de Duero Aranda de Duero 2 Arco de ladrillo II Arco Ladrillo I Avila
## highest: Vega Sicilia Velilla del Rio Carrion Venta de Baños Zamora Zamora 2
## --------------------------------------------------------------------------------
## Latitud
## n missing distinct Info Mean Gmd .05 .10
## 445788 226 101 1 42.15 0.7317 40.95 40.98
## .25 .50 .75 .90 .95
## 41.65 42.54 42.69 42.83 42.85
##
## lowest : 38.93833 40.38694 40.56944 40.57056 40.65861
## highest: 42.95167 42.95250 43.04111 43.04167 43.60333
## --------------------------------------------------------------------------------
## Longitud
## n missing distinct Info Mean Gmd .05 .10
## 445788 226 100 1 -5.179 1.259 -6.662 -6.600
## .25 .50 .75 .90 .95
## -6.484 -4.909 -4.538 -3.674 -2.941
##
## lowest : -6.781944 -6.725556 -6.662222 -6.653611 -6.643333
## highest: -2.918056 -2.917500 -2.856944 -2.480556 -2.466667
## --------------------------------------------------------------------------------
## Posición
## n missing distinct
## 445788 226 106
##
## lowest : 38.9383333333,-4.63 40.3869444444,-4.39666666667 40.5694444444,-6.22388888889 40.5705555556,-6.2225 40.6586111111,-4.68805555556
## highest: 42.9516666667,-3.47527777778 42.9525,-3.47527777778 43.0411111111,-5.09055555556 43.0416666667,-5.09138888889 43.6033333333,-5.58916666667
## --------------------------------------------------------------------------------
Las primeras resultantes de estas medidas descriptivas son:
Ahora se genera el histograma de dos variables numéricas que presenta la tabla de datos: \(03 \,\ (μg/m3)\) y \(PM10 \,\ (μg/m3)\).
Antes de realizar cualquier analisis cambiamos el nombre a la variable
colnames(calidad_aire)[5] <- "O3"
colnames(calidad_aire)[6] <- "PM10"
colnames(calidad_aire)[7] <- "PM25"
colnames(calidad_aire)[2] <- "CO"
colnames(calidad_aire)[3] <- "NO"
colnames(calidad_aire)[4] <- "NO2"
colnames(calidad_aire)[8] <- "SO2"
colnames(calidad_aire)[10] <- "Estacion"
Con estos cambios se realizan los histogramas
par(mfrow=c(1,2))
hist_O3 <- hist(calidad_aire$O3, main = "",
xlab = "O3 (ug/m3)", ylab = "Frecuencia",
breaks = 1000, xlim = c(0,150))
hist_PM10 <- hist(calidad_aire$PM10, main = "",
xlab = "PM10 (ug/m3)", ylab = "Frecuencia",
breaks = 1000, xlim = c(0,150))
De los histogramas de ambas variables se observan distribuciones sesgadas hacia la izquierda, con valores más cercanos al 0, con un sesgo más pronunciado en la variable \(PM10\).
Se explora el tipo de datos de todas las variables
str(calidad_aire)
## spc_tbl_ [446,014 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Fecha : Date[1:446014], format: "2020-12-31" "2020-12-31" ...
## $ CO : num [1:446014] 0.6 NA NA NA NA NA NA NA NA NA ...
## $ NO : num [1:446014] 8 2 8 1 1 2 5 2 2 1 ...
## $ NO2 : num [1:446014] 16 6 2 4 1 2 9 6 6 1 ...
## $ O3 : num [1:446014] NA NA 65 58 NA 62 56 53 59 81 ...
## $ PM10 : num [1:446014] 6 8 4 21 6 6 5 6 5 NA ...
## $ PM25 : num [1:446014] NA NA NA NA NA NA NA NA NA NA ...
## $ SO2 : num [1:446014] 1 4 2 17 2 6 5 5 NA 2 ...
## $ Provincia: chr [1:446014] "Burgos" "León" "León" "León" ...
## $ Estacion : chr [1:446014] "Burgos1" "C.T.L.R. - Naredo" "Carracedelo" "La Robla" ...
## $ Latitud : num [1:446014] 42.4 42.8 42.6 42.8 42.8 ...
## $ Longitud : num [1:446014] -3.68 -5.53 -6.73 -5.63 -5.65 ...
## $ Posición: chr [1:446014] "42.3511111111,-3.67555555556" "42.8166666667,-5.53333333333" "42.5586111111,-6.72555555556" "42.8016666667,-5.625" ...
## - attr(*, "spec")=
## .. cols(
## .. Fecha = col_date(format = ""),
## .. `CO (mg/m3)` = col_double(),
## .. `NO (ug/m3)` = col_double(),
## .. `NO2 (ug/m3)` = col_double(),
## .. `O3 (ug/m3)` = col_double(),
## .. `PM10 (ug/m3)` = col_double(),
## .. `PM25 (ug/m3)` = col_double(),
## .. `SO2 (ug/m3)` = col_double(),
## .. Provincia = col_character(),
## .. `Estación` = col_character(),
## .. Latitud = col_double(),
## .. Longitud = col_double(),
## .. `Posición` = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
Se encuentran tres variables a las cuales se debe re-ajustar el tipo (Fecha, Provincia y Estación) para que puedan ser tratadas de manera correcta en posteriores analisis.
Re-ajustar la variable Fecha
calidad_aire$Fecha <- as.Date(calidad_aire$Fecha, format("%d/%m/%Y"))
str(calidad_aire$Fecha)
## Date[1:446014], format: "2020-12-31" "2020-12-31" "2020-12-31" "2020-12-31" "2020-12-31" ...
Re-ajustar la variable Provincia
unique(calidad_aire$Provincia)
## [1] "Burgos" "León" "Palencia" "Salamanca" "Valladolid"
## [6] "Soria" "Zamora" "Avila" "Segovia" "Madrid"
calidad_aire$Provincia <- as.factor(calidad_aire$Provincia)
levels(calidad_aire$Provincia)
## [1] "Avila" "Burgos" "León" "Madrid" "Palencia"
## [6] "Salamanca" "Segovia" "Soria" "Valladolid" "Zamora"
Re-ajustar la varaible Estacion
unique(calidad_aire$Estacion)
## [1] "Burgos1" "C.T.L.R. - Naredo"
## [3] "Carracedelo" "La Robla"
## [5] "Tudela Veguin-Tudela Veguin" "Valderas"
## [7] "Guardo" "Hontoria 1 - Poblado"
## [9] "Renault4" "El Maillo"
## [11] "Salamanca5" "Arco de ladrillo II"
## [13] "La rubia II" "Medina del Campo"
## [15] "Michelin2" "Puente Poniente-Mº Luisa Sánchez"
## [17] "Vega Sicilia" "Aranda de Duero 2"
## [19] "Miranda de Ebro2" "C.T.L.R. - Cuadros"
## [21] "C.T.L.R. - Ventosilla" "Lario"
## [23] "Leon1" "Otero"
## [25] "Toral de los Vados" "C.T.G. - Villalba"
## [27] "Palencia 3" "Muriel de la Fuente"
## [29] "Soria" "Renault3"
## [31] "Zamora 2" "Avila II"
## [33] "Burgos4" "Medina de Pomar"
## [35] "Leon 4" "Ponferrada4"
## [37] "C.T.G. - Compuerto" "Hontoria 2 - Venta de Baños"
## [39] "Salamanca6" "Segovia 2"
## [41] "Michelin1" "Renault1"
## [43] "Renault2" "VALLADOLID SUR"
## [45] "C.T.Compostilla-Congosto" "C.T.Compostilla-Cortiguera"
## [47] "C.T.Compostilla-Villaverde" "C.T.Compostilla-Compostilla"
## [49] "C.T.Compostilla-Santa Marina" "NH3"
## [51] "Miranda de Ebro1" "Puente Regueral"
## [53] "San MartÃn de Valdeiglesias" "C.T.Anllares - Palacios del Sil"
## [55] "C.T.Anllares - Susañe" "C.T.Anllares - Hospital del Sil"
## [57] "C.T.Anllares - Anllares" "C.T.Anllares - Lillo"
## [59] "C.T.Compostilla-San Miguel" "C.T.Compostilla-Sancedo"
## [61] "C.T.Compostilla-Cueto" "Burgos5"
## [63] "Salamanca4" "Leon3"
## [65] "Labradores II" "Cementerio"
## [67] "Velilla del Rio Carrion" "Ponferrada5"
## [69] "Ponferrada1" "Salamanca2"
## [71] "Venta de Baños" "Santa Teresa"
## [73] "Leon2" "Burgos3"
## [75] "C.T.Anllares - Anllarinos" "C.T.Anllares - Páramo del Sil"
## [77] "C.T.Anllares - Sorbeda" "C.T.L.R. - La Robla"
## [79] "Zamora" "Avila"
## [81] "Segovia" "Aranda de Duero"
## [83] "Palencia2" "Salamanca3"
## [85] "Burgos2" "Ponferrada3"
## [87] "Ponferrada2" "Miranda de Ebro3"
## [89] "Palencia1" "Salamanca1"
## [91] "Arco Ladrillo I"
calidad_aire$Estacion <- as.factor(calidad_aire$Estacion)
levels(calidad_aire$Estacion)
## [1] "Aranda de Duero" "Aranda de Duero 2"
## [3] "Arco de ladrillo II" "Arco Ladrillo I"
## [5] "Avila" "Avila II"
## [7] "Burgos1" "Burgos2"
## [9] "Burgos3" "Burgos4"
## [11] "Burgos5" "C.T.Anllares - Anllares"
## [13] "C.T.Anllares - Anllarinos" "C.T.Anllares - Hospital del Sil"
## [15] "C.T.Anllares - Lillo" "C.T.Anllares - Páramo del Sil"
## [17] "C.T.Anllares - Palacios del Sil" "C.T.Anllares - Sorbeda"
## [19] "C.T.Anllares - Susañe" "C.T.Compostilla-Compostilla"
## [21] "C.T.Compostilla-Congosto" "C.T.Compostilla-Cortiguera"
## [23] "C.T.Compostilla-Cueto" "C.T.Compostilla-San Miguel"
## [25] "C.T.Compostilla-Sancedo" "C.T.Compostilla-Santa Marina"
## [27] "C.T.Compostilla-Villaverde" "C.T.G. - Compuerto"
## [29] "C.T.G. - Villalba" "C.T.L.R. - Cuadros"
## [31] "C.T.L.R. - La Robla" "C.T.L.R. - Naredo"
## [33] "C.T.L.R. - Ventosilla" "Carracedelo"
## [35] "Cementerio" "El Maillo"
## [37] "Guardo" "Hontoria 1 - Poblado"
## [39] "Hontoria 2 - Venta de Baños" "La Robla"
## [41] "La rubia II" "Labradores II"
## [43] "Lario" "Leon 4"
## [45] "Leon1" "Leon2"
## [47] "Leon3" "Medina de Pomar"
## [49] "Medina del Campo" "Michelin1"
## [51] "Michelin2" "Miranda de Ebro1"
## [53] "Miranda de Ebro2" "Miranda de Ebro3"
## [55] "Muriel de la Fuente" "NH3"
## [57] "Otero" "Palencia 3"
## [59] "Palencia1" "Palencia2"
## [61] "Ponferrada1" "Ponferrada2"
## [63] "Ponferrada3" "Ponferrada4"
## [65] "Ponferrada5" "Puente Poniente-Mº Luisa Sánchez"
## [67] "Puente Regueral" "Renault1"
## [69] "Renault2" "Renault3"
## [71] "Renault4" "Salamanca1"
## [73] "Salamanca2" "Salamanca3"
## [75] "Salamanca4" "Salamanca5"
## [77] "Salamanca6" "San MartÃn de Valdeiglesias"
## [79] "Santa Teresa" "Segovia"
## [81] "Segovia 2" "Soria"
## [83] "Toral de los Vados" "Tudela Veguin-Tudela Veguin"
## [85] "Valderas" "VALLADOLID SUR"
## [87] "Vega Sicilia" "Velilla del Rio Carrion"
## [89] "Venta de Baños" "Zamora"
## [91] "Zamora 2"
Se identifican resultados booleano por cada observacion ausente que se presenta la tabla de datos:
TRUE, en caso de que la observacion sea un valor
ausente.FALSE, en caso contrario.head(is.na(calidad_aire))
## Fecha CO NO NO2 O3 PM10 PM25 SO2 Provincia Estacion Latitud
## [1,] FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE
## [2,] FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE
## [3,] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
## [4,] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
## [5,] FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE
## [6,] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
## Longitud Posición
## [1,] FALSE FALSE
## [2,] FALSE FALSE
## [3,] FALSE FALSE
## [4,] FALSE FALSE
## [5,] FALSE FALSE
## [6,] FALSE FALSE
Se devuelve un resultado booleano (TRUE o
FALSE) para toda la tabla de datos.
TRUE indica la presencia de datos perdidos en
la tabla.FALSE, indica que no existen valores perdidos
en la tabla.any(is.na(calidad_aire))
## [1] TRUE
Se muestra la suma de todos los valores perdidos que presenta la tabla.
sum(is.na(calidad_aire))
## [1] 1163037
Se muestra el porcentaje de valores perdidos que presenta la tabla
mean(is.na(calidad_aire))
## [1] 0.2005865
Se muestra el numero de valores perdidos que presenta cada variable de la tabla
colSums(is.na(calidad_aire))
## Fecha CO NO NO2 O3 PM10 PM25 SO2
## 0 344856 30984 32517 170600 101435 392230 89737
## Provincia Estacion Latitud Longitud Posición
## 0 0 226 226 226
Se muestra el porcentaje de valores perdidos que presenta cada variable de la tabla
colMeans(is.na(calidad_aire), round(2))
## Fecha CO NO NO2 O3 PM10
## 0.0000000000 0.7731954602 0.0694686714 0.0729057832 0.3824992041 0.2274255965
## PM25 SO2 Provincia Estacion Latitud Longitud
## 0.8794118570 0.2011977203 0.0000000000 0.0000000000 0.0005067106 0.0005067106
## Posición
## 0.0005067106
Se puede observar que la base de datos presenta un total de \(1163037\) valores perdidos, el \(21 \%\) del total. \(CO (mg/m3)\) y \(PM25 (μg/m3)\) presentan un porcentaje superior al \(50 \%\), del \(77 \%\) y \(88 \%\) respectivamente, lo que conlleva una ausencia significativa de información. Esta anomalía debe ser tratada de alguna forma para disminuir su impacto en el objetivo de reutilización de los datos.
Se puede llevar a cabo la eliminacion de las variables que presentan un porcentaje superior al \(50 \%\) de valores perdidos.
calidad_aire_SV <- calidad_aire[,-which(colMeans(is.na(calidad_aire)) >= 0.50)]
colMeans(is.na(calidad_aire_SV), round(2))
## Fecha NO NO2 O3 PM10 SO2
## 0.0000000000 0.0694686714 0.0729057832 0.3824992041 0.2274255965 0.2011977203
## Provincia Estacion Latitud Longitud Posición
## 0.0000000000 0.0000000000 0.0005067106 0.0005067106 0.0005067106
Se hace la sustitucion de NAs por la media de la
variable a la cual pertenece
columnas_numericas <- which(sapply(calidad_aire, is.numeric))
cols_mean <- rep(NA, ncol(calidad_aire))
cols_mean[columnas_numericas] <- colMeans(calidad_aire[, columnas_numericas], na.rm = TRUE)
calidad_aire_SinNA <- for (x in columnas_numericas) {
calidad_aire[is.na(calidad_aire[,x]), x] <- round(cols_mean[x],2)
}
sum(is.na(calidad_aire))
## [1] 226
Se detectan y tratan datos atipicos en una variable continua creando el histograma de frecuencias
par(mfrow=c(1,1))
hist(calidad_aire$O3, main = "",
xlab = "O3", ylab = "Frecuencia",
breaks = 1000, xlim = c(0,150))
Se obtienen las estadisticas del boxplot y se crea el boxplot
outliers <- boxplot(calidad_aire$O3, horizontal = TRUE, xlab ="O3 (ug/m3)")
boxplot(calidad_aire$O3, horizontal = TRUE, xlab ="O3 (ug/m3)")
boxplot.stats(calidad_aire$O3)[1:3]
## $stats
## [1] 32.00 48.00 52.62 59.00 75.00
##
## $n
## [1] 446014
##
## $conf
## [1] 52.59398 52.64602
Se eliminan los valores atipicos de una variable continua
calidad_aire_NoOut <- calidad_aire[!(calidad_aire$O3 %in% outliers$out), ]
boxplot(calidad_aire_NoOut$O3, horizontal = TRUE, xlab ="O3 (ug/m3)")
str(calidad_aire_NoOut)
## tibble [354,851 × 13] (S3: tbl_df/tbl/data.frame)
## $ Fecha : Date[1:354851], format: "2020-12-31" "2020-12-31" ...
## $ CO : num [1:354851] 0.6 0.85 0.85 0.85 0.85 0.85 0.85 0.85 0.85 0.85 ...
## $ NO : num [1:354851] 8 2 8 1 1 2 5 2 2 4 ...
## $ NO2 : num [1:354851] 16 6 2 4 1 2 9 6 6 11 ...
## $ O3 : num [1:354851] 52.6 52.6 65 58 52.6 ...
## $ PM10 : num [1:354851] 6 8 4 21 6 6 5 6 5 4 ...
## $ PM25 : num [1:354851] 13.7 13.7 13.7 13.7 13.7 ...
## $ SO2 : num [1:354851] 1 4 2 17 2 6 5 5 9.09 3 ...
## $ Provincia: Factor w/ 10 levels "Avila","Burgos",..: 2 3 3 3 3 3 5 5 5 6 ...
## $ Estacion : Factor w/ 91 levels "Aranda de Duero",..: 7 32 34 40 84 85 37 38 71 76 ...
## $ Latitud : num [1:354851] 42.4 42.8 42.6 42.8 42.8 ...
## $ Longitud : num [1:354851] -3.68 -5.53 -6.73 -5.63 -5.65 ...
## $ Posición: chr [1:354851] "42.3511111111,-3.67555555556" "42.8166666667,-5.53333333333" "42.5586111111,-6.72555555556" "42.8016666667,-5.625" ...
Se hace la comparativa entre ambas tablas (con outliers y sin outliers) y se crea el boxplot con la nueva tabla
par(mfrow=c(1,2)) #Dividir el cuadro del grafico en dos
boxplot(calidad_aire$O3, xlab ="03 (ug/m3)") #Creacion del boxplot con la tabla con outliers
boxplot(calidad_aire_NoOut$O3, xlab ="O3 (ug/m3)") #Creacion del boxplot con la tabla sin outliers
Se hace la detección de valores atipicos en una variable categórica contando el número de observaciones que tiene cada categoria de la variable
calidad_aire %>% count(Provincia)
## # A tibble: 10 × 2
## Provincia n
## <fct> <int>
## 1 Avila 7389
## 2 Burgos 57906
## 3 León 176821
## 4 Madrid 3252
## 5 Palencia 61857
## 6 Salamanca 31204
## 7 Segovia 8245
## 8 Soria 10482
## 9 Valladolid 80460
## 10 Zamora 8398
Se genera el grafico de barras para ver la distribucion que presenta la variable
par(mfrow=c(1,1))
ggplot_provincias <- ggplot(calidad_aire) +
geom_bar(mapping = aes(x = calidad_aire$Provincia, fill=calidad_aire$Provincia))+
xlab("Provincias")+
ylab("observaciones")+
theme(axis.text.x = element_text(angle = 30))
ggplot_provincias
La variable \(Provincia\) presenta \(10\) factores o categorías donde el factor llamado “Madrid” tiene muy pocas observaciones,por lo que puede no pertenecer a la Comunidad Autónoma de Castilla y León. Esta categoría puede ser un error o podría estar indicando la presencia de una estación de calidad del aire fuera de la Comunidad Autónoma de Castilla y León, algo que se tiene que comprobar al disponer de las coordenadas geográficas de las estaciones en el conjunto de datos.
La categoría de información detectada para esta variable se trata de un outlier y por tanto se procede a su eliminación.
eliminar_Madrid <- calidad_aire$Provincia %in% c("Madrid")
calidad_aire_SM <- calidad_aire[!eliminar_Madrid,]
calidad_aire_SM %>% count(Provincia)
## # A tibble: 9 × 2
## Provincia n
## <fct> <int>
## 1 Avila 7389
## 2 Burgos 57906
## 3 León 176821
## 4 Palencia 61857
## 5 Salamanca 31204
## 6 Segovia 8245
## 7 Soria 10482
## 8 Valladolid 80460
## 9 Zamora 8398
calidad_aire_SM$Provincia <- droplevels(calidad_aire_SM$Provincia)
levels(calidad_aire_SM$Provincia)
## [1] "Avila" "Burgos" "León" "Palencia" "Salamanca"
## [6] "Segovia" "Soria" "Valladolid" "Zamora"
Se genera el gráfico de barras de nuevo para ver los niveles del factor
ggplot_provincias_SM <- ggplot(calidad_aire_SM) +
geom_bar(mapping = aes(x = calidad_aire_SM$Provincia, fill=calidad_aire_SM$Provincia))+
xlab("Provincias")+
ylab("observaciones")+
theme(axis.text.x = element_text(angle = 30))
ggplot_provincias_SM
## Warning: Use of `calidad_aire_SM$Provincia` is discouraged. Use `Provincia` instead.
## Use of `calidad_aire_SM$Provincia` is discouraged. Use `Provincia` instead.
# Seleccionamos las variables numéricas situadas en las columnas 2 a 6 de la tabla de calidad del aire (NO, NO2, O3, PM10, PM25 y SO2)
num_variables <- calidad_aire[,c(2,3,4,5,6)]
#Calculamos la matriz de coeficientes de correlación entre las variables numéricas
correlacion <- cor(num_variables)
#Gráfico de correlaciones indicando la forma en la que se representa la correlación (un cuadrado que varía en tamaño según la fortaleza). Para la generación de este gráfico es necesario instalar y cargar la librería corrplot
corrplot(correlacion, method = "square")
Observando el gráfico se tienen las siguientes consideraciones: