>백엔드 개발 >파이썬 튜토리얼 >SciPy를 사용하여 경험적 데이터 세트에 가장 적합한 이론적 분포를 찾고 주어진 임계값을 초과하는 확률을 계산하려면 어떻게 해야 합니까?

SciPy를 사용하여 경험적 데이터 세트에 가장 적합한 이론적 분포를 찾고 주어진 임계값을 초과하는 확률을 계산하려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-11-24 11:36:09527검색

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를 사용하여 이러한 피팅을 수행하는 방법을 살펴봅니다.

Distribution Fitting

적합도를 평가하기 위해 제곱 오차의 합을 사용할 수 있습니다. (SSE) 측정항목을 사용하여 경험적 데이터와 적합 분포의 히스토그램을 비교합니다. SSE가 가장 낮은 분포가 가장 적합한 것으로 간주됩니다.

Scipy 구현>

Scipy의 통계 모듈은 광범위한 연속 분포 클래스를 제공합니다. 각 분포를 반복하고, 해당 매개변수를 추정하고, SSE를 계산하고, 결과를 저장할 수 있습니다.

예: 엘니뇨 데이터세트

과정을 설명해 보겠습니다. 엘니뇨 데이터세트의 해수면 온도(SST) 데이터를 사용합니다.

  1. 데이터를 로드하고 히스토그램을 그립니다.
  2. SSE 측정항목을 사용하여 분포 피팅을 수행합니다.
  3. 가장 낮은 SSE를 기준으로 가장 적합한 분포를 식별합니다.
  4. 확률 밀도 함수 플로팅(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()

출력은 매개변수가 있는 Weibull 분포로서 가장 적합한 분포를 보여줍니다.

scale=0.64, loc=15.59

위 내용은 SciPy를 사용하여 경험적 데이터 세트에 가장 적합한 이론적 분포를 찾고 주어진 임계값을 초과하는 확률을 계산하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.