• APUNTES
    Qué probabilidad tiene cada resultado en una votación SI/NO (ej.REFERÉNDUM).

Nacho Coll

Enterprise Architect / AWS Evangelist
linkedin
  • Volver
Test Resultados - utilizando una función recursiva que simula el recuento de votos -
Número de votantes: (prueba con 2 votantes primero para ver qué resultados da)  
 0 COMBINACIONES GENERADAS (objetivo: 0)
Generamos con una función recursiva que simula el recuento de votos todas las combinaciones posibles.
Una vez generadas todas las combinaciones, contamos cuántos SI y cuántos NO hay en cada una.
RESULTADO CAMINOS PROBABILIDAD
Método

Hace poco surgió una controversia sobre la probabilidad del resultado en una votación SI/NO de la @cupnacional, en la que resultó un empate de 1515 votos a favor y 1515 votos en contra. A priori, el sentido común inmediato nos dice que es una opción muy poco probable. La verdad es que me picó la curiosidad, y como no recuerdo la estadística que estudié en su día, busqué el resultado "a lo bruto" imaginando el escrutinio, sacando papeleta a papeleta (SI, NO) y teniendo en cuenta lo giguiente:
  • Cada voto es 'independiente', es decir, el voto de 'Javier' no influye en el de 'Maria',
  • Una vez relizada la votación, teniendo todas las papeletas en la mesa de recuento, el orden del recuento no modifica el resultado,
  • Dado lo anterior, la probabilidad de un resultado es la suma de la probabilidad de todos los caminos (formas de hacer el recuento) posibles a ese resultado.
El objetivo entonces es obtener la lista de caminos posibles (combinaciones) y para cada combinación contar cuántos SI y cuántos NO hay. En este caso, y aquí viene lo de "a lo bruto", con una función recursiva:

var voto = function (combinacion) {
  if (combinacion.length != numVotantes) { // si todavía no hemos contado todos los votos, la siguiente papeleta puede ser un SI o un NO ;)
       voto(combinacion + "S"); // la siguiente papeleta es un SI
       voto(combinacion + "N"); // la siguiente papeleta es un NO
   } else { // Si ya hemos contado todos los votos, hacemos el recuento para esta combinación.
       var SIs = (combinacion.match(/S/g) || []).length; // cuantos SIs
       var NOs = (combinacion.match(/N/g) || []).length; // cuantos NOs
       almacenarResultado(SIs,NOs); // sumamos +1 al resultado SIs/NOs de esta combinación (recuento)
       return;
  }
};
Para iniciar el recuento (generación de todas las combinaciones posibles) llamámos a la función recursiva con las 2 únicas opciones para la primera papeleta: voto("S") y voto("N"). La función recursiva no se detendrá hasta generar todas las formas de recuento posible.

Nota para coders:
He tenido que convertir la función recursiva a iterativa, ya que los browsers sólo soportan N llamadas recursivas. Aún así, dado que existen 2^num-votantes combinaciones para encontrar el resultado, el recuento de votos es muy lento y queda pendiente optimizar o cambiar de estrategía ;). Comentar también que para no bloquear el UI, he utilizado https://github.com/Katochimoto/setImmediate.

Referencias Relacionadas (Estadística)
  • Binomial Distribution Formula: What is it and How to use it
  • Binomial distribution

Algunas referencias sobre el caso de la votación de la CUP y la controversia generada:
  • Així es va fer el recompte a l'assemblea de la CUP
  • Quina probabilitat hi havia que l'assemblea de la CUP acabés en empat?
  • La teoria de la probabilitat i l’Assemblea de la CUP
  • Quines probabilitats hi havia que es produís un empat a l'assemblea de la CUP?
  • UN ENGINYER, UN MATEMÀTIC, UN PSICÒLEG I UN CATALÀ DISCUTINT LA PROBABILITAT QUE L’ASSEMBLEA DE LA CUP HAGI ACABAT EN EMPAT

Bueno, ya me he desquitado.