考慮從未知樣本中採樣的整數值資料集連續分佈。我們試圖確定遇到大於任何給定閾值的值的機率(p 值)。為了準確估計這些機率,必須將我們的經驗分佈擬合到適當的理論分佈。本文探討如何在 Python 中使用 Scipy 執行此類擬合。
為了評估適合度,我們可以採用誤差平方和(SSE)指標來比較經驗數據和適合分佈的直方圖。具有最低 SSE 的分佈被認為是最佳擬合。
Scipy 的統計模組提供了廣泛的連續分佈類別。我們可以迭代每個分佈,估計其參數,計算 SSE,並儲存結果。
讓我們說明一下該過程使用厄爾尼諾資料集中的海面溫度 (SST) 資料。
下面的程式碼展示了這一點實現:
import numpy as np import pandas as pd import scipy.stats as st import matplotlib.pyplot as plt from scipy.stats._continuous_distns import _distn_names import warnings # El Niño SST data data = pd.Series(sm.datasets.elnino.load_pandas().data.set_index('YEAR').values.ravel()) # Function to fit distributions based on SSE def best_fit_distribution(data): return sorted( [ (getattr(st, distribution), distribution.fit(data), np.sum(np.power(data.hist(bins=50).values - distribution.pdf(data.index), 2.0))) for distribution in _distn_names if not distribution in ['levy_stable', 'studentized_range'] ], key=lambda x:x[2] ) # Find best fit best_dist = best_fit_distribution(data)[0] # Plot distribution fig, ax = plt.subplots(figsize=(12,8)) ax.plot(data.hist(bins=50, density=True, alpha=0.5, color='gray')) param_names = best_dist[0].shapes + ', loc, scale' if best_dist[0].shapes else ['loc', 'scale'] param_str = ', '.join(['{}={:0.2f}'.format(k, v) for k, v in zip(param_names, best_dist[1])]) dist_str = '{}({})'.format(best_dist[0].name, param_str) ax.plot(best_dist[0].pdf(data.index, **best_dist[1]), lw=2, label=dist_str) ax.set_title('Fitted Distribution: ' + dist_str) ax.set_xlabel('SST (°C)') ax.set_ylabel('Frequency') ax.legend()
輸出將最佳擬合分佈顯示為威布爾分佈,參數為:
scale=0.64, loc=15.59
以上是如何使用 SciPy 找到經驗資料集的最佳擬合理論分佈併計算超過給定閾值的機率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!