用于对一组指数数据进行分级的统计方法

时间:2011-09-25 20:41:52

标签: php math statistics

我有一个PHP应用程序,允许用户指定国家/地区列表和产品列表。它告诉他们哪个零售商最接近。它使用类似于此的公式来做到这一点:

(匹配的国家数量/所选国家/地区数量)*(国家匹配的重要性)

+

(匹配的产品数量/所选产品数量)*(产品匹配的重要性)

*

(国家和解决方案匹配的重要性*(一致的匹配/可能的重合匹配数))

国家匹配的重要性为30%,[产品匹配的重要性]为10%,[国家和解决方案匹配的重要性]为2.5

所以简化它:(国家匹配+产品匹配)*乘数。

将其视为[他们是否在该国经营? +他们是否销售该产品?] * [他们是否在该国销售该产品?]

这为我们提供了每个零售商的匹配百分比,用于对搜索结果进行排名。

我的数据表看起来像这样:

id | country | retailer_id | product_id 
========================================
1  | FR      | 1           | 1          
2  | FR      | 2           | 1          
3  | FR      | 3           | 1          
4  | FR      | 4           | 1          
5  | FR      | 5           | 1          

直到现在它已经相当简单,因为它是一个二元决策。零售商要么在该国家经营,要么销售该产品,或者不销售。

但是,我现在被要求为系统增加一些复杂性。我已经获得了收入数据,显示了每个零售商在每个国家/地区销售的产品数量。数据表现在看起来像这样:

id | country | retailer_id | product_id | revenue
===================================================
1  | FR      | 1           | 1          | 1000
2  | FR      | 2           | 1          | 5000
3  | FR      | 3           | 1          | 10000
4  | FR      | 4           | 1          | 400000
5  | FR      | 5           | 1          | 9000000

我的问题是,我不希望零售商3的销售量是零售商1的十倍,使其成为搜索结果的十倍。同样,零售商5的匹配度不应该比零售商1好九千倍。我已经研究过使用均值,模式和中位数。我尝试过使用偏离平均值的方法。我很难过如何让大跳跃变得不那么重要。我对统计领域缺乏无知感。

帮助!

2 个答案:

答案 0 :(得分:0)

考虑使用log10()函数。与您所描述的一样,这减少了结果的直接缩放。如果您记录收入的log10(),那么收入大1000倍的人获得的分数只会大3倍。

答案 1 :(得分:0)

{阻尼'价值大幅增加的经典之作是logarithms。如果你看一下维基百科的文章,你会发现函数值最初增长得相当快,但那么就更少了。如另一个答案中所提到的,以10为基数的对数意味着每次将输入值乘以10,输出值都会增加 1 。类似地,每次将输入值乘以2时,带有基数2的对数将增加1。

如果你想削弱对数的效果,你可以考虑将它与线性函数结合起来,例如: f(x) = log2 x + 0.0001 x ...但是那个乘数需要非常仔细地调整,以便线性部分不会快速地掩盖对数部分。

提出这种加权本身就很棘手,特别是如果你不确切知道这个函数看起来是什么样子的话。但是,有一些程序可以进行曲线拟合,即你可以给它一对函数输入/输出和一个模板函数,程序会找到模板函数的好参数来逼近所需的曲线。因此,从理论上讲,你可以画出你的曲线,然后让程序找出一个好的公式。这也可能有点棘手,但我认为你可能会感兴趣。其中一个程序是开源工具QtiPlot