php - secundaria - para que sirve la media ponderada
Media ponderada (2)
¿Qué dejó en claro que la ponderación sería más apropiada? ¿Qué estás viendo en una media aritmética que no es útil para ti? Tengo curiosidad porque parece que la respuesta que buscas podría no necesariamente satisfacer tus necesidades de la mejor manera. (Además, una escala de 16 puntos es típicamente mucho más grande que lo que la mayoría de la gente necesita, las personas rara vez diferencian entre tantos puntos y tienden a agrupar sus respuestas alrededor de un grupo selecto de respuestas).
El concepto al que vinculó lleva la media hacia la media del sitio; tu media simplemente se dirige hacia la respuesta más común. Normalmente, si utiliza una media y desea ponderar las respuestas, lo haría en función de algo sobre los encuestados (poniendo más peso en las respuestas de las personas más conocedoras, las personas que frecuentan el sitio más, u otras cosas por el estilo).
También podría considerar usar cálculos distintos de los puntajes promedio, tal vez un porcentaje de N-box superior (porcentaje de encuestados que dan las calificaciones de dificultad N superiores).
De lo contrario, la fórmula para su media es suma (respuesta * conteo * conteo) / suma (conteo * conteo) ...
select sum(response*ct*ct)/sum(ct*ct) from
( select response, count(response) as ct from your_table group by response) data
Disculpas si la sintaxis no es exacta, no tengo MySQL en el trabajo.
Tenga en cuenta que puede que tenga que convertir las sumas de enter a flotantes; no estoy seguro exactamente cómo funciona eso en MySQL. En SQL Server, debe lanzar una de las sumas para que comprenda que no desea una media integral.
Tengo una aplicación web existente que permite a los usuarios "calificar" los artículos en función de su dificultad. (0 a 15). Actualmente, simplemente estoy tomando el promedio de la opinión de cada usuario y presentando el promedio directamente de MySQL. Sin embargo, cada vez es más claro para mí (y para mis usuarios) que ponderar los números sería más apropiado.
Por extraño que parezca, algunas horas de Google no han aparecido demasiado. Encontré dos artículos que mostraban sistemas de calificación en todo el sitio basados en "filtros Bayesianos" (que entiendo parcialmente). Aquí hay un ejemplo:
La fórmula es:
WR = (V / (V + M)) * R + (M / (V + M)) * C
Dónde:
* WR=Weighted Rating (The new rating) * R=Average Rating (arithmetic mean) so far * V=Number of ratings given * M=Minimum number of ratings needed * C=Arithmetic mean rating across the whole site
Me gusta la idea aquí de aumentar la ponderación en función del número total de votos por elemento ... sin embargo, porque los niveles de dificultad en mi sitio pueden variar drásticamente de un elemento a otro, tomando "C" (calificación media aritmética en todo el sitio) no es válido.
Entonces, reafirma mi pregunta:
Usando MySQL, PHP o ambos, intento obtener de la media aritmética:
(5 + 5 + 4)/3 = 4.67 (rounded)
... a una media ponderada:
rating / weight
5 / 2 (since it was given 2 times)
5 / 2
4 / 1
(sum[(rate * weight)])/(sum of weights)
(5 * 2) + (5 * 2) + (4 * 1) / (2 + 2 + 1)
(24)/(5)
= 4.8
Este es un ejemplo simple de cómo hacerlo en MySQL directamente. Por supuesto, deberá agregar una condición en la subconsulta para obtener solo los votos para el elemento relevante en lugar de todos los votos.
mysql> create table votes( vote int); Query OK, 0 rows affected (0.01 sec) mysql> insert into votes values (5),(5),(4); Query OK, 3 row affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from votes; +------+ | vote | +------+ | 5 | | 5 | | 4 | +------+ 3 rows in set (0.00 sec) mysql> select vote,count(vote),vote*count(vote) from votes group by vote; +------+-------------+------------------+ | vote | count(vote) | vote*count(vote) | +------+-------------+------------------+ | 4 | 1 | 4 | | 5 | 4 | 20 | +------+-------------+------------------+ 2 rows in set (0.00 sec) mysql> select sum(vt)/sum(cnt) FROM (select count(vote)*count(vote) as cnt,vote*count(vote)*count(vote) as vt from votes group by vote) a; +------------------+ | sum(vt)/sum(cnt) | +------------------+ | 4.8000 | +------------------+ 1 row in set (0.00 sec)