R — Ejercicio sobre la despoblación

Roberto Finistrosa
Feb 27 · 6 min read

Éste es un ejercicio de Análisis Exploratorio de Datos (EDA) en el marco de trabajo de las técnicas Big Data y Data Analytics.

Para ello, se analiza con el lenguaje de programación R la despoblación en los municipios de España, a partir de un dataset propio creado con datos públicos extraídos de distintas fuentes institucionales.

El código de éste proyecto puede ser descargado aquí.

FUENTES

Los datos se han obtenido de las siguientes fuentes:

  • Municipios - CENTRO DE DESCARGAS DEL CENTRO NACIONAL DE INFORMACIÓN GEOGRÁFICA
  • Padrón - INE
  • Paro por municipio en España | SEPE
  • Municipios IGN (Shapefiles) | PORTAL DE DATOS ABIERTOS DE ESRI ESPAÑA — ARCGis
  • Provincias — ETRS89 UTM 30N | PORTAL DE DATOS ABIERTOS DE ESRI ESPAÑA — ARCGis
  • Datos climáticos (temperatura media) | AEMET

DATASET
Una vez realizado el proceso ETL sobre las fuentes, obtenemos el fichero municipios.csv con los siguientes datos:

Metadatos del dataset

EDA
Utilizando R y sus librerías de representación geoespacial, demostramos cómo realizar un análisis exploratorio de datos (EDA)

Las librerías R que utilizadas en éste ejercicio son:

  • rgdal — Librería para uso de datos geoespaciales
  • tmap — Librería para presentación de mapas
  • ggplot2 — Librería para análisis exploratorio de datos

Código

Carga de librerías y datos geoespaciales
Carga de dataset de municipios
str(data)
head(data)
dim(data)
El dataset tiene 8121 municipios
Sumatorio de habitantes, superficie y media de densidad

DENSIDAD DE POBLACIÓN POR PROVINCIAS

Se agregan la población y superficie por provincias, para averiguar las provincias con menor densidad

myvars <- c("COD_PROV", "PROVINCIA", "SUPERFICIE", "HABITANTES")
dfprovincias<-data[myvars]
dfprovincias <-aggregate(list(data$HABITANTES, data$SUPERFICIE/100, data$HABITANTES / (data$SUPERFICIE / 100)), by=list(Provincia = data$PROVINCIA, Codigo = data$COD_PROV), FUN= sum)
names(dfprovincias)[3] <- "HABITANTES"
names(dfprovincias)[4] <- "SUPERFICIE"
names(dfprovincias)[5] <- "DENSIDAD"
dfprovincias <- transform(dfprovincias, DENSIDAD = HABITANTES / SUPERFICIE)View(dfprovincias)# Observamos en los datos, que tanto Melilla como Ceuta tienen una densidad de población muy elevada, por sus características especiales (poca superficie con relación al número de habitantes), por lo que las eliminamos de la muestra para mejorar la presentación de la gráficadf <- dfprovincias[!grepl("CEUTA|MELILLA", dfprovincias$Provincia),]
dfreducido <- dfprovincias[which(dfprovincias$DENSIDAD < 100),]
hist(dfreducido$DENSIDAD,
main="Densidad en provincias (excepto Ceuta y Melilla)",
xlab="Densidad (Población/Superficie)",
xlim=c(0,100),
col="lightyellow",
freq=TRUE
)

Mapa de densidad de población por provincia

Para ello, se necesita un Codigo que relacione los datos del fichero SHAPEFILE con los datos del dataframe. El Codigo de los ficheros SHAPEFILE es un string de 2 caracteres que en el caso del DATASET corresponde al COD_PROV
Por lo tanto se crea un DATAFRAME con los datos necesarios.

mapa_densidad_provincias_peninsula<-merge(i_data_gs_provincias_peninsula, dfprovincias, by = "Codigo", all.x=TRUE)
mapa_densidad_provincias_islas<-merge(i_data_gs_provincias_islas, dfprovincias, by = "Codigo", all.x=TRUE)
mapa_provincias_peninsula <-
tm_shape(mapa_densidad_provincias_peninsula) +
tm_fill("DENSIDAD", title = "Densidad", style = "fixed",
breaks = c(0, 20, 40, 60, 80, 100, Inf),
colorNA = "green") + # <-------- color for NA values +
#tm_polygons("DENSIDAD", textNA=">100", title="Densidad") +
tm_borders() +
#tm_text("Texto", size=0.5) +
tm_layout(legend.position = c("RIGHT","BOTTOM"),
legend.frame = FALSE)
print(mapa_provincias_peninsula)
mapa_densidad_provincias_islas <-
tm_shape(mapa_densidad_provincias_islas) +
tm_fill("DENSIDAD", title = "Densidad", style = "fixed",
breaks = c(0, 20, 40, 60, 80, 100, Inf),
colorNA = "green") + # <-------- color for NA values +
tm_layout(legend.show = FALSE)
print(mapa_densidad_provincias_islas)
Mapa de densidad de población por provincias

Se puede observar que 6 provincias en España con una densidad de población inferior a 20 habitantes / km2, tres de ellas con una densidad de población inferior a 12.5 habitantes por Km2
* SORIA (8)
* TERUEL (9)
* CUENCA (11)
* HUESCA (14)
* ZAMORA (16)
* AVILA (19)

DENSIDAD DE POBLACIÓN POR MUNICIPIOS

Para ello, se necesita un CODIGOINE que relacione el fichero SHAPEFILE con los datos del dataframe
El CODIGOINE de los ficheros SHAPEFILE es un string de 5 caracteres que en el caso del DATASET corresponde a los 5 primeros caracteres del COD_INE
Por lo tanto se crea un DATAFRAME con los datos necesarios.

myvars <- c("COD_INE", "COD_PROV", "PROVINCIA", "NOMBRE_ACTUAL", "SUPERFICIE", "HABITANTES")
dfmunicipios<-data[myvars]
#Dividimos la superficie por 100, para pasarla de Hectáreas a Km2
dfmunicipios <- transform(dfmunicipios, DENSIDAD = HABITANTES / (SUPERFICIE / 100))
dfmunicipios <- transform(dfmunicipios, CODIGOINE = substr(dfmunicipios$COD_INE, 1, 5))
#options(max.print=10000)
#duplicated(p$CODIGOINE)
#Eliminamos también los registros con datos de densidad muy elevados
dfreducido <- dfmunicipios[which(dfmunicipios$DENSIDAD <= 200),]
hist(dfreducido$DENSIDAD,
main="Densidad en municipios",
xlab="Densidad (Población/Superficie)",
xlim=c(0,200),
col="lightyellow",
freq=TRUE
)
View(dfmunicipios)
Más del 50% de los municipios tienen una densidad inferior a 20 Habitantes por Km2

Mapa de densidad de población por municipio

mapa_densidad_municipios_peninsula<-merge(i_data_gs_municipios, dfmunicipios, by = "CODIGOINE", all.x=TRUE)
# Asignamos 99 a los municipios de los que no disponemos dato de densidad
mapa_densidad_municipios_peninsula@data$DENSIDAD[which(is.na(mapa_densidad_municipios_peninsula@data$DENSIDAD))] <-99
# Mapa de los municipios de las Islas Canarias
mapa_densidad_municipios_islas<-merge(i_data_gs_municipios_islas, dfmunicipios, by = "CODIGOINE", all.x=TRUE)
mapa_densidad_municipios_peninsula <-
tm_shape(mapa_densidad_municipios_peninsula) +
tm_fill("DENSIDAD", title = "DENSIDAD DE POBLACIÓN (Habitantes/Km2)", style = "fixed",
breaks = c(0, 8, 12.5, Inf),
colorNA = "green") + # <-------- color for NA values +
tm_layout(legend.position = c("RIGHT","BOTTOM"),
legend.frame = FALSE)
print(mapa_densidad_municipios_peninsula)
mapa_densidad_municipios_islas <-
tm_shape(mapa_densidad_municipios_islas) +
tm_fill("DENSIDAD", title = "DENSIDAD DE POBLACIÓN (Habitantes/Km2)", style = "fixed",
breaks = c(0, 8, 12.5, Inf),
colorNA = "green") + # <-------- color for NA values +
tm_layout(legend.show = FALSE)
print(mapa_densidad_municipios_islas)

A partir de los datos del dataset, modificando la variable que se quiere analizar, se pueden obtener otros mapas.

EDAD MEDIA

Las provincias más despobladas tienen una edad media más alta
Los municipios más despoblados tienen la edad media más alta

EMPLEO

En éste caso hay que tener en cuenta que en el dataset no se disponen de datos de empleo de todos los municipios, por lo que hay que realizar un proceso previo de gestión de valores nulos, que se puede hacer de dos formas:

  • Eliminando los registros con valores nulos
  • Asignando a los valores nulos una media ponderada
Las provincias más despobladas tienen bajo porcentaje de paro
Los municipios más despoblados tienen menor índice de paro

HABITANTES

DESPOBLACIÓN

Mapa de municipios con densidad de población inferior a 12.5 habitantes / km2

CLIMA

Se puede obtener un mapa de clima por provincias (ya que no se dispone de datos de clima por municipios) con el dataset clima.csv.

Las provincias más frías también son las más despobladas

El código de éste proyecto puede ser descargado aquí.

Otros artículos:

R-Pirámide de población
Análisis de la despoblación en los municipios de España, con Python

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade