Wie 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?

DDD
Freigeben: 2024-11-24 11:36:09
Original
467 Leute haben es durchsucht

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

Anpassen empirischer Verteilungen an theoretische mit Scipy

Problemübersicht

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.

Verteilungsanpassung

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.

Scipy-Implementierung

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.

Beispiel: El Niño-Datensatz

Lassen Sie uns den Prozess veranschaulichen unter Verwendung von Daten zur Meeresoberflächentemperatur (SST) aus dem El-Niño-Datensatz.

  1. Laden Sie die Daten und zeichnen Sie sie auf Histogramm.
  2. Führen Sie eine Verteilungsanpassung mithilfe der SSE-Metrik durch.
  3. Identifizieren Sie die am besten geeignete Verteilung basierend auf dem niedrigsten SSE.
  4. Plotten Sie die Wahrscheinlichkeitsdichtefunktion (PDF) der Best-Fit-Verteilung zusammen mit dem empirischen Histogramm.

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()
Nach dem Login kopieren

Die Ausgabe zeigt die am besten geeignete Verteilung als Weibull-Verteilung mit Parametern:

scale=0.64, loc=15.59
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage