• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Estadística
      • Calculadora del Tamaño Muestral en Encuestas
      • Calculadora de estadísticos descriptivos
      • Test de normalidad
      • Calculadora de contrastes de hipotesis
      • Calculadora de tamano del efecto
      • Simulador de Regresión Lineal con Ruido
      • Visualizador de PCA
      • Visualizador de Series Temporales
      • Simulador de Regresión Logística
      • Simulador de K-Means
      • Simulador de DBSCAN
      • Detector de la Ley de Benford
      • Ajuste de Curvas
      • Calculadora de Matrices
    • Probabilidad
      • Calculadora de Probabilidad de Distribuciones
      • Calculadora de Probabilidades de Lotería
      • Simulador del Problema de Monty Hall
      • Simulador de la Estrategia Martingala
    • Finanzas
      • Calculadora de Préstamos e Hipotecas
      • Conversor TIN ↔ TAE
      • Calculadora DCA con ajuste por inflación
      • Calculadora XIRR con Flujos Irregulares
      • Simulador FIRE (Financial Independence, Retire Early)
    • Negocios
      • CLV
      • Scoring
    • Herramientas
      • Formateador / Minificador de JSON
      • Conversor CSV ↔ JSON
      • Comparador y Formateador de Texto y JSON
      • Formateador y Tester de Expresiones Regulares
      • Inspector de JWT
      • Generador y verificador de hashes
      • Codificador / Decodificador Base64 y URL
      • Conversor de bases numericas
      • Conversor de Timestamp Unix
      • Conversor de colores
      • Generador de UUIDs
    • Juegos
      • Tres en Raya
      • Nim con Q-Learning
    • Más
      • Método D’Hondt
      • Generador de Contraseñas Seguras
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

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

Elecciones

septiembre 22, 2023 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 5 minutos

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.

La caverna del consumo, o cómo Greenspan miraba calzoncillos para hacer política monetaria – El bestiario de los indicadores económicos absurdos (parte 1)
En Analytics Lane
La caverna del consumo, o cómo Greenspan miraba calzoncillos para hacer política monetaria – El bestiario de los indicadores económicos absurdos (parte 1)

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.

Publicidad


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?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicidad


Publicaciones relacionadas

  • La caverna del consumo, o cómo Greenspan miraba calzoncillos para hacer política monetaria – El bestiario de los indicadores económicos absurdos (parte 1)
  • La vanidad del paisaje, o por qué un becario sale a contar grúas a Manhattan – El bestiario de los indicadores económicos absurdos (parte 2)
  • Augurios deportivos y portadas malditas, o cuando The Economist predice mejor al revés – El bestiario de los indicadores económicos absurdos (parte 3)
  • El bestiario de los indicadores económicos absurdos: El zoo patrio
  • El Binning en Credit Scoring: El Arte de Discretizar Variables
  • Las fórmulas con DNI, o cómo dividir cualquier cosa entre cualquier otra cosa puede acabar publicado en un titular serio – El bestiario de los indicadores económicos absurdos (parte 5)
  • Cómo comparar tendencias con gráficos de líneas en Matplotlib: guía práctica paso a paso
  • Analytics Lane lanza la versión 1.2 del laboratorio con nuevas herramientas de ajuste de curvas y cálculo matricial
  • Analytics Lane lanza la versión 1.3 del laboratorio con nuevas herramientas de evaluación de modelos y utilidades prácticas

Publicado en: Ciencia de datos Etiquetado como: Elecciones

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Las fórmulas con DNI, o cómo dividir cualquier cosa entre cualquier otra cosa puede acabar publicado en un titular serio – El bestiario de los indicadores económicos absurdos (parte 5)

julio 2, 2026 Por Daniel Rodríguez

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

julio 1, 2026 Por Daniel Rodríguez

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

junio 30, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Figura en la que se combina una gráfica de barras con las ventas por departamento y una gráfica de barra apilada con el detalle del departamento. Crear un gráfico de tarta con subcategorías detalladas mediante barras apiladas en Python publicado el octubre 14, 2024 | en Python
  • Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales publicado el mayo 12, 2026 | en Python
  • Buscar en Excel con dos o más criterios publicado el septiembre 7, 2022 | en Herramientas
  • Cómo usar SQLite3 con Pandas publicado el junio 3, 2024 | en Python
  • Ejecutar SQL Server en una máquina virtual VirtualBox publicado el abril 22, 2019 | en Herramientas

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.1 (11)

Aplicar el método D’Hondt en Excel

Comentarios recientes

  • bif en JSON en bases de datos: cuándo es buena idea y cuándo no
  • bif en Cómo desinstalar Oracle Database 19c en Windows
  • M. Pilar en Cómo eliminar las noticias en Windows 11 y recuperar tu concentración
  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2026 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto