2.1 Analisis descriptivo
calidad_aire <- read.csv("C:/Users/Martini/Downloads/calidad-del-aire-datos-historicos-diarios.csv", sep=";")
View(calidad_aire)
str(calidad_aire)
## 'data.frame': 446014 obs. of 13 variables:
## $ Fecha : chr "2020-12-31" "2020-12-31" "2020-12-31" "2020-12-31" ...
## $ CO..mg.m3. : num 0.6 NA NA NA NA NA NA NA NA NA ...
## $ NO..ug.m3. : int 8 2 8 1 1 2 5 2 2 1 ...
## $ NO2..ug.m3. : int 16 6 2 4 1 2 9 6 6 1 ...
## $ O3..ug.m3. : int NA NA 65 58 NA 62 56 53 59 81 ...
## $ PM10..ug.m3.: int 6 8 4 21 6 6 5 6 5 NA ...
## $ PM25..ug.m3.: int NA NA NA NA NA NA NA NA NA NA ...
## $ SO2..ug.m3. : int 1 4 2 17 2 6 5 5 NA 2 ...
## $ Provincia : chr "Burgos" "León" "León" "León" ...
## $ Estación : chr "Burgos1" "C.T.L.R. - Naredo" "Carracedelo" "La Robla" ...
## $ Latitud : num 42.4 42.8 42.6 42.8 42.8 ...
## $ Longitud : num -3.68 -5.53 -6.73 -5.63 -5.65 ...
## $ Posición : chr "42.3511111111,-3.67555555556" "42.8166666667,-5.53333333333" "42.5586111111,-6.72555555556" "42.8016666667,-5.625" ...
summary(calidad_aire)
## Fecha CO..mg.m3. NO..ug.m3. NO2..ug.m3.
## Length:446014 Min. : 0.0 Min. :-441.00 Min. : 0.00
## Class :character 1st Qu.: 0.3 1st Qu.: 2.00 1st Qu.: 8.00
## Mode :character Median : 0.7 Median : 5.00 Median : 16.00
## Mean : 0.9 Mean : 13.23 Mean : 21.41
## 3rd Qu.: 1.1 3rd Qu.: 15.00 3rd Qu.: 29.00
## 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
##
##
##
##
hist_O3 <- hist(calidad_aire$O3..ug.m3. , main ="",
xlab = "O3 (ug/m3)",
ylab = "Frecuencia",
xlim = c(0, 150),
breaks = 1000)

hist_PM10 <- hist(calidad_aire$PM10..ug.m3., main ="",
xlab = "PM10 (ug/m3)",
ylab = "Frecuencia",
xlim = c(0, 150),
breaks = 1000)

2.2 Ajuste de tipo de variables
#ajustamos el tipo de la variable fecha
calidad_aire$Fecha <- as.Date(calidad_aire$Fecha)
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
##
##
##
##
str(calidad_aire)
## 'data.frame': 446014 obs. of 13 variables:
## $ Fecha : Date, format: "2020-12-31" "2020-12-31" ...
## $ CO..mg.m3. : num 0.6 NA NA NA NA NA NA NA NA NA ...
## $ NO..ug.m3. : int 8 2 8 1 1 2 5 2 2 1 ...
## $ NO2..ug.m3. : int 16 6 2 4 1 2 9 6 6 1 ...
## $ O3..ug.m3. : int NA NA 65 58 NA 62 56 53 59 81 ...
## $ PM10..ug.m3.: int 6 8 4 21 6 6 5 6 5 NA ...
## $ PM25..ug.m3.: int NA NA NA NA NA NA NA NA NA NA ...
## $ SO2..ug.m3. : int 1 4 2 17 2 6 5 5 NA 2 ...
## $ Provincia : chr "Burgos" "León" "León" "León" ...
## $ Estación : chr "Burgos1" "C.T.L.R. - Naredo" "Carracedelo" "La Robla" ...
## $ Latitud : num 42.4 42.8 42.6 42.8 42.8 ...
## $ Longitud : num -3.68 -5.53 -6.73 -5.63 -5.65 ...
## $ Posición : chr "42.3511111111,-3.67555555556" "42.8166666667,-5.53333333333" "42.5586111111,-6.72555555556" "42.8016666667,-5.625" ...
#ajustamos el tipo de la variable Provincia y Estacion
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)
unique(calidad_aire$Estación)
## [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$Estación <- as.factor(calidad_aire$Estación)
str(calidad_aire)
## 'data.frame': 446014 obs. of 13 variables:
## $ Fecha : Date, format: "2020-12-31" "2020-12-31" ...
## $ CO..mg.m3. : num 0.6 NA NA NA NA NA NA NA NA NA ...
## $ NO..ug.m3. : int 8 2 8 1 1 2 5 2 2 1 ...
## $ NO2..ug.m3. : int 16 6 2 4 1 2 9 6 6 1 ...
## $ O3..ug.m3. : int NA NA 65 58 NA 62 56 53 59 81 ...
## $ PM10..ug.m3.: int 6 8 4 21 6 6 5 6 5 NA ...
## $ PM25..ug.m3.: int NA NA NA NA NA NA NA NA NA NA ...
## $ SO2..ug.m3. : int 1 4 2 17 2 6 5 5 NA 2 ...
## $ Provincia : Factor w/ 10 levels "Avila","Burgos",..: 2 3 3 3 3 3 5 5 5 6 ...
## $ Estación : Factor w/ 91 levels "Aranda de Duero",..: 7 32 34 40 84 85 37 38 71 36 ...
## $ Latitud : num 42.4 42.8 42.6 42.8 42.8 ...
## $ Longitud : num -3.68 -5.53 -6.73 -5.63 -5.65 ...
## $ Posición : chr "42.3511111111,-3.67555555556" "42.8166666667,-5.53333333333" "42.5586111111,-6.72555555556" "42.8016666667,-5.625" ...
2.3 Deteccion y tratamiento de datos ausentes
a. deteccion de datos ausentes
# Devuelve un vector lógico
head(is.na(calidad_aire))
## Fecha CO..mg.m3. NO..ug.m3. NO2..ug.m3. O3..ug.m3. PM10..ug.m3.
## [1,] FALSE FALSE FALSE FALSE TRUE FALSE
## [2,] FALSE TRUE FALSE FALSE TRUE FALSE
## [3,] FALSE TRUE FALSE FALSE FALSE FALSE
## [4,] FALSE TRUE FALSE FALSE FALSE FALSE
## [5,] FALSE TRUE FALSE FALSE TRUE FALSE
## [6,] FALSE TRUE FALSE FALSE FALSE FALSE
## PM25..ug.m3. SO2..ug.m3. Provincia Estación Latitud Longitud Posición
## [1,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [2,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [3,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [4,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [5,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [6,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
# Devuelve un único valor lógico, cierto o falso, si existe algún valor ausente
any(is.na(calidad_aire))
## [1] TRUE
# Devuelve el número de NAs que presenta la tabla
sum(is.na(calidad_aire))
## [1] 1162811
# Devuelve el % de valores perdidos
mean(is.na(calidad_aire))
## [1] 0.2005475
# Detección del número de valores perdidos en cada una de las columnas que presenta la tabla
colSums(is.na(calidad_aire))
## Fecha CO..mg.m3. NO..ug.m3. NO2..ug.m3. O3..ug.m3. PM10..ug.m3.
## 0 344856 30984 32517 170600 101435
## PM25..ug.m3. SO2..ug.m3. Provincia Estación Latitud Longitud
## 392230 89737 0 0 226 226
## Posición
## 0
# Detección del % de valores perdidos en cada una de las columnas que presenta la tabla
colMeans(is.na(calidad_aire), round(2))
## Fecha CO..mg.m3. NO..ug.m3. NO2..ug.m3. O3..ug.m3. PM10..ug.m3.
## 0.0000000000 0.7731954602 0.0694686714 0.0729057832 0.3824992041 0.2274255965
## PM25..ug.m3. SO2..ug.m3. Provincia Estación Latitud Longitud
## 0.8794118570 0.2011977203 0.0000000000 0.0000000000 0.0005067106 0.0005067106
## Posición
## 0.0000000000
b. Tratamiento de datos ausentes
# Eliminación de las variables que presentan un % de NAs superior al 50%, para ello se utiliza la función which() que permite realizar selecciones de datos bajo alguna premisa.}
calidad_aire <- calidad_aire[,-which(colMeans(is.na(calidad_aire)) >= 0.50)]
head(calidad_aire)
## Fecha NO..ug.m3. NO2..ug.m3. O3..ug.m3. PM10..ug.m3. SO2..ug.m3.
## 1 2020-12-31 8 16 NA 6 1
## 2 2020-12-31 2 6 NA 8 4
## 3 2020-12-31 8 2 65 4 2
## 4 2020-12-31 1 4 58 21 17
## 5 2020-12-31 1 1 NA 6 2
## 6 2020-12-31 2 2 62 6 6
## Provincia Estación Latitud Longitud
## 1 Burgos Burgos1 42.35111 -3.675556
## 2 León C.T.L.R. - Naredo 42.81667 -5.533333
## 3 León Carracedelo 42.55861 -6.725556
## 4 León La Robla 42.80167 -5.625000
## 5 León Tudela Veguin-Tudela Veguin 42.80167 -5.648889
## 6 León Valderas 42.07972 -5.448889
## Posición
## 1 42.3511111111,-3.67555555556
## 2 42.8166666667,-5.53333333333
## 3 42.5586111111,-6.72555555556
## 4 42.8016666667,-5.625
## 5 42.8016666667,-5.64888888889
## 6 42.0797222222,-5.44888888889
# Seleccionamos las variables numéricas que presenta la tabla iterando sobre todas las columnas de la tabla mediante la función sapply()
columnas_numericas <- which(sapply(calidad_aire, is.numeric))
# Calculamos la media para cada una de las variables numéricas sin tener en cuenta los NAs
cols_mean <- colMeans(calidad_aire[, columnas_numericas], na.rm = TRUE)
# Sustituimos los valores NA por la media correspondiente a cada variable
for (x in columnas_numericas) {
calidad_aire[is.na(calidad_aire[,x]), x] <- round(cols_mean[x],2)
}
head(calidad_aire)
## Fecha NO..ug.m3. NO2..ug.m3. O3..ug.m3. PM10..ug.m3. SO2..ug.m3.
## 1 2020-12-31 8 16 22.69 6 1
## 2 2020-12-31 2 6 22.69 8 4
## 3 2020-12-31 8 2 65.00 4 2
## 4 2020-12-31 1 4 58.00 21 17
## 5 2020-12-31 1 1 22.69 6 2
## 6 2020-12-31 2 2 62.00 6 6
## Provincia Estación Latitud Longitud
## 1 Burgos Burgos1 42.35111 -3.675556
## 2 León C.T.L.R. - Naredo 42.81667 -5.533333
## 3 León Carracedelo 42.55861 -6.725556
## 4 León La Robla 42.80167 -5.625000
## 5 León Tudela Veguin-Tudela Veguin 42.80167 -5.648889
## 6 León Valderas 42.07972 -5.448889
## Posición
## 1 42.3511111111,-3.67555555556
## 2 42.8166666667,-5.53333333333
## 3 42.5586111111,-6.72555555556
## 4 42.8016666667,-5.625
## 5 42.8016666667,-5.64888888889
## 6 42.0797222222,-5.44888888889
2.4 Deteccion y tratamiento de valores atipicos(outliers)
a. Variables continuas
#generamos un histograma para conocer la distribución de frecuencias que presenta la variable de estudio:
calidad_aire_1 <- read.csv("C:/Users/Martini/Downloads/calidad-del-aire-datos-historicos-diarios.csv", sep=";")
histograma_O3 <- hist(calidad_aire_1$O3..ug.m3. , main ="", xlab = "O3 (ug/m3)", ylab = "Frecuencia",xlim = c(0, 150), breaks = 1000)

# Estadísticas necesarias para reproducir el gráfico de cajas y bigotes
options(max.print = 100)
head(boxplot.stats(calidad_aire$NO2..ug.m3. ))
## $stats
## [1] 0 8 18 34 73
##
## $n
## [1] 446014
##
## $conf
## [1] 17.93849 18.06151
##
## $out
## [1] 122 75 80 74 81 82 78 100 74 74 78 76 81 77 77 79 86 89
## [19] 92 82 85 77 93 90 74 74 75 77 82 79 89 75 76 80 80 76
## [37] 80 85 93 77 86 79 85 82 76 87 75 75 75 76 77 80 75 75
## [55] 79 96 84 90 79 91 80 86 84 94 74 85 75 94 101 79 78 85
## [73] 78 77 76 75 80 78 79 76 76 77 80 78 77 79 97 82 94 79
## [91] 74 76 80 85 90 81 74 81 76 79
## [ reached getOption("max.print") -- omitted 9267 entries ]
# Construcción del gráfico de cajas y bigotes
boxplot(calidad_aire$O3..ug.m3. , horizontal = TRUE, xlab = "O3 (ug/m3)")

# Se genera una nueva tabla que no contiene los valores almacenados en el vector outliers$out, antes obtenido con la función boxplot.stats().
outliers<- boxplot.stats(calidad_aire$O3..ug.m3. )
calidad_aire_NoOut <- calidad_aire[!(calidad_aire$O3..ug.m3. %in% outliers$out),]
calidad_aire_NoOut
## Fecha NO..ug.m3. NO2..ug.m3. O3..ug.m3. PM10..ug.m3. SO2..ug.m3.
## 1 2020-12-31 8 16 22.69 6 1.00
## 2 2020-12-31 2 6 22.69 8 4.00
## 3 2020-12-31 8 2 65.00 4 2.00
## 4 2020-12-31 1 4 58.00 21 17.00
## 5 2020-12-31 1 1 22.69 6 2.00
## 6 2020-12-31 2 2 62.00 6 6.00
## 7 2020-12-31 5 9 56.00 5 5.00
## 8 2020-12-31 2 6 53.00 6 5.00
## 9 2020-12-31 2 6 59.00 5 42.15
## Provincia Estación Latitud Longitud
## 1 Burgos Burgos1 42.35111 -3.675556
## 2 León C.T.L.R. - Naredo 42.81667 -5.533333
## 3 León Carracedelo 42.55861 -6.725556
## 4 León La Robla 42.80167 -5.625000
## 5 León Tudela Veguin-Tudela Veguin 42.80167 -5.648889
## 6 León Valderas 42.07972 -5.448889
## 7 Palencia Guardo 42.79139 -4.846389
## 8 Palencia Hontoria 1 - Poblado 41.93278 -4.470000
## 9 Palencia Renault4 41.96139 -4.494444
## Posición
## 1 42.3511111111,-3.67555555556
## 2 42.8166666667,-5.53333333333
## 3 42.5586111111,-6.72555555556
## 4 42.8016666667,-5.625
## 5 42.8016666667,-5.64888888889
## 6 42.0797222222,-5.44888888889
## 7 42.7913888889,-4.84638888889
## 8 41.9327777778,-4.47
## 9 41.9613888889,-4.49444444444
## [ reached 'max' / getOption("max.print") -- omitted 445535 rows ]
# Construcción de los gráficos de cajas y bigotes
boxplot(calidad_aire$NO2..ug.m3., xlab = "NO2 (ug/m3)")
boxplot(calidad_aire_NoOut$NO2..ug.m3., xlab = "NO2 (ug/m3)")

length(calidad_aire$NO2..ug.m3.)
## [1] 446014
length(calidad_aire_NoOut$NO2..ug.m3.)
## [1] 445544
Variables categoricas
library(ggplot2)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.2
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Número de categorías que presenta la variable Provincia
count(calidad_aire, "Provincia")
## "Provincia" n
## 1 Provincia 446014
# Construcción del gráfico de barras para la variable Provincia
ggplot_provincias <- ggplot(calidad_aire)+
geom_bar(aes(x = Provincia, fill = Provincia)) +
xlab("Provincia") + ylab("No observaciones") +
theme(axis.text.x = element_text(angle = 30))
ggplot_provincias

Eliminacion de valores atipicos
# Eliminamos las filas que pertenecen al factor “Madrid”
eliminar_Madrid <- calidad_aire$Provincia %in% c("Madrid")
calidad_aire_SM <- calidad_aire[!eliminar_Madrid,]
# Eliminamos el factor “Madrid”
calidad_aire$Provincia <- as.factor(calidad_aire$Provincia)
calidad_aire_SM$Provincia <- droplevels(calidad_aire_SM$Provincia)
# Con la función levels() verificamos la eliminación de la categoría “Madrid” de la variable
levels(calidad_aire_SM$Provincia)
## [1] "Avila" "Burgos" "León" "Palencia" "Salamanca"
## [6] "Segovia" "Soria" "Valladolid" "Zamora"
2.5 Analisis de correlacion 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
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.2.2
## corrplot 0.92 loaded
corrplot(correlacion, method = "square")
