Statistics 处理指数数据集时,使用mquantiles()是否准确?

Statistics 处理指数数据集时,使用mquantiles()是否准确?,statistics,scipy,outliers,quantile,Statistics,Scipy,Outliers,Quantile,我试图找到最精确的函数,在数据集中给出给定值的分位数。数据集(可能)总是呈指数分布 我使用的方法如下(如果编码很差,我很抱歉,因为我实际上是一个基础设施人员,不是统计人员,也不是日常开发人员): 在我的研究过程中,我注意到有几个更高级的函数可以使用,比如scipy.stats.[distribution type].ppf() 与mquantiles()相比,使用这些工具有什么好处 是否有一种方法可以有效地确定数据集中数据的分布(这是我关心的scipy.stats。[分布类型]()) 谢谢 马特

我试图找到最精确的函数,在数据集中给出给定值的分位数。数据集(可能)总是呈指数分布

我使用的方法如下(如果编码很差,我很抱歉,因为我实际上是一个基础设施人员,不是统计人员,也不是日常开发人员):

在我的研究过程中,我注意到有几个更高级的函数可以使用,比如
scipy.stats.[distribution type].ppf()

mquantiles()
相比,使用这些工具有什么好处

是否有一种方法可以有效地确定数据集中数据的分布(这是我关心的
scipy.stats。[分布类型]()

谢谢

马特

[更新]

在与一位“统计专家”讨论后,我相信如果你不知道分布情况,这种方法(他称之为“经验方法”)同样有效。要查找分布,可以使用通过和显示的来确定分布,然后使用
scipy.stats.[distribution type].ppf()函数之一。他还说,这一点都不重要,上面的方法和做所有这些工作一样好,报酬很少。尽管他警告说,上述方法的强度将随着
数据中可用数据量的增加而增加(这意味着反过来也是正确的),但还没有人解决对小数据集应用法律的问题

我要做的是,考虑数据集的强度,并对结果进行加权,当数据集“小”时,它会更模糊/重量更小。什么是“小的”?我还不确定。


我仍然希望找到其他人关于有效使用ppf()和mquantile()的意见。

ppf
根据分布的参数为您提供特定分布的分位数。例如,您可以将数据拟合为指数分布,然后使用
ppf
和估计参数来获得分位数

当您使用mquantiles时,您不会假定您有一个特定的发行版


估计给定分布的参数并使用
ppf
将比mquantiles获得更好的结果,方差更低,如果您的数据确实来自该分布,或者该分布至少是一个很好的近似值。

ppf
根据分布参数为您提供特定分布的分位数。例如,您可以将数据拟合为指数分布,然后使用
ppf
和估计参数来获得分位数

当您使用mquantiles时,您不会假定您有一个特定的发行版


估计给定分布的参数并使用
ppf
将比mquantiles提供更好的结果,方差更低,如果您的数据确实来自该分布,或者该分布至少是一个非常好的近似值。

感谢您的回复。我已经在我的原始问题后面附加了一些更多的信息,因为它与确定数据驻留的分布有关。我是否应该使用一种方法来尝试发现分布,然后使用
ppf
功能?还是太贵了?我希望将其集成到一个近乎实时的异常检测机制中。谢谢异常值检测是另一个问题。您需要一个参考分布来了解异常值可能是什么(否则它只是尾部的一个常规随机抽取)。参考分布是过去的干净数据集(mquantiles)还是基于分布假设(distr.ppf),取决于您的用例。此外,如果分布变化不是很快,则不需要使用每个新观测更新参考分位数。有了分位数后,np.searchsorted是最快找到新观测相对于基准的位置的方法。也有针对指数分布的特定异常值测试,但我不记得参考。感谢您的回复。我已经在我的原始问题后面附加了一些更多的信息,因为它与确定数据驻留的分布有关。我是否应该使用一种方法来尝试发现分布,然后使用
ppf
功能?还是太贵了?我希望将其集成到一个近乎实时的异常检测机制中。谢谢异常值检测是另一个问题。您需要一个参考分布来了解异常值可能是什么(否则它只是尾部的一个常规随机抽取)。参考分布是过去的干净数据集(mquantiles)还是基于分布假设(distr.ppf),取决于您的用例。此外,如果分布变化不是很快,则不需要使用每个新观测更新参考分位数。有了分位数后,np.searchsorted是最快找到新观测相对于基准的位置的方法。也有针对指数分布的特定异常值测试,但我不记得参考。
import sys, scipy, numpy
from matplotlib import pyplot
from scipy.stats.mstats import mquantiles

def FindQuantile(data,findme):
    print 'entered FindQuantile'
    probset=[]
    #cheap hack to make a quick list to get quantiles for each permille value]
    for i in numpy.linspace(0,1,10000):
            probset.append(i)

    #http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.mquantiles.html
    quantile_results = mquantiles(data,prob=probset)
    quantiles = []
    i = 0
    for value in quantile_results:
            print str(i) +  ' permille ' + str(value)
            quantiles.append(value)
            i = i+1
    #goal is to figure out which quantile findme falls in:
    i = 0
    for quantile in quantiles:
            if (findme > quantile):
                    print str(quantile) + ' is too small for ' + str(findme)
            else:
                    print str(quantile) + ' is the quantile value for the ' + str(i) + '-' + str(i + 1) + ' permille quantile range. ' + str(findme) + ' falls within this range.'
                    break
            i = i + 1