Análisis Exploratorio de Datos (AED)

Pasos del AED

  1. Carga de librerias.
  2. Carga de datos.
  3. Analisis descriptivo.
  4. Ajuste de tipos de variables.
  5. Deteccion y tratamiento de datos ausentes.
  6. Deteccion y tratamiento de valores atipicos.
  7. Analisis de correlacion entre variables.

Pre-requisitos

Antes de empezar a trabajar con los datos se ubica el directorio de trabajo.

getwd()
## [1] "/cloud/project"

Carga de librerias

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

Carga de datos

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.")
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

Análisis exploratorio

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:

  • Se tienen un total de \(446.014\) observaciones.
  • Se cuenta con \(12\) variables, tres de tipo caracter y \(9\) de tipo numérica.
  • Las fechas del estudio van del \(01/01/1997\) hasta el \(31/12/2020\).
  • Se tienen variables de Longitud y Latitud para georreferenciar cada una de las estaciones de calidad de aire.

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\).

Ajuste de tipos de variables

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"

Deteccion y tratamiento de valores ausentes

Deteccion de valores ausentes en toda la tabla de datos.

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.

  • El valor TRUE indica la presencia de datos perdidos en la tabla.
  • El valor 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.

Eliminacion de los valores ausentes

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

Detección y tratamiento de valores atipicos (outliers)

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.

Análisis de correlación entre variables

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

  • Las variables \(NO (ug/m3)\) y \(NO2 (ug/m3)\) presenta un coeficiente alto de correlación positiva (\(r = 0.73\)).
  • En el resto de variables, el coeficiente de correlación es más bajo. Las variables \(O3 (ug/m3)\) y \(PM10 (ug/m3)\) se pueden considerar variables independientes.