Python SciPy Stats 百分位得分
考虑下面这段Python代码:
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
这里的 kind 参数表示结果分数的解释方式。
现在,当我用Excel的PERCENTRANK函数处理相同的数据时,得到的结果是0.3333。这看起来是正确的,因为有3个值小于x=0.3963。
有人能解释一下为什么我得到的结果不一致吗?
2 个回答
这个问题有点奇怪,按照我的理解,他们在做不同的计算。如果用这种方式调用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
使用任何一种关键词,我得到的答案都是一样的。不过,这里没有考虑到数据中恰好等于查询值的那个值。你可以看看这个 VBA中的PercentRank算法,可能会有一些启发。
那么,哪个是对的呢?是Excel还是Scipy?
当我在scipy.stats中重写这个函数时,我发现有很多不同的定义,其中一些被包含在内。
一个基本的例子是,当我想根据分数给学生排名时。在这种情况下,分数包括所有学生,而percentileofscore则给出了在所有学生中的排名。主要的区别在于如何处理并列的情况。
Excel似乎是根据一个现有的标准来给学生排名,比如说某个分数在历史GRE评分中的排名。我不太清楚Excel是否会在分数不在现有列表中时去掉一个条目。
统计学中有一个类似的问题,就是“绘图位置”用于分位数。我在网上找不到好的参考资料。这是一个通用的公式 http://amsglossary.allenpress.com/glossary/search?id=plotting-position1。维基百科只有一小段内容: http://en.wikipedia.org/wiki/Q-Q_plot#Plotting_positions
文献中有很多关于不同选择b(甚至是第二个参数a的选择)的案例,这些选择对应于不同分布的不同近似值。有几个已经在scipy.stats.mstats中实现。
我认为这并不是哪个是对的问题,而是你想用它来做什么?以及在你的问题或领域中,常见的定义是什么?