2011-11-15 36 views
3

考虑以下Python代码:Python的SciPy的统计percentilofscore

In [1]: import numpy as np 
In [2]: import scipy.stats as stats 
In [3]: ar = np.array([0.8389, 0.5176, 0.1867, 0.1953, 0.4153, 0.6036, 0.2497, 0.5188, 0.4723, 0.3963]) 
In [4]: x = ar[-1] 
In [5]: stats.percentileofscore(ar, x, kind='strict') 
Out[5]: 30.0 
In [6]: stats.percentileofscore(ar, x, kind='rank') 
Out[6]: 40.0 
In [7]: stats.percentileofscore(ar, x, kind='weak') 
Out[7]: 40.0 
In [8]: stats.percentileofscore(ar, x, kind='mean') 
Out[8]: 35.0 

参数表示导致分数的解释。

现在,当我使用Excel的PERCENTRANK函数和相同的数据时,我得到了0.3333。这似乎是正确的,因为有3个值小于x = 0.3963。

有人可以解释为什么我得到不一致的结果吗?

+0

我不认为1/3是一个长度为10的输入数组的合理结果。(注意''在[6]'可能使用'kind ='rank''。我认为你没有两个不同的结果具有相同的参数。) –

+0

你说得对,我在'In [6]'中使用'kind ='rank''。复制/粘贴错误。我编辑了这篇文章。 –

+1

好吧,正如我之前所说的:我认为你展示的所有结果都符合预期,但Excel的结果很奇怪。由于我不知道你在Excel中做了什么,我不能评论奇怪的结果。 –

回答

1

当我在scipy.stats中重写了这个函数时,我发现了很多不同的定义,其中一些定义包括在内。

基本的例子是当我想给学生评分时。在这种情况下,分数包括所有学生,而百分比分数给出所有学生的排名。主要区别在于如何处理关系。

Excel似乎使用如何将学生与现有比例相对排名,例如什么是历史GRE比例上的分数排名。我不知道如果excel下降一个条目,如果分数不在现有的列表中。

统计学中类似的问题是分位数的“绘制位置”。我在互联网上没有找到很好的参考。这里是一个通式http://amsglossary.allenpress.com/glossary/search?id=plotting-position1 维基百科只具有短的一段:http://en.wikipedia.org/wiki/Q-Q_plot#Plotting_positions

文献有大量B的不同的选择(或甚至一第二参数的的选择)的情况下,这对应于用于不同不同的逼近的分布。有几个是在scipy.stats.mstats中实现的。

我不认为这是一个正确的问题。这是,你想用它来做什么?什么是你的问题或你的领域的常见定义?

+0

我正在使用代码在财务应用程序中。基本上我正在建立指标并取得用户定义窗口的百分比。指标然后说买入或卖出。有趣的是,我试图在VBA中复制代码,所以不幸的是,由于scipy和Excel之间的差异,单元测试失败了。再次测试时,差异会随着时间的推移产生很大的盈亏差异。 –

+0

这是一个很好的观点,它不是一个正确的问题,但是在scipy中提供了四种方法。他们都没有复制Excel的算法? –

+0

我一直在寻找excel的行为(我没有),但它看起来像他们也改变了他们的行为http://office.microsoft.com/en-us/excel-help/percentrank-inc-function- HP010335694.aspx http://office.microsoft.com/en-us/excel-help/percentrank-inc-function-HP010335694.aspx从头开始编写兼容的函数是可能的,但除了基于VBA的基准测试之外,I我不确定这很有道理。 – user333700

1

这是一个奇怪的,我可以告诉他们正在做不同的计算,Scipy会重现excel结果,如果这样调用。

In [1]: import numpy as np 
In [2]: In [2]: import scipy.stats as stats 
In [3]: In [3]: ar = np.array([0.8389, 0.5176, 0.1867, 0.1953, 0.4153, 0.6036, 0.2497, 0.5188, 0.4723, 0.3963]) 
In [4]: In [4]: x = ar[-1] 
In [5]: stats.percentileofscore(ar[:-1], x, kind='mean') 
Out[5]: 33.333333333333336 

使用任何种类的关键字,我得到了同样的答案。这会使数据中的值与查询完全相同。看看这个PercentRank algorithm in VBA,因为它可能有点洞察力。

那么哪个是对的? Excel或Scipy?