Resultados de las elecciones municipales 2023 según candidatura en la Comunidad Valenciana

ELECCIONES
GPKG
COMUNIDAD VALENCIANA
Autor/a
Afiliación

Gerard Ferrando Ballester

Universitat de València

Fecha de publicación

29 de marzo de 2025

Input

Se ha obtenido un conjunto de datos sobre los resultados electorales en la Comunitat Valenciana a través del Banco de Datos Territorial (BDT) de la Generalitat Valenciana.

Los datos utilizados en este estudio han sido extraídos del fichero V0301_C1D5283.xlsx, disponible en el portal del Banco de Datos Territorial - Resultados Electorales. Además, se ha considerado la documentación metodológica adjunta.

Los datos están disponibles para su descarga en distintos formatos, incluyendo Excel (.xlsx), CSV y otros formatos de datos tabulares. En este estudio, se ha trabajado con el archivo en formato Excel, ya que permite una mejor manipulación de los datos en herramientas de análisis como R.

Descripción

Se cargan las librerías necesarias:

Se lee y se carga el conjunto de datos, omitiendo las 9 primeras filas en las que aparecen textos innecesarios:

res_elec <- read_excel("data/V0301_C1D5283.xlsx", skip = 9)  

Se trata de un data frame con un total de 549 filas y 9 columnas que contiene información estructurada en formato tabular, tbl.

class(res_elec)
[1] "tbl_df"     "tbl"        "data.frame"
dim(res_elec)
[1] 549   9

Tratamiento

Se detecta que las columbras no están bien nombradas, hay información clave junta que debe ser separada, se necesita que algunos de los datos sean numéricos y el objeto no contiene ningún tipo de geografía.

head(res_elec)
# A tibble: 6 × 9
  ...1              PP    PSOE  COMPROMÍS VOX   `PODEMOS - IU` `C's` EUPV  Otras
  <chr>             <chr> <chr> <chr>     <chr> <chr>          <chr> <chr> <chr>
1 Comunitat Valenc… 8810… 7478… 332371    2331… 59535          48099 27518 1320…
2 Provincia de Ali… 3238… 2525… 75225     80939 22313          20369 12319 31792
3 03001 - Atzúbia,… 104   0     0         0     0              0     0     210  
4 03002 - Agost     1533  396   260       128   0              124   0     350  
5 03003 - Agres     198   56    155       0     0              0     0     0    
6 03004 - Aigües    88    383   0         20    0              0     0     68   

Para solucionar estos problemas se renombran las columnas de forma más estándar para mejorar la legibilidad y facilitar su manipulación. Además, se eliminan las filas que tengan NAs, ya que son textos o filas vacías y se elige la columna PP porque en la primera columna aparece algún texto que no queremos y de esta forma no se eliminaría.

datos <- res_elec %>%
  rename(
    Municipio = ...1,  # Primera columna sin nombre
    PP = PP, PSOE = PSOE, COMPROMIS = COMPROMÍS, VOX = VOX,
    PODEMOS = `PODEMOS - IU`, CS = `C's`, EUPV = EUPV, Otras = Otras
  ) %>%
  filter(!is.na(PP))

Se extrae el código y el nombre del municipio, separando información clave.

datos_cod <- datos %>%
  mutate(
    Codigo = str_extract(Municipio, "^\\d+"),  # Extraer código numérico
    Municipio = str_replace(Municipio, "^\\d+ - ", "")  # Limpiar nombres
  ) %>%
  filter(!is.na(Codigo))  # Filtrar filas sin código

Se convierten datos a numéricos.

datos_num <- datos_cod %>%
  mutate(across(PP:Otras, ~ as.numeric(.), .names = "{.col}_num"), .keep = "unused")

Se busca a ver si hay algún NA.

sum(is.na(datos_num$PP_num))
[1] 1

Aparece un NA y se observa que el municipio Gátova aparece dos veces pero con diferencias. Las dos filas son Gátova (hasta 1995) y Gátova (desde 1996), la primera solo tiene NAs y la segunda tiene valores normales. Por eso eliminamos la fila Gátova (hasta 1995) por ser problemática y porque ya tenemos valores de ese municipio.

datos_num <- datos_num %>% filter(Municipio != "Gátova (hasta 1995)")

Cuando ya tenemos los datos numéricos, se calculan el total de votos y porcentajes por partido, normalizando la información.

datos <- datos_num %>%
  rowwise() %>%
  mutate(Total_Votos = sum(c_across(ends_with("_num")), na.rm = TRUE)) %>%
  mutate(across(ends_with("_num"), ~ . / Total_Votos * 100, .names = "{.col}_pct")) %>%
  ungroup()

Se determina el partido ganador en cada municipio.

datos <- datos %>%
  mutate(Ganador = colnames(select(., ends_with("_num")))[max.col(select(., ends_with("_num")), ties.method = "first")])

Se obtiene la cartografía de la Comunidad Valenciana mediante mapSpain.

spain <- esp_get_munic()
cv <- spain %>% filter(codauto == 10)

Una vez ya se tiene todo lo anterior, se unen en un mismo conjunto los datos electorales con la cartografía, permitiendo su análisis espacial.

res_elec_cart <- left_join(cv, datos, by=c("LAU_CODE"="Codigo"))

Se verifican los nombres de los partidos ganadores.

res_elec_cart$Ganador <- gsub("_num$", "", res_elec_cart$Ganador)
unique(res_elec_cart$Ganador)
[1] "Otras"     "PP"        "PSOE"      "COMPROMIS" "EUPV"      "CS"       
[7] "VOX"      

Por último, se asignan a cada partido sus colores representativos para crear el gráfico.

colores <- c("PP" = "blue", "PSOE" = "red", "COMPROMIS" = "orange", "VOX" = "green",
             "PODEMOS" = "purple", "CS" = "yellow", "EUPV" = "brown", "Otras" = "gray")

res_elec_cart$color <- colores[res_elec_cart$Ganador]

Output

Se obtiene un nuevo objeto sf", con 542 observaciones y 28 variables.

class(res_elec_cart)
[1] "sf"         "data.frame"
dim(res_elec_cart)
[1] 542  28

Cuando se obtiene el conjunto de datos con todas las características deseadas, se representa un mapa interactivo con Leaflet de la Comunitat Valenciana en el que se visualizan los resultados electorales a nivel municipal y en el que cada municipio está coloreado según el partido político que ha obtenido la mayor cantidad de votos, facilitando así la interpretación de la distribución geográfica del voto.

La información se ha integrado en ventanas emergentes (popups), donde se detallan los resultados para cada municipio, incluyendo el número de votos y el porcentaje correspondiente a cada partido. En el mapa también se ha incorporado una leyenda explicativa.

leaflet(res_elec_cart) %>%
  addTiles() %>%
  addPolygons(
    fillColor = ~color,  # Color según el partido ganador
    fillOpacity = 0.7,  
    color = "black",     
    weight = 1,          
    popup = ~paste(      # Ventana emergente con información
      "<b>", Municipio, "</b><br>",
      "PP: ", PP_num, " (", round(PP_num_pct, 1), "%)<br>",
      "PSOE: ", PSOE_num, " (", round(PSOE_num_pct, 1), "%)<br>",
      "COMPROMIS: ", COMPROMIS_num, " (", round(COMPROMIS_num_pct, 1), "%)<br>",
      "VOX: ", VOX_num, " (", round(VOX_num_pct, 1), "%)<br>",
      "PODEMOS: ", PODEMOS_num, " (", round(PODEMOS_num_pct, 1), "%)<br>",
      "CS: ", CS_num, " (", round(CS_num_pct, 1), "%)<br>",
      "EUPV: ", EUPV_num, " (", round(EUPV_num_pct, 1), "%)<br>",
      "Otras: ", Otras_num, " (", round(Otras_num_pct, 1), "%)"
    )
  ) %>%
  addLegend(
    "bottomright",     
    colors = colores,    
    labels = names(colores), 
    title = "Partido Ganador" 
  )
sf::st_write(res_elec_cart, "res_elec_cv.gpkg")

El fichero generado con el procedimiento descrito anteriormente se puede descargar, en formato GeoPackage (gpkg), de aquí.



Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394