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.
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).
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 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.
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.
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).
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.#N/A,
N/D, etc.) y aplicamos na.omit() para
garantizar que el modelo de regresión trabaje sobre una matriz
completa.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
##
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.
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.
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.
Finalmente, confirmamos estadísticamente si incluir la covariable mejora la explicación de los datos y extraemos las medias puras ajustadas.
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.
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.
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.
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.