Betrachten Sie einen Datensatz ganzzahliger Werte, die aus einer unbekannten kontinuierlichen Verteilung entnommen wurden. Wir versuchen, die Wahrscheinlichkeit (p-Wert) zu bestimmen, auf Werte zu stoßen, die über einem bestimmten Schwellenwert liegen. Um diese Wahrscheinlichkeiten genau abzuschätzen, ist es wichtig, unsere empirische Verteilung an eine geeignete theoretische Verteilung anzupassen. In diesem Artikel wird untersucht, wie eine solche Anpassung mit Scipy in Python durchgeführt wird.
Um die Güte der Anpassung zu beurteilen, können wir eine Summe quadrierter Fehler verwenden (SSE)-Metrik zum Vergleich der Histogramme der empirischen Daten und der angepassten Verteilungen. Die Verteilung mit dem niedrigsten SSE gilt als die beste Anpassung.
Das Statistikmodul von Scipy bietet eine breite Palette kontinuierlicher Verteilungsklassen. Wir können jede Verteilung durchlaufen, ihre Parameter schätzen, den SSE berechnen und die Ergebnisse speichern.
Lassen Sie uns den Prozess veranschaulichen unter Verwendung von Daten zur Meeresoberflächentemperatur (SST) aus dem El-Niño-Datensatz.
Der folgende Code zeigt dies Implementierung:
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()
Die Ausgabe zeigt die am besten geeignete Verteilung als Weibull-Verteilung mit Parametern:
scale=0.64, loc=15.59
Das obige ist der detaillierte Inhalt vonWie kann ich SciPy verwenden, um die am besten passende theoretische Verteilung für einen empirischen Datensatz zu finden und Wahrscheinlichkeiten zu berechnen, die einen bestimmten Schwellenwert überschreiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!