1. Fundamentos Teóricos del ANCOVA

El Análisis de la Covarianza (ANCOVA) es un modelo lineal general que combina el Análisis de la Varianza (ANOVA) con el Análisis de Regresión. Su propósito principal es comparar las medias de una variable dependiente entre diferentes grupos, eliminando el efecto de una o más variables continuas extrañas, denominadas covariables.

¿Para qué sirve el ANCOVA?

En este estudio, el ANCOVA nos permite determinar si el nivel de renta (factor) influye en la abstención en las elecciones municipales de Madrid en 2015 (variable dependiente) una vez que hemos limpiado el efecto que tiene la inercia del comportamiento electoral pasado (abstención de 2011).

Sus funciones principales son: * Reducción del error: Al explicar parte de la variabilidad mediante la covariable, el modelo se vuelve más preciso. * Ajuste de medias: Permite comparar los grupos como si todos hubieran partido del mismo nivel de abstención en las elecciones anteriores (nivela el punto de partida).

¿Qué significa “controlar por una covariable”?

Controlar estadísticamente significa aislar el efecto puro de la variable de interés. Dado que quien se abstuvo en 2011 tiene altas probabilidades de reincidir en 2015, el ANCOVA ajusta los resultados actuales en función de lo que cabría esperar según esa tendencia histórica. Así, las diferencias que observemos entre quintiles de renta serán “netas”, independientes del pasado.

El Modelo Matemático

El modelo ANCOVA para un diseño de un solo factor se expresa mediante la siguiente ecuación:

\[Y_{ij} = \mu + \tau_i + \beta(X_{ij} - \bar{X}) + \epsilon_{ij}\]

Donde: * \(Y_{ij}\): Abstención en 2015 de la sección \(j\) en el quintil de renta \(i\). * \(\mu\): Media global de abstención. * \(\tau_i\): Efecto del quintil de renta \(i\). * \(\beta\): Coeficiente de regresión de la covariable (Abstención 2011). * \(X_{ij} - \bar{X}\): Desviación de la covariable respecto a su media aritmética. * \(\epsilon_{ij}\): Error aleatorio o residuo del modelo.

Supuesto Estadístico del ANCOVA: Homogeneidad de las pendientes de regresión (No interacción)

Establece que la relación entre la covariable y la variable dependiente debe ser la misma para todos los grupos. En nuestro caso, significa que la inercia del voto debe afectar de forma similar a los barrios ricos y a los pobres. Si las pendientes fueran muy distintas, no podríamos usar un solo coeficiente \(\beta\) global y el ANCOVA no sería el modelo adecuado.


2. Aplicación Práctica: Análisis de Abstención Electoral

Vamos a analizar la abstención electoral en 2015 en función de los niveles de renta (factor), controlando por la inercia de la abstención en 2011 (covariable).

2.1 Carga y Tratamiento de Datos

Librerías utilizadas

  • readxl: Para la importación desde Excel.
  • Hmisc y dplyr: Para el cálculo de estadísticas descriptivas y manipulación de estructuras de datos.
  • emmeans: Para el cálculo de las medias ajustadas del ANCOVA.
  • plotly y scales: Para la generación de visualizaciones interactivas y formatos de porcentaje.

Limpieza y Transformación

  1. Tratamiento de Nulos: Al cargar los datos, identificamos múltiples formas de valores ausentes (#N/A, N/D, etc.) y aplicamos na.omit() para garantizar que el modelo de regresión trabaje sobre una matriz completa.
  2. Definición de Factores: Convertimos las variables identificativas (distrito y sección) en factores. Esto evita que R las interprete como variables numéricas en los cálculos.

Creación de quintiles Ponderados por Censo

En lugar de dividir las secciones en cuatro grupos iguales, utilizamos la función wtd.quantile del paquete Hmisc. Las secciones censales no tienen el mismo tamaño: las hay con 500 habitantes y otras con 2.500. Si no ponderamos por el censo, los cortes de renta podrían estar sesgados hacia zonas con muchas secciones pequeñas.

Al usar weights = elecciones$censo_15, garantizamos que cada quintil (Q1 a Q4) represente aproximadamente al 25% de la población total, y no solo al 25% de las secciones.

library(readxl)
library(Hmisc)
library(dplyr)
library(ggplot2)
library(emmeans)
library(plotly)
library(scales)

elecciones <- read_xlsx("DExp.xlsx", sheet = 1, 
                        na = c("#N/A", "N/A", "#N/D", "N/D", "", "NA")) %>% 
  na.omit()

elecciones$distrito <- as.factor(elecciones$distrito)
elecciones$sección <- as.factor(elecciones$sección)

# Creación de quintiles ponderados por censo
n_grupos <- 5
cortes_ponderados <- wtd.quantile(elecciones$renta_15, weights = elecciones$censo_15, probs = seq(0, 1, 1/n_grupos))

elecciones <- elecciones %>%
  mutate(cuantil_renta_15 = cut(renta_15, breaks = cortes_ponderados, include.lowest = TRUE, labels = paste0("Q", 1:n_grupos)))

summary(elecciones)
##        sección                      distrito        abs_15      
##  2807901001:   1   Latina               : 201   Min.   :0.1037  
##  2807901002:   1   Carabanchel          : 178   1st Qu.:0.2736  
##  2807901003:   1   Puente de Vallecas   : 177   Median :0.3236  
##  2807901004:   1   Fuencarral - El Pardo: 172   Mean   :0.3305  
##  2807901006:   1   Ciudad Lineal        : 171   3rd Qu.:0.3803  
##  2807901007:   1   Salamanca            : 125   Max.   :0.9264  
##  (Other)   :2382   (Other)              :1364                   
##     renta_15        censo_15          abs_11       cuantil_renta_15
##  Min.   : 3281   Min.   : 498.0   Min.   :0.1810   Q1:539          
##  1st Qu.:10126   1st Qu.: 744.0   1st Qu.:0.3130   Q2:506          
##  Median :13484   Median : 921.0   Median :0.3583   Q3:459          
##  Mean   :14656   Mean   : 982.9   Mean   :0.3635   Q4:453          
##  3rd Qu.:18044   3rd Qu.:1150.0   3rd Qu.:0.4057   Q5:431          
##  Max.   :28350   Max.   :2066.0   Max.   :0.9255                   
## 

2.2 Modelo 1: ANOVA Unifactorial (Modelo Simple)

Primero ajustamos un modelo unifactorial para ver cómo afecta la renta a la abstención sin tener en cuenta el pasado.

modelo_simple <- lm(abs_15 ~ cuantil_renta_15, data = elecciones, weights = censo_15)
summary(modelo_simple)
## 
## Call:
## lm(formula = abs_15 ~ cuantil_renta_15, data = elecciones, weights = censo_15)
## 
## Weighted Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.1916 -0.9511  0.0285  0.9476 18.6328 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         0.418576   0.002206  189.76   <2e-16 ***
## cuantil_renta_15Q2 -0.062182   0.003118  -19.94   <2e-16 ***
## cuantil_renta_15Q3 -0.116280   0.003120  -37.27   <2e-16 ***
## cuantil_renta_15Q4 -0.137328   0.003121  -44.01   <2e-16 ***
## cuantil_renta_15Q5 -0.159537   0.003120  -51.13   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.512 on 2383 degrees of freedom
## Multiple R-squared:  0.5874, Adjusted R-squared:  0.5867 
## F-statistic: 848.1 on 4 and 2383 DF,  p-value: < 2.2e-16

Para entender este primer modelo, visualizamos la distribución de la abstención según el quintil de renta mediante un diagrama de cajas:

ggplot(elecciones, aes(x = cuantil_renta_15, y = abs_15, fill = cuantil_renta_15)) +
  geom_boxplot(alpha = 0.7) +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal() +
  scale_fill_manual(values = c("#d73027", "#FF9900", "#fee090", "#91cf60", "#4575b4")) +
  labs(title = "Modelo 1: Distribución de Abstención 2015 por Renta",
       x = "quintil de Renta", y = "Abstención 2015") +
  theme(legend.position = "none")

Los resultados del modelo lineal ponderado muestran que el nivel de renta es un predictor crítico y estadísticamente significativo de la abstención electoral. El intercepto nos indica que la abstención media en las secciones del primer quintil (las de menor renta) se sitúa en el 40.93%, y esta es menor según aumenta la renta por quintiles.

Su capacidad explicativa se queda en un 55,86% de la variabilidad: es bastante pero sigue sin explicar gran parte de esta.

2.3 Modelo 2: ANCOVA (Inercia Histórica + Renta)

Ahora introducimos la abstención de 2011 como covariable para ver si, al aislar la inercia del pasado, el efecto de la renta se mantiene.

modelo_ancova <- lm(abs_15 ~ cuantil_renta_15 + abs_11, data = elecciones, weights = censo_15)
summary(modelo_ancova)
## 
## Call:
## lm(formula = abs_15 ~ cuantil_renta_15 + abs_11, data = elecciones, 
##     weights = censo_15)
## 
## Weighted Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.9661 -0.5746  0.0709  0.6838  8.0672 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         0.096782   0.006596  14.673   <2e-16 ***
## cuantil_renta_15Q2 -0.022808   0.002312  -9.865   <2e-16 ***
## cuantil_renta_15Q3 -0.047725   0.002569 -18.575   <2e-16 ***
## cuantil_renta_15Q4 -0.054391   0.002733 -19.901   <2e-16 ***
## cuantil_renta_15Q5 -0.055267   0.003009 -18.366   <2e-16 ***
## abs_11              0.731756   0.014586  50.170   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.054 on 2382 degrees of freedom
## Multiple R-squared:  0.7994, Adjusted R-squared:  0.799 
## F-statistic:  1898 on 5 and 2382 DF,  p-value: < 2.2e-16

Al controlar por la abstención de 2011, los resultados nos ofrecen una visión mucho más precisa del impacto real de la renta:

  • La inercia es el factor dominante sobre la renta: el coeficiente de abs_11 es de 0.731. Esto significa que, por cada punto porcentual de abstención en 2011, se espera un aumento de 0.73 puntos en 2015.

  • El “Efecto Neto” de la Renta, descontando el pasado: los coeficientes de los quintiles han disminuido notablemente respecto al modelo simple: por ejemplo, Q4 (Renta Alta) antes tenía una diferencia de 14.7 puntos respecto a Q1; ahora, al “limpiar” el efecto del pasado, esa diferencia neta es de solo 4.99 puntos.

El ANCOVA nos revela que gran parte de la abstención en barrios pobres (Q1) no se debe únicamente a su situación socioeconómica actual, sino a una tendencia histórica de desmovilización. Aun así, la renta sigue siendo estadísticamente significativa (\(p < 2e-16\)), lo que demuestra que la desigualdad económica sigue castigando la participación, incluso cuando comparamos barrios con el mismo pasado electoral.

2.3 Visualización Interactiva del Ajuste Lineal

Aquí podemos visualizar el ajuste lineal de cada quintil de renta. (Pasa el ratón por los puntos para ver la media de abstención de ese grupo y su ecuación matemática ponderada).

ecuaciones <- elecciones %>%
  group_by(cuantil_renta_15) %>%
  summarise(
    intercepto = coef(lm(abs_15 ~ abs_11, weights = censo_15))[1],
    pendiente = coef(lm(abs_15 ~ abs_11, weights = censo_15))[2],
    media_ponderada_15 = weighted.mean(abs_15, w = censo_15, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate(
    ecuacion = paste0("y = ", round(intercepto, 3), " + ", round(pendiente, 3), "x"),
    media_texto = scales::percent(media_ponderada_15, accuracy = 0.1)
  )

elecciones_eq <- elecciones %>%
  left_join(ecuaciones, by = "cuantil_renta_15")

p <- ggplot(elecciones_eq, aes(x = abs_11, y = abs_15, color = cuantil_renta_15)) +

  geom_point(aes(size = censo_15, 
                 text = paste("quintil:", cuantil_renta_15, 
                              "<br>Media Abstención 2015:", media_texto,
                              "<br>Ecuación:", ecuacion)), 
             alpha = 0.15) + 

  geom_smooth(aes(weight = censo_15), method = "lm", se = FALSE, linewidth = 1) +
              
  scale_size_continuous(range = c(0.5, 2)) +
  theme_minimal() +
  labs(title = "Tendencias Individuales por quintil de Renta",
       x = "Abstención 2011 (Covariable)", y = "Abstención 2015",
       color = "quintil") +
       
  scale_color_manual(values = c("#d73027", "#FF9900", "#fee090", "#91cf60", "#4575b4")) +
  
  scale_x_continuous(labels = scales::percent) +
  scale_y_continuous(labels = scales::percent) +
  coord_cartesian(xlim = c(0.15, 0.75), ylim = c(0.15, 0.75))

suppressWarnings({
  ggplotly(p, tooltip = "text") %>%
    toWebGL() %>% 
    layout(
      legend = list(orientation = "h", y = -0.2),
      hovermode = "closest" 
    )
})

Se puede ver que las rectas de regresión para cada cuantil son casi paralelas, pero vamos a hacer el análisis de contrastes.

2.4 Contrastes y Evaluación del Modelo

Finalmente, confirmamos estadísticamente si incluir la covariable mejora la explicación de los datos y extraemos las medias puras ajustadas.

2.5 Comparación de modelos

anova(modelo_simple, modelo_ancova)
## Analysis of Variance Table
## 
## Model 1: abs_15 ~ cuantil_renta_15
## Model 2: abs_15 ~ cuantil_renta_15 + abs_11
##   Res.Df    RSS Df Sum of Sq    F    Pr(>F)    
## 1   2383 5444.6                                
## 2   2382 2647.3  1    2797.3 2517 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

El ANCOVA mejora respecto al modelo simple ponderado ampliamente, yu manteniendo significatividad. ### 2.6 Test de homogeneidad de pendientes

test_homogeneidad <- lm(abs_15 ~ cuantil_renta_15 * abs_11, data = elecciones, weights = censo_15)
anova(test_homogeneidad)
## Analysis of Variance Table
## 
## Response: abs_15
##                           Df Sum Sq Mean Sq   F value    Pr(>F)    
## cuantil_renta_15           4 7751.0 1937.74 1752.7836 < 2.2e-16 ***
## abs_11                     1 2797.3 2797.32 2530.3092 < 2.2e-16 ***
## cuantil_renta_15:abs_11    4   18.4    4.59    4.1511  0.002359 ** 
## Residuals               2378 2628.9    1.11                        
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

El test de homogeneidad de pendientes muestra una interacción estadísticamente significativa . Sin embargo, la magnitud de esta interacción (\(MS = 4.59\)) es despreciable frente a la potencia explicativa de la renta (\(MS = 1937\)) y la inercia histórica (\(MS = 2797\)). El p-valor, aunque bajo también es mayor que los de las variables por separado, y teniendo en cuenta el elevado valor de la muestra, se puede considerar irrelevante la importancia de la interacción.

Por tanto, aunque existen ligeras variaciones en la tendencia según el quintil, el modelo ANCOVA es una herramienta robusta y válida para estimar el impacto neto de la desigualdad económica en la participación electoral.

2.7 Medias ajustadas (aislando el efecto de la covariable)

medias_ajustadas <- emmeans(modelo_ancova, "cuantil_renta_15")
print(medias_ajustadas)
##  cuantil_renta_15 emmean      SE   df lower.CL upper.CL
##  Q1                0.363 0.00190 2382    0.359    0.367
##  Q2                0.340 0.00157 2382    0.337    0.343
##  Q3                0.315 0.00156 2382    0.312    0.318
##  Q4                0.308 0.00163 2382    0.305    0.312
##  Q5                0.308 0.00182 2382    0.304    0.311
## 
## Confidence level used: 0.95
plot(medias_ajustadas) + 
  coord_flip() + 
  theme_minimal() +
  labs(title = "Medias Ajustadas de Abstención", x = "Cuantil de Renta")

Las medias ajustadas (EMMeans) revelan que la renta tiene un impacto lineal en la participación hasta alcanzar el cuarto quintil. Mientras que en los niveles bajos y medios cada incremento de grupo de renta reduce significativamente la abstención, en los niveles altos (Q4 y Q5) el efecto se estabiliza en un 30.8%.

Esto sugiere que la brecha de participación neta atribuible exclusivamente a la renta actual entre secciones censales de menos y más renta es de 5.5 puntos. De esta manera, debemos interpretar la abstención elevada en las secciones de menos renta no como un comportamiento derivado de la menor renta actual exclusivamente, sino también de la baja participación histórica.

3. Conclusiones Finales

El presente estudio muestra un análisis detallado de la relación entre el nivel de renta y la desmovilización electoral en 2015, utilizando el ANCOVA para separar el efecto socioeconómico actual de la inercia histórica del territorio.


3.1 La “Inercia” como Factor Dominante

  • La inclusión de la abstención de 2011 como covariable ha transformado radicalmente la capacidad explicativa del modelo, elevando el coeficiente de determinación ajustado () del 56% al 80%.
  • Se confirma una fuerte persistencia del comportamiento electoral: por cada punto porcentual de abstención en el pasado, se espera un incremento neto de 0.75 puntos en el presente.

3.2 El Efecto Neto de la Renta y el “Efecto Techo”

  • Al controlar por el pasado electoral, la brecha de abstención entre el grupo más pobre (Q1) y el más rico (Q5) se reduce de un 15% bruto a un 5.5% neto.
  • Se observa un “efecto techo” de movilización: mientras que en los quintiles bajos (Q1 a Q3) cada incremento de renta reduce significativamente la abstención, en los niveles de renta alta (Q4 y Q5) la participación se estabiliza en una media ajustada de 30.8%, sugiriendo un límite natural a la movilización por motivos económicos.
  • Aunque se detectó una interacción significativa entre renta y pasado (p < 0.01), su impacto real es marginal frente a los efectos principales. Este fenómeno es atribuible a la elevada potencia estadística del modelo dado el gran tamaño muestral (N > 2300).

3.3 Implicación Sociológica

En conclusión, la desigualdad económica sigue siendo un motor activo de exclusión política. No obstante, el análisis demuestra que la mayor parte de la brecha observada no es un fenómeno coyuntural debido a menor renta actual, sino el resultado de una desmovilización estructural y heredada en los barrios con menores recursos.