Skip to contents

Este vignette explica cómo explorar las dos entidades maestras de la base de datos: territorios (la jerarquía territorial española) y partidos (incluyendo sus agrupaciones o recode).


Territorios

Jerarquía territorial

Los territorios en EleccionesDB se organizan en una jerarquía de 7 niveles:

Tipo Descripción Ejemplo
ccaa Comunidad Autónoma Andalucía, Cataluña
provincia Provincia Sevilla, Barcelona
municipio Municipio Dos Hermanas, Badalona
distrito Distrito censal
seccion Sección censal
circunscripcion Circunscripción electoral
cera Voto exterior (CERA)

Cada territorio contiene códigos jerárquicos completos (codigo_ccaa, codigo_provincia, codigo_municipio, etc.) y un parent_id que permite navegar hacia arriba en la jerarquía.

Listar territorios

get_territorios() devuelve un listado paginado que puedes filtrar por tipo, códigos jerárquicos y nombre:

# Todas las comunidades autónomas
ccaas <- get_territorios(tipo = "ccaa", all_pages = TRUE)
ccaas
#> # A tibble: 19 × 5
#>       id tipo  nombre             codigo_completo parent_id
#>    <int> <chr> <chr>              <chr>               <int>
#>  1     1 ccaa  Andalucia          0100000000000          NA
#>  2     2 ccaa  Aragon             0200000000000          NA
#>  3     3 ccaa  Asturias           0300000000000          NA
#> # ℹ 16 more rows
# Provincias de Andalucía (codigo_ccaa = "01")
provincias_andalucia <- get_territorios(
  tipo = "provincia",
  codigo_ccaa = "01",
  all_pages = TRUE
)
provincias_andalucia
#> # A tibble: 8 × 5
#>       id tipo      nombre   codigo_completo parent_id
#>    <int> <chr>     <chr>    <chr>               <int>
#>  1    20 provincia Almeria  0104000000000           1
#>  2    21 provincia Cadiz    0111000000000           1
#>  3    22 provincia Cordoba  0114000000000           1
#> # ℹ 5 more rows
# Buscar por nombre (búsqueda parcial)
get_territorios(nombre = "madrid")
#> # A tibble: 50 × 5
#>       id tipo      nombre               codigo_completo parent_id
#>    <int> <chr>     <chr>                 <chr>               <int>
#>  1    13 ccaa      Madrid               1300000000000          NA
#>  2    50 provincia Madrid               1328000000000          13
#>  3   812 municipio Madrid               1328079000000          50
#> # ℹ 47 more rows

Detalle de un territorio

get_territorio() devuelve todos los códigos jerárquicos de un territorio:

# Detalle de la provincia de Sevilla
get_territorio(27)
#> # A tibble: 1 × 12
#>      id tipo      nombre  codigo_ccaa codigo_provincia codigo_municipio
#>   <int> <chr>     <chr>   <chr>       <chr>            <chr>
#> 1    27 provincia Sevilla 01          41               000
#> # ℹ 6 more variables: codigo_distrito <chr>, codigo_seccion <chr>,
#> #   codigo_circunscripcion <chr>, codigo_completo <chr>, parent_id <int>

get_territorio_hijos() devuelve los hijos directos de un territorio, permitiendo recorrer la jerarquía de arriba a abajo:

# Hijos de Andalucía (id = 1) → sus 8 provincias
provincias <- get_territorio_hijos(1, all_pages = TRUE)
provincias
#> # A tibble: 8 × 5
#>       id tipo      nombre     codigo_completo parent_id
#>    <int> <chr>     <chr>      <chr>               <int>
#>  1    20 provincia Almeria    0104000000000           1
#>  2    21 provincia Cadiz      0111000000000           1
#>  3    22 provincia Cordoba    0114000000000           1
#>  4    23 provincia Granada    0118000000000           1
#>  5    24 provincia Huelva     0121000000000           1
#>  6    25 provincia Jaen       0123000000000           1
#>  7    26 provincia Malaga     0129000000000           1
#>  8    27 provincia Sevilla    0141000000000           1
# Municipios de la provincia de Sevilla (id = 27)
municipios_sevilla <- get_territorio_hijos(27, all_pages = TRUE)
nrow(municipios_sevilla)
#> [1] 105
head(municipios_sevilla)
#> # A tibble: 6 × 5
#>      id tipo      nombre            codigo_completo parent_id
#>   <int> <chr>     <chr>             <chr>               <int>
#> 1  5401 municipio Aguadulce         0141001000000          27
#> 2  5402 municipio Alanis            0141002000000          27
#> 3  5403 municipio Albaida del Ala…  0141003000000          27
#> # ℹ 3 more rows

Ejemplo: recorrer la jerarquía completa

# Obtener todas las CCAAs y contar sus provincias
ccaas <- get_territorios(tipo = "ccaa", all_pages = TRUE)

resumen_provincias <- lapply(ccaas$id, function(ccaa_id) {
  hijos <- get_territorio_hijos(ccaa_id, all_pages = TRUE)
  tibble(
    ccaa_id = ccaa_id,
    n_provincias = nrow(hijos)
  )
}) |> bind_rows()

resumen_provincias <- left_join(
  ccaas |> select(id, nombre),
  resumen_provincias,
  by = c("id" = "ccaa_id")
)
resumen_provincias

Partidos

Buscar partidos

get_partidos() permite buscar partidos por siglas, denominación o por su grupo de recode:

# Buscar partidos con siglas "PSOE"
get_partidos(siglas = "psoe")
#> # A tibble: 50 × 4
#>       id siglas              denominacion                      partido_recode_id
#>    <int> <chr>               <chr>                                         <int>
#>  1  9451 P.S.O.E.            PARTIDO SOCIALISTA OBRERO ESPAÑOL                80
#>  2  9452 P.S.O.E.-PROGRE…    PARTIDO SOCIALISTA OBRERO ESPAÑOL…               80
#>  3  9453 P.S.O.E.-P.S.C.     PARTIDO SOCIALISTA OBRERO ESPAÑOL…               80
#> # ℹ 47 more rows
# Buscar por denominación
get_partidos(denominacion = "popular", limit = 5)

# Buscar partidos de un grupo de recode concreto
get_partidos(partido_recode_id = 80, all_pages = TRUE)

Detalle de un partido

get_partido() devuelve el detalle completo de un partido, con los datos del recode expandidos como columnas con prefijo recode_:

get_partido(9451)
#> # A tibble: 1 × 7
#>      id siglas   denominacion                      partido_recode_id recode_id
#>   <int> <chr>    <chr>                                         <int>     <int>
#> 1  9451 P.S.O.E. PARTIDO SOCIALISTA OBRERO ESPAÑOL                80        80
#> # ℹ 2 more variables: recode_agrupacion <chr>, recode_color <chr>

Los partidos sin grupo de recode asignado tendrán partido_recode_id = NA y las columnas recode_* también serán NA.

Agrupaciones de partidos (recode)

Los partidos se agrupan en familias (recode) que permiten agregar votos de partidos locales o coaliciones bajo un mismo paraguas. Por ejemplo, las distintas candidaturas del PSOE en cada comunidad autónoma se agrupan bajo el recode “PSOE”.

# Listar agrupaciones
get_partidos_recode()
#> # A tibble: 50 × 4
#>       id partido_recode    agrupacion color
#>    <int> <chr>             <chr>      <chr>
#>  1     1 AP/PP             AP/PP      #0068B2
#>  2     2 BNG               BNG        #76B3DD
#>  3     3 CC                CC         #FFD700
#> # ℹ 47 more rows
# Buscar por agrupación
get_partidos_recode(agrupacion = "izquierda")

Detalle de una agrupación

get_partido_recode() devuelve una lista con dos elementos:

  • $recode — tibble de 1 fila con la información del grupo.
  • $partidos — tibble con todos los partidos miembros.

Se usa una lista porque un grupo puede contener cientos o miles de partidos:

resultado <- get_partido_recode(80)

# Información del grupo
resultado$recode
#> # A tibble: 1 × 4
#>      id partido_recode agrupacion color
#>   <int> <chr>          <chr>      <chr>
#> 1    80 PSOE           PSOE       #E30613

# Partidos miembros
nrow(resultado$partidos)
#> [1] 342

head(resultado$partidos)
#> # A tibble: 6 × 4
#>      id siglas              denominacion                      partido_recode_id
#>   <int> <chr>               <chr>                                         <int>
#> 1  9451 P.S.O.E.            PARTIDO SOCIALISTA OBRERO ESPAÑOL                80
#> 2  9452 P.S.O.E.-PROGRE…    PARTIDO SOCIALISTA OBRERO ESPAÑOL…               80
#> 3  9453 P.S.O.E.-P.S.C.     PARTIDO SOCIALISTA OBRERO ESPAÑOL…               80
#> # ℹ 3 more rows

Ejemplo: explorar las familias más grandes

recodes <- get_partidos_recode(all_pages = TRUE)

# Para cada agrupación, contar cuántos partidos incluye
tamanos <- lapply(recodes$id, function(recode_id) {
  detalle <- get_partido_recode(recode_id)
  tibble(
    recode_id = recode_id,
    agrupacion = detalle$recode$agrupacion,
    n_partidos = nrow(detalle$partidos)
  )
}) |> bind_rows()

tamanos |>
  arrange(desc(n_partidos)) |>
  head(10)

Siguientes pasos