考虑从未知样本中采样的整数值数据集连续分布。我们试图确定遇到大于任何给定阈值的值的概率(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中文网其他相关文章!