9 Geradenmodelle 1
Statistik, Prognose, Modellierung, R, Datenanalyse, Regression
9.1 Lernsteuerung
Abb. Abbildung 1.3 zeigt den Standort dieses Kapitels im Lernpfad und gibt damit einen Überblick über das Thema dieses Kapitels im Kontext aller Kapitel.
9.1.1 Lernziele
- Sie können ein Punktmodell von einem Geradenmodell begrifflich unterscheiden.
- Sie können die Bestandteile eines Geradenmodells aufzählen und erläutern.
- Sie können die Güte eines Geradenmodells anhand von Kennzahlen bestimmen.
- Sie können Geradenmodelle sowie ihre Modellgüte in R berechnen.
9.1.2 Benötigte R-Pakete
\[ \definecolor{ycol}{RGB}{230,159,0} \definecolor{modelcol}{RGB}{86,180,233} \definecolor{errorcol}{RGB}{0,158,115} \definecolor{beta0col}{RGB}{213,94,0} \definecolor{beta1col}{RGB}{0,114,178} \definecolor{xcol}{RGB}{204,121,167} \]
9.1.3 Benötigte Daten
mariokart <- read.csv("https://vincentarelbundock.github.io/Rdatasets/csv/openintro/mariokart.csv")
9.2 Vorhersagen
Vorhersagen sind eine nützliche Sache, unter (mindestens) folgenden Voraussetzungen:
- Sie sind präzise
- Wir kennen die Präzision
- Jemand interessiert sich für die Vorhersage
Die Methode des Vorhersagens, die wir hier betrachten, nennt man auch lineare Regression.
9.2.1 Vorhersagen ohne Prädiktor
Beispiel 9.1 Nach intensiver Beschäftigung mit Statistik sind Sie allgemein als Checker bekannt. Viele jüngere Studis fragen Sie um Rat. eines Tages kommt eine Studentin, Toni, und fragt: “Welche Statistiknote kann ich in der Klausur erwarten?” Sie entgegnen: “Wie viel hast du denn gelernt?”. Die Antwort: “Sag ich nicht.”
Nach kurzem Überlegen geben sie den Notenschnitt der letzten Klausur als Prognose für diese Person. Dazu rechnen Sie schnell den Notenschnitt (Mittelwert) aus.
Zuerst importieren Sie die Daten der letzten Klausur. Die Syntax in Listing 9.1 wird bei Ihnen nur funktionieren, wenn auf Ihrem Computer dieser Ordner mit dieser Datei existiert. Andernfalls müssen Sie die Daten erst herunterladen1:
Dann rechnen Sie den Mittelwert aus:
Ihre Antwort lautet also: “Im Schnitt haben die Studis bei der letzten Klausur gut 70% der Punkte erzielt. Diesen Wert kannst du erwarten. Solange ich keine genaueren Infos habe, z.B. wieviel du gelernt hast, kann ich dir keine genauere Vorhersage machen, sorry!”\(\square\)
Ohne Kenntnis eines Prädiktors (UV) (wie z.B. Lernzeit) ist der Mittelwert ein geeigneter Vorhersagewert für jede Beobachtung, s. Abbildung 9.1. Wir nutzen den Mittelwert als Punktmodell für den Klausurerfolg.\(\square\)
9.2.2 Nullmodell (Punktmodell)
Modelle ohne Prädiktor, Punktmodelle also, kann man so bezeichnen: y ~ 1
. Da das Modell null Prädiktoren hat, nennt man es auch manchmal “Nullmodell”.
Auf Errisch kann man dieses Nullmodell so spezifizieren:
lm0 <- lm(y ~ 1, data = noten2)
lm0
##
## Call:
## lm(formula = y ~ 1, data = noten2)
##
## Coefficients:
## (Intercept)
## 71.1
lm
steht für “lineares Modell”, die 1
sagt, dass es keine Prädiktoren gibt. In dem Fall wird der Mittelwert als Gerade verwendet. Der zurückgemeldete Koeffizient (Intercept)
ist hier der Modell des Punktmodells. Da es ein Punktmodell ist, sagt es für alle Beobachtungen (hier Studentis) den gleichen Wert vorher.
Die Regressionsgleichung lautet demnach: y_pred = 71.08
. In Worten: “Wir sagen für jede Beobachtung einen Wert von ca. 71 vorher”.
9.2.3 Vorhersagen mit Prädiktor
Beispiel 9.2 (Toni verrät die Lernzeit) Toni entschließt sich dann doch noch, die Lernzeit zu verraten: “Okay, also ich hab insgesamt 42 Stunden gelernt, insgesamt.” Jetzt müssen Sie erstmal nachdenken: “Wie viele Klausurpunkte sag ich vorher, wenn Toni 42 Stunden gelernt hat?”
Sie visualisieren sich zur Hilfe die vorliegenden Daten, s. Abbildung 9.2, a).2
library(DataExplorer)
noten2 %>%
plot_scatterplot(by = "y") # Y-Variable muss angegeben werden
Auf dieser Basis antworten Sie Toni: “Bei 42 Stunden Lernzeit solltest du so 46 Punkte bekommen. Könnte mit dem Bestehen eng werden.” Toni ist nicht begeistert von Ihrer Prognose und zieht von dannen.\(\square\)
Der Trend (im Sinne eines linearen Zusammenhangs) von Lernzeit und Klausurpunkte ist deutlich zu erkennen. Mit einem Lineal könnte man eine entsprechende Gerade in das Streudiagramm einzeichnen, s. Abbildung 9.2, b).
Eine Gerade eignet sich, um einen linearen Trend zusammenzufassen.
9.3 Geradenmodelle
9.3.1 Achsenabschnitt und Steigung definieren eine Gerade
Wir verwenden eine Gerade als Modell für die Daten, s. Abbildung 9.2, b. Anders gesagt: Wir modellieren die Daten (bzw. deren Zusammenhang) mit einer Geraden.
Ein Geradenmodell ist eine Verallgemeinerung des Punktmodells: Ein Punktmodell sagt für alle Beobachtungen den gleichen Wert vorher. Abbildung 9.1 und Abbildung 9.2 stellen ein Punktmodell einem Geradenmodell gegenüber.
In einem Geradenmodell wird nicht mehr (notwendig) für jede Beobachtung die gleiche Vorhersage \(\hat{y}\) gemacht (wie das bei einem Punktmodell der Fall ist).
Definition 9.1 (Gerade) Eine Gerade ist das, was man bekommt, wenn man eine lineare Funktion in ein Koordinatensystem einzeichnet. Man kann sie durch durch zwei Koeffizienten festlegen: Achsenabschnitt (engl. intercept), und Steigung (engl. slope). Häufig wird (z.B. im Schulunterricht) der Achsenabschnitt mit \(t\) und die Steigung mit \(m\) bezeichnet:
\(f(\color{xcol}{x})=\color{ycol}{y}={m} \color{xcol}{x} + \color{beta0col}{t}\).
In der Statistik wird folgende Nomenklatur bevorzugt: \(f(\color{xcol}{x})=\color{ycol}{\hat{y}}=\color{beta0col}{\beta_0} + {\beta_1} \color{xcol}{x}\) oder \(f(\color{xcol}{x})=\color{ycol}{\hat{y}}= \color{beta0col}{b_0} + {b_1} \color{xcol}{x}\) .
Die Nomenklatur mit \(b_0, b_1\) hat den Vorteil, dass man das Modell einfach erweitern kann: \(b_2, b_3, ...\). Anstelle von \(b\) liest man auch oft \(\beta\). Griechische Buchstaben werden meist verwendet, um zu zeigen, dass man an einer Aussage über eine Population, nicht nur über eine Stichprobe, machen möchte.
Das “Dach” über y, \(\color{modelcol}{\hat{y}}\), drückt aus, dass es sich den den geschätzten, bzw. vom Modell vorhergesagten (“modellierten”) Wert für \(\color{ycol}{y}\) handelt, nicht das tatsächliche (empirische, beobachtete) \(\color{ycol}{y}\). \(\square\)
Abbildung 9.3 skizziert die Elemente einer Regression. (Bildquelle: Basierend auf TikZ-Quellcode von Henri Menke.)
Das einfache lineare Modell nimmt den Wert einer abhängigen metrischen Variablen, y als lineare Funktion von unabhängigen Variablen, x an, plus einem Fehlerterm, e. \(\square\)
\[\begin{aligned} \color{ycol}{y} &= f(\color{xcol}{x}) + \color{errorcol}{\epsilon} \\ \color{ycol}{y_i} &= \color{beta0col}{\beta_0} + \color{beta1col}{\beta_1} \cdot \color{modelcol}{x_i} + \color{errorcol}{\epsilon_i} \square \end{aligned}\]
Mit:
- \(\color{beta0col}{\beta_0}\): geschätzter y-Achsenabschnitt laut Modell
- \(\color{beta1col}{\beta_1}\): geschätzte Steigung laut Modell
- \(\color{errorcol}{\epsilon}\): Fehler des Modells
Je nach Datenlage können sich Regressionsgerade in Steigung oder Achsenabschnitt unterscheiden, s. Abbildung 9.4.
Abbildung 9.5 zeigt ein interaktives Beispiel einer linearen Funktion. Sie können Punkte per Klick/Touch hinzufügen.
Beispiel 9.3 (Toni will es genau wissen) Da Toni Sie als Statistik-Profi abgespeichert hat, w erden Sie wieder konsultiert. “Okay, ich hab noch zwei Fragen. Erstens: Wie viele Punkte bekomme ich, wenn ich gar nicht lerne? Zweitens, wie viele Punkte bekomme ich pro gelernte Stunde? Ist immerhin meine Lebenszeit, krieg ich nicht zurück!”
Das sind gute Fragen. Den \(\color{ycol}{Y}\)-Wert (Klausurpunkte) bei \(\color{xcol}{X}=0\) gibt der Achsenabschnitt zurück.
Schnell skizzieren Sie dazu ein Diagramm, s. Abbildung 9.6. Puh, die Antwort wird Toni nicht gefallen …\(\square\)
Anstelle auf Abbildung 9.6 zu schauen, können Sie sich auch von R Tonis Klausurerfolg vorhersagen (to predict) lassen:
🧑🏫 Hey R, predicte mir mal auf Basis vom Modell “lm1” den Lernerfolg für Toni, wenn der x=0 Stunden lernt.
🤖 Okay, ich predicte mit Modell “lm1” und nehme als neue Datentabelle Tonis Lernzeit (x=0)!
tonis_lernzeit <- tibble(x = 0) # `tibble` erstellt eine Tabelle
predict(lm1, newdata = tonis_lernzeit)
## 1
## 8.6
9.3.2 Spezifikation eines Geradenmodells
Ein Geradenmodell kann man im einfachsten Fall so spezifizieren, s. Gleichung 9.2 :
\[\color{ycol}{\hat{y}} \sim \color{xcol}{\text{x}} \tag{9.1}\]
Lies: “Laut meinem Modell ist mein (geschätztes) \(\color{ycol}{\hat{y}}\) irgendeine Funktion von \(\color{xcol}{\text{x}}\)”.
Wir erinnern uns, dass \(\color{ycol}{Y}\) die \(\color{ycol}{AV}\) und \(\color{xcol}{X}\) die \(\color{xcol}{UV}\) ist:
\[\color{ycol}{AV} \sim \color{xcol}{UV} \tag{9.2}\]
Wir werden als Funktion (erstmal) nur Geraden verwenden. Die genauen Werte der Gerade lassen wir uns (erstmal) vom Computer ausrechnen.
Gleichung 9.2 können Sie so ins Errische übersetzen:
lm(y ~ x, data = meine_daten)
lm
steht für “lineares Modell”, also eine Gerade als Modell. Die Gerade nennt man auch Regressionsgerade (an anderer Stelle in diesem Buch unscharf als “Trendgerade” bezeichnet).
Beispiel 9.4 (Zahlen für Toni) Toni ist nicht zufrieden mit Ihren Vorhersagen: “Jetzt hör mal auf mit deinem Lineal hier herum zu malen. Ich will es genau wissen, sag mir präzise Zahlen!”.
lm1 <- lm(y ~ x, data = noten2)
lm1
##
## Call:
## lm(formula = y ~ x, data = noten2)
##
## Coefficients:
## (Intercept) x
## 8.603 0.879
R gibt Ihnen die beiden Koeffizienten für die Gerade aus. Den Namen des Objekts können Sie frei aussuchen, z.B. mein_erstes_lm
.
Die Regressionsgleichung lautet demnach: y_pred = 8.6 + 0.88*x
8.6
ist der Achsenabschnitt, d.h. der Wert von \(\color{ycol}{Y}\) wenn \(\color{xcol}{x}=0\). 0.88
ist das Regressionsgewicht, d.h. die Steigung der Regressionsgeraden: Für jede Stunde Lernzeit steigt der vorhergesagte Klausurerfolg um 0.88
Punkte.
Mit Kenntnis der beiden Koeffizienten kann man beliebige \(\color{ycol}{Y}\)-Werte ausrechnen gegeben bestimmte \(\color{xcol}{X}\)-Werte. Hat jemand zum Beispiel 10 Stunden gelernt, würden wir folgendes Klausurergebnis vorhersagen:
lernzeit <- 10
y_pred <- 8.6 + 0.88*lernzeit
y_pred
## [1] 17
Beispiel 9.5 (Vorhersage für Klausurerfolg, nächster Versuch) Sie versuchen, noch etwas Gutes für Toni zu tun. R hilft Ihnen dabei und rechnet die erwartete Punktzahl aus, wenn Toni 73 Stunden lernt. Sie dürfen es aber auch selber rechnen, wenn Ihnen das lieber ist.
tonis_lernzeit2 <- tibble(x = 73) # Der Befehl `tibble` erstellt eine Tabelle in R.
tonis_lernzeit2
ist eine Tabelle mit einer Zeile und einer Spalte:
tonis_lernzeit2
predict(lm1, newdata = tonis_lernzeit2)
## 1
## 73
Die Syntax von predict
lautet:
predict(name_des_objekts, newdata = tabelle_mit_prädiktorwerten)
Mit predict
bekommt man eine Vorhersage; im Standard eine “Punkt-Vorhersage”, eine einzelne Zahl.\(\square\)
9.3.3 Vorhersagefehler
Die Differenz zwischen vorhergesagten Wert für eine (neue) Beobachtung, \(\color{modelcol}{\hat{y_0}}\) und ihrem tatsächlichen Wert nennt man Vorhersagefehler (error, \(e_i\)) oder Residuum: \(\color{errorcol}{e_i} = \color{ycol}{y_i} - \color{modelcol}{\hat{y}_i}\).
Wie ist es mit den Vorhersagefehlern von beiden Modellen bestellt?
Lassen wir uns von R die Streuung (Residuen) in Form der mittleren Absolutabweichung (MAE) ausgeben (aus dem Paket easystats
):
mae(lm0)
## [1] 11
mae(lm1)
## [1] 8
Vergleichen wir MAE im Nullmodell mit MAE in lm1
:
verhaeltnis_fehler_mae <- mae(lm1) / mae(lm0)
verhaeltnis_fehler_mae
## [1] 0.71
Ah! Das Geradenmodell ist viel besser: Von lm0
zu lm1
haben die mittlere (Absolut-)Länge des Fehlerbalkens auf 71 Prozent verbessert. Nicht schlecht!
Definition 9.2 (Fehlerstreuung) Als Fehlerstreuung bezeichnen wir die Gesamtheit der Abweichungen der beobachteten Werte (\(y_i\)) vom vorhergesagten Wert (\(\hat{y}_i\)).\(\square\)
Zur Berechnung der Fehlerstreuung gibt es mehrere Kenngrößen wie MAE oder MSE.
Ein Geradenmodell ist immer besser als ein Punktmodell (im Hinblick auf die Verringerung der Fehlerstreuung), solange X mit Y korreliert ist.\(\square\)
Natürlich können wir - in Analogie zur Varianz - auch den mittleren Quadratfehlerbalken (Mean Squared Error, MSE) berechnen. Wer mag, kann den MSE auch von Hand berechnen: mean((noten2$y-mean(noten2$y))^2)
.
mse(lm0)
## [1] 193
mse(lm1)
## [1] 106
verhaeltnis_fehler_mse <- mse(lm1)/mse(lm0)
verhaeltnis_fehler_mse
## [1] 0.55
9.3.4 Berechnung der Modellkoeffizienten
Aber wie legt man die Regressionsgerade in das Streudiagramm, bildlich gesprochen?
Die Regressionskoeffizienten (hier synonym: Modellparameter) b0 und b1 wählt man so, dass die Residuen minimal sind,
Abbildung 9.8 veranschaulicht die Minimierung der Residuen (Vorhersagefehler).
Genauer gesagt wird die Summe der quadrierten Residuen minimiert, s. Gleichung 9.3.
\[\text{min}\sum_i \color{errorcol}{e_i}^2 \tag{9.3}\]
Es gibt verschiedene Möglichkeiten, um die Koeffizienten zu berechnen (die sind aber nicht in diesem Buch zu finden). Eine schöne Darstellung dazu findet sich bei Kaplan (2009).
“Von Hand” können Sie die Optimierung von b0 und b1 in dieser App der FOM-Hochschule3 ausprobieren.
9.4 R-Quadrat als Maß der Modellgüte
Anders gesagt, wir haben uns um \(1 - 0.55\) verbessert:
1 - verhaeltnis_fehler_mse
## [1] 0.45
Definition 9.3 (R-Quadrat) Die Verringerung (als Anteil) der Fehlerstreuung der Zielvariablen von lm0
zum gerade untersuchten Modell nennt man R-Quadrat (\(R^2\)). R-Quadrat (\(R^2\)) e ines Modells \(m\) ist definiert als die Verringerung der Streuung, wenn man das Modell \(m\) mit dem Nullmodell \(m_0\) vergleicht: \(R^2 =1- \frac{\text{MSE}_{m}}{\text{MSE}_{m0}}\). R-Quadrat ist ein Maß der Modellgüte: Je größer \(R^2\), desto besser die Vorhersage. Da es ein Anteilsmaß ist, liegt der Wertebereich zwischen 0 uns 1. Im Nullmodell liegt R-Quadrat per Definition bei 0. Im Fall von Modellen des Typs \(y\sim x\) gilt: \(R^2 = r_{xy}^2\). \(\square\)
Einfach gesagt: \(R^2\) gibt an, wie gut (zu welchem Anteil) ein Modell die Zielvariable erklärt.
Wir können R-Quadrat (\(R^2\)) uns von R z.B. so ausgeben lassen:
r2(lm1)
## # R2 for Linear Regression
## R2: 0.448
## adj. R2: 0.442
Bei einer perfekten Korrelation ist \(r=1\), daher ist dann auch \(R^2 = 1\). Das gilt bei Modellen mit einem Prädiktor; gibt es mehrere Prädiktoren gilt die Beziehung nur, wenn die Prädiktoren alle paarweise unabhängig sind, vgl. Abbildung 9.9.
Bei einer perfekten Korrelation \(R^2=1\) liegen die Punkte auf der Geraden. Im gegenteiligen Extremfall von \(R^2=0\) ist die Vorhersage genauso gut, wie wenn man für jedes \(y\) den Mittelwert, \(\color{ycol}{\bar{y}}\) , vorhersagen würde.
Je größer R-Quadrat, desto besser passt das Modell zu den Daten; desto besser “erklärt” das Modell die Daten (desto besser der “Fit”, sagt man).
Diese App der FOM-Hochschule erlaubt es Ihnen mit der Größe der Residuen eines linearen Modells zu spielen.
9.5 Interpretation eines Regressionsmodells
9.5.1 Modellgüte
Die Residuen (Vorhersagefehler) bestimmen die Modellgüte: Sind die Residuen im Schnitt groß, so ist die Modellgüte gering (schlecht), und umgekehrt. Verschiedenen Koeffizienten stehen zur Verfügung: R-Quadrat, r (als Korrelation von tatsächlichem \(y\) und vorhergesagten \(\hat{y}\)), MSE, RMSE, MAE, …
9.5.2 Koeffizienten
Die Modellkoeffizienten, also Achsenabschnitt (\(\beta_0\);lies: “beta Null”) und Steigung (\(\beta_1\)) sind nur eingeschränkt zu interpretieren, wenn man die zugrundeliegenden kausalen Abhängigkeiten nicht kennt. Nur aufgrund eines statistischen Zusammenhangs darf man keine kausalen Abhängigkeiten annehmen. Ohne eine guten Grund für eine Kausalbehauptung kann man kann nur deskriptiv argumentieren. Oder sich mit der Modellgüte und den Vorhersagen begnügen. Was auch was wert ist.
9.5.2.1 Achsenabschnitt (b0)
Im Modell lm1
liegt der Achsenabschnitt bei \(\textcolor{ycol}{y}=8.6\). Beobachtungen mit \(\color{xcol}{x}=0\) können also diesen \(\textcolor{ycol}{Y}\)-Wert erwarten.
Leider ist es häufig so, dass Prädiktorwerte von 0 in der Praxis nicht realistisch sind, so dass der Achsenabschnitt dann wenig nützt.
Beispiel 9.6 (Regression Größe und Gewicht) Nutzt man Körpergröße und das Gewicht von Menschen vorherzusagen, ist der Achsenabschnitt von Körpergröße wenig nützlich, da es keine Menschen gibt der Größe 0.\(\square\)
9.5.2.2 Geradensteigung (b1)
“Im Modell lm1
beträgt der Regressionskoeffizient b1
\(0.88\). Zwei Studenti, deren Lernzeit sich um eine Stunde unterscheidet, unterscheiden sich laut Modell um den Wert von b1.”
Häufig liest man, der “Effekt des Prädiktors” auf die AV betrage z.B. \(0.88\). “Effekt” ist aber ein Wort, dass man kausal verstehen kann. Ohne weitere Absicherung kann man aber Regressionskoeffizienten nicht kausal verstehen. Daher sollte man das Wort “Effekt” mit Vorsicht genießen. Manche sprechen daher auch von einem “statistischen Effekt”.\(\square\).
9.6 Wie man mit Statistik lügt
Der Unterschied in Modellgüte zwischen, sagen wir, \(r=.1\) und \(r=.2\) ist viel kleiner als zwischen \(r=.7\) und \(r=.8\). \(R^2\) ist ein (lineares) Maß der Modellgüte und da \(r = \sqrt{R^2}\), darf \(r\) nicht wie \(R^2\) als Maß der Modellgüte interpretiert werden. Abbildung 9.10 zeigt den Zusammenhang von \(r\) und \(R^2\).
Unterschiede zwischen Korrelationsdifferenzen dürfen nicht linear interpretiert werden. \(\square\)
9.7 Fallbeispiel Mariokart
9.7.1 Der Datenwahrsager legt los
Als mittlerweile anerkannter Extrem-Datenanalyst in dem Online-Auktionshaus, in dem Sie arbeiten, haben Sie sich neue Ziele gesetzt. Sie möchten eine genaue Vorhersage von Verkaufspreisen erzielen. Als Sie von diesem Plan berichteten, leuchteten die Augen Ihrer Chefin. Genaue Vorhersagen, das ist etwas von hoher betriebswirtschaftlicher Relevanz. Auf geht’s!
Daten laden (und die üblichen Pakete starten, nicht vergessen):
mariokart <- read.csv("https://vincentarelbundock.github.io/Rdatasets/csv/openintro/mariokart.csv")
lm2 <- lm(total_pr ~ start_pr, data = mariokart)
r2(lm2)
## # R2 for Linear Regression
## R2: 0.005
## adj. R2: -0.002
Oh nein! Unterirdisch schlecht. Anstelle von bloßem Rumprobieren überlegen Sie und schauen dann in Abbildung 8.10 nach, welche Variable am stärksten korreliert mit total_pr
; es resultiert lm3
:
lm3 <- lm(total_pr ~ ship_pr, data = mariokart)
parameters(lm3)
Parameter | Coefficient | SE | 95% CI | t(141) | p |
---|---|---|---|---|---|
(Intercept) | 36.25 | 2.54 | (31.23, 41.26) | 14.28 | < .001 |
ship pr | 4.34 | 0.57 | (3.22, 5.46) | 7.67 | < .001 |
Der Achsenabschnitt liegt bei ca. 36 Euro, wie man in Tabelle 9.1 sieht: Ein Spiel, das mit Null Euro Preis startet, kann laut lm3
etwa 36 Euro finaler Verkaufspreis erwarten. Pro Euro an Versandkosten (ship_pr
) steigt der zu erwartende finale Verkaufspreis um ca. 4 Euro. (Die Spalte 95 CI
gibt einen Schätzbereich für den jeweiligen Modellkoeffizienten an, denn es handelt sich bei den Koeffizienten um Schätzwerte; der wahre Wert in der Population ist unbekannt. Wir kennen schließlich nur eine Stichprobe der Größe \(n=143\).)
Die Regressionsgleichung von lm3
lautet demnach:
total_pr_pred = 36.25 + 4.34*ship_pr
.
In Worten:
Der vorhergesagte Gesamptreis eines Spiels liegt bei 36.25€ “Sockelbetrag” plus 4.34 mal die Versandkosten.
9.7.2 Vertiefung
Man kann sich die erwarteten Werte (“expectations”) des Verkaufspreises in Abhängigkeit vom Wert der UV (ship_pr
) auch schätzen (“to estimate”) lassen, und zwar so:
ship_pr | Predicted | SE | 95% CI | Residuals |
---|---|---|---|---|
4.00 | 53.59 | 1.87 | (49.89, 57.30) | -2.04 |
3.99 | 53.55 | 1.87 | (49.85, 57.25) | -16.51 |
3.50 | 51.43 | 1.82 | (47.82, 55.03) | -5.93 |
0.00 | 36.25 | 2.54 | (31.23, 41.26) | 7.75 |
0.00 | 36.25 | 2.54 | (31.23, 41.26) | 34.75 |
4.00 | 53.59 | 1.87 | (49.89, 57.30) | -8.59 |
Variable predicted: total_pr
Ah, bei 4 Euro Versandkosten ist laut dem Modell knapp 54 Euro Verkaufspreis zu erwarten, fassen Sie sich die Ausgabe zusammen.
🤖 Das sieht man in der Spalte
Predicted
, dort steht der vorhersagte Wert fürtotal_pr
für einen bestimmten Wert vonship_pr
.
🧑🎓 Kann ich auch
predict
benutzen? Ich würde gerne den Verkaufspreis wissen, wenn die Versandkosten bei 1 und bei 4 Euro liegen.
🤖 Ja, klar!
predict(lm3, newdata = neue_daten)
## 1 2
## 41 54
Aber nützlich wäre noch, das Modell (bzw. die Schätzung der erwarteten Werte) als Diagramm zu bekommen. Das erreicht man z.B. so, s. Abbildung 10.10.
estimate_expectation
heißt sinngemäß “schätze den zu erwartenden Wert”. Kurz gesagt: Wir wollen eine Vorhersage von R.
Am wichtigsten ist Ihnen aber im Moment die Frage, wie “gut” das Modell ist, spricht wie lang oder kurz die (absoluten) Vorhersagefehler-Balken sind:
mae(lm3)
## [1] 13
Das Modell erklärt einen Anteil von ca. 0.29 der Gesamtstreuung.
r2(lm3)
## # R2 for Linear Regression
## R2: 0.294
## adj. R2: 0.289
mae(lm3)
## [1] 13
Im nächsten Meeting erzählen Sie Ihrem Chef “Ich kann den Verkaufspreis von Mariokart-Spielen im Schnitt auf 13 Dollar genau vorhersagen!”. Hört sich gut an. Allerdings hätte ihr Chef es gerne genauer. Kann man da noch was machen?
9.8 Fallstudie Immobilienpreise
Diese Fallstudie stellt die Prüfungsleistung “Prognosewettbewerb” einführend dar. Es empfiehlt sich für Sie, diese Fallstudie sorgsam zu bearbeiten.\(\square\)
9.8.1 Hintergrund
In dieser Fallstudie geht es darum, die Preise von Immobilien vorherzusagen. Kurz gesagt: Sagen Sie die Hauspreise vorher, und reichen Sie Ihre Vorhersagen als CSV bei Kaggle ein.
Kaggle ist eine Webseite, die Prognosewettbewerbe veranstaltet.
In dieser Fallstudie nehmen Sie teil an der Kaggle-Competition Ames House Prices.4
9.8.2 Benötigte R-Pakete
9.8.3 Daten
Wenn Sie sich nicht bei Kaggle einloggen möchten, können Sie die Daten von Kaggle herunterladen und zwar hier.
Im Einzelnen müssen Sie folgende Dateien herunterladen:
- Data_description.txt: Code book, d.h. Beschreibung der Variablen im Datensatz
- train.csv: Daten von Häusern, die Sie nutzen, um Modelle zu erstellen
- test.csv: Daten von Häusern, von denen Sie den Kaufpreis vorhersagen sollen
- sample_submission.csv: Beispielhafte Prognosedatei, die Datei also, mit der Sie Ihre Vorhersagen einreichen
Sie können auch so auf die Daten zugreifen:
d_train_path_online <- paste0(
"https://raw.githubusercontent.com/sebastiansauer/",
"Lehre/main/data/ames-kaggle/train.csv")
d_test_path_online <- paste0(
"https://raw.githubusercontent.com/sebastiansauer/",
"Lehre/main/data/ames-kaggle/test.csv")
d_train <- read.csv(d_train_path_online)
d_test <- read.csv(d_test_path_online)
Laden Sie diese Daten am besten herunter und speichern Sie sie in einem passenden Unterverzeichnis (Ihres Projektordners in RStudio) ab.
Das Code Book können Sie hier einsehen und herunterladen.8
9.8.4 Prognosedatei
Die Prognosedatei ist die Datei, die Ihre Vorhersagen (Prognosen) enthält. Sie soll prinzipiell so aussehen wie in Tabelle 9.2 dargestellt.
id | SalePrice |
---|---|
1461 | 169277 |
1462 | 187758 |
1463 | 183584 |
Die Prognosedatei besteht also aus zwei Spalten: der Spalte id
und der Spalte Saleprice
. Die Spalte id
gibt an, welches Haus in einer bestimmten Zeile Ihrer Prognosedatei gemeint ist - für welches Haus Sie also gerade einen Kaufpreis vorhersagen. die Spalte SalePrice
ist Ihre Vorhersage für den Kaufpreis das Hauses mit der Id, die in der betreffenden Zeile steht. Insgesamt soll die Prognosedatei genau so viele Zeilen haben wie der Test-Datensatz, also die Tabelle, die die vorherzusagenden Werte angibt.
Alles klar?
Los geht’s!
9.8.5 Daten importieren von der Festplatte
Wir können die Daten auch von der Festplatte importieren; oft müssen wir das auch - wenn die Daten nämlich nicht öffentlich zugreifbar auf einem Server liegen.
In diesem Beispiel gehen wir davon aus, dass die Dateien train.csv
und test.csv
in einem Unterordner namens daten/ames-kaggle
liegen. Sie müssen sie dort abspeichern. Dieser Ordner muss ein Unterordner Ihres aktuellen R-Projekts sein.\(\square\)
Wenn das Importieren von der Festplatte nicht klappt … Es ist hilfreich, wenn man Daten von der eigenen Festplatte importieren kann. Aber fürs Erste können Sie die Daten auch von oben angegeben Online-Pfad importieren.\(\square\)
9.8.6 Ein erster Blick in die Daten
Schauen wir uns einmal die Verteilung der metrischen Variablen an, Tabelle 9.3.
describe_distribution(d_train)
Variable | Mean | SD | IQR | Range | Skewness | Kurtosis | n | n_Missing |
---|---|---|---|---|---|---|---|---|
Id | 730.50 | 421.61 | 730.50 | (1.00, 1460.00) | 0.00 | -1.20 | 1460 | 0 |
MSSubClass | 56.90 | 42.30 | 50.00 | (20.00, 190.00) | 1.41 | 1.58 | 1460 | 0 |
LotFrontage | 70.05 | 24.28 | 21.00 | (21.00, 313.00) | 2.16 | 17.45 | 1201 | 259 |
LotArea | 10516.83 | 9981.26 | 4060.00 | (1300.00, 2.15e+05) | 12.21 | 203.24 | 1460 | 0 |
OverallQual | 6.10 | 1.38 | 2.00 | (1.00, 10.00) | 0.22 | 0.10 | 1460 | 0 |
OverallCond | 5.58 | 1.11 | 1.00 | (1.00, 9.00) | 0.69 | 1.11 | 1460 | 0 |
YearBuilt | 1971.27 | 30.20 | 46.00 | (1872.00, 2010.00) | -0.61 | -0.44 | 1460 | 0 |
YearRemodAdd | 1984.87 | 20.65 | 37.00 | (1950.00, 2010.00) | -0.50 | -1.27 | 1460 | 0 |
MasVnrArea | 103.69 | 181.07 | 166.00 | (0.00, 1600.00) | 2.67 | 10.08 | 1452 | 8 |
BsmtFinSF1 | 443.64 | 456.10 | 712.75 | (0.00, 5644.00) | 1.69 | 11.12 | 1460 | 0 |
BsmtFinSF2 | 46.55 | 161.32 | 0.00 | (0.00, 1474.00) | 4.26 | 20.11 | 1460 | 0 |
BsmtUnfSF | 567.24 | 441.87 | 585.00 | (0.00, 2336.00) | 0.92 | 0.47 | 1460 | 0 |
TotalBsmtSF | 1057.43 | 438.71 | 503.50 | (0.00, 6110.00) | 1.52 | 13.25 | 1460 | 0 |
X1stFlrSF | 1162.63 | 386.59 | 509.75 | (334.00, 4692.00) | 1.38 | 5.75 | 1460 | 0 |
X2ndFlrSF | 346.99 | 436.53 | 728.00 | (0.00, 2065.00) | 0.81 | -0.55 | 1460 | 0 |
LowQualFinSF | 5.84 | 48.62 | 0.00 | (0.00, 572.00) | 9.01 | 83.23 | 1460 | 0 |
GrLivArea | 1515.46 | 525.48 | 649.75 | (334.00, 5642.00) | 1.37 | 4.90 | 1460 | 0 |
BsmtFullBath | 0.43 | 0.52 | 1.00 | (0.00, 3.00) | 0.60 | -0.84 | 1460 | 0 |
BsmtHalfBath | 0.06 | 0.24 | 0.00 | (0.00, 2.00) | 4.10 | 16.40 | 1460 | 0 |
FullBath | 1.57 | 0.55 | 1.00 | (0.00, 3.00) | 0.04 | -0.86 | 1460 | 0 |
HalfBath | 0.38 | 0.50 | 1.00 | (0.00, 2.00) | 0.68 | -1.08 | 1460 | 0 |
BedroomAbvGr | 2.87 | 0.82 | 1.00 | (0.00, 8.00) | 0.21 | 2.23 | 1460 | 0 |
KitchenAbvGr | 1.05 | 0.22 | 0.00 | (0.00, 3.00) | 4.49 | 21.53 | 1460 | 0 |
TotRmsAbvGrd | 6.52 | 1.63 | 2.00 | (2.00, 14.00) | 0.68 | 0.88 | 1460 | 0 |
Fireplaces | 0.61 | 0.64 | 1.00 | (0.00, 3.00) | 0.65 | -0.22 | 1460 | 0 |
GarageYrBlt | 1978.51 | 24.69 | 41.00 | (1900.00, 2010.00) | -0.65 | -0.42 | 1379 | 81 |
GarageCars | 1.77 | 0.75 | 1.00 | (0.00, 4.00) | -0.34 | 0.22 | 1460 | 0 |
GarageArea | 472.98 | 213.80 | 244.50 | (0.00, 1418.00) | 0.18 | 0.92 | 1460 | 0 |
WoodDeckSF | 94.24 | 125.34 | 168.00 | (0.00, 857.00) | 1.54 | 2.99 | 1460 | 0 |
OpenPorchSF | 46.66 | 66.26 | 68.00 | (0.00, 547.00) | 2.36 | 8.49 | 1460 | 0 |
EnclosedPorch | 21.95 | 61.12 | 0.00 | (0.00, 552.00) | 3.09 | 10.43 | 1460 | 0 |
X3SsnPorch | 3.41 | 29.32 | 0.00 | (0.00, 508.00) | 10.30 | 123.66 | 1460 | 0 |
ScreenPorch | 15.06 | 55.76 | 0.00 | (0.00, 480.00) | 4.12 | 18.44 | 1460 | 0 |
PoolArea | 2.76 | 40.18 | 0.00 | (0.00, 738.00) | 14.83 | 223.27 | 1460 | 0 |
MiscVal | 43.49 | 496.12 | 0.00 | (0.00, 15500.00) | 24.48 | 701.00 | 1460 | 0 |
MoSold | 6.32 | 2.70 | 3.00 | (1.00, 12.00) | 0.21 | -0.40 | 1460 | 0 |
YrSold | 2007.82 | 1.33 | 2.00 | (2006.00, 2010.00) | 0.10 | -1.19 | 1460 | 0 |
SalePrice | 1.81e+05 | 79442.50 | 84075.00 | (34900.00, 7.55e+05) | 1.88 | 6.54 | 1460 | 0 |
9.8.7 Ein erstes Vorhersagemodell
9.8.7.1 Welche Variablen eignen sich zur Vorhersage?
Eine einfache Antwort auf die Frage, welche Variablen sich zur Vorhersage eignen, ist, die Korrelation aller Prädiktoren mit der abhängigen Variablen9 zu berechnen, s. Listing 9.2.
Aha! Ein Menge Information.10
Diese Variablen sind einigermaßen stark mit unserer Zielvariablen SalePrice
korreliert. Nutzen wir also diese Variablen (oder einige von ihnen) zur Vorhersage.
9.8.7.2 Modell 1
Im ersten Modell gehen wir davon aus, dass der Verkaufspreis im Großen und Ganzen durch den Zustand der Immobilie (OverallQual
) vorhergesagt werden kann. Diese Variable ist am stärksten mit der Zielvariable korreliert und ist daher ein guter Kandidat für die Vorhersage.
m1 <- lm(SalePrice ~ OverallQual, data = d_train)
parameters(m1) # aus easystats
Parameter | Coefficient | SE | 95% CI | t(1458) | p |
---|---|---|---|---|---|
(Intercept) | -96206.08 | 5756.41 | (-1.07e+05, -84914.35) | -16.71 | < .001 |
OverallQual | 45435.80 | 920.43 | (43630.29, 47241.31) | 49.36 | < .001 |
Wie gut ist das Modell?
rmse(m1) # aus easystats
## [1] 48589
Im Schnitt liegen wir 4.54^{4} Dollar daneben. Ob das viel oder weniger ist, wird sich im Vergleich mit anderen Modellen zeigen.
R-Quadrat liefert einen anderen Blick auf die Modellgüte:
r2(m1) # aus easystats
## # R2 for Linear Regression
## R2: 0.626
## adj. R2: 0.625
9.8.7.3 Model 2
Berechnen wir als nächstes ein Modell mit mehreren UV, m2
.
Mann kann mehrere UV (Prädiktorvariablen) in ein Regressionsmodell aufnehmen. Dazu trennt man sie mit einem Pluszeichen in lm()
:
mein_modell <- lm(av ~ uv1 + uv2 + ... + uv_n, data = meine_daten)
Dabei ist das Pluszeichen kein arithmetischer Operator, sondern sagt nur “als UV nimm UV1 und UV2 und …”. \(\square\)
m2 <- lm(SalePrice ~ OverallQual + GrLivArea + GarageCars, data = d_train)
parameters(m2)
Tabelle 9.5 zeigt die Koeffizienten von m2
.
Parameter | Coefficient | SE | 95% CI | t(1456) | p |
---|---|---|---|---|---|
(Intercept) | -98832.49 | 4842.90 | (-1.08e+05, -89332.69) | -20.41 | < .001 |
OverallQual | 27104.83 | 1072.18 | (25001.64, 29208.01) | 25.28 | < .001 |
GrLivArea | 50.67 | 2.55 | (45.67, 55.68) | 19.86 | < .001 |
GarageCars | 21298.96 | 1807.06 | (17754.23, 24843.69) | 11.79 | < .001 |
Wie gut sind die Vorhersagen des Modells m2
für die Daten von d_train
?
rmse(m2)
## [1] 40566
Im Schnitt liegen unsere Vorhersagen 2.71^{4} Dollar daneben. Ist das gut?
Betrachten wir noch \(R^2\):
r2(m2)
## # R2 for Linear Regression
## R2: 0.739
## adj. R2: 0.739
Ob die Modellgüte (R-Quadrat, RMSE, etc.) “gut” oder “hoch” ist, beantwortet man am besten relativ, also im Vergleich zu anderen Modellen. \(\square\)
9.8.7.4 Nullmodell
Zum Vergleich berechnen wir das maximal einfache Modell: ohne Prädiktoren. Man nennt es das “Nullmodell”. In diesem Modell sagen wir für jedes Haus einfach den mittleren Preis aller Häuser vorher.
m0 <- lm(SalePrice ~ 1, data = d_train)
Wie gut ist die Vorhersage des Nullnomdells?
rmse(m0)
## [1] 79415
Beim Nullmodell liegen wir ca. 80 Tausend Dollar daneben.
Das R-Quadrat der Nullmodells ist per Definition Null:
r2(m0)
## # R2 for Linear Regression
## R2: 0.000
## adj. R2: 0.000
9.8.8 Vorhersagen im Test-Datensatz mit m2
Wir haben jetzt unseren Champion, m2
. Alle Hoffnung ruht auf diesem Modell. Ob die Vorhersagen im Test-Sample präzise sein werden? Oder himmelweit daneben? Enttäusche uns nicht!
Hier sind die Vorhersagen:
m2_pred <- predict(m2, newdata = d_test)
head(m2_pred)
## 1 2 3 4 5 6
## 103395 152441 161838 187676 225467 190260
- 1
-
predicte anhand der Regressionsgerade von m1 und zwar anhand der Daten aus
d_test
- 2
-
zeige den “Kopf” der Vorhersagen (
m1_pred
), d.h. die ersten paar Vorhersagen
Die Vohersagen fügen wir jetzt dem Test-Sample hinzu:
9.8.9 Einreichen!
9.8.9.1 Wir brauchen zwei Spalten: Id
und SalePrice
So, wir haben unsere Vorhersagen! Jetzt reichen wir diese Vorhersagen ein.
Für die Prognosedatei (submission file) zum Einreichen brauchen wir nur die Spalten id
und SalePrice
:
Kaggle möchte keine fehlenden Werten in den Vorhersagen, also prüfen wir das mal:
- 1
- Lass alle Zeilen mit NAs (fehlenden Werten in irgendeiner Spalte) fallen, filtere diese Zeilen also raus
- 2
- zähle die Anzahl der Zeilen (die noch verbleiben)
Die Anzahl der Zeilen, die wir hier erhalten, ist gleich zu den Anzahl der Zeilen von d_test
. Es gibt also keine fehlenden Werte.
nrow(d_test)
## [1] 1459
9.8.9.2 Hochladen
Diesen Tibble speichern wir als CSV-Datei an geeigneter Stelle ab.11
write_csv(m2_subm, "daten/ames-kaggle/m1-subm.csv")
Und dann laden Sie diese Datei, m1_subm.csv
bei Kaggle hoch und hoffen auf einen Hauptgewinn.
Das Modell erzielte einen Score von 0.55521.
9.8.10 Fazit
Diese Fallstudie hat ein einfaches Prognosemodell vorgestellt. Sicherlich gibt es viele Ansätze, dieses Modell zu verbessern.
Hier sind einige Fragen, die Sie sich dazu stellen können:
- Welche Prädiktoren sollte ich in das Modell aufnehmen?
- Wie gehe ich mit fehlenden Werten um?
- Wenn ein Prädiktor schief ist, sollte ich ihn dann log-transformieren?
- Vielleicht sollte man manche Prädiktoren quadrieren?
- Wie gehe ich mit nominalskalierten Variablen um, wenn diese viele Stufen haben?
- …
Viel Spielraum für Ihre Kreativität!
9.9 Aufgaben
Eine Aufgabe, die eine Einführung zum Kaggle-Wettbewerb Ames House Prices bietet12, finden Sie im Datenwerk.13
Die Webseite datenwerk.netlify.app stellt eine Reihe von einschlägigen Übungsaufgaben bereit. Sie können die Suchfunktion der Webseite nutzen, um die Aufgaben mit den folgenden Namen zu suchen:
- Aussagen-einfache-Regr
- interpret-koeff-lm
- korr-als-regr
- Linearitaet1a
- lm1
- mtcars-regr01
- nichtlineare-regr1
- penguins-regr02
- regression1
- regression1b
- Regression3
- Regression4
- Regression5
- Regression6
Schauen Sie sich die Aufgaben beim Datenwerk an, vor allem die Tags regression und lm.
Nicht alle Aufgaben aus dieser Sammlung passen zum Stoff; vielleicht können Sie einige Aufgaben nicht lösen. Ignorieren Sie einfach diese Aufgaben.
Beachten Sie die Hinweise zu den Aufgaben.14
9.10 Literaturhinweise
Gelman et al. (2021) liefert eine deutlich umfassendere Einführung in die Regressionsanalyse als dieses Kapitel es tut. Eine moderne, R-orientierte Einführung in Statistik inklusive der Regressionsanalyse findet sich bei Cetinkaya-Rundel & Hardin (2021). Ein Klassiker mit viel Aha-Potenzial ist Cohen et al. (2003)
https://raw.githubusercontent.com/sebastiansauer/statistik1/main/daten/noten.csv↩︎
Die Daten stehen hier zum Download bereit: https://raw.githubusercontent.com/sebastiansauer/statistik1/main/daten/noten2.csv↩︎
https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques/overview↩︎
https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques/overview/description↩︎
https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques/overview/evaluation↩︎
https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques/rules↩︎
<ttps://github.com/sebastiansauer/Lehre/blob/main/data/ames-kaggle/data_description.txt>↩︎
die vorherzusagende Variable, auch Ziel- oder Outcome-Variable genannt↩︎
Wenn Sie Teile der Ausgabe der Tabelle nicht verstehen: Im Zweifel einfach ignorieren. Wenn Sie die R-Syntax nicht verstehen: Führen Sie die Syntax schrittweise aus. Zuerst
d_train
ausführen und das Ergebnis betrachten. Dannd_train %>% select(-Id)
ausführen, wieder die Ausgabe betrachten, usw.↩︎Es bietet sich an
write_csv
zu verwenden, dawrite.csv
automatisch (ungefragt) noch eine Id-Spalte ohne Namen einfügt (mit den Zeilennummern), das mag aber Kaggle nicht. Kaggle erwartet exakt zwei Spalten und zwar mit den NamenId
undSalePrice
.↩︎https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques/overview↩︎
https://sebastiansauer.github.io/Datenwerk/posts/ames-kaggle1/ames-kaggle1.html↩︎