SciPy を使用して、経験的データセットに最適な理論的分布を見つけ、特定のしきい値を超える確率を計算するにはどうすればよいですか?

DDD
リリース: 2024-11-24 11:36:09
オリジナル
466 人が閲覧しました

How can I use SciPy to find the best-fitting theoretical distribution for an empirical dataset and calculate probabilities exceeding a given threshold?

Scipy による経験的分布を理論分布に当てはめる

問題の概要

整数値のデータセットを考えてみましょう未知の連続分布からサンプリングされます。特定のしきい値よりも大きい値に遭遇する確率 (p 値) を決定しようとします。これらの確率を正確に推定するには、経験的分布を適切な理論的分布に適合させることが不可欠です。この記事では、Python で Scipy を使用してこのようなフィッティングを実行する方法について説明します。

分布フィッティング

フィットの良さを評価するには、二乗誤差の合計を使用できます。 (SSE) メトリックを使用して、経験的データのヒストグラムと近似された分布を比較します。 SSE が最も低い分布が最適であると考えられます。

Scipy の実装

Scipy の統計モジュールは、広範囲の連続分布クラスを提供します。各分布を反復処理し、そのパラメータを推定し、SSE を計算し、結果を保存できます。

例: エルニーニョ データセット
    プロセスを説明してみましょう。エルニーニョ データセットの海面水温 (SST) データを使用します。
  1. ロードデータを取得し、そのヒストグラムをプロットします。
  2. SSE メトリクスを使用して分布フィッティングを実行します。
  3. 最低の SSE に基づいて最適分布を特定します。
確率密度関数をプロットします。最適分布と経験的ヒストグラムの (PDF)。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート