idpif | anio | idestadopif | probabilidadignicion | idpeligro | idcomunidad | comunidad | idprovincia | provincia | idmunicipio | latitud | longitud | altitud | nummunicipiosafectados | puntosinicioincendio | deteccion | extinguido | horadeteccion | mesdeteccion | duracion | primeranotificaciondesde112 | iddetectadopor | idgradoresponsabilidad | idcausa | idmotivacion | diastormenta | idinvestigacioncausa | idcertidumbrecausa | intencionalidad | idcausante | idautorizacionactividad | idclasedia | diasultimalluvia | tempmaxima | humrelativa | velocidadviento | direccionviento | perdidassuperficiales | idnivelgravedadmaximo | numeromediospersonal | numeromediospesados | numeromediosaereos | huso | x | y | iddatum | claseincendio | lugar | combustible | tipodefuego | tipodeataque |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
568679 | 2016 | 3 | NA | NA | 15 | Islas Baleares | 7 | Islas Baleares | 63 | 39.709 | 2.622 | 409 | 1 | 1 | 10/01/2016 | 10/01/2016 | tarde | enero | 0 | VERDADERO | ccff_seguridad | 2 | 290 | NA | 0 | 1 | 2 | supuesto_no_intencionado | 2 | 4 | festivo | 0 | 17 | 49 | 20 | Suroeste | 0.20 | 0 | 20 | 18 | 0 | 31 | 466451 | 4397989 | 2 | conato | excursionistas | bosques | superficie | directo |
568680 | 2016 | 3 | NA | NA | 10 | Aragon | 22 | Huesca | 157 | 42.466 | 0.695 | 1213 | 1 | 1 | 12/01/2016 | 12/01/2016 | tarde | enero | 0 | VERDADERO | ccff_seguridad | 1 | 322 | NA | 0 | 3 | 1 | no_intencionado | 1 | 3 | laborable | 2 | 8 | 0 | 0 | Norte | 0.05 | 0 | 4 | 0 | 0 | 30 | 800159 | 4713460 | 2 | conato | vertederos | pas_mat | superficie | directo |
568681 | 2016 | 3 | NA | NA | 10 | Aragon | 22 | Huesca | 125 | 42.141 | -0.408 | 483 | 1 | 1 | 17/01/2016 | 17/01/2016 | tarde | enero | 0 | VERDADERO | ccff_seguridad | 2 | 241 | NA | 0 | 3 | 1 | no_intencionado | 1 | 4 | festivo | 3 | 8 | 40 | 4 | Noreste | 0.23 | 0 | 9 | 4 | 0 | 30 | 714747 | 4675882 | 2 | conato | NA | pastizal | superficie | directo |
Datos sobre los incendios forestales en distintos niveles de agregación de la Comunidad Valenciana
Input
Para este trabajo, he decidio buscar bases de datos que resulten interesantes en la web Kaggle, una página web que ofrece distintas bases de datos para entrenar o realizar en ellas procesos estadísticos además de ofrecer distintos scripts en diversos lenguajes de programación. Buscando dentro de esta plataforma, he encontrado una base de datos que se puede descargar de aquí, que nos proporciona todos los incendios forestales ocurridos en todo el territorio español desde 1968 hasta 2016. Esta base de datos contiene distinta información en sus variables que vamos a explicar en el siguiente apartado.
Descripción
Antes de pasar a la modificación de la base de datos hemos de hacernos cargo de eliminar algunas variables que, o bien, resultan redudnantes, o bien tienen tantos valores nulos que no tienen ninguna importancia mantenerlas en la base de datos. Para ello, veremos el diccionario de variables presente en la página web y veremos también el total de NAs que contiene cada variable sabiendo que la base de datos cuenta con un total de 585.399 observaciones, podemos ver cuantos valores nulos tiene cada variable para ver en que casos es un recurso útil eliminar variables.
Número de incendios registrados desde 1968 hasta 2016 |
---|
585399 |
Número de NAs en cada variable | |
---|---|
probabilidadignicion | 96010 |
idpeligro | 5537 |
latitud | 71348 |
longitud | 71348 |
altitud | 71348 |
puntosinicioincendio | 578985 |
idgradoresponsabilidad | 578985 |
idmotivacion | 283151 |
diastormenta | 576137 |
idinvestigacioncausa | 578985 |
idautorizacionactividad | 578985 |
diasultimalluvia | 378983 |
tempmaxima | 303335 |
humrelativa | 308365 |
velocidadviento | 323215 |
direccionviento | 384866 |
idnivelgravedadmaximo | 578982 |
huso | 364809 |
x | 364852 |
y | 364814 |
iddatum | 581473 |
lugar | 11056 |
combustible | 40000 |
tipodefuego | 1726 |
tipodeataque | 81869 |
Se detecta que variables como los puntos de inicio del incendio, el grado de responsabilidad o la investigación de la causa, entre otras que podemos ver en la tabla superior, tienen un numero exageradamente elevado. Esto se debe principalmente a que son variables que se han añadido recientemente y las observaciones anteriores a 2016 no contienen esta información. No mostramos las variables con 0 NAs para no alargar en exceso el documento.
Por otro lado, variables como id_motivación, contiene muchos NAs, puesto que si el incendio se da por causas naturales es lógico que no tenga motivación. Otras variables como tipo de fuego, tipo de ataque y similares suponemos que aparecen en algunos casos como nulos porque simplemente se desconocen.
Por otro lado, surge la idea de que puede que haya datos que algunas comunidades autónomas añaden y que otras pueden considerar irrelevantes por lo que antes de eliminar variables que puede que sí contengan información útil se procederá a filtrar por la Comunidad Valenciana, que ha sido escogida como nuestro objeto de estudio, antes de tomar cartas en el asunto.
Tras explicar brevemente los problemas que tiene la base de datos, vamos a proceder a modificar la base de datos para facilitar el tratamiento de la misma.
Tratamiento
Cómo anteriormente hemos mencionado, nuestro primer paso será filtrar la base de datos para solo obtener los incendios ocurridos en territorio valenciano. Para ello, utilizaremos el siguiente código:
com_val <- datos %>%
filter(idcomunidad == 9)
Número de incendios registrados en la Com. Valenciana desde 1968 hasta 2016 |
---|
20238 |
Número de NAs en cada variable | |
---|---|
probabilidadignicion | 1726 |
idpeligro | 341 |
latitud | 3933 |
longitud | 3933 |
altitud | 3933 |
puntosinicioincendio | 19897 |
idgradoresponsabilidad | 19897 |
idmotivacion | 15315 |
diastormenta | 19280 |
idinvestigacioncausa | 19897 |
idautorizacionactividad | 19897 |
diasultimalluvia | 8748 |
tempmaxima | 5345 |
humrelativa | 5482 |
velocidadviento | 6110 |
direccionviento | 10328 |
idnivelgravedadmaximo | 19897 |
huso | 15353 |
x | 15355 |
y | 15354 |
iddatum | 20001 |
lugar | 435 |
combustible | 1082 |
tipodefuego | 56 |
tipodeataque | 2012 |
Como vemos, hay variables en las que prácticamente todas las observaciones no prestan ningún tipo de información. Por ello, procederemos a eliminarlas de nuestro conjunto de datos para facilitar la lectura de los mismos.
com_val_mut <- com_val %>%
select(-c(puntosinicioincendio, idgradoresponsabilidad, idmotivacion, diastormenta,
idinvestigacioncausa, idautorizacionactividad, idnivelgravedadmaximo, huso, x, y,
iddatum))
Tras esto, se nos queda un dataframe de con 40 variables a las cuales todavía les queda mucha tela que cortar. Lo primero que observamos es que el idmunicipio no es único, y necesita de el idprovincia para poder ser distinguido entre el resto. Si no tomamos medidas, en el caso de la Comunidad Valenciana, tendríamos 3 pueblos con el mismo id por lo que necesitamos de un identificador único para poder distinguir entre los municipios. Para ello, utilizaremos el siguiente código:
com_val_mut <- com_val_mut %>%
mutate(id_unico = str_c(idprovincia, idmunicipio))
idprovincia | idmunicipio | id_unico |
---|---|---|
46 | 94 | 4694 |
3 | 86 | 386 |
3 | 65 | 365 |
Como vemos, hemos creado una variable única que nos permite diferenciar los pueblos entre provincias. Dicho esto, vamos a proceder a añadir a nuestra base de datos el nombre de cada pueblo y su geometría, que puede ser especialmente útil en cuánto a representaciones gráficas y visualización se refiere. Para ello requeriremos del paquete MapSpain
, que nos proporcionará una base de datos con todos los pueblos y los mismos identificadores que nuestra base de datos. Tras modificar el conjunto de municipios, haremos un join con la base de datos de los incendios para lograr el nombre y la geometría de los municipios.
library(mapSpain)
municipios <- esp_get_munic()
municipios_val <- municipios %>%
filter(cpro %in% c("46", "03", "12")) %>%
select(c(cmun, name, geometry, cpro))
municipios_val <- municipios_val %>%
mutate(cmun = as.integer(cmun),
cpro = as.integer(cpro)) %>%
mutate(cmunic = str_c(cpro, cmun)) %>%
select(c(name, geometry, cmunic))
name | cmunic | geometry | |
---|---|---|---|
230 | Atzúbia, l’ | 31 | POLYGON ((-0.16092 38.83412… |
244 | Agost | 32 | POLYGON ((-0.65384 38.4952,… |
232 | Agres | 33 | POLYGON ((-0.53524 38.81037… |
Como vemos, primero filtramos para obtener las provincias que nos interesan en nuestro estudio, para posteriormente seleccionar las variables requeridas. Luego, cambiamos la clase de las variables para que coincidan con las del conjunto de los incendios y creamos nuestra nueva variable que nos permitirá juntar ambos conjuntos. Dicho esto, antes de proceder a mostrar el código de el join, mencionar que reduciremos los años de estudio desde 1968 a 1983 por una simple razón, pero de mucho peso. Dado que la intención es analizar los incendios en los distintos municipios de la Comunidad Valenciana, necesitamos saber en que municipio se ha dado cada incendio. Bien, hasta el año 1983, no se proporciona el municipio en el que se da el incendio. Por ello filtraremos hasta este año.
Por otro lado, el municipio afectado en cada incendio es el municipio en el que se da inicio a el incendio. Hay incendios que afectan a más de un municipio, pero en este caso hay una variable que menciona si se da este caso. Lo que no se menciona, en ningún caso, es el nombre o nombres de los demás municipios afectados.
Número de NAs en cada variable | |
---|---|
probabilidadignicion | 1726 |
idpeligro | 341 |
municipio | 13 |
latitud | 13 |
longitud | 13 |
altitud | 13 |
diasultimalluvia | 5725 |
tempmaxima | 3367 |
humrelativa | 3444 |
velocidadviento | 4088 |
direccionviento | 6408 |
lugar | 378 |
combustible | 1082 |
tipodefuego | 56 |
tipodeataque | 2012 |
A pesar de los cambios realizados, todavía tenemos NAs que no podemos pasar por alto, si miramos en la base de datos tenemos un total de 13 observaciones donde el idmunicipio es 999. No existe un municipio con este código en ninguna de las tres provincias. Por ello, procederemos a eliminar estas observaciones.
Por otro lado, las variables latitud y longitud representan las coordenadas en el sistema de coordenadas WGS-84 del lugar en el que se encuentra exactamente el asentamiento de población de cada municipio. Cabe recalcar esto dado que el término municipal no agrupa solamente al pueblo, sino que abarca mucho más terreno. Como veremos en el gráfico, en algunos casos puede parecer incluso desproporcionado. Por ello, transformaremos en puntos también estas dos variables.
incendios_completo <- incendios_completo %>%
drop_na(latitud, longitud) %>%
st_as_sf(coords = c("longitud","latitud"), crs = 4326) %>%
rename(asentamiento = geometry) %>%
relocate(asentamiento, pol_muni, .after = id_unico)
idpif | anio | idestadopif | probabilidadignicion | idpeligro | idcomunidad | comunidad | idprovincia | provincia | idmunicipio | municipio | id_unico | asentamiento | pol_muni | altitud | nummunicipiosafectados | deteccion | extinguido | horadeteccion | mesdeteccion | duracion | primeranotificaciondesde112 | iddetectadopor | idcausa | idcertidumbrecausa | intencionalidad | idcausante | idclasedia | diasultimalluvia | tempmaxima | humrelativa | velocidadviento | direccionviento | perdidassuperficiales | numeromediospersonal | numeromediospesados | numeromediosaereos | claseincendio | lugar | combustible | tipodefuego | tipodeataque |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
571081 | 2016 | 3 | NA | NA | 9 | Comunidad Valenciana | 46 | Valencia | 94 | Catarroja | 4694 | POINT (-0.403 39.402) | POLYGON ((-0.43539 39.41279… | 10 | 1 | 03/01/2016 | 03/01/2016 | tarde | enero | 0 | VERDADERO | ccff_seguridad | 400 | 1 | intencionado | 2 | festivo | 0 | 0 | 0 | 0 | Norte | 0.01 | 9 | 6 | 0 | conato | viasferreas | pastizal | superficie | directo |
572472 | 2016 | 3 | NA | NA | 9 | Comunidad Valenciana | 3 | Alicante | 86 | Millena | 386 | POINT (-0.363 38.731) | POLYGON ((-0.35935 38.74924… | 635 | 1 | 04/01/2016 | 05/01/2016 | tarde | enero | 1 | VERDADERO | ccff_seguridad | 400 | 1 | intencionado | 2 | laborable | 7 | 12 | 70 | 68 | Norte | 0.20 | 22 | 20 | 0 | conato | excursionistas | mat_bos | superficie | directo |
572486 | 2016 | 3 | NA | NA | 9 | Comunidad Valenciana | 3 | Alicante | 65 | Elche / Elx | 365 | POINT (-0.699 38.265) | POLYGON ((-0.51936 38.27487… | 81 | 1 | 10/01/2016 | 10/01/2016 | tarde | enero | 0 | VERDADERO | ccff_seguridad | 295 | 1 | no_intencionado | 2 | festivo | 13 | 14 | 51 | 45 | Suroeste | 0.02 | 15 | 3 | 0 | conato | NA | pas_res | superficie | directo |
572504 | 2016 | 3 | NA | NA | 9 | Comunidad Valenciana | 3 | Alicante | 106 | Planes | 3106 | POINT (-0.345 38.786) | POLYGON ((-0.38576 38.81026… | 451 | 1 | 11/01/2016 | 12/01/2016 | noche | enero | 1 | VERDADERO | ccff_seguridad | 400 | 1 | intencionado | 2 | laborable | 14 | 0 | 66 | 60 | Noroeste | 0.15 | 35 | 20 | 0 | conato | excursionistas | mat_bos | superficie | directo |
572505 | 2016 | 3 | NA | NA | 9 | Comunidad Valenciana | 3 | Alicante | 9 | Alcoy / Alcoi | 39 | POINT (-0.473 38.698) | POLYGON ((-0.42861 38.63594… | 564 | 1 | 26/01/2016 | 26/01/2016 | tarde | enero | 0 | VERDADERO | ccff_seguridad | 400 | 1 | intencionado | 2 | laborable | 11 | 0 | 94 | 3 | Sureste | 0.05 | 10 | 4 | 0 | conato | viasferreas | pas_mat_res | superficie | directo |
Como vemos, hay municipios que no aparecen en el mapa dado que no han sufrido incendios forestales. Por ejemplo, municipios como Catarroja o Albal pertenecientes al área metropolitana de Valencia no aparecen por razones obvias.
Antes de terminar, y para completar la información recavada, crearemos una nueva base de datos con un acumulado de incendios por municipio para poder analizar de un modo más global la información obtenida. Para ello, dado que no aparecen los municipios sin incendios en el mapa, haremos un nuevo join, en este caso desde municipios a incendios, pero creando previamente el conteo por municipios como observaremos a continuación.
conteo_municipios <- incendios_completo %>%
count(id_unico, sort = TRUE) %>%
st_drop_geometry(asentamiento)
conteo_municipios <- municipios_val %>%
left_join(conteo_municipios, by = c('cmunic' = 'id_unico')) %>%
mutate(n = replace_na(n, 0)) %>%
rename(pol_muni = geometry)
Output
Se ha obtenido un total de dos bases de datos. La primera, contiene toda la información relativa a los incendios con gran cantidad de variables a analizar y con todo un mundo de procedimientos que realizar. Por otro lado, hemos obtenido el total de incendios por municipio, que a su vez puede utilizarse para mayores niveles de agregación y/o otras ideas. Aquí mostramos un gráfico del total de incendios por municipios y el nombre de los cinco municipios con más incendios.
Los ficheros generados con este procedimiento se pueden descargar de aquí.
Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394