Eine Box-Cox-Transformation ist eine häufig verwendete Methode zum Transformieren eines nicht normalverteilten Datensatzes in einen normalverteilten.

Die Grundidee hinter dieser Methode besteht darin, einen Wert für λ zu finden, so dass die transformierten Daten unter Verwendung der folgenden Formel so nahe wie möglich an der Normalverteilung liegen:

  • y (λ) = (y λ - 1) / λ wenn y ≠ 0 ist
  • y (λ) = log (y) wenn y = 0

Wir können eine Box-Cox-Transformation in Python mithilfe der Funktion scipy.stats.boxcox() durchführen.

Das folgende Beispiel zeigt, wie diese Funktion in der Praxis verwendet wird.

Beispiel: Box-Cox-Transformation in Python

Angenommen, wir generieren eine zufällige Menge von 1.000 Werten, die aus einer Exponentialverteilung stammen:

# notwendige Pakete laden
import numpy as np 
from scipy.stats import boxcox 
import seaborn as sns 

#Machen Sie dieses Beispiel reproduzierbar
np.random.seed(0)

# Datensatz generieren
data = np.random.exponential(size=1000)

# Zeichnen Sie die Verteilung der Datenwerte
sns.distplot(data, hist=False, kde=True) 

Boxcox

Wir können sehen, dass die Verteilung nicht normal zu sein scheint.

Wir können die boxcox()-Funktion verwenden, um einen optimalen Lambda-Wert zu finden, der eine normalere Verteilung erzeugt:

# Box-Cox-Transformation für Originaldaten durchführen
transformed_data, best_lambda = boxcox(data) 

# Zeichnen Sie die Verteilung der transformierten Datenwerte
sns.distplot(transformed_data, hist=False, kde=True) 

Box-Cox-Transformation in Python

Wir können sehen, dass die transformierten Daten viel mehr einer Normalverteilung folgen.

Wir können auch den genauen Lambda-Wert finden, der zur Durchführung der Box-Cox-Transformation verwendet wird:

# optimalen Lambda-Wert anzeigen
print(best_lambda)

0.2420131978174143

Das optimale Lambda betrug ungefähr 0,242.

Somit wurde jeder Datenwert unter Verwendung der folgenden Gleichung transformiert:

Neu = (alt 0,242 - 1) / 0,242

Wir können dies bestätigen, indem wir die Werte aus den Originaldaten im Vergleich zu den transformierten Daten betrachten:

# Die ersten fünf Werte des Originaldatensatzes anzeigen
data[0:5]

array([0.79587451, 1.25593076, 0.92322315, 0.78720115, 0.55104849])

# Die ersten fünf Werte des transformierten Datensatzes anzeigen
transformed_data[0:5]

array([-0.22212062,  0.23427768, -0.07911706, -0.23247555, -0.55495228])

Der erste Wert im Originaldatensatz war 0,79587. Daher haben wir die folgende Formel angewendet, um diesen Wert zu transformieren:

New = (0,79587 ,242-1) / 0,242 = -0,222

Wir können bestätigen, dass der erste Wert im transformierten Datensatz tatsächlich -0,222 ist.

Zusätzliche Ressourcen

So erstellen und interpretieren Sie ein QQ-Diagramm in Python
So führen Sie einen Shapiro-Wilk-Test auf Normalität in Python durch

Statistik: Der Weg zur Datenanalyse

* Amazon Affiliate Link


Das könnte Sie auch interessieren: