• 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
    • 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

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.

Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane
En Analytics Lane
Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane

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

  • Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane
  • Nuevo conversor de timestamp Unix en el laboratorio de Analytics Lane
  • Calculadora de Contrastes de Hipótesis: interpreta correctamente el p-valor y toma decisiones estadísticas con confianza
  • Calculadora de Tamaño del Efecto: la herramienta clave para entender cuánto importa realmente una diferencia
  • Simulador de DBSCAN: descubre cómo encontrar clusters reales (y ruido) sin fijar K
  • Conversor de Colores: convierte, compara y valida cualquier color en tiempo real
  • Analytics Lane lanza su Generador de UUIDs: identificadores únicos, seguros y listos para producción en segundos
  • 1200 publicaciones en Analytics Lane
  • Analytics Lane lanza su Conversor TIN ↔ TAE: la herramienta definitiva para entender el coste real de depósitos, préstamos e hipotecas

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

De la Regresión Logística al Scorecard: La Transformación Matemática

mayo 19, 2026 Por Daniel Rodríguez

Noticias

Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring

mayo 18, 2026 Por Daniel Rodríguez

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

mayo 14, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Gráficos de correlación en Seaborn: Mapas de calor y gráficos de pares publicado el julio 27, 2023 | en Python
  • Media, mediana y moda: Descubre cómo interpretar las medidas de tendencia central con ejemplos claros y sin complicaciones publicado el mayo 16, 2025 | en Ciencia de datos
  • Gráficos de barras en Matplotlib publicado el julio 5, 2022 | en Python
  • Cómo encontrar la posición de elementos en una lista de Python publicado el abril 12, 2021 | en Python
  • Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python) publicado el octubre 7, 2025 | en Herramientas, Productividad

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