Después de un proceso electoral como el vivido ayer, 22 de mayo, y más con los movimientos sociales de la semana anterior (acampadas en céntricas plazas de muchas ciudades), las tentaciones de extraños análisis post-electorales son habituales. Como lo mío no es la sociología, sino los datos, os dejo una función que realiza el reparto de escaños de acuerdo con el criterio de D’Hondt y otras variantes. Las sencillas matemáticas detrás de estos criterios de asignación de representantes se pueden ver en los enlaces anteriores.
La función en R que devuelve el reparto mediante el sistema de D’Hondt y variantes es la siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| reparto.dhondt < - function(votos, esc, inc=1) {
votos <- abs(votos)
esc <- abs(round(esc))
divisores <- seq(1, by=inc, length=esc)
tabdhondt <- outer(votos, divisores, "/")
colnames(tabdhondt) <- paste("div", 1:ncol(tabdhondt))
if (is.null(names(votos))) {
rownames(tabdhondt) <- LETTERS[1:length(votos)]
} else {
rownames(tabdhondt) <- names(votos)
}
if (ncol(tabdhondt) <= 10) print(tabdhondt)
last <- sort(tabdhondt, decreasing=TRUE)[esc]
elec <- apply(tabdhondt>=last, 1, sum)
return(elec)
} |
La función espera un vector numérico de votos en su primer argumento, el número de escaños/concejales/representantes a asignar en el segundo y un incremento para calcular los divisores del sistema de D’Hondt como tercer argumento. El criterio que se aplica en las elecciones españolas hace inc=1, que es el valor por defecto. Valores superiores de inc producen repartos más proporcionales. La función devuelve la distribución de representantes para los correspondientes elementos del vector de votos.
Ahora, un sencillo análisis. Los resultados de las seis candidaturas más votadas para el Ayuntamiento de Madrid, en forma de vector de R son:
vv < - c(PP=756952, PSOE=364600, IULV=163706, UPyD=119601, ECOLO=13425, CENB=10795) |
y el reparto que se obtiene de las 57 concejalías es el conocido:
> reparto.dhondt(vv, 57)
PP PSOE IULV UPyD ECOLO CENB
31 15 6 5 0 0 |
¿Y si el incremento de los divisores fuese mayor?
> reparto.dhondt(vv, 57, 2)
PP PSOE IULV UPyD ECOLO CENB
30 14 7 5 1 0
> reparto.dhondt(vv, 57, 3)
PP PSOE IULV UPyD ECOLO CENB
29 14 7 5 1 1 |
Es decir, con un incremento de divisores inc=3, los dos siguientes grupos en número de votos, Verdes de Madrid (ECOLO) y Ciudadanos en Blanco (CENB) podrían haber obtenido un representante cada uno a costa de PP y PSOE que verían reducida su representación en un concejal cada uno.
¿Y si los electores que votaron en blanco hubiesen votado a Ciudadanos en Blanco? En las elecciones al Ayuntamiento de Madrid se contabilizaron 43 292 votos blancos. Supongamos que la mitad hubiesen ido a parar a la candidatura que los "representa". Entonces:
> vv["CENB"] < - vv["CENB"]+(43292/2)
> reparto.dhondt(vv, 57)
PP PSOE IULV UPyD ECOLO CENB
31 15 6 4 0 1 |
En este caso, habría sido Izquierda Unida el partido que habría perdido un concejal que pasaría a Ciudadanos en Blanco.
Bueno, que disfrutéis la función, seguro que salen resultados curiosos al hacer política-ficción. Por cierto, recordad que no todas las candidaturas entran al reparto, deben superar (en elecciones municipales) un 5% del total de votos válidos (es decir, votos a partidos más votos en blanco). Así, ni ECOLO ni CENB han entrado en la distribución de representantes porque hacían falta un mínimo de 76 169 votos para el Ayuntamiento de Madrid.
Por otra parte, en algunos municipios pequeños no se aplica la distribución por el criterio de D'Hondt, porque se vota a personas (tipo listas abiertas), aunque dichas personas se presenten por cierto partido.