El objetivo de este trabajo es analizar de una forma más visual tres aspectos que consideramos curiosos de las pasadas elecciones del 28A. Nuestra primera intención es observar si los titulares de los medios de comunicación sobre la irrupción de VOX, especialmente en los municipios com mayor proporción de población extranjera, son ciertos. En el siguiente apartado veremos el coste que tiene para cada partido obtener representación en el Congreso de los Diputados. Finalizaremos con un análisis sobre las diferencias entre dos partidos nacionalistas: Compromis y ERC. Las diferencia en la propensión al voto y otros aspectos.
Los datos utilizados provienen del Ministerio del Interior y del Instituto Nacional de Estadística. A continuación importamos los datos que previamente y tal y como se muestra en el apéndice técnico hemos hecho tidy. La fuentes de los datos (el MIR) presenta unos datos que son visualmente validos pero que a efectos de tratamiento no nos sirven. En el apéndice técnico se explica detalladamente el proceso llevado a cabo.
Primeros importamos las librerias básicas, utilizamos más librerias pero las llamamos cuando las necesitamos. Les remito al sessionInfo()
para ver todos los paquetes utilizados.
library(tidyverse)
library(sf)
library(LAU2boundaries4spain)
library(viridis)
# cargamos todas las funciones muy últiles para el dearrollo del trabajo, elaboradas por nosotros
source("funciones.R")
Cargamos los datos que hemos hecho tidy previamente. Los datos originales se encuentran en la carpeta data/raw
. A continuación le aplicamos la función partidosNom()
para limpiar el nombre de los partidos y reducir en algunos casos su extensión.
# Cargamos df de las elecciones y limpiamos los nombre de los partidos
generales28A <- rio::import(here::here("./data/", "generales28A.rdata")) %>% partidosNom(.)
municipios28A <- rio::import(here::here("./data/", "municipios28A.rdata")) %>% partidosNom(.)
CCAAProvCodigos <- rio::import(here::here("./data/", "CCAAProvCodigos.rdata")) # With leading 0s
Los medios de comunicación han jugado con los datos para mostrar que existia una correlación entre el voto a VOX y la inmigración. Es cierto que ha ganado en municipios con tasa de inmigración altas como El Ejido pero el número total de municipios es insignificante y destaca lo pequeños que son los municipios. Estableceremos una correleación que, a nuestro juicio, es más acertada.
Nos hemos centrado en los datos del INE de 2019 sobre las estadísticas del Padrón Continuo sobre el porcentaje de población inmigrante. Según la hipótesis de los medios de comunicación, el partido Vox saldría con mayor representación en aquellos lugares del Estado donde el porcentaje de población extranjera es más alto.
Como podemos observar, en los municipios en los que ha ganado VOX son:
# Importamos los datos que previamente hemos limpiado para todo el supuesto
pobExtEscanos <- rio::import("./data/poblacion_Extranjera.rdata")
pobExt <- rio::import("./data/poblacionExtranjera.rdata")
VOX28A <- municipios28A %>% group_by(comunidad, codigo.prov, codigo.muni) %>% top_n(1,votos) %>%
filter(partido == "VOX") %>% ungroup() %>% group_by(codigo.prov) %>%
mutate(total.votos = sum(votos), total.muni = n()) %>%
ungroup() %>% distinct(provincia, total.muni, total.votos)
# con trimws quitamos los espacios en blanco que parece que no están pero sí y fastidian el gráfico
VOX28A$provincia <- VOX28A$provincia %>% gsub("Castellón / ", "", .) %>% gsub("Valencia / ", "", .)
ggplot(VOX28A, aes(forcats::fct_reorder(provincia, total.muni), total.muni)) +
geom_col(aes(fill = total.votos)) +
geom_text(aes(label = total.votos), nudge_y = 2, size=3) +
scale_fill_viridis_c(option = "magma", name = "Votos", alpha = 0.8, begin = 0.3, end = 0.7, direction = 1,
guide = guide_colorbar( direction = "horizontal", barheight = unit(2, units = "mm"),
barwidth = unit(50, units = "mm"), draw.ulim = F,
title.position = 'top', title.hjust = 0.5, label.hjust = 0.5
)) +
theme_plot() + theme(legend.text = element_text(size = 8)) +
labs(title = "Provincias en las que Vox ha sido la fuerza más votada",
subtitle = "Número total de municipios por provincias",
caption = default_caption) + theme(axis.title.y = element_blank())
Es curioso como ha ganado con a penas un puñado de votos. Por ejemplo, en Soria ha sido la fuerza más votada en cinco municipios obteniendo un global de 50 votos. La provincia más destaca es Almería que ha ganado en tres municipios pero ha obtenido un número de votos exagerado. Como decíamos anteriomente, el lugar más destacada es El Ejido que es uno de los municipios con mayor porcentaje de población inmigrante.
Exceptuando Madrid, la mayor parte son provincias del interior de España. ¿Pero son estas las que tienen un mayor porcentaje de población extranejera?
prov_inmi <- pobExt %>% top_n(14, porcentaje)
library(treemapify)
ggplot(prov_inmi, aes(area = porcentaje, fill = porcentaje, label = provincia)) +
geom_treemap() +
geom_treemap_text(fontface = "italic", colour = "white", place = "centre",
grow = FALSE) +
scale_fill_viridis_c(option = "viridis", name = "", alpha = 0.8, begin = 0.3, end = 0.7, direction = 1,
guide = guide_colorbar( title = "Porcentaje", direction = "horizontal", barheight = unit(2, units = "mm"),
barwidth = unit(50, units = "mm"), draw.ulim = F,
title.position = 'top', title.hjust = 0.5, label.hjust = 0.5
)) +
theme(legend.position = "bottom") +
labs(title = "Provincias con mayor porcentaje de población extranjera",
caption = "Estadísticas del Padrón Continuo. 1 de Enero de 2019.")
La realidad es que las diez primeras provincias con mayor porcentaje de población extranjera no se corresponden con el gráfico anteriormente obtenido. Guadalajara, que antes era la primera se encuentra en la catorceava posición. Por otro lado, es especialmente relevante el caso de Girona, ya que siendo una de las provincias con mayor porcentaje de población extranjera, no existe ningún municipio en el que VOX obtenga representación por pequeño que sea.
diputados28A <- pobExtEscanos %>% filter(complete.cases(.), diputados > 0) %>% mutate(dipu_quantile = cut(as.numeric(diputados), breaks = c(1,2,5,7,11), include.lowest = TRUE)) %>%
mutate(porc_quantile = cut(porcentaje, breaks = 4, labels = c("Bajo", "Medio", "Medio-Alto", "Alto")))
dipu_label = c("1-2", "3-5", "6-7", "8-11")
El gráfico anterior muestra la representación de los partidos políticos por provincia y por porcentaje de población extrajera residente. Además, la representación política se distribuye en una escala de colores, de oscuro a claro de menor a mayor representación. Para desmentir la idea de que Vox había ganado en provincias con un alto número de población extranjera comparamos los resultados del PSOE y PP. Concluimos que Vox ha tenido mayor representación en provincias grandes y naturalmente con mayor numero de población extranjera. Sin embargo, no se observa una correlación entre la representación y la población inmigrante —como es el caso de Ávila que como hemos podido observar anteriormente ha ganado en 9 municipios— pero si que se observa una correlación positiva entre el tamaño poblacional y la representación.
En este apartado vamos a valorar el coste en términos de votos que tiene un diputado por partido y provincia.
costeVotos <- generales28A %>% filter(diputados > 0) %>% mutate(coste_dipu = votos/diputados) %>% mutate(pct = coste_dipu/poblacion)
costeVotos$partido <- as.factor(costeVotos$partido)
df3 <- costeVotos %>% group_by(partido) %>% top_n(1, coste_dipu) %>% ungroup()
df3$partido <- forcats::fct_reorder(df3$partido , df3$coste_dipu)
p <- ggplot(df3, aes(partido, coste_dipu)) + geom_col(aes(fill = provincia)) +
theme_plot() + theme(legend.text = element_text(size=8), legend.position = "bottom") +
scale_fill_viridis_d(option="magma", alpha = 0.8, begin = 0, end = 1,
name = "", guide = guide_legend(nrow = 3, ncol = 4)) +
labs(title = "Provincia con el coste por diputados mas alto para cada partido") + ylab("")
plotly::ggplotly(p)
El diputado más costoso en términos de votos es el del PP por la provincia de Barcelona.
Lo relevante de este gráfico, podría ser que las únicas provincias donde es más costoso obtener un diputado en términos absolutos son provincias grandes y económicamente potentes, lo que nos da una primera visión del porqué los partidos grandes en sus campañas electorales centran su atención en provincias pequeñas donde se reparten mayor número de diputados en relación a la población.
costeVotos$codigo.prov <- as.numeric(costeVotos$codigo.prov)
df4 <- costeVotos %>% filter(codigo.prov %in% c(17,25,43,1,20,48, 2, 13, 16, 19, 45, 8))
ggplot(df4, aes(forcats::fct_reorder(provincia, coste_dipu), coste_dipu/1000, fill=factor(partido))) + geom_col(stat = "identity", position = position_dodge()) +
theme_plot_facet() +
facet_grid(~comunidad, scales = "free", space = "free") + scale_fill_viridis_d(option="magma", alpha = 0.8, begin = 0.1, end = 0.9, name = "") +
labs(title = "Votos necesarios para obtener un diputado",
caption = default_caption)+
ylab("Miles de personas") + xlab("")
Por otro lado, como hemos comentado, las provincias de la España interior tienen un coste por diputado en términos absolutos menor. En comunidades autónomas como Cataluña y País Vasco, donde hay provincias tanto industrializadas como rurales, se observa una notable diferencia en el coste por diputado.
Centrándonos en el caso de EH-Bildu, si lo comparamos con el interior de la comunidad, se observa la gran diferencia entre lo que le cuesta obtener un diputado en la provincia de Álava y lo que le cuesta en la provincia de Bizkaia que es sin lugar a dudas una región con más desarrollo económico.
Para el caso de Castilla-La Mancha, es destacable como el coste de diputados en promedio es realmente más bajo en comparación con las otras dos CCAA.
ggplot(df4, aes(forcats::fct_reorder(provincia, coste_dipu), pct, fill=factor(partido))) + geom_col(stat = "identity", position = position_dodge()) +
theme_plot_facet() + scale_y_continuous(labels = scales::percent) +
facet_grid(~comunidad, scales = "free", space = "free") + scale_fill_viridis_d(option="magma", name = "", alpha = 0.8, begin = 0.1, end = 0.9) +
labs(title = "Importancia relativa de un voto para la obtención de un diputado",
subtitle = "A mayor porcentaje, más 'valor' tiene el voto del ciudadano",
caption = default_caption) +
ylab("Cuánto representa el coste \n por diputado sobre la población") + xlab("")
Este grafico destaca la gran diferencia que supone el valor de un voto en Castilla-La Mancha, en general, respecto a la provincia de Barcelona, donde el valor del voto por persona es mínimo debido al gran número de habitantes que posee.
Finalmente, el mapa anterior es un mapa bivariante que muestra la relación entre la representatividad (diputados) y el total del censo electoral. Los colores que están en la linea diagonal serian aquellas provincias que están correctamente representadas. Aquellas provincias como Lleida o Lugo estarían sobrerrepresentadas, el número de diputados que reparten es proporcionalmente mayor al censo electoral. Por otro lado, Ourense o Zaragoza estarían infrarrepresentadas, en promedio los diputados que reparten son menores dado el censo electoral.
compromisERC <- municipios28A %>% filter(codigo.prov %in% c("03","12","46", "08","17", "43", "25"),
partido %in% c("COMPROMIS-EUPV", "ERC"),
votos > 0) %>%
mutate(INECodMuni = paste(codigo.prov, codigo.muni, sep = ""),
votos_quantile = ntile(votos, 5))
compromisERC_mapa <- left_join(compromisERC, loadGeometry(6, provincias = c("03","12","46", "08","17", "43", "25")))
provinciasLindes <- c("22", "44", "50", "16", "44", "30", "02", "07", "31", "19")
fraSF <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf") %>% filter(adm0_a3 == "FRA")
plot1 <- ggplot() + geom_sf(data = fraSF, aes(geometry = geometry)) +
geom_sf(aes(geometry = geometry), data=filter(loadGeometry(1, provincias = provinciasLindes))) +
geom_sf(aes(geometry = geometry, fill=votos_quantile), data=compromisERC_mapa) +
scale_fill_viridis(
option = "magma",
direction = -1,
begin = 0.3, end = 0.8,
name = "Votos (Quantiles)",
# here we use guide_colourbar because it is still a continuous scale --> https://timogrossenbacher.ch/2016/12/beautiful-thematic-maps-with-ggplot2-only/
guide = guide_colorbar(
direction = "horizontal",
barheight = unit(2, units = "mm"),
barwidth = unit(50, units = "mm"),
draw.ulim = F,
title.position = 'top',
# some shifting around
title.hjust = 0.5,
label.hjust = 0.5
)) +
coord_sf(xlim = c(-1.5, 4), ylim = c(38,42.7)) + theme_map() +
theme(legend.position = "bottom", plot.title = element_text(size = 12) ) +
labs(title="Densidad de votos a Compromís y ERC", caption = default_caption)
plot1
En esta sección queremos comparar el origen del voto de los partidos nacionalistas Compromís y Esquerra Republicana de Cataluña (ERC). En primer lugar, lo que percibimos es que el voto de Compromís, se ubica en el territorio que ocupa las grandes ciudades de la Comunidad Valenciana mientras que el voto de ERC no sigue el mismo patrón y obtiene gran representación uniformemente por todo el territorio catalán. Es relevante el caso de Lleida porque como anteriormente hemos resaltado, la provincia está sobrerrepresentada en el número de diputados por lo que cada voto a ERC tiene más valor.
votantes28A <- rio::import("./data/generales28ATipoVoto.rdata") %>% filter(tipo.voto == "total.censo.electoral",
codigo.prov %in% c("03","12","46", "08","17", "43", "25"))
tableCompromis <- generales28A %>% filter(partido %in% c("COMPROMIS-EUPV", "ERC"), votos > 0) %>% left_join(votantes28A) %>%
select(c(3,5,6,7,10))
colnames(tableCompromis) <- c("Provincia", "Partido", "Nº votos", "Diputados", "Total censo electoral")
knitr::kable(tableCompromis)
Provincia | Partido | Nº votos | Diputados | Total censo electoral |
---|---|---|---|---|
Barcelona | ERC | 716714 | 8 | 4178927 |
Girona | ERC | 114031 | 3 | 522860 |
Lleida | ERC | 75760 | 2 | 314558 |
Tarragona | ERC | 113887 | 2 | 571800 |
Alicante / Alacant | COMPROMIS-EUPV | 31030 | 0 | 1272928 |
Castellón / Castelló | COMPROMIS-EUPV | 16713 | 0 | 419714 |
Valencia / València | COMPROMIS-EUPV | 126078 | 1 | 1964556 |
La poca progresividad en la representatividad se puede observar con los resultados de Compromís en Valencia. Con 126.078 votos ha obtenido un solo diputado frente a ERC que en Lleida con menor número de votantes y censo electoral ha obtenido dos diputados. Recordamos que Compromís es el segundo partido con mayor coste en términos de votos por diputado solo por detrás del PP en Barcelona.
edadmedia <- rio::import(here::here("data", "edadMediaPob2019.rdata")) %>% filter(codigo.prov %in% c("03","12","46", "08","17", "43", "25"))
edadmedia_map <- left_join(edadmedia, loadGeometry(6, provincias = c("03","12","46", "08","17", "43", "25")))
plot2 <- ggplot() + geom_sf(data = fraSF, aes(geometry = geometry)) +
geom_sf(data=loadGeometry(3, provinciasLindes), aes(geometry = geometry), alpha = 0.5) +
geom_sf(data=edadmedia_map, aes(geometry = geometry, fill = quantile)) +
scale_fill_viridis(
option = "magma",
direction = -1,
begin = 0.3, end = 0.8,
name = "Edad Media",
# here we use guide_colourbar because it is still a continuous scale --> https://timogrossenbacher.ch/2016/12/beautiful-thematic-maps-with-ggplot2-only/
guide = guide_colorbar(
direction = "horizontal",
barheight = unit(2, units = "mm"),
barwidth = unit(50, units = "mm"),
draw.ulim = F,
title.position = 'top',
# some shifting around
title.hjust = 0.5,
label.hjust = 0.5
)) +
coord_sf(xlim = c(-1.5, 4), ylim = c(38,42.7)) + theme_map() + theme(legend.position = "bottom") +
labs(title = "Edad media por municipios",
subtitle = "Nota: datos de INE trameados cruzados con la población",
caption = default_caption)
gridExtra::grid.arrange(plot1, plot2, ncol=2)
Finalmente, resulta relevante la relacción inversa entre la propensión al voto de estas dos formaciones y la edad media de los municipios. A falta de un análisis más exhaustivo podríamos decir que el perfil del votante de las formaciones es relativamente jóven.
library(DT)
infovotos <- rio::import("./data/municipios28ATipoVoto.rdata") %>% select(c(2,4,7)) %>% unique()
dtable <- municipios28A %>% filter(votos > 0) %>% left_join(., infovotos) %>% select(-c(2,4))
dtable$provincia <- chartr('áéíóúñ','aeioun', dtable$provincia)
dtable$municipio <- chartr('áéíóúñ','aeioun', dtable$municipio)
dtable$comunidad <- chartr('áéíóúñ','aeioun', dtable$comunidad)
datatable(dtable)