2015-09-17 79 views
2

我有一個經驗分佈,我試圖用numpy來擬合T分佈,並用matplotlib作圖。T分佈的奇怪行爲

這裏是我無法理解:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import t 

arr = np.array([140, 36, 44, 24, 15, 48, 19, 2, 84, 6, 70, 3, 20, 6, 133, 23, 30, 7, 37, 165]) 

params = t.fit(arr) 

mean = arr.mean() 
std = arr.std() 

r = np.arange(mean - 3 * std, mean + 3 * std, 0.01) 

pdf_fitted = t.pdf(r, *params[0:-2], loc=params[-2], scale=params[-1]) 
plt.plot(r, pdf_fitted) 

plt.plot([mean, mean], [0, max(pdf_fitted)]) 

plt.show() 

該地塊:

enter image description here

綠線是實證數據的平均值,而藍線是裝T分佈到相同的數據。

問題是經驗均值和分佈的峯值不匹配。按照預期,當我將normal分配適用於相同的數據時,我會與綠線和分佈的峯值完美匹配。現在

,展望Wikipedia T distribution

t分佈是對稱的,鐘形,就像普通的 分佈,但有較重的尾巴......

因爲它說它是symmetric我期望我的意思和峯值完美匹配,但事實並非如此。

我的問題是:我的Python代碼有什麼問題嗎?或者它是T分配的預期行爲?如果是,爲什麼?如果不是,我在做什麼錯我的代碼?

+2

快速回答:重點是在報價中**重尾巴**。擬合t分佈比正常分佈對尾巴的重量更輕。將前三個觀察值修剪爲「異常值」使得正常估計值更接近於t stats.norm.fit(np.sort(arr)[: - 3]) - >(27.882352941176471,22.712738983018465)''。另一個跡象表明:中位數遠低於數據中的平均值。 – user333700

+0

是的,請注意你有'arr.mean()== 45.6','np.median(arr)== 27.0'。所以。 。 。這不是一個Python問題;這是一個數學問題。 – dbliss

回答

3

就我所見,Python代碼中沒有任何錯誤;實際上,這是一個很好的例子,用來說明學生的分佈與高斯分佈相比的魯棒性。指數族分佈(高斯,指數,二項式,泊松等)的一個特徵是它們的尾部非常細,這意味着當您偏離平均值時,pdf將呈指數下降。這個特性給了他們很好的理論性質,但是往往是將它們應用於真實世界分佈建模的瓶頸,在這些數據集中出現了異常值。因此,發佈是一種流行的選擇,因爲觀察數據集中的幾個異常值不會影響您的推論。在您的示例中,將原始數據集考慮爲除三個高離羣值之外的所有點。但是,這些異常值是在一些嘈雜的過程中引入的。統計推斷的目的是描述原始數據集的屬性(比如平均值),所以假設你在這種情況下使用了高斯,那麼你會嚴重高估真實平均值。如果在這種情況下使用了t,它將與您的噪聲樣本的平均值不匹配,但不管異常值如何,它都會對原始真實均值進行更精確的估計。