알 수 없는 값에서 샘플링된 정수 값의 데이터 세트를 생각해 보세요. 지속적인 배포. 우리는 주어진 임계값보다 큰 값을 만날 확률(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()
출력은 매개변수가 있는 Weibull 분포로서 가장 적합한 분포를 보여줍니다.
scale=0.64, loc=15.59
위 내용은 SciPy를 사용하여 경험적 데이터 세트에 가장 적합한 이론적 분포를 찾고 주어진 임계값을 초과하는 확률을 계산하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!