我正試圖找到最準確的函數來給我一個數據集內給定值的分位數。數據集將(可能)始終是指數分佈。當處理指數數據集時,是否使用mquantiles()是否準確?
我使用的方法如下(我道歉,如果編碼很差,因爲我真的基礎設施的人,而不是一個統計的傢伙,也不是每天DEV):
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
在我的研究,我注意到有幾個更高級的功能可供使用,如scipy.stats.[distribution type].ppf()
。
使用mquantiles()
的優勢是什麼?
有沒有一種方法可以有效地確定數據集中數據的分佈(這是我對scipy.stats.[distribution type]()
的關注)?
感謝,
馬特
[更新]
與討論後,「統計花花公子,」我相信,這種方法(他被稱爲「經驗方法」)僅僅是如果您不知道分配情況,則爲有效。要找到分佈,可以使用通過scipy.stats.ksone
和scipy.stats.kstwobign
顯示的Kolmogorov–Smirnov test來確定分佈,然後使用scipy.stats.[distribution type].ppf()
函數之一。他還表示,根本沒有關係,上述方法與完成所有這些工作一樣好,沒有多少回報。儘管他警告說,上述方法的優勢將隨着data
中的可用數據量的增加而增加(意味着情況反過來也是如此),但沒有人解決了針對小數據集應用法律的問題。
我會做的是考慮數據集的強度,並對我的結果加以權衡,並且認爲數據集「小」時它會更加模糊/重量更輕。什麼是「小」?我不肯定。
我仍然想找到其他人輸入有效使用ppf()與mquantile()。
感謝您的回覆。我在原來的問題中附加了更多的信息,因爲它涉及到確定數據所在的分佈。我應該使用一種方法來嘗試發現分佈並使用'ppf'函數嗎?或者這太昂貴了?我希望整合到這個系統中的系統將是一個接近實時的異常檢測機制。謝謝! – mbrownnyc
異常值檢測是一個不同的問題。你需要一個參考分佈來知道什麼是異常值(否則它只是尾部的常規隨機抽取)。參考分佈是過去的乾淨數據集(mquantiles)還是基於分佈假設(distr.ppf)取決於您的用例。此外,如果分佈變化不是很快,那麼不需要每次新觀察都更新參考分位數。一旦你擁有分位數,np.searchsorted是找到新的觀察位置相對於基準位置的最快速度。 – user333700
對於指數分佈也有特定的異常值測試,但我不記得參考。 – user333700