整数値のデータセットを考えてみましょう未知の連続分布からサンプリングされます。特定のしきい値よりも大きい値に遭遇する確率 (p 値) を決定しようとします。これらの確率を正確に推定するには、経験的分布を適切な理論的分布に適合させることが不可欠です。この記事では、Python で Scipy を使用してこのようなフィッティングを実行する方法について説明します。
フィットの良さを評価するには、二乗誤差の合計を使用できます。 (SSE) メトリックを使用して、経験的データのヒストグラムと近似された分布を比較します。 SSE が最も低い分布が最適であると考えられます。
Scipy の統計モジュールは、広範囲の連続分布クラスを提供します。各分布を反復処理し、そのパラメータを推定し、SSE を計算し、結果を保存できます。
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 中国語 Web サイトの他の関連記事を参照してください。