Regression in Python: Wie man Zusammenhänge in seinen Daten findet
Daten einfach nur zu sammeln reicht nicht aus. Sie können Tabellen mit Daten füllen, aber es ist nutzlos, wenn Sie nicht darauf reagieren können. Regression ist eines der leistungsstärksten statistischen Werkzeuge, um Beziehungen in Daten zu finden. Python macht es einfach und ist viel flexibler als eine Tabellenkalkulation. Legen Sie Bleistift und Lineal beiseite und nehmen Sie stattdessen Python zur Hand. So können Sie loslegen.
Einfache lineare Regression: Trends erkennen
Die einfachste Form der Regression in Python ist, nun ja, die einfache lineare Regression. Bei der einfachen linearen Regression versucht man zu untersuchen, ob es eine Beziehung zwischen zwei Variablen gibt, wobei die erste als „unabhängige Variable“ und die zweite als „abhängige Variable“ bezeichnet wird. Die unabhängige Variable wird typischerweise auf der x-Achse und die abhängige Variable auf der y-Achse dargestellt. Dies erzeugt das klassische Streudiagramm der Datenpunkte. Ziel ist es, eine Linie zu zeichnen, die dieses Streudiagramm am besten beschreibt.
Wir beginnen damit, die Beispieldaten zu Trinkgeldern in Restaurants in New York City zu verwenden. Wir möchten sehen, ob es einen Zusammenhang zwischen der Gesamtrechnung und dem Trinkgeld gibt. Dieses Datenset ist im Seaborn-Paket für statistische Diagramme enthalten, meinem bevorzugten Werkzeug zur Datenvisualisierung. Ich habe diese Tools in einer Mamba-Umgebung eingerichtet, um einfachen Zugriff zu haben.
Zuerst werden wir Seaborn importieren, eine Datenbank für statistische Diagramme.
import seaborn as sns
Dann laden wir den Datensatz:
tips = sns.load_dataset('tips')
Wenn Sie ein Jupyter-Notebook verwenden, wie das, auf das ich auf meiner eigenen GitHub-Seite verlinke, stellen Sie sicher, dass Sie diese Zeile einfügen, damit Bilder im Notebook und nicht in einem externen Fenster angezeigt werden:
%matplotlib inline
Schauen wir uns nun das Streudiagramm mit der relplot-Methode an:
sns.relplot(x='total_bill',y='tip',data=tips)
Das Streudiagramm scheint größtenteils linear zu sein. Das bedeutet, dass möglicherweise eine positive lineare Beziehung zwischen dem Rechnungsbetrag und dem Trinkgeld besteht. Wir können die Regressionslinie mit der Methode regplot darstellen:
sns.regplot(x='total_bill',y='tip',data=tips)
Die Linie scheint ziemlich gut zu passen.
Wir können eine weitere Bibliothek, Pingouin, für eine formellere Analyse verwenden. Die Methode linear_regression von Pingouin berechnet die Koeffizienten der Regressionsgleichung der Linie, die über die Datenpunkte gelegt wird, und bestimmt die Anpassung.
import pingouin as pg
pg.linear_regression(tips['total_bill'],tips['tip']).round(2)
Das Runden macht die Ergebnisse leichter lesbar. Die Zahl, auf die man bei der linearen Regression achten sollte, ist der Korrelationskoeffizient. In der resultierenden Tabelle ist er als "r2" aufgeführt, da es sich um das Quadrat des Korrelationskoeffizienten handelt. Er beträgt 0,46, was auf eine gute Anpassung hinweist. Die Quadratwurzel ergibt ungefähr 0,68, was ziemlich nahe bei 1 liegt und eine positive lineare Beziehung formaler anzeigt als das Diagramm, das wir zuvor gesehen haben.
Wir können auch ein Modell mit den Werten in der Tabelle erstellen. Sie erinnern sich vielleicht an die Gleichung einer Geraden: y=mx + b. Das y wäre die abhängige Variable, das m ist der Koeffizient von x oder die Gesamtrechnung, die 0,11 beträgt. Dies bestimmt, wie steil die Linie ist. Das b ist der y-Achsenabschnitt oder 0,92.
Die daraus resultierende Gleichung basierend auf diesem Modell ist
tip = 0.11(total bill) + 0.92
Die Gleichungen für die Regression drehen dies um, also wäre es:
tip = 0.92 + 0.11(total_bill)
Wir können eine kurze Python-Funktion schreiben, die den Trinkgeldbetrag basierend auf der Rechnungssumme vorhersagt.
def tip(total_bill):
return 0.92 + 0.11 * total_bill
Die zweite Zeile sollte eingerückt werden, aber unser CMS kann dies nicht anzeigen. Bitte stellen Sie sicher, dass Sie diese Zeile auf Ihrem Computer einrücken. Denken Sie daran, dass Einrückungen in Python vier Leerzeichen lang sind.
Lassen Sie uns das Trinkgeld für eine Restaurantrechnung von 100 $vorhersagen:
tip(100)
Das erwartete Trinkgeld liegt bei etwa 12 $.
Multiple Lineare Regression: Regression in die dritte Dimension und darüber hinaus
Die lineare Regression kann auf mehr Variablen als nur zwei erweitert werden. Sie können sich mehr unabhängige Variablen ansehen. Anstatt eine Linie über Datenpunkte in einer Ebene zu legen, legen Sie eine Ebene über ein Streudiagramm. Leider ist dies schwieriger zu visualisieren als bei einer 2D-Regression. Ich habe multiple Regression verwendet, um ein Modell für Laptop-Preise basierend auf deren Spezifikationen zu erstellen.
Wir werden den Tips-Datensatz verwenden. Dieses Mal werden wir die Größe der Party mit der Spalte "size" betrachten. In Pingouin ist das einfach zu machen.
pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
Beachten Sie die doppelten Klammern beim ersten Argument, das die Gesamtrechnung und die Größe der Gruppe angibt. Beachten Sie, dass das r² identisch ist. Dies bedeutet erneut, dass die Anpassung gut ist und dass die Gesamtrechnung und die Gruppengröße gute Prädiktoren für das Trinkgeld sind.
Wir können unser früheres Modell umschreiben, um die Größe unter Verwendung des Koeffizienten der Tabellengröße zu berücksichtigen:
def tip(total_bill,size):
return 0.67 + 0.09 * total_bill + 0.19 * size
Nichtlineare Regression: Anpassung von Kurven
Sie können nicht nur lineare Regressionen anpassen, sondern auch nichtlineare Kurven. Ich werde dies demonstrieren, indem ich NumPy verwende, um einige Datenpunkte zu erzeugen, die ein quadratisches Diagramm darstellen können.
Zuerst werde ich ein großes Array von Datenpunkten in NumPy für die x-Achse generieren:
x = np.linspace(-100,100,1000)
Jetzt werde ich ein quadratisches Diagramm für die y-Achse erstellen.
y = 4*x**2 + 2*x + 3
Um die Regression zu erstellen, werde ich ein Pandas DataFrame aufbauen, eine Datenstruktur, die einer relationalen Datenbank ähnelt, für die x- und y-Achsen. Dies wird Spalten für die x- und y-Werte erstellen, mit den Namen "x" und "y". Wir übergeben ein Wörterbuch für das DataFrame, das wir erstellen möchten, an Pandas. Wir nennen unser DataFrame "df."
import pandas as pd
df = pd.DataFrame({'x':x,'y':y})
Wir können unser DataFrame mit der Head-Methode untersuchen:
df.head()
Wir können ein Streudiagramm mit Seaborn erstellen, wie wir es zuvor mit den linearen Daten getan haben:
sns.relplot(x='x',y='y',data=df)
Es sieht aus wie der klassische parabolische Graph, den man aus dem Mathematikunterricht kennt, gezeichnet auf dem Taschenrechner (den Python ersetzen kann). Mal sehen, ob wir eine Parabel darüberlegen können. Die regplot-Methode von Seaborn hat die Option 'order', mit der der Grad der anzupassenden Polynomlinie festgelegt wird. Da wir versuchen, eine quadratische Linie zu zeichnen, setzen wir die Ordnung auf 2:
sns.regplot(x='x',y='y',order=2,data=df)
Es scheint tatsächlich zu einer klassischen quadratischen Parabel zu passen.
Um die Formatregression zu erhalten, können wir die nichtlineare Regressionstechnik mit Pingouin verwenden. Wir fügen einfach eine weitere Spalte zu unserem DataFrame hinzu, um die x-Werte zu quadrieren:
df['x2'] = df['x']**2
Wir können dann lineare Regression verwenden, um die quadratische Kurve anzupassen:
pg.linear_regression(df[['x','x2']],df['y']).round(2)
Da dies eine künstliche Erstellung war, beträgt das r² 1, was auf eine sehr gute Anpassung hinweist, eine, die man bei realen Daten wahrscheinlich nicht sehen würde.
Wir können auch ein Vorhersagemodell mithilfe einer Funktion erstellen:
def quad(x):
return 3 + 2*x + 4*x**2
Sie können diese Methode auch auf Polynome mit einem Grad größer als 2 ausdehnen.
Logistische Regression: Anpassung binärer Kategorien
Wenn Sie eine Beziehung für binäre Kategorien finden möchten, wie einen bestimmten Risikofaktor, zum Beispiel, ob eine Person raucht oder nicht, können wir die logistische Regression verwenden.
Der einfachste Weg, dies zu veranschaulichen, ist erneut die Verwendung der Seaborn-Bibliothek. Wir werden den Datensatz der Passagiere auf der Titanic laden. Wir wollen sehen, ob der Ticketpreis ein Indikator dafür war, wer die unglückliche Reise überleben würde oder nicht.
titanic = sns.load_dataset('titanic')
Wir können die Daten so untersuchen, wie wir es beim quadratischen DataFrame getan haben:
titanic.head()
Wir werden die lmplot-Methode verwenden, da sie eine logistische Kurve anpassen kann:
sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)Wir sehen die logistische Kurve über die Anzahl der Passagiere, getrennt danach, ob sie überlebt haben oder nicht. Die Spalte „überlebt“ ist bereits in 0 für „nicht überlebt“ und 1 für „überlebt“ unterteilt.
Wir können Pingouin verwenden, um formell zu bestimmen, ob der Fahrpreis ein Prädiktor für das Überleben auf der Titanic war, wobei Pingouin, das unter seinen vielen statistischen Tests auch logistische Regression anbietet, genutzt wird:
pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)
Die Zahl, auf die man bei einem statistischen Test achten sollte, ist der p-Wert, der in der Tabelle als „pval.“ angegeben ist. Er beträgt 0,0, was darauf hinweist, dass der Ticketpreis ein starker Prädiktor dafür war, die Fahrt der Titanic zu überleben.
Diese Operationen zeigen, warum Python eine bevorzugte Sprache für die Datenanalyse ist. Es ermöglicht Operationen, die per Hand Tage dauern würden oder sogar über das hinausgingen, was Statistiker bereit waren zu tun, in Python in nur wenigen Sekunden durchzuführen. Diese Regressionsoperationen helfen Ihnen dabei, Ihre Daten zu durchsuchen, um Zusammenhänge zu finden und Vorhersagen zu treffen.









