Introducción

Este informe documenta el análisis cuantitativo realizado para estudiar la relación entre las viviendas de uso turístico (VUT) y la pérdida de población residente en el municipio de Cádiz. El análisis se basa principalmente en datos abiertos del INE para el periodo 2021-2025.

Carga del entorno

Carga de las fuentes de datos

Población (Censo Anual del INE)

## Secciones únicas: 107
## Años disponibles: 2021, 2022, 2023, 2024, 2025

La población de Cádiz pasa de 114.442 habitantes en 2021 a 110.123 en 2025. Esto supone una pérdida de 4.319 residentes, equivalente a un descenso del 3,8%.

Viviendas turísticas (EVT del INE)

En la serie original del INE, las VUT pasan de 1.474 en agosto de 2021 a 1.706 en agosto de 2024, lo que supone un crecimiento del 15,7%. A partir de noviembre de 2024 se produce un cambio metodológico en la fuente, por lo que el análisis principal utiliza la serie homogénea de agosto entre 2021 y 2024.

Durante el periodo analizado también cambia el seccionado censal de Cádiz: 110 secciones en 2021 y 2022, 111 en 2023 y 107 en 2024. Para mantener una base territorial estable, el análisis por sección censal se realiza sobre las 107 secciones vigentes en 2024.

Cartografía de secciones censales

## Polígonos en Cádiz municipio: 107
## Sistema de referencia: ETRS89 / UTM zone 30N

La cartografía utilizada corresponde al seccionado censal de 2024, con 107 secciones para el municipio de Cádiz.

Renta neta media (ADRH del INE)

La renta neta media por persona crece un 19,1% entre 2020 y 2023, pasando de 12.887 € a 15.352 €. Para los cruces con el resto de variables, se utiliza el periodo común del panel.

Tabla unificada de análisis

Las fuentes se integran en un único objeto espacial, con una fila por sección censal y año.

## Filas: 535
## Variables: cod_seccion, cod_distrito, anio, poblacion, vut, plazas, renta_persona, geometry

Cobertura de datos por año

Antes de continuar, se revisa la cobertura de datos por año. Esto permite comprobar qué variables están disponibles en cada momento y qué comparaciones pueden hacerse con seguridad.

La población tiene cobertura completa entre 2021 y 2025. Las VUT están disponibles entre 2021 y 2024, salvo los dos valores ausentes aislados en la misma sección censal, uno en 2021 y otro en 2022. La renta llega hasta 2023.

Particularidades metodológicas del panel

Antes de comenzar el análisis exploratorio, conviene señalar algunas particularidades de las fuentes y del diseño del panel, ya que condicionan la interpretación de los resultados.

Cambio metodológico de la EVT en noviembre de 2024

A partir del segundo semestre de 2024, el INE modificó la metodología de la EVT y cambió los meses de referencia de la estadística. Hasta entonces, la serie utilizada en este trabajo se basaba en los datos de agosto. A partir de la nueva metodología aparecen datos de noviembre, que no son directamente comparables con la serie homogénea de agosto de 2021 a agosto de 2024.

En el caso de Cádiz, este cambio coincide con el descenso entre agosto de 2024, con 1.706 VUT, y noviembre de 2024, con 1.463. Por este motivo, los datos de noviembre de 2024 y noviembre de 2025 se revisan como referencia, pero no se incorporan al análisis principal.

Cambio en el número de secciones censales

El número de secciones censales varía durante el periodo: la EVT incluye 110 secciones en agosto de 2021 y 2022, 111 en agosto de 2023 y 107 desde agosto de 2024. La cartografía de referencia utilizada en este trabajo contiene 107 secciones censales. Por ello, el análisis se realiza sobre este seccionado común, lo que permite comparar los años sobre una base territorial estable.

Estas modificaciones del seccionado suelen responder a ajustes técnicos derivados de cambios en la distribución de la población. En este trabajo, su efecto principal es que algunas secciones presentes al inicio del periodo no coinciden exactamente con el seccionado vigente en 2024.

Análisis exploratorio univariante

En este apartado se revisan las principales variables continuas del panel: población, VUT, plazas y renta neta media por persona. El objetivo es conocer su distribución, detectar valores ausentes o atípicos y valorar si alguna variable necesita una transformación para mejorar su representación.

Análisis de valores ausentes

La revisión de valores ausentes permite comprobar qué variables están disponibles en cada año y qué cruces pueden realizarse sin perder coherencia temporal.

## Valores ausentes por variable y año
## # A tibble: 5 × 8
##    anio n_secciones na_poblacion na_vut na_plazas na_renta pct_vut_na
##   <int>       <int>        <int>  <int>     <int>    <int>      <dbl>
## 1  2021         107            0      1         1        0        0.9
## 2  2022         107            0      1         1        0        0.9
## 3  2023         107            0      0         0        0        0  
## 4  2024         107            0      0         0      107        0  
## 5  2025         107            0    107       107      107      100  
## # ℹ 1 more variable: pct_renta_na <dbl>
## 
## Secciones con VUT ausente en 2021 y 2022
##   anio cod_distrito cod_seccion
## 1 2021      1101210  1101210026
## 2 2022      1101210  1101210026
## 
## Cobertura del panel por año y variable
## # A tibble: 5 × 5
##    anio Poblacion VUT                               Plazas   `Renta por persona`
##   <int> <chr>     <chr>                             <chr>    <chr>              
## 1  2021 Completa  1 NA aislado (sección 1101210026) 1 NA ai… Completa           
## 2  2022 Completa  1 NA aislado (sección 1101210026) 1 NA ai… Completa           
## 3  2023 Completa  Completa                          Completa Completa           
## 4  2024 Completa  Completa                          Completa No disponible      
## 5  2025 Completa  No disponible                     No disp… No disponible

El recuento confirma tres patrones.

La población, que cuenta con una cobertura completa en todo el periodo.

Las VUT y plazas presentan un único valor ausente en 2021 y otro en 2022, ambos en la sección 1101210026 del distrito 10. Esta sección probablemente no superó los umbrales de difusión del INE en los primeros años de la EVT y aparece por primera vez en 2023 con cero VUT. No hay datos de VUT ni de plazas para 2025 por desfase de publicación de la EVT.

En cuanto a la renta neta, la cobertura llega hasta 2023. Por este motivo, los análisis que cruzan renta con presión turística se limitan al periodo 2021-2023, mientras que los cruces entre VUT y población pueden extenderse hasta 2024.

El análisis univariante muestra comportamientos distintos según la variable.

La población residente presenta una distribución moderadamente asimétrica, con la mayoría de secciones entre 700 y 1.200 habitantes. Entre 2021 y 2025 se aprecia un ligero desplazamiento hacia valores menores, coherente con la pérdida de población observada en el municipio.

Las VUT presentan una distribución mucho más desigual. La mayoría de secciones tiene valores bajos, mientras que unas pocas concentran cifras elevadas. En escala logarítmica se observa mejor cómo la distribución se desplaza hacia valores mayores entre 2021 y 2024, especialmente en las secciones con más presencia turística.

Las plazas turísticas siguen un patrón similar al de las VUT, aunque con valores mayores.

La renta neta por persona, disponible hasta 2023, muestra un desplazamiento general al alza, en línea con la evolución nominal de la renta municipal.

La figura muestra la evolución agregada de los tres indicadores principales del análisis.

La población residente desciende de forma continuada entre 2021 y 2025, pasando de 114.442 a 110.123 habitantes. Esto equivale a una pérdida aproximada del 3,8%, con un ritmo medio anual cercano al 1%.

Las VUT aumentan un 20,1% entre 2021 y 2024 en el panel armonizado, al pasar de 1.420 a 1.706 viviendas. Este crecimiento se acelera a partir de 2022, con casi 270 nuevas VUT en los dos años siguientes.

La renta neta media por persona, ponderada por población, sube un 13,8% nominal entre 2021 y 2023. Este dato debe leerse con cautela, ya que coincide con un periodo de inflación elevada y no implica necesariamente una mejora real del poder adquisitivo.

El crecimiento de las VUT cambia según la base territorial utilizada. En la serie original del INE, el aumento es del 15,7%. En el panel armonizado de 107 secciones, utilizado en este trabajo, alcanza el 20,1%. Ambas cifras son correctas, pero se calculan sobre bases territoriales distintas. En adelante se emplea el 20,1%, por ser el dato coherente con el panel de análisis.

Detección y caracterización de valores atípicos

Se utiliza la regla de Tukey para localizar valores atípicos en las variables continuas de cada año. Este método no exige asumir una distribución normal, algo importante en variables como las VUT o las plazas turísticas, que presentan una distribución muy desigual.

En este estudio, un valor atípico no tiene por qué indicar un error. Puede señalar precisamente aquellas secciones donde la actividad turística está más concentrada. Por este motivo, estos casos se mantienen en el análisis y se interpretan como parte del fenómeno estudiado.

## Outliers por variable y año (regla 1.5·IQR)
## # A tibble: 16 × 3
##    variable           anio superior
##    <fct>             <int>    <int>
##  1 Población          2021        3
##  2 Población          2022        4
##  3 Población          2023        3
##  4 Población          2024        4
##  5 Población          2025        3
##  6 VUT                2021        5
##  7 VUT                2022        5
##  8 VUT                2023        4
##  9 VUT                2024        2
## 10 Plazas             2021        4
## 11 Plazas             2022        4
## 12 Plazas             2023        4
## 13 Plazas             2024        3
## 14 Renta por persona  2021        1
## 15 Renta por persona  2022        1
## 16 Renta por persona  2023        2

## 
## Outliers superiores en VUT por año (límite 1.5·IQR de referencia)
## # A tibble: 16 × 5
##     anio cod_distrito cod_seccion valor limite_sup
##    <int> <chr>        <chr>       <dbl>      <dbl>
##  1  2021 1101202      1101202001     61       45.5
##  2  2021 1101201      1101201003     60       45.5
##  3  2021 1101206      1101206006     60       45.5
##  4  2021 1101201      1101201004     59       45.5
##  5  2021 1101202      1101202003     53       45.5
##  6  2022 1101201      1101201003     61       46  
##  7  2022 1101201      1101201004     59       46  
##  8  2022 1101206      1101206006     58       46  
##  9  2022 1101202      1101202001     56       46  
## 10  2022 1101202      1101202005     50       46  
## 11  2023 1101201      1101201004     66       51.8
## 12  2023 1101201      1101201003     61       51.8
## 13  2023 1101202      1101202001     61       51.8
## 14  2023 1101206      1101206006     60       51.8
## 15  2024 1101201      1101201004     77       61.8
## 16  2024 1101201      1101201003     67       61.8

Los diagramas de caja muestran dos perfiles claros. Población y renta presentan distribuciones más estables, con pocos valores atípicos. En cambio, las VUT y las plazas presentan varias secciones con valores altos respecto al conjunto del municipio.

El ranking por número de VUT permite identificar un grupo reducido de secciones que aparecen con valores atípicos durante varios años. Esto sugiere que no son casos puntuales, sino zonas donde la oferta turística se concentra de forma persistente. Estas secciones se analizarán más adelante en el bloque territorial.

Distribuciones, densidades y transformaciones

Para completar el análisis univariante se revisan las distribuciones del año 2023, el último con cobertura completa de población, VUT, plazas y renta. También se compara la distribución de las VUT en escala lineal y logarítmica para comprobar si la transformación \(\log(x+1)\) mejora la lectura de la variable.

Figura 1: La distribución conjunta confirma lo observado anteriormente. Población y renta presentan formas más equilibradas. VUT y plazas, sin embargo, concentran muchos valores bajos y una cola larga hacia la derecha. Esto refleja que la actividad turística no se reparte de forma homogénea entre secciones.

Figura 2: La comparación entre escala lineal y \(\log(x+1)\) para las VUT muestra que la transformación ayuda a leer mejor esta variable. En escala lineal, los valores bajos quedan muy comprimidos y no se diferencian. Con la transformación logarítmica se distinguen mejor las secciones sin actividad turística (valor cero) de aquellas con presencia de VUT.

Figura 3: La evolución de la distribución de VUT entre 2021 y 2024 muestra una forma bastante estable, aunque con una ligera reducción de las secciones sin VUT y una cola más extendida en 2024. Esto encaja con la idea de crecimiento concentrado en las zonas con mayor presencia turística.

Difusión territorial: número de secciones con presencia turística

## Difusión e intensificación de la presencia turística por año
## -------------------------------------------------------------
## # A tibble: 4 × 7
##    anio secciones_con_datos con_alguna_vut con_oferta_consolidada
##   <int>               <int>          <int>                  <int>
## 1  2021                 106             95                     66
## 2  2022                 106             94                     71
## 3  2023                 107             98                     70
## 4  2024                 107            103                     71
## # ℹ 3 more variables: con_concentracion_alta <int>, pct_con_alguna_vut <dbl>,
## #   pct_con_oferta_consolidada <dbl>

El número de secciones con datos varía ligeramente entre años: 106 en 2021 y 2022, y 107 en 2023 y 2024. La diferencia se debe a la sección 1101210026, sin datos de VUT en los dos primeros años.

La presencia de viviendas turísticas ya estaba bastante extendida al inicio del periodo. En 2021, el 89,6% de las secciones con datos tenía al menos una VUT, y el 62,3% contaba con cinco o más. En 2024, la proporción de secciones con alguna VUT alcanza el 96,3%, pero las secciones con oferta consolidada se mantienen en torno a 70.

Estos datos matizan el crecimiento agregado de las VUT. El aumento del 20,1% entre 2021 y 2024 no parece deberse principalmente a una expansión hacia muchas secciones nuevas, sino a una intensificación en secciones donde la actividad turística ya estaba presente.

Este resultado encaja con lo observado en la detección de valores atípicos. En ese análisis se identificaba un grupo reducido de secciones con valores elevados de forma recurrente. Ambos resultados apuntan a una densificación de la oferta turística más que a una expansión territorial generalizada.

Síntesis del análisis univariante

El análisis univariante permite fijar varias decisiones para los bloques siguientes.

En primer lugar, la cobertura temporal no es la misma para todas las variables. Los análisis que incorporen la renta se limitan al periodo 2021-2023, mientras que los centrados en población y VUT pueden ampliarse hasta 2024.

En segundo lugar, las variables turísticas presentan una distribución muy desigual. La mayoría de secciones tiene valores bajos o moderados, pero un grupo reducido concentra cifras elevadas de forma persistente. Por este motivo, los valores atípicos no se eliminan del análisis, sino que se consideran parte relevante del fenómeno.

En tercer lugar, el crecimiento de las VUT no parece responder tanto a una expansión hacia zonas nuevas de la ciudad. La presencia turística ya estaba muy extendida al inicio del periodo. Los datos apuntan más bien a una intensificación en secciones donde el fenómeno ya estaba presente.

A partir de aquí, el análisis se centra en comprobar qué secciones concentran ese crecimiento y cómo se relaciona esta dinámica con la evolución de la población residente.

Indicadores derivados

A partir del panel armonizado se construyen varios indicadores para comparar la evolución de las secciones censales. No basta con observar los valores absolutos, ya que las secciones tienen tamaños de población diferentes. Por eso se calculan indicadores relativos, como las VUT por cada 1.000 habitantes, junto con variaciones absolutas y porcentuales.

En el caso de las VUT se utiliza como métrica principal la variación absoluta entre 2021 y 2024. La variación porcentual puede resultar problemática en secciones que parten de cero o de valores muy bajos, por lo que se conserva solo como indicador auxiliar.

# Construcción de la tabla con los 7 indicadores derivados
# Pivot ancho con columnas para 2021, 2023 y 2024. 2023 se incluye porque
# es el último año con datos de renta.
# var_vut_pct e if_else evitan la división por cero cuando vut_2021 == 0.
# tam_medio_vut_2024 idem cuando vut_2024 == 0.
indicadores_tabla <- tabla |>
  sf::st_drop_geometry() |>
  dplyr::filter(anio %in% c(2021, 2023, 2024)) |>
  dplyr::select(cod_seccion, cod_distrito, anio,
                poblacion, vut, plazas, renta_persona) |>
  tidyr::pivot_wider(names_from = anio,
                     values_from = c(poblacion, vut, plazas, renta_persona),
                     names_sep = "_") |>
  dplyr::mutate(
    var_pob_pct       = 100 * (poblacion_2024 - poblacion_2021) / poblacion_2021,
    var_vut_abs       = vut_2024 - vut_2021,
    var_vut_pct       = dplyr::if_else(
                          !is.na(vut_2021) & vut_2021 > 0,
                          100 * (vut_2024 - vut_2021) / vut_2021,
                          NA_real_
                        ),
    vut_por_mil_2024    = 1000 * vut_2024 / poblacion_2024,
    plazas_por_mil_2024 = 1000 * plazas_2024 / poblacion_2024,
    var_renta_pct       = 100 * (renta_persona_2023 - renta_persona_2021) /
                                renta_persona_2021,
    tam_medio_vut_2024 = dplyr::if_else(
                          !is.na(vut_2024) & vut_2024 > 0,
                          plazas_2024 / vut_2024,
                          NA_real_
                        )
  )

# Cobertura: número de secciones con dato válido por cada indicador
cat("Recuento de secciones por indicador (con dato válido):\n")
## Recuento de secciones por indicador (con dato válido):
indicadores_recuento <- indicadores_tabla |>
  dplyr::summarise(
    var_pob_pct        = sum(!is.na(var_pob_pct)),
    var_vut_abs        = sum(!is.na(var_vut_abs)),
    var_vut_pct        = sum(!is.na(var_vut_pct)),
    vut_por_mil_2024   = sum(!is.na(vut_por_mil_2024)),
    plazas_por_mil_2024 = sum(!is.na(plazas_por_mil_2024)),
    var_renta_pct      = sum(!is.na(var_renta_pct)),
    tam_medio_vut_2024 = sum(!is.na(tam_medio_vut_2024))
  )
print(indicadores_recuento)
## # A tibble: 1 × 7
##   var_pob_pct var_vut_abs var_vut_pct vut_por_mil_2024 plazas_por_mil_2024
##         <int>       <int>       <int>            <int>               <int>
## 1         107         106          95              107                 107
## # ℹ 2 more variables: var_renta_pct <int>, tam_medio_vut_2024 <int>
# Tabla descriptiva: n, media, mediana, sd, min, max para cada indicador.
# pivot_longer convierte el ancho en largo (una fila por indicador-valor),
# luego se agrupa por indicador y se calculan los estadísticos.
resumen_indicadores <- indicadores_tabla |>
  dplyr::select(var_pob_pct, var_vut_abs, var_vut_pct,
                vut_por_mil_2024, plazas_por_mil_2024,
                var_renta_pct, tam_medio_vut_2024) |>
  tidyr::pivot_longer(cols = dplyr::everything(),
                      names_to = "indicador", values_to = "valor") |>
  dplyr::filter(!is.na(valor)) |>
  dplyr::group_by(indicador) |>
  dplyr::summarise(
    n      = dplyr::n(),
    media  = round(mean(valor), 2),
    mediana = round(stats::median(valor), 2),
    sd     = round(stats::sd(valor), 2),
    minimo = round(min(valor), 2),
    maximo = round(max(valor), 2),
    .groups = "drop"
  )

cat("\nDescriptivos de los indicadores derivados\n")
## 
## Descriptivos de los indicadores derivados
print(resumen_indicadores)
## # A tibble: 7 × 7
##   indicador               n media mediana    sd  minimo maximo
##   <chr>               <int> <dbl>   <dbl> <dbl>   <dbl>  <dbl>
## 1 plazas_por_mil_2024   107 68.1    44.9  65.9     0    339.  
## 2 tam_medio_vut_2024    103  4.37    4.29  0.8     1      6.33
## 3 var_pob_pct           107 -2.72   -3.06  2.91   -8.77   5.35
## 4 var_renta_pct         107 13.9    13.7   3.35    5.55  23.7 
## 5 var_vut_abs           106  2.66    1     5.83  -13     21   
## 6 var_vut_pct            95 31.6    20    65.0  -100    300   
## 7 vut_por_mil_2024      107 16.0     9.28 16.3     0     85.2
# Histograma 1: variación % de población. Línea vertical en 0 como referencia.
g_var_pob <- ggplot2::ggplot(
  indicadores_tabla |> dplyr::filter(!is.na(var_pob_pct)),
  ggplot2::aes(x = var_pob_pct)
) +
  ggplot2::geom_histogram(bins = 25, fill = "steelblue",
                          color = "white", alpha = 0.85) +
  ggplot2::geom_vline(xintercept = 0, color = "grey40", linetype = "dashed") +
  ggplot2::labs(
    title = "Variación de población por sección (%) · 2021-2024",
    x = "Variación (%)", y = "Número de secciones"
  ) +
  ggplot2::theme_minimal(base_size = 11)

# Histograma 2: presión turística (VUT/1000 hab) en 2024
g_pres_tur <- ggplot2::ggplot(
  indicadores_tabla |> dplyr::filter(!is.na(vut_por_mil_2024)),
  ggplot2::aes(x = vut_por_mil_2024)
) +
  ggplot2::geom_histogram(bins = 25, fill = "darkorange",
                          color = "white", alpha = 0.85) +
  ggplot2::labs(
    title = "Presión turística por sección · 2024",
    subtitle = "VUT por 1.000 habitantes",
    x = "VUT/1.000 hab", y = "Número de secciones"
  ) +
  ggplot2::theme_minimal(base_size = 11)

# Histograma 3: tamaño medio de VUT (plazas/VUT) en 2024
g_tam_medio <- ggplot2::ggplot(
  indicadores_tabla |> dplyr::filter(!is.na(tam_medio_vut_2024)),
  ggplot2::aes(x = tam_medio_vut_2024)
) +
  ggplot2::geom_histogram(bins = 25, fill = "darkgreen",
                          color = "white", alpha = 0.85) +
  ggplot2::labs(
    title = "Tamaño medio de VUT por sección · 2024",
    subtitle = "Plazas por VUT",
    x = "Plazas/VUT", y = "Número de secciones"
  ) +
  ggplot2::theme_minimal(base_size = 11)

# Apilamos los tres histogramas
print(g_var_pob / g_pres_tur / g_tam_medio)

# Caso emblemático: extraemos la serie completa de la sección 1101210026
caso_emblematico <- tabla |>
  sf::st_drop_geometry() |>
  dplyr::filter(cod_seccion == "1101210026") |>
  dplyr::select(anio, poblacion, vut, plazas, renta_persona) |>
  dplyr::arrange(anio)

cat("\nSección 1101210026 · evolución 2021-2025\n")
## 
## Sección 1101210026 · evolución 2021-2025
print(caso_emblematico)
##   anio poblacion vut plazas renta_persona
## 1 2021      1069  NA     NA         13003
## 2 2022      1048  NA     NA         13857
## 3 2023      1030   0      0         15261
## 4 2024      1002   4     16            NA
## 5 2025       989  NA     NA            NA
# Variación de población 2021-2025 y de renta 2021-2023 para esta sección,
# para compararlas con la media municipal
pob_inicio <- caso_emblematico$poblacion[caso_emblematico$anio == 2021]
pob_fin    <- caso_emblematico$poblacion[caso_emblematico$anio == 2025]
var_pob_caso <- 100 * (pob_fin - pob_inicio) / pob_inicio

renta_inicio <- caso_emblematico$renta_persona[caso_emblematico$anio == 2021]
renta_fin    <- caso_emblematico$renta_persona[caso_emblematico$anio == 2023]
var_renta_caso <- 100 * (renta_fin - renta_inicio) / renta_inicio

cat(sprintf(
  "\nVariación poblacional 2021-2025: %.1f%% (frente a -3,8%% del municipio)\n",
  var_pob_caso
))
## 
## Variación poblacional 2021-2025: -7.5% (frente a -3,8% del municipio)
cat(sprintf(
  "Variación de renta 2021-2023: %.1f%% (frente a +13,8%% del municipio)\n",
  var_renta_caso
))
## Variación de renta 2021-2023: 17.4% (frente a +13,8% del municipio)
cat("Aparición de VUT: registradas por primera vez en 2023\n")
## Aparición de VUT: registradas por primera vez en 2023

Los indicadores calculados permiten comparar secciones censales con tamaños y situaciones de partida diferentes. Son siete a escala de sección censal:

  • la variación porcentual de población entre 2021 y 2024
  • la variación absoluta de VUT entre 2021 y 2024
  • la variación porcentual de VUT entre 2021 y 2024
  • la presión turística, medida como VUT por cada 1.000 habitantes en 2024
  • la densidad de plazas turísticas, medida como plazas por cada 1.000 habitantes en 2024
  • la variación porcentual de renta entre 2021 y 2023
  • el tamaño medio de las VUT, definido como plazas por vivienda en 2024

La cobertura de los indicadores es prácticamente completa. Aquellos que dependen solo de datos de población o valores de 2024 están disponibles para las 107 secciones censales analizadas. La variación absoluta de VUT se calcula para 106 secciones, ya que la sección 1101210026 no dispone de datos de VUT en 2021. La variación porcentual de VUT, en cambio, solo puede calcularse en 95 secciones, las que ya contaban con al menos una VUT al inicio del periodo. El tamaño medio de las viviendas turísticas se obtiene para 103 secciones, aquellas con al menos una VUT registrada en 2024.

Los resultados obtenidos son coherentes con lo observado en el análisis univariante. La variación de población se concentra en torno al -3%, con una distribución relativamente simétrica, que encaja con la pérdida demográfica registrada a escala municipal. La presión turística, sin embargo, muestra una distribución asimétrica. La mediana se sitúa en 9,3 VUT por cada 1.000 habitantes, pero la media asciende a 16. Esta diferencia se explica por la presencia de secciones del centro histórico con valores mucho más elevados, que alcanzan hasta 85,2 VUT por cada 1.000 habitantes.

La variación porcentual de VUT también muestra una dispersión muy acusada, con valores que van desde el -100% hasta el +300% y una desviación típica de 65. Por este motivo, la variación absoluta se utiliza como métrica principal para analizar el crecimiento de las VUT. En muchas secciones el número inicial de viviendas turísticas era muy bajo, de modo que pequeñas variaciones absolutas generan porcentajes demasiado inestables.

El tamaño medio de las VUT en 2024 se concentra principalmente entre 3 y 6 plazas por vivienda, con una mediana de 4,3 plazas. Este resultado apunta a una oferta formada mayoritariamente por viviendas turísticas pequeñas y medianas, más próxima al alquiler turístico de plataforma que a establecimientos de gran capacidad.

En cuanto a la renta, se observa una evolución bastante homogénea. Entre 2021 y 2023, la variación de la mediana es del 13,7%, mientras que la media alcanza el 13,9%. Estos valores son prácticamente los mismos que el crecimiento municipal ponderado. Ninguna sección muestra una caída de renta nominal, aunque este resultado debe interpretarse con cautela por el contexto de inflación elevada del periodo.

Dentro de este bloque destaca la sección 1101210026, situada en el distrito 10 de extramuros. Esta sección no tenía datos publicados de VUT en 2021 ni en 2022, probablemente por no superar el umbral de difusión del INE. En 2023 aparece con 0 VUT y en 2024 pasa a contabilizar 4 viviendas turísticas y 16 plazas. Al mismo tiempo, su población desciende un 7,5% entre 2021 y 2025, una pérdida superior a la media municipal del 3,8%, y su renta aumenta un 17,4% entre 2021 y 2023, por encima del conjunto del municipio.

Por estas características, la sección 1101210026 se considera un caso de interés. No permite extraer conclusiones generales para toda la ciudad, pero sí muestra a pequeña escala una combinación de rasgos compatibles con procesos iniciales de gentrificación turística: aparición reciente de actividad turística, pérdida de población por encima de la media y crecimiento relativo de la renta. En los análisis posteriores se tendrá en cuenta como ejemplo puntual, sin convertirlo en una prueba general del fenómeno.

Análisis bivariante (a nivel sección censal)

Una vez construidos los indicadores, se analiza si las secciones donde más crecen las VUT son también las que más población pierden.

# Se usa indicadores_tabla (construida en el bloque anterior) filtrando
# la sección sin dato de VUT en 2021 para mantener la misma muestra.
indicadores <- indicadores_tabla |>
  dplyr::filter(!is.na(var_vut_abs), !is.na(var_pob_pct))

cat("Secciones analizadas:", nrow(indicadores), "\n")
## Secciones analizadas: 106
# Función auxiliar para no repetir código en los dos scatters.
# Recibe el dataframe, el nombre de la variable X, el título y la etiqueta del eje X.
# Eje Y siempre var_pob_pct. Línea horizontal en 0 como referencia.
scatter_bivariado <- function(datos, x_var, titulo, eje_x) {
  ggplot2::ggplot(datos, ggplot2::aes(x = .data[[x_var]], y = var_pob_pct)) +
    ggplot2::geom_hline(yintercept = 0, color = "grey70", linetype = "dashed") +
    ggplot2::geom_point(alpha = 0.7, color = "steelblue", size = 2) +
    ggplot2::geom_smooth(method = "lm", se = FALSE,
                         color = "firebrick", linewidth = 0.7) +
    ggplot2::labs(
      title = titulo,
      x = eje_x,
      y = "Variación de población (%) 2021-2024"
    ) +
    ggplot2::theme_minimal(base_size = 11)
}

# Dos scatters: variación absoluta de VUT y presión turística, ambos contra
# variación % de población
g1 <- scatter_bivariado(
  indicadores, "var_vut_abs",
  "Variación de VUT y variación de población por sección",
  "Variación absoluta de VUT (2024 - 2021)"
)

g2 <- scatter_bivariado(
  indicadores, "vut_por_mil_2024",
  "Presión turística y variación de población por sección",
  "VUT por 1.000 habitantes (2024)"
)

# Apilados verticalmente con patchwork
print(g1 / g2)

# Pearson y Spearman para los dos cruces, redondeados a 3 decimales
correlaciones <- data.frame(
  Cruce = c("Variación VUT vs variación población",
            "Presión turística vs variación población"),
  Pearson  = c(cor(indicadores$var_vut_abs,      indicadores$var_pob_pct, method = "pearson"),
               cor(indicadores$vut_por_mil_2024, indicadores$var_pob_pct, method = "pearson")),
  Spearman = c(cor(indicadores$var_vut_abs,      indicadores$var_pob_pct, method = "spearman"),
               cor(indicadores$vut_por_mil_2024, indicadores$var_pob_pct, method = "spearman"))
) |>
  dplyr::mutate(dplyr::across(c(Pearson, Spearman), \(x) round(x, 3)))

cat("\nCoeficientes de correlación\n")
## 
## Coeficientes de correlación
print(correlaciones)
##                                      Cruce Pearson Spearman
## 1     Variación VUT vs variación población   0.057    0.014
## 2 Presión turística vs variación población   0.092    0.111

En este bloque se analiza si existe relación entre la evolución de las viviendas de uso turístico y la pérdida de población residente a escala de sección censal. Para ello se utilizan dos medidas de la variable turística: la variación absoluta de VUT entre 2021 y 2024 y la presión turística en 2024, medida como VUT por cada 1.000 habitantes.

La variación de VUT se mide en términos absolutos porque algunas secciones partían de cero o de valores muy bajos en 2021, lo que hace que la variación porcentual sea poco estable. En cambio, la población sí se expresa en porcentaje, ya que todas las secciones tienen dato inicial y esta medida permite comparar mejor unidades de distinto tamaño. La sección 1101210026 se excluye del cruce porque no dispone de dato de VUT en 2021, por lo que el análisis se realiza sobre 106 secciones censales.

Los resultados no muestran una relación clara entre las variables. En el cruce entre variación de VUT y variación de población, los coeficientes son muy bajos: Pearson = 0,057 y Spearman = 0,014. En el cruce entre presión turística y variación de población ocurre algo parecido, con Pearson = 0,092 y Spearman = 0,111.

Los gráficos confirman esta idea. Los puntos aparecen bastante dispersos y no forman una tendencia definida. La mayoría de secciones se sitúa alrededor de una pérdida de población cercana al -3%, independientemente de que tengan mayor o menor presencia de VUT. Esto indica que las secciones donde más crece la oferta turística, o donde mayor es la presión turística en 2024, no son necesariamente las que más población pierden.

Este resultado matiza la hipótesis inicial del trabajo. A escala de sección censal, y para el periodo 2021-2024, no se observa una asociación estadística relevante entre crecimiento turístico y pérdida de población. Además, el hecho de que las dos medidas turísticas apunten en la misma dirección refuerza la interpretación: la debilidad de la relación no parece depender del indicador elegido.

Una posible explicación es que la pérdida de población en Cádiz tenga un carácter bastante generalizado. Si muchas secciones pierden habitantes a ritmos parecidos, la correlación con la presión turística tiende a ser débil. También puede ocurrir que algunas zonas con alta presencia turística, especialmente en el centro histórico, ya hubieran perdido población antes de 2021, de modo que durante el periodo analizado tengan menos margen de descenso adicional. Por otra parte, el periodo disponible puede ser corto para captar procesos residenciales que suelen desarrollarse a más largo plazo.

En conjunto, este análisis no permite confirmar que el aumento reciente de las VUT explique directamente la pérdida de población por sección censal. El siguiente paso es analizar los datos a escala de distrito, donde la agregación puede reducir parte del ruido de las secciones pequeñas y mostrar patrones territoriales más generales.

Análisis territorial (a nivel distrito)

Además del análisis por sección censal, el análisis se repite a escala de distrito. Esta escala permite observar patrones territoriales más generales y evitar que secciones pequeñas distorsionen la lectura general. Contando con diez distritos, los coeficientes tienen valor exploratorio, no confirmatorio.

# Agregación a distrito: suma de población y VUT por las secciones de cada
# distrito, para 2021 y 2024. Luego pivot ancho y cálculo de los tres
# indicadores. Para presión turística usamos los totales del distrito, no
# el promedio de las presiones de sus secciones (evita ponderar mal).
distritos <- tabla |>
  sf::st_drop_geometry() |>
  dplyr::filter(anio %in% c(2021, 2024)) |>
  dplyr::group_by(cod_distrito, anio) |>
  dplyr::summarise(
    poblacion = sum(poblacion, na.rm = TRUE),
    vut       = sum(vut,       na.rm = TRUE),
    .groups = "drop"
  ) |>
  tidyr::pivot_wider(names_from = anio,
                     values_from = c(poblacion, vut),
                     names_sep = "_") |>
  dplyr::mutate(
    var_pob_pct      = 100 * (poblacion_2024 - poblacion_2021) / poblacion_2021,
    var_vut_abs      = vut_2024 - vut_2021,
    vut_por_mil_2024 = 1000 * vut_2024 / poblacion_2024
  )

cat("Tabla resumen por distrito\n")
## Tabla resumen por distrito
print(distritos |>
        dplyr::mutate(dplyr::across(where(is.numeric), \(x) round(x, 1))))
## # A tibble: 10 × 8
##    cod_distrito poblacion_2021 poblacion_2024 vut_2021 vut_2024 var_pob_pct
##    <chr>                 <dbl>          <dbl>    <dbl>    <dbl>       <dbl>
##  1 1101201                5880           5693      217      233        -3.2
##  2 1101202                5608           5482      227      235        -2.2
##  3 1101203                6519           6299      129      156        -3.4
##  4 1101204                4054           3973       83       95        -2  
##  5 1101205                4529           4535      110      150         0.1
##  6 1101206                4164           4064      138      164        -2.4
##  7 1101207                3581           3494       93      121        -2.4
##  8 1101208               27068          26208       99      129        -3.2
##  9 1101209               24515          23665      112      156        -3.5
## 10 1101210               28524          27767      212      267        -2.7
## # ℹ 2 more variables: var_vut_abs <dbl>, vut_por_mil_2024 <dbl>
# Barras horizontales: variación % de población por distrito.
# reorder() ordena los distritos por la variable; coord_flip() voltea
# a horizontal. Etiquetas a la izquierda o derecha de la barra según signo.
g_pob <- ggplot2::ggplot(
  distritos,
  ggplot2::aes(x = stats::reorder(cod_distrito, var_pob_pct),
               y = var_pob_pct)
) +
  ggplot2::geom_col(fill = "steelblue", alpha = 0.85) +
  ggplot2::geom_text(ggplot2::aes(label = sprintf("%.1f%%", var_pob_pct)),
                     hjust = ifelse(distritos$var_pob_pct < 0, 1.1, -0.1),
                     size = 3.3) +
  ggplot2::coord_flip() +
  ggplot2::labs(
    title = "Variación de población por distrito",
    subtitle = "Cádiz municipio · 2021-2024",
    x = "Distrito",
    y = "Variación de población (%)"
  ) +
  ggplot2::theme_minimal(base_size = 11)

# Mismo esquema para presión turística
g_pres <- ggplot2::ggplot(
  distritos,
  ggplot2::aes(x = stats::reorder(cod_distrito, vut_por_mil_2024),
               y = vut_por_mil_2024)
) +
  ggplot2::geom_col(fill = "darkorange", alpha = 0.85) +
  ggplot2::geom_text(ggplot2::aes(label = sprintf("%.1f", vut_por_mil_2024)),
                     hjust = -0.15, size = 3.3) +
  ggplot2::coord_flip() +
  ggplot2::labs(
    title = "Presión turística por distrito",
    subtitle = "VUT por 1.000 habitantes · 2024",
    x = "Distrito",
    y = "VUT por 1.000 habitantes"
  ) +
  ggplot2::theme_minimal(base_size = 11)

print(g_pob / g_pres)

# Scatter del cruce a nivel distrito (n=10). Cada punto etiquetado con el
# código del distrito. Misma estructura que el bivariado a nivel sección.
g_biv_distrito <- ggplot2::ggplot(
  distritos,
  ggplot2::aes(x = vut_por_mil_2024, y = var_pob_pct)
) +
  ggplot2::geom_hline(yintercept = 0, color = "grey70", linetype = "dashed") +
  ggplot2::geom_point(color = "steelblue", size = 3.5, alpha = 0.85) +
  ggplot2::geom_text(ggplot2::aes(label = cod_distrito),
                     vjust = -1.2, size = 3.2, color = "grey25") +
  ggplot2::geom_smooth(method = "lm", se = FALSE,
                       color = "firebrick", linewidth = 0.7) +
  ggplot2::labs(
    title = "Presión turística y variación de población por distrito",
    subtitle = "Cádiz municipio · n = 10 distritos · 2021-2024",
    x = "VUT por 1.000 habitantes (2024)",
    y = "Variación de población (%) 2021-2024",
    caption = "Línea de tendencia: ajuste lineal por mínimos cuadrados"
  ) +
  ggplot2::theme_minimal(base_size = 11) +
  ggplot2::theme(plot.caption = ggplot2::element_text(size = 9, color = "grey40"))

print(g_biv_distrito)

# Pearson y Spearman con n=10. Etiquetados como exploratorios porque
# el tamaño muestral no permite contraste estadístico formal.
correlaciones_distrito <- data.frame(
  Cruce = c("Variación VUT vs variación población",
            "Presión turística vs variación población"),
  Pearson  = c(cor(distritos$var_vut_abs,      distritos$var_pob_pct, method = "pearson"),
               cor(distritos$vut_por_mil_2024, distritos$var_pob_pct, method = "pearson")),
  Spearman = c(cor(distritos$var_vut_abs,      distritos$var_pob_pct, method = "spearman"),
               cor(distritos$vut_por_mil_2024, distritos$var_pob_pct, method = "spearman"))
) |>
  dplyr::mutate(dplyr::across(c(Pearson, Spearman), \(x) round(x, 3)))

cat("\nCoeficientes de correlación a nivel distrito (n = 10, exploratorios)\n")
## 
## Coeficientes de correlación a nivel distrito (n = 10, exploratorios)
print(correlaciones_distrito)
##                                      Cruce Pearson Spearman
## 1     Variación VUT vs variación población   0.045   -0.321
## 2 Presión turística vs variación población   0.364    0.358

Los datos se agregan por distrito para comprobar si a una escala territorial más amplia aparece algún patrón que no era visible a nivel de sección censal. Dado que Cádiz cuenta solo con diez distritos, los coeficientes obtenidos deben interpretarse con carácter exploratorio, no confirmatorio.

Los distritos del centro histórico (1101201 a 1101207) tienen entre 3.500 y 6.500 habitantes, mientras que los tres distritos de extramuros (1101208, 1101209 y 1101210) concentran entre 23.000 y 28.000 habitantes cada uno. Es relevante considerar esta diferencia de tamaño, ya que no todas las unidades territoriales tienen el mismo peso en la lectura de los resultados.

El primer gráfico muestra una pérdida de población bastante homogénea: nueve de los diez distritos registran descensos de entre el -2,0% y el -3,5%. Solo el distrito 1101205 se mantiene estable, con un +0,1%. La presión turística, en cambio, presenta una distribución mucho más desigual, desde 4,9 VUT por cada 1.000 habitantes en el distrito 1101208 hasta 42,9 en el 1101202.

El cruce entre ambas variables no muestra el patrón esperado. Los distritos con mayor presión turística no son los que más población pierden. De hecho, los coeficientes de correlación entre presión turística y variación de población son positivos (Pearson = 0,364; Spearman = 0,358), mientras que la relación entre variación absoluta de VUT y variación de población es prácticamente nula e inestable (Pearson = 0,045; Spearman = -0,321).

Es posible que los distritos más turistificados ya vinieran perdiendo población antes de 2021 y tengan menos margen de descenso adicional en el periodo analizado. En los grandes distritos residenciales de extramuros, donde las VUT son escasas, la pérdida de población parece estar más relacionada con el envejecimiento y la salida de población joven que con la presión turística.

Correlación entre indicadores derivados

Para completar el análisis se calculan matrices de correlación entre los principales indicadores derivados. El objetivo es observar qué variables tienden a moverse juntas y cuáles presentan relaciones débiles o independientes. Estas correlaciones son un recurso exploratorio, no una prueba de causalidad.

# Selección de los siete indicadores derivados (sin identificadores).
matriz_datos <- indicadores_tabla |>
  dplyr::select(var_pob_pct, var_vut_abs, var_vut_pct,
                vut_por_mil_2024, plazas_por_mil_2024,
                var_renta_pct, tam_medio_vut_2024)

# Etiquetas legibles para la matriz.
nombres_legibles <- c(
  var_pob_pct         = "Var. población (%)",
  var_vut_abs         = "Var. VUT (abs)",
  var_vut_pct         = "Var. VUT (%)",
  vut_por_mil_2024    = "VUT/1000 hab",
  plazas_por_mil_2024 = "Plazas/1000 hab",
  var_renta_pct       = "Var. renta (%)",
  tam_medio_vut_2024  = "Tam. medio VUT"
)
colnames(matriz_datos) <- nombres_legibles[colnames(matriz_datos)]

# Matrices de correlación con pairwise.complete.obs.
cor_pearson  <- stats::cor(matriz_datos, method = "pearson",  use = "pairwise.complete.obs")
cor_spearman <- stats::cor(matriz_datos, method = "spearman", use = "pairwise.complete.obs")

# n efectivo de cada par (cuántas secciones tienen dato en ambas variables).
n_efectivo <- crossprod(!is.na(as.matrix(matriz_datos)))

cat("n efectivo por par de variables\n")
## n efectivo por par de variables
print(n_efectivo)
##                    Var. población (%) Var. VUT (abs) Var. VUT (%) VUT/1000 hab
## Var. población (%)                107            106           95          107
## Var. VUT (abs)                    106            106           95          106
## Var. VUT (%)                       95             95           95           95
## VUT/1000 hab                      107            106           95          107
## Plazas/1000 hab                   107            106           95          107
## Var. renta (%)                    107            106           95          107
## Tam. medio VUT                    103            102           94          103
##                    Plazas/1000 hab Var. renta (%) Tam. medio VUT
## Var. población (%)             107            107            103
## Var. VUT (abs)                 106            106            102
## Var. VUT (%)                    95             95             94
## VUT/1000 hab                   107            107            103
## Plazas/1000 hab                107            107            103
## Var. renta (%)                 107            107            103
## Tam. medio VUT                 103            103            103
cat("\nMatriz de Pearson\n")
## 
## Matriz de Pearson
print(round(cor_pearson, 3))
##                    Var. población (%) Var. VUT (abs) Var. VUT (%) VUT/1000 hab
## Var. población (%)              1.000          0.057        0.218        0.099
## Var. VUT (abs)                  0.057          1.000        0.625        0.331
## Var. VUT (%)                    0.218          0.625        1.000       -0.012
## VUT/1000 hab                    0.099          0.331       -0.012        1.000
## Plazas/1000 hab                 0.095          0.339       -0.004        0.992
## Var. renta (%)                 -0.078          0.171       -0.017        0.291
## Tam. medio VUT                  0.015         -0.035        0.153       -0.167
##                    Plazas/1000 hab Var. renta (%) Tam. medio VUT
## Var. población (%)           0.095         -0.078          0.015
## Var. VUT (abs)               0.339          0.171         -0.035
## Var. VUT (%)                -0.004         -0.017          0.153
## VUT/1000 hab                 0.992          0.291         -0.167
## Plazas/1000 hab              1.000          0.293         -0.094
## Var. renta (%)               0.293          1.000         -0.012
## Tam. medio VUT              -0.094         -0.012          1.000
cat("\nMatriz de Spearman\n")
## 
## Matriz de Spearman
print(round(cor_spearman, 3))
##                    Var. población (%) Var. VUT (abs) Var. VUT (%) VUT/1000 hab
## Var. población (%)              1.000          0.014        0.102        0.120
## Var. VUT (abs)                  0.014          1.000        0.811        0.381
## Var. VUT (%)                    0.102          0.811        1.000        0.157
## VUT/1000 hab                    0.120          0.381        0.157        1.000
## Plazas/1000 hab                 0.127          0.382        0.158        0.992
## Var. renta (%)                 -0.008          0.049        0.003        0.201
## Tam. medio VUT                  0.003         -0.010        0.116       -0.158
##                    Plazas/1000 hab Var. renta (%) Tam. medio VUT
## Var. población (%)           0.127         -0.008          0.003
## Var. VUT (abs)               0.382          0.049         -0.010
## Var. VUT (%)                 0.158          0.003          0.116
## VUT/1000 hab                 0.992          0.201         -0.158
## Plazas/1000 hab              1.000          0.202         -0.053
## Var. renta (%)               0.202          1.000         -0.079
## Tam. medio VUT              -0.053         -0.079          1.000
# Visualización Pearson.
corrplot::corrplot(
  cor_pearson,
  method     = "color",
  type       = "upper",
  order      = "hclust",
  addCoef.col = "black",
  number.cex = 0.75,
  tl.col     = "grey20",
  tl.srt     = 45,
  tl.cex     = 0.85,
  diag       = FALSE,
  col        = colorRampPalette(c("firebrick", "white", "steelblue"))(200),
  mar        = c(0, 0, 2, 0),
  title      = "Correlaciones de Pearson entre indicadores derivados"
)

# Visualización Spearman.
corrplot::corrplot(
  cor_spearman,
  method     = "color",
  type       = "upper",
  order      = "hclust",
  addCoef.col = "black",
  number.cex = 0.75,
  tl.col     = "grey20",
  tl.srt     = 45,
  tl.cex     = 0.85,
  diag       = FALSE,
  col        = colorRampPalette(c("firebrick", "white", "steelblue"))(200),
  mar        = c(0, 0, 2, 0),
  title      = "Correlaciones de Spearman entre indicadores derivados"
)

Se emplean dos matrices de correlación: Pearson, para relaciones lineales, y Spearman, para relaciones por rangos. Dado que no todos los indicadores tienen la misma cobertura, el número de secciones varía entre 94 y 107 según el par de variables comparado.

La relación entre los indicadores turísticos y la variación de población es muy baja: 0,06 en Pearson y 0,01 en Spearman para el cruce con la variación absoluta de VUT. Los resultados son similares cuando se utiliza la presión turística medida mediante VUT o plazas por habitante. En conjunto, la pérdida de población no sigue el mismo patrón territorial que la presión turística.

Dentro de los propios indicadores turísticos sí aparecen relaciones más claras. La variación absoluta de VUT correlaciona de forma moderada con la presión turística en 2024 (Pearson = 0,33; Spearman = 0,38), lo que apunta a que el crecimiento de la oferta se concentra en zonas donde ya había actividad turística, más que en áreas completamente nuevas.

La relación entre presión turística y variación de renta es más débil (Pearson = 0,29; Spearman = 0,20), aunque apunta en la misma dirección: las zonas con más VUT tienden a coincidir con aquellas donde la renta nominal ha crecido más en el periodo disponible.

Dos correlaciones adicionales sirven como comprobación de coherencia. Las VUT por 1.000 habitantes y las plazas por 1.000 habitantes presentan una correlación de aproximadamente 0,99, algo esperable porque ambas variables miden la misma dimensión de presión turística con unidades distintas.

Por último, la variación absoluta y la variación porcentual de VUT presentan una relación alta, especialmente en Spearman (Pearson = 0,62; Spearman = 0,81). Esto indica que ambos indicadores están relacionados, aunque miden aspectos distintos del mismo fenómeno. La variación porcentual es más sensible a secciones que partían de valores bajos.

Mapas coropléticos

En este bloque se representan los principales indicadores sobre el seccionado censal de Cádiz. La lectura cartográfica permite comprobar si los patrones observados en los análisis anteriores se concentran en zonas concretas o si aparecen repartidos por el conjunto del municipio.

Mapa seccionado censal

El mapa muestra las 107 secciones censales del municipio de Cádiz utilizadas en el análisis. Se aprecia la diferencia entre el casco antiguo, con secciones más pequeñas y compactas, y las del resto del municipio, donde las unidades territoriales ocupan superficies más amplias. Esta cartografía sirve como base para los mapas posteriores.

Mapa de referencia: secciones de interés

Antes de interpretar los mapas temáticos, se localizan algunas secciones que aparecen de forma recurrente en el análisis. En naranja se muestran las cuatro secciones detectadas como valores atípicos de presión turística, todas situadas en el casco antiguo. En morado aparece la sección 1101210026, ubicada en extramuros, que se analiza como caso de interés por la aparición reciente de VUT.

Este mapa funciona como referencia visual para identificar estas secciones sin sobrecargar de etiquetas los mapas siguientes.

Mapa 1. Presión turística por sección

## Secciones con NA en presión turística: 0

El mapa muestra una distribución muy desigual de la presión turística. Los valores más altos se concentran en la zona norte del municipio, especialmente en el casco antiguo y su entorno próximo. En varias secciones se superan las 30 VUT por cada 1.000 habitantes, y el valor máximo alcanza 85,2.

Hacia el sur, la presión turística desciende con claridad. Buena parte de las secciones residenciales de extramuros presentan valores inferiores a 15 VUT por cada 1.000 habitantes, y en muchas zonas se sitúan por debajo de 5. La diferencia entre el casco antiguo y el resto de la ciudad es, por tanto, muy marcada.

También aparecen algunos valores intermedios fuera del centro histórico, sobre todo en zonas próximas al litoral o relativamente cercanas al centro. Esto sugiere cierta presencia turística fuera del casco antiguo, aunque todavía lejos de los niveles observados en las secciones más turistificadas.

En conjunto, el mapa muestra que la presión turística no se distribuye de forma homogénea: se concentra en una parte concreta de la ciudad, mientras que la mayor parte del municipio presenta valores más bajos.

Mapa 2. Variación de población por sección

## Secciones con NA en variación de población: 0
## Rango de variación: -8.77 % a  5.35 %

El mapa de variación de población muestra un patrón distinto al de la presión turística. La pérdida de residentes aparece repartida por buena parte del municipio y no se concentra únicamente en las secciones con más VUT.

La categoría más habitual es la de pérdida moderada, entre el 0% y el -3%, en línea con la evolución general de Cádiz durante el periodo. También aparecen secciones con descensos más intensos, superiores al -6%, distribuidas tanto en el casco antiguo como en zonas intermedias y de extramuros.

Esta lectura ayuda a entender por qué las correlaciones entre presión turística y pérdida de población eran bajas. Las VUT se concentran territorialmente, mientras que la caída demográfica tiene una distribución más extendida. Por tanto, ambos fenómenos coinciden en algunas zonas, pero no siguen exactamente el mismo patrón espacial.

Mapa 3. Coincidencia territorial entre presión turística y pérdida de población

## Mediana presión turística: 9.28 VUT/1000 hab
## Mediana variación poblacional: -3.06 %
## # A tibble: 4 × 3
##   cuadrante                       n porcentaje
##   <fct>                       <int>      <dbl>
## 1 Alta presión + alta pérdida    24       22.4
## 2 Alta presión + baja pérdida    30       28  
## 3 Baja presión + alta pérdida    30       28  
## 4 Baja presión + baja pérdida    23       21.5

Este mapa cruza las dos variables principales del análisis: presión turística y pérdida de población. Para ello, las secciones se clasifican en cuatro grupos a partir de la mediana de cada indicador: 9,3 VUT por cada 1.000 habitantes para la presión turística y -2,7% para la variación de población.

El resultado muestra una coincidencia parcial, pero no una relación uniforme. Hay 24 secciones con alta presión turística y alta pérdida de población, situadas sobre todo en el casco antiguo. Sin embargo, también aparecen 30 secciones con alta presión turística y una pérdida de población menor. Esto indica que el centro histórico no funciona como un bloque homogéneo.

En extramuros se observa el patrón contrario: varias secciones presentan baja presión turística y alta pérdida de población. Estas zonas pierden habitantes sin tener una presencia elevada de VUT, lo que apunta a la influencia de otros factores demográficos y urbanos.

El mapa matiza la hipótesis inicial. La presión turística y la pérdida de población existen en Cádiz, pero no siempre aparecen en las mismas secciones. Solo en una parte del municipio ambos procesos se solapan de forma clara; en otras zonas siguen dinámicas diferentes.

Mapa 4. Variación absoluta de VUT por sección

## Secciones con NA en variación de VUT: 1
## Rango de variación absoluta: -13 a 21 VUT

Este mapa muestra dónde aumentan o disminuyen las VUT entre 2021 y 2024. A diferencia del mapa de presión turística, que representa la situación en 2024, este permite observar la evolución durante el periodo.

Los mayores incrementos, superiores a 10 VUT, se concentran principalmente en el casco antiguo y en la zona norte del municipio. Se trata de áreas que ya presentaban una presión turística elevada, por lo que el crecimiento reciente apunta más a una intensificación de la oferta que a la aparición del fenómeno en zonas completamente nuevas.

Un ejemplo claro es la sección 1101201004, que pasa de 59 a 77 VUT entre 2021 y 2024. Este caso ilustra que algunas secciones con una oferta turística ya consolidada siguen acumulando nuevas viviendas turísticas.

Fuera del casco antiguo también aparecen aumentos, aunque más moderados, especialmente en zonas litorales o residenciales. Al mismo tiempo, algunas secciones del centro muestran variaciones nulas o incluso negativas, lo que recuerda que el crecimiento no es uniforme ni siquiera dentro de las zonas más turistificadas.

La sección 1101210026 aparece en gris porque no dispone de dato de VUT en 2021 y, por tanto, no puede calcularse su variación. En años posteriores empieza a registrar actividad turística, por lo que se mantiene como caso de interés.

En conjunto, el mapa refuerza la idea de que el crecimiento de las VUT combina dos dinámicas: intensificación en zonas donde la oferta ya estaba presente, especialmente en el casco antiguo, y aumentos más moderados en otras áreas de la ciudad.

Lectura demográfica complementaria

Los resultados anteriores muestran que la pérdida de población no sigue exactamente el mismo patrón territorial que la presión turística. Por este motivo, se incorpora una lectura complementaria de la estructura por edad, centrada en dos grupos: población joven, de 20 a 39 años, y población mayor, de 65 años o más.

El objetivo no es sustituir la explicación turística, sino comprobar si el envejecimiento y la pérdida de población joven ayudan a contextualizar mejor la evolución demográfica observada en Cádiz.

Población por edad (Censo Anual del INE)

La información por edad procede también del Censo Anual de Población del INE. A diferencia de la población total, los datos se organizan en grupos quinquenales de edad, lo que permite construir indicadores de estructura demográfica por sección censal y año.

## Filas: 11235
## Secciones: 107
## Años: 2021, 2022, 2023, 2024, 2025
## Grupos de edad: 21

La carga de población por edad confirma que se dispone de la misma estructura territorial que en el resto del panel: sección censal y año. Esto permite incorporar la edad como lectura complementaria para contextualizar la pérdida de población observada en los bloques anteriores.

Indicadores de estructura por edad

A partir de la tabla por edades se calculan dos indicadores: el porcentaje de población joven y el porcentaje de población mayor. La población joven se define como la comprendida entre 20 y 39 años, mientras que la población mayor corresponde a las personas de 65 años o más.

grupos_jovenes <- c("De 20 a 24 años", "De 25 a 29 años",
                    "De 30 a 34 años", "De 35 a 39 años")

grupos_mayores <- levels(df_pob_edad$grupo_edad)[
  stringr::str_detect(levels(df_pob_edad$grupo_edad),
                      "^De (6[5-9]|[7-9]\\d|100)")
]

cat("Grupos clasificados como mayores (65+):\n")
## Grupos clasificados como mayores (65+):
print(grupos_mayores)
## [1] "De 65 a 69 años" "De 70 a 74 años" "De 75 a 79 años" "De 80 a 84 años"
## [5] "De 85 a 89 años" "De 90 a 94 años" "De 95 a 99 años"
df_edad_resumen <- df_pob_edad |>
  dplyr::mutate(
    categoria = dplyr::case_when(
      grupo_edad %in% grupos_jovenes ~ "jovenes",
      grupo_edad %in% grupos_mayores ~ "mayores",
      TRUE                           ~ "otros"
    )
  ) |>
  dplyr::group_by(cod_seccion, cod_distrito, anio, categoria) |>
  dplyr::summarise(poblacion = sum(poblacion, na.rm = TRUE),
                   .groups   = "drop") |>
  tidyr::pivot_wider(names_from  = categoria,
                     values_from = poblacion,
                     values_fill = 0) |>
  dplyr::mutate(
    poblacion_total = jovenes + mayores + otros,
    pct_jovenes     = 100 * jovenes / poblacion_total,
    pct_mayores     = 100 * mayores / poblacion_total
  )

cat("\nDistribución de pct_mayores (todas las secciones y años):\n")
## 
## Distribución de pct_mayores (todas las secciones y años):
print(summary(df_edad_resumen$pct_mayores))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   12.93   21.72   25.04   25.86   29.74   39.82
cat("\nDistribución de pct_jovenes (todas las secciones y años):\n")
## 
## Distribución de pct_jovenes (todas las secciones y años):
print(summary(df_edad_resumen$pct_jovenes))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   13.06   18.50   20.00   20.09   21.86   26.13
head(df_edad_resumen)

Los indicadores muestran una ciudad con una estructura demográfica envejecida. El peso medio de la población mayor se sitúa en torno al 26% durante el periodo analizado, mientras que la población joven ronda el 20%.

Esta diferencia ayuda a interpretar la pérdida de población desde una perspectiva más amplia. Una menor presencia de población joven reduce el relevo generacional y puede hacer más difícil compensar la pérdida de residentes, incluso en zonas con baja presión turística.

Estructura por edad por distrito

## Tabla por distrito: variación poblacional, presión turística, % jóvenes y % mayores en 2024
## # A tibble: 10 × 5
##    cod_distrito var_pob_pct vut_por_mil_2024 pct_jovenes pct_mayores
##    <chr>              <dbl>            <dbl>       <dbl>       <dbl>
##  1 1101202             -2.2             42.9        22.2        22.6
##  2 1101201             -3.2             40.9        21.6        23  
##  3 1101206             -2.4             40.4        22.4        20.1
##  4 1101207             -2.4             34.6        22          21  
##  5 1101205              0.1             33.1        22.9        22.1
##  6 1101203             -3.4             24.8        20.7        26.8
##  7 1101204             -2               23.9        20.1        24.8
##  8 1101210             -2.7              9.6        19.1        27.8
##  9 1101209             -3.5              6.6        18.7        29  
## 10 1101208             -3.2              4.9        18.9        26.4

Los porcentajes se calculan sobre los totales de cada distrito, no como promedio de sus secciones, para evitar que las unidades más pequeñas distorsionen el resultado.

La lectura por distrito muestra diferencias territoriales relevantes. Los distritos de extramuros, especialmente los de mayor tamaño residencial, presentan porcentajes de población mayor relativamente altos y menor peso de población joven. En cambio, varios distritos del casco antiguo combinan mayor presión turística con una estructura por edad algo menos envejecida.

Esta comparación refuerza la idea de que la pérdida de población no puede atribuirse únicamente a la presencia de VUT. En algunas zonas residenciales con baja presión turística, el envejecimiento aparece como un factor relevante para entender la evolución demográfica.

Cruces con presión turística

# Misma muestra de 106 secciones que el bloque bivariado original:
# se excluye la sección sin dato de VUT en 2021 para que las
# correlaciones sean comparables con las del análisis turístico.
indicadores_seccion_edad <- tabla |>
  sf::st_drop_geometry() |>
  dplyr::filter(anio %in% c(2021, 2024)) |>
  dplyr::select(cod_seccion, anio, poblacion, vut) |>
  tidyr::pivot_wider(names_from = anio, values_from = c(poblacion, vut),
                     names_sep = "_") |>
  dplyr::mutate(
    var_pob_pct      = 100 * (poblacion_2024 - poblacion_2021) / poblacion_2021,
    vut_por_mil_2024 = 1000 * vut_2024 / poblacion_2024
  ) |>
  dplyr::left_join(
    df_edad_resumen |> dplyr::filter(anio == 2024) |>
      dplyr::select(cod_seccion, pct_jovenes, pct_mayores),
    by = "cod_seccion"
  ) |>
  dplyr::filter(!is.na(var_pob_pct), !is.na(pct_mayores))

cat("Secciones analizadas:", nrow(indicadores_seccion_edad), "\n\n")
## Secciones analizadas: 107
correlaciones_seccion <- tibble::tibble(
  Cruce = c(
    "pct_mayores vs var_pob_pct",
    "pct_jovenes vs var_pob_pct",
    "vut_por_mil vs pct_mayores",
    "vut_por_mil vs pct_jovenes"
  ),
  Pearson = c(
    cor(indicadores_seccion_edad$pct_mayores,      indicadores_seccion_edad$var_pob_pct,      method = "pearson"),
    cor(indicadores_seccion_edad$pct_jovenes,      indicadores_seccion_edad$var_pob_pct,      method = "pearson"),
    cor(indicadores_seccion_edad$vut_por_mil_2024, indicadores_seccion_edad$pct_mayores,      method = "pearson"),
    cor(indicadores_seccion_edad$vut_por_mil_2024, indicadores_seccion_edad$pct_jovenes,      method = "pearson")
  ),
  Spearman = c(
    cor(indicadores_seccion_edad$pct_mayores,      indicadores_seccion_edad$var_pob_pct,      method = "spearman"),
    cor(indicadores_seccion_edad$pct_jovenes,      indicadores_seccion_edad$var_pob_pct,      method = "spearman"),
    cor(indicadores_seccion_edad$vut_por_mil_2024, indicadores_seccion_edad$pct_mayores,      method = "spearman"),
    cor(indicadores_seccion_edad$vut_por_mil_2024, indicadores_seccion_edad$pct_jovenes,      method = "spearman")
  )
) |>
  dplyr::mutate(dplyr::across(c(Pearson, Spearman), \(x) round(x, 3)))

cat("Correlaciones a nivel sección censal (n =",
    nrow(indicadores_seccion_edad), ")\n")
## Correlaciones a nivel sección censal (n = 107 )
print(correlaciones_seccion)
## # A tibble: 4 × 3
##   Cruce                      Pearson Spearman
##   <chr>                        <dbl>    <dbl>
## 1 pct_mayores vs var_pob_pct  -0.292   -0.257
## 2 pct_jovenes vs var_pob_pct   0.22     0.17 
## 3 vut_por_mil vs pct_mayores  -0.36    -0.316
## 4 vut_por_mil vs pct_jovenes   0.467    0.397
correlaciones_distrito <- tibble::tibble(
  Cruce = c(
    "pct_mayores vs var_pob_pct",
    "pct_jovenes vs var_pob_pct",
    "vut_por_mil vs pct_mayores",
    "vut_por_mil vs pct_jovenes"
  ),
  Pearson = c(
    cor(tabla_distrito_edad$pct_mayores,      tabla_distrito_edad$var_pob_pct,      method = "pearson"),
    cor(tabla_distrito_edad$pct_jovenes,      tabla_distrito_edad$var_pob_pct,      method = "pearson"),
    cor(tabla_distrito_edad$vut_por_mil_2024, tabla_distrito_edad$pct_mayores,      method = "pearson"),
    cor(tabla_distrito_edad$vut_por_mil_2024, tabla_distrito_edad$pct_jovenes,      method = "pearson")
  ),
  Spearman = c(
    cor(tabla_distrito_edad$pct_mayores,      tabla_distrito_edad$var_pob_pct,      method = "spearman"),
    cor(tabla_distrito_edad$pct_jovenes,      tabla_distrito_edad$var_pob_pct,      method = "spearman"),
    cor(tabla_distrito_edad$vut_por_mil_2024, tabla_distrito_edad$pct_mayores,      method = "spearman"),
    cor(tabla_distrito_edad$vut_por_mil_2024, tabla_distrito_edad$pct_jovenes,      method = "spearman")
  )
) |>
  dplyr::mutate(dplyr::across(c(Pearson, Spearman), \(x) round(x, 3)))

cat("\nCorrelaciones a nivel distrito (n = 10, exploratorias)\n")
## 
## Correlaciones a nivel distrito (n = 10, exploratorias)
print(correlaciones_distrito)
## # A tibble: 4 × 3
##   Cruce                      Pearson Spearman
##   <chr>                        <dbl>    <dbl>
## 1 pct_mayores vs var_pob_pct  -0.508   -0.648
## 2 pct_jovenes vs var_pob_pct   0.59     0.661
## 3 vut_por_mil vs pct_mayores  -0.872   -0.721
## 4 vut_por_mil vs pct_jovenes   0.933    0.806

Se añaden cruces con la estructura por edad para comprobar si las secciones más envejecidas, o con menor presencia de población joven, presentan también una evolución demográfica más negativa. El objetivo no es identificar una causa única, sino apoyar la interpretación de los resultados anteriores.

Los resultados a nivel de distrito deben tomarse con prudencia, ya que solo hay diez observaciones. Aun así, apuntan en la misma dirección: la pérdida de población en Cádiz no puede explicarse únicamente por las VUT. La dinámica demográfica propia, relacionada con el envejecimiento y la falta de relevo generacional, también ayuda a entender el patrón observado.

Mapa de envejecimiento

## Secciones con NA en pct_mayores: 0
## Rango pct_mayores 2024: 15.4 % a  39.8 %

El mapa muestra que el envejecimiento no se distribuye de manera uniforme por Cádiz. Hay secciones donde la población de 65 años o más tiene un peso especialmente alto, mientras que otras mantienen valores más moderados.

Esta distribución ayuda a entender por qué la pérdida de población no coincide siempre con las zonas de mayor presión turística. La presión turística se concentra sobre todo en el casco antiguo, mientras que el envejecimiento aparece también en otras zonas del municipio.

Esta lectura refuerza la idea de que la caída de población responde a una combinación de factores.

Coincidencia territorial entre presión turística y envejecimiento

## Mediana presión turística: 9.28 VUT/1000 hab
## Mediana envejecimiento: 25.28 %
##                            cuadrante  n porcentaje
## 1 Alta presión + alto envejecimiento 20       18.7
## 2 Alta presión + bajo envejecimiento 34       31.8
## 3 Baja presión + alto envejecimiento 34       31.8
## 4 Baja presión + bajo envejecimiento 19       17.8

El mapa cruza presión turística y envejecimiento para identificar secciones donde ambos factores coinciden con valores altos. Estas zonas, representadas en morado, se concentran principalmente en el casco antiguo.

Sin embargo, también aparecen secciones envejecidas con baja presión turística, sobre todo en extramuros. Esto indica que el envejecimiento no puede interpretarse únicamente como consecuencia de la turistificación, sino como un fenómeno con distribución propia que afecta a zonas con perfiles turísticos distintos.

Evolución temporal de los indicadores demográficos

A partir de los grupos quinquenales se construyen dos indicadores, población joven y población mayor, para explorar si la evolución demográfica de Cádiz tiene relación con el envejecimiento y la falta de relevo generacional.

Las series siguientes recogen los valores anuales agregados que sirven de base para los dos gráficos de este apartado.

Evolución conjunta de población y VUT

El gráfico muestra de forma visual la evolución simultánea de la población residente y las VUT: mientras la población desciende de forma continua, la oferta de VUT crece en el periodo analizado. Que ambos fenómenos coincidan en el tiempo no implica que uno explique el otro, como ha quedado de manifiesto en los análisis anteriores.

Evolución de población joven y población mayor

El gráfico ayuda a interpretar la pérdida de población en Cádiz dentro de un contexto de envejecimiento progresivo. El peso de la población mayor de 65 años aumenta del 24,4% en 2021 al 27,0% en 2025, mientras que la población joven de 20 a 39 años baja del 20,9% al 19,5%.

Esta evolución apunta a una pérdida de relevo generacional. La ciudad tiene cada vez más peso de población mayor y menos presencia de población joven adulta, una franja asociada a la emancipación, la formación de hogares y la permanencia residencial.

Por tanto, la caída demográfica no puede explicarse solo por la presión turística. Debe entenderse dentro de una dinámica más amplia, en la que coinciden el crecimiento de las VUT, el envejecimiento de la población y la pérdida de peso de los grupos jóvenes.

Mapas interactivos

Los mapas siguientes reproducen los análisis territoriales en formato interactivo. Permiten consultar el valor de cada sección censal pasando el cursor por encima.

Presión turística por sección (2024)

Variación absoluta de VUT (dinámica de crecimiento 2021-2024)

Variación de población por sección (2021-2024)

Coincidencia entre presión turística y pérdida de población

Envejecimiento por sección (2024, lectura complementaria)