Ciencia de datos

El método Sainte-Laguë y su implementación en Python

En los sistemas electorales de representación proporcional es necesario utilizar un algoritmo para asignar los escaños de las circunscripciones a los partidos o listas electorales. Convirtiendo así los votos en escaños. El método Sainte-Laguë, también conocido como el método Webster o el método de cociente y resto, es la opción que se utiliza en países como Alemania, Noruega, Suecia o Dinamarca. Siendo un método similar en funcionamiento al D’Hondt en el que solamente se usan divisores impares, lo que hace que los partidos más votados reciban menos escaños. En esta entrada se va a ver las bases del método Sainte-Laguë y como se puede implementar en Python.

Fundamentos del método Sainte-Laguë

El método Sainte-Laguë es un sistema para asignar escaños en sistemas de representación proporcional similar al método D’Hondt. La principal diferencia es que solamente usa divisores impares para calcular los cocientes que determinarán la asignación de escaños, esto es, 1, 3, 5, … Lo que debería favorecer a los partidos más pequeños respectó al al método D’Hondt. El procedimiento para asignar los escaños según el método Sainte-Laguë es:

  1. Votos obtenidos por cada partido: Al igual que en el método D’Hondt, primero se recopilan los resultados electorales y se cuentan los votos obtenidos por cada partido o lista electoral.
  2. Divisor inicial: A diferencia del método D’Hondt, el método Sainte-Laguë utiliza un divisor inicial de números impares, comenzando con el número 1, y luego se incrementa de forma secuencial (3, 5, 7, etc.). Los divisores impares tienden a favorecer a los partidos más pequeños.
  3. Cálculo de cocientes: Se divide el número de votos obtenidos por cada partido entre el divisor actual para obtener un cociente. Este cociente representa cuántas veces el partido ha superado el divisor. \textrm {Cociente} = \frac{\textrm{Votos del partido}}{\textrm{Divisor actual}}
  4. Asignación de escaños: El escaño se asigna al partido que tenga el cociente más alto en cada ronda. Es decir, el partido que haya obtenido más votos en relación con el divisor actual. Ese partido recibe un escaño.
  5. Actualización del divisor: Después de asignar un escaño, se actualiza el divisor para el siguiente cálculo. El divisor se incrementa en 2 unidades. \textrm{Divisor actualizado} = \textrm{Divisor actual} + 2
  6. Repetición del proceso: Los pasos 3 al 5 se repiten hasta que se asignan todos los escaños disponibles.

El método Sainte-Laguë también se puede utilizar con un umbral electoral para evitar que los partidos que no superan un cierto porcentaje de votos obtengan escaños.

Implementación en Python del método Sainte-Laguë

El método Sainte-Laguë solamente incluye un cambio respecto al método D’Hondt, el uso de divisores impares. Un cambio que se puede introducir fácilmente en la función implementada la semana pasada para el método D’Hondt. Lo que se muestra en el siguiente código.

def sainte_lague_method(votes, num_seats):
    """
    Método para aplicar el método Sainte-Laguë y obtener la asignación de escaños.
    
    Parámetros
    ----------
        votes : array-like, shape (num_parties, )
            Una lista o array con los votos obtenidos por cada partido.
            
        num_seats : int
            Número total de escaños a asignar.

    Retorna
    -------
        seats : array, shape (num_parties,)
            Una lista con el número de escaños asignados a cada partido.
    """
    num_parties = len(votes)

    # Inicializar la asignación de escaños a cero
    seats = [0] * num_parties

    # Realizar el proceso de asignación de escaños
    for _ in range(num_seats):
        max_index = max(range(num_parties), key=lambda i: votes[i] / (2 * seats[i] + 1))
        seats[max_index] += 1

    return seats

En este ejemplo lo primero que se hace es calcular el número de partidos en base a la lista de votos. Luego se crea una lista de escaños para cada uno de los partidos inicializada a cero. Finalmente, se hace una iteración en la que se asignan los escaños a la lista con los restos más altos.

Notase que la única diferencia con el método de D’Hondt se encuentra en la línea 25. En esta línea, para el método de D’Hondt el divisor era seats[i] + 1, donde seats[i] es el número de escaños asignados hasta ese momento a la lista i. Para el método Sainte-Laguë se usa 2 * seats[i] + 1.

Evaluación de los resultados y comparación con el método D’Hondt

Se puede evaluar la implementación del método Sainte-Laguë y cómo varían los resultados en comparación con el método de D’Hondt. Por ejemplo, se puede ver en una circunscripción pequeña en la que solamente se reparten 4 escaños. (El código de la función dhondt_method y sus detalles se pueden ver en esta entrada o en el apéndice).

votes = [15000, 12000, 8000, 6000, 2000, 1200]

print("D'Hondt:      ", dhondt_method(votes, 4))
print("Sainte-Laguë: ", sainte_lague_method(votes, 4))
D'Hondt:       [2, 1, 1, 0, 0, 0]
Sainte-Laguë:  [1, 1, 1, 1, 0, 0]

En este ejemplo se puede ver como el método D’Hondt beneficia al partido más votado con un escaño adicional respecto a lo que ofrece el método Sainte-Laguë. Escaño que pierde la cuarta lista. Esto es así porque a la hora de repartir el último escaño el método de D’Hondt 2 como divisor para el primer partido (15.000 / 2 = 7500), mientras que el Sainte-Laguë usar 3 (15.000 / 3 = 5000). Por lo que el método D’Hondt asigna el último escaño al primer partido porque el cociente supera a los 6000 del cuarto, lo que no es así en el caso del método Sainte-Laguë.

Usando el mismo número de votos, si se repartieran 10 escaños no existirá diferencia entre el método D’Hondt y el de Sainte-Laguë. Lo que se puede ver en el siguiente ejemplo.

print("D'Hondt:      ", dhondt_method(votes, 10))
print("Sainte-Laguë: ", sainte_lague_method(votes, 10))
D'Hondt:       [4, 3, 2, 1, 0, 0]
Sainte-Laguë:  [4, 3, 2, 1, 0, 0]

Si se repartieran 35 escaños, habría un pequeño baile entre los partidos minoritarios. Aunque el reparto es similar.

print("D'Hondt:      ", dhondt_method(votes, 35))
print("Sainte-Laguë: ", sainte_lague_method(votes, 35))
D'Hondt:       [12, 10, 6, 5, 1, 1]
Sainte-Laguë:  [12, 9, 6, 5, 2, 1]

En este caso el segundo partido pierde un escaño que recae sobre el quinto.

Conclusiones

El método Sainte-Laguë es una alternativa al método D’Hondt para asignar los escaños en un sistema electoral. Como se ha visto en los ejemplos, el método Sainte-Laguë beneficia a los partidos pequeños respecto a los grandes. Algo que se aprecia especialmente en las circunscripciones pequeñas donde hay pocos asientos en juego.

Apéndice

La implementación de la función dhondt_method que se explicó en una publicación sobre el método D’Hondt es:

def dhondt_method(votes, num_seats):
    """
    Método para aplicar el método D'Hondt y obtener la asignación de escaños.

    Parámetros
    ----------
        votes : array-like, shape (num_parties, )
            Una lista o array con los votos obtenidos por cada partido.
            
        num_seats : int
            Número total de escaños a asignar.

    Retorna
    -------
        seats : array, shape (num_parties,)
            Una lista con el número de escaños asignados a cada partido.
    """
    num_parties = len(votes)

    # Inicializar la asignación de escaños a cero
    seats = [0] * num_parties

    # Realizar el proceso de asignación de escaños
    for _ in range(num_seats):
        max_index = max(range(num_parties), key=lambda i: votes[i] / (seats[i] + 1))
        seats[max_index] += 1

    return seats

Imágenes: Unsplash (Arnaud Jaegers)

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: Elecciones

Recent Posts

Analytics Lane lanza ScoreFlow, un SaaS para construir y desplegar scorecards de crédito

En Analytics Lane seguimos evolucionando nuestras herramientas y damos un paso más con el lanzamiento…

3 días ago

DBSCAN y la selección de ε: teoría, intuición y aplicación práctica

Cuando hablamos de clustering, lo primero que viene a la mente suele ser k-means. Pero…

4 días ago

El bestiario de los indicadores económicos absurdos: El zoo patrio

Cualquier país desarrollado tiene sus propios indicadores folclóricos. España, por motivos que tienen mucho que…

1 semana ago

Por qué el banco te ofrece un 3% TAE y no es lo que parece

Entras a la web de tu banco. En la página principal, un banner llamativo: “Depósito…

2 semanas ago

Analytics Lane lanza la versión 1.3 del laboratorio con nuevas herramientas de evaluación de modelos y utilidades prácticas

Seguimos ampliando el laboratorio de Analytics Lane con el lanzamiento de la versión 1.3, disponible…

2 semanas ago

This website uses cookies.