加权平均数

时间:2008-11-11 16:31:13

标签: php mysql statistics

我有一个现有的网络应用程序,允许用户根据他们的难度“评价”项目。 (0到15)。目前,我只是简单地取每个用户的意见,并直接呈现MySQL的平均值。但是,我(以及我的用户)越来越清楚,加权数字会更合适。

奇怪的是,几个小时的Google-ing并没有出现太多。我确实发现两篇文章显示了基于“贝叶斯过滤器”的网站范围评级系统(我部分理解)。 Here就是一个例子:

  

公式为:

     

WR =(V /(V + M))* R +(M /(V + M))* C

     

其中:

* 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

我喜欢这里根据每件商品的总票数增加加权的想法......但是,因为我的网站上的难度级别可以在不同的项目之间大幅度变化,取“C”(算术平均等级)在整个网站上)无效。

所以,重述我的问题:

使用MySQL,PHP或两者兼而有之,我试图从aritmetic手段获取:

(5 + 5 + 4)/3 = 4.67 (rounded)

...加权平均值:

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

2 个答案:

答案 0 :(得分:5)

这是一个关于如何直接在MySQL中执行此操作的简单示例。您当然需要在子查询上添加一个条件,以便仅获得相关项目的投票而不是所有投票。


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)


答案 1 :(得分:0)

什么表明加权更合适?你在算术平均值上看到什么对你没有帮助?我很好奇,因为看起来你正在寻找的答案可能不一定能满足你的需求。 (此外,16分制通常比大多数人需要的规模大得多;人们很少区分这么多分数,并倾向于围绕一组精选答案聚集他们的答案。)

您链接的概念将平均值拉向网站的均值;你的意思只是将自己拉向最常见的反应。通常情况下,如果您使用平均值并希望对响应进行加权,则可以根据受访者的某些内容进行加权(更多地考虑来自知识渊博的人,更频繁访问网站的人或其他类似事件的响应)。

您也可以考虑使用平均分数以外的计算,也可以考虑前N个百分比(给出前N个难度等级的受访者百分比)。

否则,你的平均值的公式是sum(response * count * count)/ sum(count * count)...

select sum(response*ct*ct)/sum(ct*ct) from
( select response, count(response) as ct from your_table group by response) data

如果语法不准确,请道歉,我没有工作中的MySQL。

请注意,您可能必须将ints的总和转换为浮点数;不确定在MySQL中究竟是如何工作的。在SQL Server中,您必须转换其中一个总和,以便它理解您不需要整数均值。