Вы находитесь на странице: 1из 22

REUNIÓN GRUPO DE USUARIOS R VALENCIA

09/03/2016

Predicción de contaminación con técnicas de Machine Learning

Lidia Contreras

Dpt. Sistemes Informàtics i Computació UPV

Contreras D pt. Sistemes Informàtics i Computació UPV @ValenciaRUsers @liconoc https://valenciarusers.wordpress.com/

@liconoc

Contreras D pt. Sistemes Informàtics i Computació UPV @ValenciaRUsers @liconoc https://valenciarusers.wordpress.com/

Predicción de contaminación con técnicas de Machine Learning

Lidia Contreras

Predicción de contaminación con técnicas de Machine Learning Lidia Contreras
Predicción de contaminación con técnicas de Machine Learning Lidia Contreras

Índice

Fuentes de datos y parámetros

Estudio de los datos

Tráfico y viento

Predicción

Extrapolación

Web

Posibles mejoras

2

Fuentes de datos y parámetros

CONTAMINACIÓN

Fuente: Generalitat Valenciana

Parámetros: CO, NO, NO2, PM 2.5, PM10, SO2, O3

DATOS METEOROLÓGICOS

Fuente: AEMET

Parámetros: Temperatura, Humedad, Velocidad y Dirección del viento, Precipitación y Presión

TRÁFICO

Fuente: Ayuntamiento de Valencia

Parámetros: Intensidad de los Puntos de Medida de Tráfico - Espiras electromagnéticas (vehículos/hora)

de Tráfico - Espiras electromagnéticas (vehículos/hora) Datos históricos horarios de tres años (2013-2014-2015) 3
de Tráfico - Espiras electromagnéticas (vehículos/hora) Datos históricos horarios de tres años (2013-2014-2015) 3
de Tráfico - Espiras electromagnéticas (vehículos/hora) Datos históricos horarios de tres años (2013-2014-2015) 3

Datos históricos horarios de tres años (2013-2014-2015)

3

Estudio de los datos

%

CO

NO

NO2

PM2.5

PM10

SO2

O3

2013

25,38

72,37

72,37

82,25

97,26

2014

89,21

89,2

89,49

98,69

2015

8,46

86,46

86,46

90,23

97,66

Total

41,02

82,68

52,94

87,32

97,87

2013

90,7

79,95

79,95

93,43

93,37

84,89

97,43

2014

81,95

81,11

81,11

92,6

92,6

76,63

92,6

2015

90,13

84,19

84,19

77,64

77,64

85,11

97,04

Total

87,59

81,75

81,75

87,89

87,87

82,21

95,69

2013

48,13

79,59

79,59

72,08

72,08

94,16

96,61

2014

88,25

89,18

88,84

96,63

96,63

65,66

94,17

2015

74,09

86,39

86,27

84,91

84,91

96,1

95,76

Total

70,16

85,05

84,90

84,54

84,54

85,31

95,51

2013

73,56

69,43

69,43

99,79

71,51

99,27

2014

96,28

99,69

99,69

99,34

99,34

89,83

97,23

2015

86,73

88,97

88,97

64,23

97,49

86,28

89,68

Total

2013

2014

2015

Total

 

91,25

91,25

97,71

97,71

80,07

89,14

2013

88,39

63,25

63,25

74,24

85,53

2014

 

92,12

92,12

91,02

97,19

2015

29,46

81,9

81,9

83,74

90,41

Total

39,28

83,00

91,04

Bulevar

Bulevar
Bulevar
Bulevar

Francia

Moli
Moli

Moli

Moli

Pista

Pista
Pista
Pista

UPV

Viveros

Porcentaje de datos de contaminación completos por estación y año

4

79,09

79,09

79,09 79,09

Estudio de los datos

Estudio de los datos windRose(dat, breaks=c(0,5,10,15,20,25,30), angle=20, cols="jet", paddle=FALSE, offset=5,

windRose(dat, breaks=c(0,5,10,15,20,25,30), angle=20, cols="jet", paddle=FALSE, offset=5, key.header= "Wind speed", key.footer="m/s", key.position="right", main="WindRose")

Librería: openair

main="WindRose") Librería: openair calendarPlot(dat, pollutant = "No2", year = 2014,

calendarPlot(dat, pollutant = "No2", year = 2014, annotate = "ws", main="Dirección del viento en 2014 (+NO2 en Bulevar)")

5

Estudio de los datos

Estudio de los datos summaryPlot(dat, percentile=0.98, na.len=12, col.trend="blue", xlab=c("Gráficas de

summaryPlot(dat, percentile=0.98, na.len=12, col.trend="blue", xlab=c("Gráficas de evolución

anual", "Histogramas"), main="Gráfica resumen de parámetros")

main="Gráfica resumen de parámetros") polarFreq(dat, pollutant =“NO”,

polarFreq(dat, pollutant=“NO”, statistic="mean", ws.int=0.4,

ws.upper=8, min.bin=5, grid.line=2, border.col="white", main="Distribution of no depending on wind speed and wind direction”,key.header="Mean", key.footer="")

6

Estudio de los datos

Estudio de los datos timeVariation(dat, pollutant=objs2[1:4], normalise = TRUE, difference=FALSE,

timeVariation(dat, pollutant=objs2[1:4], normalise = TRUE, difference=FALSE, ylab="Concentration", xlab=c(paste(estaciones[i],": Hour",sep = ""), "Hour", "Month", "Week"))

xlab=c(paste(estaciones[i],": Hour",sep = ""), "Hour", "Month", "Week")) 7

7

Puntos de tráfico

1245 Puntos de medida de tráfico

Puntos de tráfico 1245 Puntos de medida de tráfico 8

8

Estaciones

6 Estaciones de medición de contaminación

Estaciones 6 Estaciones de medición de contaminación 9

9

Tráfico y viento Versión sin viento

Todo el tráfico en un radio de 1km

Tráfico y viento – Versión sin viento Todo el tráfico en un radio de 1km E
Tráfico y viento – Versión sin viento Todo el tráfico en un radio de 1km E
Tráfico y viento – Versión sin viento Todo el tráfico en un radio de 1km E
Tráfico y viento – Versión sin viento Todo el tráfico en un radio de 1km E

E

Tráfico y viento – Versión sin viento Todo el tráfico en un radio de 1km E
Tráfico y viento – Versión sin viento Todo el tráfico en un radio de 1km E

10

Tráfico y viento Versión con viento

Todo el tráfico en un radio de 1km dentro de ±30º en la dirección del viento

y viento – Versión con viento Todo el tráfico en un radio de 1km dentro de
y viento – Versión con viento Todo el tráfico en un radio de 1km dentro de
y viento – Versión con viento Todo el tráfico en un radio de 1km dentro de
y viento – Versión con viento Todo el tráfico en un radio de 1km dentro de

E

y viento – Versión con viento Todo el tráfico en un radio de 1km dentro de
y viento – Versión con viento Todo el tráfico en un radio de 1km dentro de

11

Tráfico y viento Versión con viento y distancia

Todo el tráfico en un radio de 1km, dando más peso a aquellos puntos dentro de ±30º en la dirección del viento

aquellos puntos dentro de ±30º en la dirección del viento E Librería: geosphere Distancia de la
aquellos puntos dentro de ±30º en la dirección del viento E Librería: geosphere Distancia de la
aquellos puntos dentro de ±30º en la dirección del viento E Librería: geosphere Distancia de la

E

puntos dentro de ±30º en la dirección del viento E Librería: geosphere Distancia de la estación
puntos dentro de ±30º en la dirección del viento E Librería: geosphere Distancia de la estación
puntos dentro de ±30º en la dirección del viento E Librería: geosphere Distancia de la estación

Librería: geosphere

Distancia de la estación al punto de tráfico (LAT, LON):

distHaversine(Estación, Punto) metros Dirección del punto de tráfico respecto a la estación (LAT, LON):

bearingRhumb(Punto, Estación) grados

12

Predicción

Para cada contaminante en cada estación:

Parámetros usados:

Día, mes, año, hora, día de la semana

Temperatura, presión, humedad, velocidad del viento, precipitación

Trafico (Según versión)

Contaminante 3h antes, Tráfico 3h antes, Temperatura 3h antes.

Contaminantes relacionados:

O3NO 3h antes, NO2 3h antes

NO, NO2O3 3h antes

Modelos:

Linear Regression (lr)

Quantile Regression (qr) with lasso method

K nearest neighbours (IBKreg) with k=10

Decision tree for regression (M5P)

Random Forest (RF)

Tres modelos básicos:

TrainMean: Siempre predice la media deTrain

TestMean: Siempre predice la media deTest

X3H: Valor del contaminante 3h antes

Librerías: Rweka, quantreg, randomForest

Data Splitting

Test: 1,2,3 y 4 meses

Train: Dataset-Test

• Test: 1,2,3 y 4 meses • Train: Dataset-Test Librería: caret #24h al dia * 30

Librería: caret

#24h al dia * 30 dias = 720h al mes #mesestest va de 1 a 4

numtest=mesestest*720

timeSlices<-createTimeSlices(1:nrow(dat), initialWindow = nrow(dat)-numtest, horizon = numtest, fixedWindow = FALSE, skip = 720)

13

Predicción - Resultados

 

Media Real Estación

TrainMean

TestMean

X3h

LinearRegression

qr

IBkreg

M5p

RF

CO

0.111

0.071

0.052

0.028

0.055

0.059

0.051

0.056

0.050

NO

10.315

17.010

18.910

17.327

14.392

15.481

15.076

16.587

12.954

NO2

28.265

15.922

15.797

14.382

15.797

12.479

13.425

15.284

11.206

PM2.5

11.160

7.000

7.033

5.035

5.962

4.524

5.889

6.870

5.957

PM10

14.356

7.981

7.619

4.753

7.776

6.704

7.515

7.581

8.043

O3

46.866

25.452

19.328

13.276

11.808

11.661

12.154

9.603

9.311

SO2

2.471

1.187

0.821

0.605

0.944

1.136

0.836

1.192

0.798

Mean Absolute Error (MAE) Versión viento+distancia Molí del Sol

14

Interpolación entre estaciones

Interpolación entre estaciones Métodos: • Media • LIDW (Local Inverse Distance Weighting) • Wind

Métodos:

Media

LIDW (Local Inverse Distance Weighting)

Wind Sensitive LIDW

Kriging

Librería: geoR

coordenadas <- as.geodata(coordenadas) kriging <- ksline(coordenadas, cov.model="exp", cov.pars=c(10,3.33), nugget=0, locations=c(longitud, latitud) ) prediccion<-kriging$predict

15

Interpolación - Resultados

 

Wind

 

Media

LIDW

Sensitive

Kriging

 

LIDW

CO

0

1

2

1

NO

0

11

17

0

NO2

1

9

17

1

PM2.5

3

0

4

5

O3

7

3

11

7

PM10

1

0

2

3

SO2

5

4

9

10

Conteo mejores modelos

2 3 SO2 5 4 9 10 Conteo mejores modelos Librería: geoR grd <-

Librería: geoR

grd <- expand.grid(x=seq(from=x.range[1], to=x.range[2], by=0.001), y=seq(from=y.range[1], to=y.range[2], by=0.001)) q <- ksline(NO, cov.model="exp",cov.pars=c(10,3.33), nugget=0,locations=grd) image(q, val=q$predict) points(NO)

16

Extrapolación - Mapas

Kriging

PM10

Extrapolación - Mapas Kriging PM10 LIDW PM10 Librería: ggmap Valencia <- get_map(location=c(lon=-0.3783341,
Extrapolación - Mapas Kriging PM10 LIDW PM10 Librería: ggmap Valencia <- get_map(location=c(lon=-0.3783341,

LIDW

PM10

Librería: ggmap

Valencia <- get_map(location=c(lon=-0.3783341, lat=39.4732093), zoom=14, maptype="terrain")

ggmap(Valencia, extent = "device") + stat_density2d(data = coordenadas,aes(x = V1, y = V2, fill = scale_alpha(range = c(0, 0.5), guide = FALSE)+ scale_fill_distiller(palette = "Blues") + labs(fill = "Concentration") + theme_nothing(legend = TRUE) +

level

,

alpha = 10), size = 10, bins = 8, geom = "polygon") +

guides(fill = guide_legend(reverse = FALSE, override.aes = list(alpha = 1)))

17

Web

Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante
Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante

15min

Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante
Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante

API Google Maps

Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante
Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante
Tráfico en tiempo real
Tráfico en tiempo real
Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante
Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante
Web 15min API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante
Modelos predictivos
Modelos predictivos
API Google Maps Tráfico en tiempo real Modelos predictivos Observación meteorológica .RData por contaminante y

Observación meteorológica

tiempo real Modelos predictivos Observación meteorológica .RData por contaminante y estación • Id punto de medida
tiempo real Modelos predictivos Observación meteorológica .RData por contaminante y estación • Id punto de medida

.RData por contaminante y estación

Id punto de medida tráfico

Coordenadas

Nombre vía

Intensidad horaria tráfico

Datos meteorológicos

Predicción contaminantes

Librerías:

geosphere

randomForest

quantreg

18

Posibles mejoras

Mejorar la predicción/extrapolación

Web:

Cambiar AEMET por OpenWeatherMap para los datos meteorológicos

Cambiar Google Maps por OpenStreetMap

Usar Leaflet + Mapbox para crear mapas temáticos

Aplicar extrapolación a toda la ciudad y no solo a los puntos de tráfico

+ Mapbox para crear mapas temáticos • Aplicar extrapolación a toda la ciudad y no solo
+ Mapbox para crear mapas temáticos • Aplicar extrapolación a toda la ciudad y no solo
+ Mapbox para crear mapas temáticos • Aplicar extrapolación a toda la ciudad y no solo
+ Mapbox para crear mapas temáticos • Aplicar extrapolación a toda la ciudad y no solo

20

21
21

21