86400 – Blog de viajes

Cómo hacer una buena media en un sistema de votaciones: media bayesiana

[su_wiloke_sc_rating_chart title="¿Te gusta el artículo? ¡Valóralo!"]4.4 media basada en 7 votos[/su_wiloke_sc_rating_chart]

[su_wiloke_sc_company_website]He tenido que lidiar con muchos sistemas de votaciones a lo largo de mi vida como programador y siempre me he dado cuenta de un problema: los elementos que tienen pocos votos con mucha puntuación. Pondré un ejemplo para ilustrarlo mejor. Imaginemos que tenemos 2 elementos que pueden recibir votos:

La media aritmética, que es el sistema de votaciones que se usa en casi todos los sistemas de votaciones en páginas web, que es aquella que divide la suma de las votaciones entre el número de votos, daría un 8.59 para el primer elemento, y un 9.9 para el segundo elemento. Al realizar la típica lista «Top10», pondría al segundo elemento en primer puesto, ya que tiene una media aritmética mayor, pero no es lógico o justo para el primer elemento, que ha recibido muchos más votos, por tanto dispone de un universo de votaciones mucho más rico y leal a la nota que realmente tenga.

Para este tipo de casos y poder realizar una media más justa existe una solución basada en la media bayesiana. En muchos sistemas de votaciones en los que hace falta conocer, de la manera más fiel posible un ranking, uno de los elementos puede estar «viciado» por los pocos votos recibidos de mucha puntuación, como hemos visto en el segundo elemento del ejemplo. La media bayesiana es una técnica usada para reducir el ruido por estos elementos con tan pocas votaciones. De hecho, cuantos menos votos recibe un elemento, el resultado bayesiano más se acerca a la media global de todos ellos.

La fórmula es la siguiente:

Media = (v / (v+m)) × R + (m / (v+m)) × C

donde:

De esta forma se equilibran mucho mejor los pesos y la influencia de cada elemento respecto a los demás. El primer sumando (V/(V+M)) R indica el peso dado a la media propia, mientras que el segundo sumando (M/(V+M))*C es el peso dado a la media general. Si se obtienen muchos votos de un elemento, pesa más la propia media de ese elemento que la general, y viceversa, si tienes muy pocos votos, pesa más la media general. Otra forma de explicarlo es que, cuantos más votos tiene un elemento, menos deriva o se modifica el resultado bayesiano de la media aritmética de ese elemento.

Veamos un ejemplo con una tabla de datos real (con m = 50):

Elemento Media de votos (r) Votos recibidos (v) Media total (c) Media Bayesiana
2531 6.01 6700 5.33 6.007
1727 7.66 535 5.33 7.460
2135 7.57 367 5.33 7.300
1543 7.76 298 5.33 7.406
1633 4.18 262 5.33 4.360
1671 4.97 231 5.33 5.033
1462 4.55 209 5.33 4.700
2100 5.47 193 5.33 5.437
2309 7.01 180 5.33 6.645
2333 6.91 169 5.33 6.549
1691 6.14 158 5.33 5.944
2636 8.75 150 5.33 7.896
1882 6.94 144 5.33 6.522
2903 8.30 139 5.33 7.515
542 4.84 134 5.33 4.974
3810 9.03 128 5.33 7.990
1502 6.61 122 5.33 6.240
1903 7.06 117 5.33 6.541
2460 7.26 112 5.33 6.662
1074 5.90 105 5.33 5.711
2148 6.82 101 5.33 6.326
1576 5.85 96 5.33 5.673
1944 6.89 92 5.33 6.340
2303 6.77 87 5.33 6.243
1771 7.01 81 5.33 6.368
2459 5.77 74 5.33 5.591
618 5.07 69 5.33 5.179
2328 5.11 61 5.33 5.210
709 5.81 54 5.33 5.580
556 4.71 49 5.33 5.023
15 3.60 43 5.33 4.530
1170 3.62 37 5.33 4.601
1452 6.64 33 5.33 5.847
2656 9.52 29 5.33 6.864
2682 8.12 26 5.33 6.280
1437 6.39 23 5.33 5.661
1360 6.29 21 5.33 5.609
750 7.37 19 5.33 5.888
1999 6.94 18 5.33 5.754
2690 9.12 17 5.33 6.288
1231 5.73 15 5.33 5.420
1182 5.07 14 5.33 5.270
1345 7.31 13 5.33 5.734
961 6.50 12 5.33 5.553
2901 9.33 12 5.33 6.101
658 3.45 11 5.33 4.988
177 6.30 10 5.33 5.488
909 6.78 9 5.33 5.547
572 4.56 9 5.33 5.208
1244 6.00 8 5.33 5.418
2859 9.25 8 5.33 5.867
316 7.29 7 5.33 5.566
957 7.67 6 5.33 5.576
574 5.00 6 5.33 5.291
1009 7.80 5 5.33 5.550
652 4.20 5 5.33 5.223
1214 4.00 4 5.33 5.227
2939 9.50 4 5.33 5.635
837 8.67 3 5.33 5.515
2938 4.33 3 5.33 5.269
3132 6.00 3 5.33 5.364
348 6.50 2 5.33 5.371
3077 7.50 2 5.33 5.409
3413 5.50 2 5.33 5.332
197 7.00 1 5.33 5.358

NOTA: He tomado un valor de m = 50, por poner un ejemplo, pero se puede variar esta constante para maximizar o minimizar la influencia del número de votos de los elementos. Es bueno jugar con una m baja al principio e ir ajustando hasta encontrar un valor lo más aproximada al sentido común, y suele ser en torno al 1% del número de votos recibido por el elemento que más votos haya conseguido.

En la primera columna aparece el identificador numérico del elemento (he cogido estos datos de un sistema de más de 4000 elementos donde todos reciben votaciones, la imagen del día de Observatorio.info).

En la segunda aparece r, la media de votos aritmética de ese elemento, es decir, la suma de todas las puntuaciones que ha recibido ese elemento dividido entre el número de votos que ha recibido dicho elemento.

En la tercera columna v, que es simplemente los votos que ha recibido dicho elemento.

En la cuarta vemos c, que es la media global de todos los elementos del conjunto, es decir, la suma de todas las votaciones de todos ellos, dividido por el número de votos que han recibido todos los elementos.

Y en la quinta por fín, el resultado de la media bayesiana.

Como se puede apreciar y como se comentaba, cuantos más votos tiene un elemento (la tabla está ordenada así en descenso), menos se altera su media aritmética original, y mientras menos tiene, el resultado bayesiano modifica su valor acercándose más a la media global del conjunto.

Veamos un ejemplo de esta tabla que ilustra muy bien este sistema y su «justicia»:

En cambio, el primero de ellos, con la fórmula bayesiana obtiene un resultado de 6.645, mucho más justo y fiel ya que se ha formado con un mayor número de personas que fueron las que votaron, mientras que el segundo obtiene un resultado bayesiano de tan sólo 6.368, habiéndose variado más y acercándose más a la media global, por el poco peso que tiene los más de la mitad de los votos que recibió respecto al primero.

Todo esto se inició mientras que veía un ranking de cartelera, en donde, tras votar una película que no tenía ningún voto (porque fui el primero en votarla) con una puntuación de 9, se trasladó a ser «la mejor película votada por los usuarios», cuando en realidad, otras con muchas más votaciones estaban en puestos inferiores. Esta es la solución con la que he trabajado estos días para crear un sistema de votaciones mucho más justo para mi web de Observatorio y poder formar un ranking más acorde a la realidad. Espero haberme explicado bien y a partir de ahora, ya sabéis como hacer un sistema de votaciones con ranking algo más justo.

Más información en la Wikipedia: Media Bayesiana y en este documento

[tags]media, aritmética, votos, votación, ponderada, bayesiana[/tags]

Salir de la versión móvil