jueves, julio 13, 2006

¿Se cruzan o no se cruzan?

La polémica desatada después del 2 de Julio por los resultados presentados por el PREP , así como el conteo distrital en las elecciones de presidente de la república sigue en pie. Muchos aseguran que en una elección tan cerrada es imposible que los candidatos punteros no intercambien posiciones constantemente. El autor de este blog se dio a la tarea de realizar un programa que simulara la repartición de votos en 2 variantes: La primera completamente aleatoria , donde se generaba un número del 1 al 7 que representaba cada una de las distintas opciones (PAN, Alianza PBT(PRD), AlianzaPM(PRI),PANAL,PASD , otros candidatos y votos nulos). El único caso por el que no se computa un voto es que ya no resten votos para ese apartado (de acuerdo a las cifras del IFE -cómputo distrital , no PREP OJO- ). En este caso los números se presentaban muy parejos hasta los 3 millones de votos donde comenzaba a caer la votación de PANAL , PASD, así como los nulos y los no registrados, cerca de los 12 millones comenzaban a despuntar PRD y PAN y se intercambiaban constantemente la cabeza del conteo.

Manejé un segundo escenario, donde no se daba la misma probabilidad a cada uno de los votos recibidos , si no que se repartían de acuerdo a los porcentajes reconocidos por el IFE ( -cómputo distrital , no PREP OJO-). Utilicé este segundo escenario al ser similar al utilizado por las casas encuestadoras( donde una muestra relativamente significativa puede reflejar el mismo comportamiento de la totalidad del sistema). Aquí el comportamiento del programa fue muy curioso. Utilicé 3 tamaños de muestra , 1000 , 10000 y 100000 votos. Y corrí 20 veces el programa para cada tamaño de muestra con los siguientes resultados.

Para 1000 votos :
El PRD estuvo arriba 16 veces.
El PAN estuvo arriba 3 veces.
En una ocasión quedaron empatados.

Para 10,000 votos:
El PRD estuvo arriba 6 veces.
El PAN estuvo arriba 14 veces.

Para 100,000 votos:
El PAN estuvo arriba las 20 veces.

Es decir que al ir aumentando el tamaño de la muestra los resultados iban mostrando siempre a la cabeza al que (según el cómputo distrital) obtuvo más votos.

Falta considerar un tercer escenario que es la influencia regional para la asignación de votos. Porcentaje por cada estado de cada partido y aleatorización de distrito computado (Se aceptan colaboraciones) . He de reconocer que los conocimientos matemáticos del autor de este blog no son amplios por lo que el modelo que escogí para la asignación aleatoria del voto probablemente no sea el idóneo , sin embargo de acuerdo a los resultados obtenidos por el programa , es matemáticamente posible que pese a lo cerrado de la elección no se crucen las líneas de los punteros después de determinado tiempo.

Les dejo el código del programa y les repito si alguien quiere mejorarlo o enviarme uno nuevo siéntase en libertad de hacerlo.

#!c:/perl/bin
use integer;

#hash con los votos reconocidos por el IFE.
#fuente : http://www.ife.org.mx/computos2006/centrales/ReportePresidenteEUM.html

$votos{"pan"}=15000284;

$votos{"prd"}=14756350;

$votos{"pri"}=9301441;

$votos{"panal"}=401804;

$votos{"pasd"}=1128850;

$votos{"noreg"}=297989;

$votos{"nulos"}=904604;


#hash de votos asignados por el sistema aleatoriamente.

$votosf{"pan"}=0;

$votosf{"prd"}=0;

$votosf{"pri"}=0;

$votosf{"panal"}=0;

$votosf{"pasd"}=0;

$votosf{"noreg"}=0;

$votosf{"nulos"}=0;


#total de votos para muestreo

$totalvotos=100000;



#Descomentar estas 5 líneas para cómputo total de la elección.
#while($votos{"pan"}>0 || $votos{"prd"}>0 || $votos{"pri"}>0 || $votos{"panal"}>0 || $votos{"pasd"} >0 || $votos{"noreg"}>0 || $votos{"nulos"}>0)
# {

# &sumVotonoP;

# }



#muestreo parcial de votos.

for($i=0;$i<=$totalvotos;$i++)
{
#Votos calculados sin probabilidad (completamente aleatorios).
#&sumVotonoP;

#Votos calculados con probabilidad.
&sumVotoPro
}

#resultados del muestreo.

print "Computo final : \n ";
print "PAN : " . $votosf{"pan"} . "\n";

print "PRD : " . $votosf{"prd"} . "\n";

print "PRI : " . $votosf{"pri"} . "\n";

print "PANAL : " . $votosf{"panal"} . "\n";

print "PASD : " . $votosf{"pasd"} . "\n";

print "NOREG : " . $votosf{"noreg"} . "\n";

print "NULOS : " . $votosf{"nulos"} . "\n";


###Rutina que hace completamente aleatorio la selección del voto
##al usar el randomize todas las opciones tienen la misma proabilidad.

sub sumVotonoP
{
#Generamos un número aleatorio entre 1 y 7 (7 rubros diferentes)
#Si ya no restan votos para la opción seleccionada se descarta este
#voto y se sigue.

$numero= int rand(7);
$numero++;


if($numero==1)
{
$partido="pan";

}
elsif($numero==2)
{
$partido="prd";
}

elsif($numero==3)
{
$partido="pri";
}

elsif($numero==4)
{
$partido="panal";
}


elsif($numero==5)
{
$partido="pasd";
}


elsif($numero==6)
{
$partido="noreg";
}


elsif($numero==7)
{
$partido="nulos";
}


if($votos{$partido})
{

$votos{$partido}--;
$votosf{$partido}++;
}




}


##En esta rutina se genera un numero aleatorio entre 1 y 10,000 y de acuerdo
## a los porcentajes obtenidos por los partidos se asgina un rango de ese universo
## por ejemplo al PAN se le asigna 3589 posiciones al obteher el 35.89% de la votación
## al PRD 3531 posiciones al obtener 35.31% del total.

sub sumVotoPro
{
#Generamos un número aleatorio entre 1 y 10000 (7 rubros diferentes)
#Si ya no restan votos para la opción seleccionada se descarta este
#voto y se sigue.

$numero= int rand(10000);
$numero++;


if($numero>=1 && $numero<=3589)
{
$partido="pan";

}
elsif($numero>=3590 && $numero<=7121)
{
$partido="prd";
}

elsif($numero>=7122 && $numero<=9348)
{
$partido="pri";
}

elsif($numero>=9349 && $numero<=9445)
{
$partido="panal";
}


elsif($numero>=9446 && $numero<=9716)
{
$partido="pasd";
}


elsif($numero>=9717 && $numero<=9788)
{
$partido="noreg";
}


elsif($numero>=9789 && $numero<=10005)
{
$partido="nulos";
}


if($votos{$partido})
{

$votos{$partido}--;
$votosf{$partido}++;
}




}