Review-Tutorial Multiple lineare Regression

Autor:in
Zugehörigkeit

Markus Geuss

Fernfachhochschule Schweiz

TippLernziele

Nach dem Erarbeiten des Tutorials sind Sie in der Lage …

  1. die konzeptionellen Ideen und mathematischen Grundlagen der multiplen linearen Regression (MLR) zu erläutern.
  2. Datensätze für MLR vorzubereiten und auf Eignung zu prüfen.
  3. explorative Datenanalysen durchzuführen und Zusammenhänge zu visualisieren.
  4. ein MLR‑Modell in R zu implementieren und zu testen.
  5. Modellvoraussetzungen (Linearität, Homoskedastizität, Unabhängigkeit, Normalverteilung, Multikollinearität) zu prüfen.
  6. Modellgütemasse (\(R^2\)), adjusted \(R^2\), AIC, F‑Test zu erklären und zu interpretieren.
  7. Ergebnisse fachgerecht zu interpretieren und Vorhersagen zu treffen.

Motivation

Stell dir vor, ein Unternehmen möchte das Jahresgehalt seiner Angestellten vorhersagen. Es ist naheliegend, dass Faktoren wie Berufserfahrung und Qualifikationsniveau einen Einfluss haben. Doch wie stark beeinflussen diese Variablen das Gehalt tatsächlich? Gibt es noch andere Einflussfaktoren?

Mit der MLR können wir diese Fragen beantworten. Wir können

  • quantifizieren, wie stark jeder Faktor das Gehalt beeinflusst,
  • Vorhersagen für neue Datenpunkte treffen,
  • herausfinden, ob einige Faktoren wichtiger sind als andere.

Die Idee der MLR

Die MLR erweitert die einfache lineare Regression und beschreibt die Zielvariable (\(Y\)) als Linearkombination der Prädiktoren (\(X_1, \dots, X_p\)):

\[Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_p X_p + \epsilon,\]

wobei \(Y\) die Zielvariable, \(X_j\) die Prädiktoren, \(\beta_j\) die Regressionskoeffizienten und \(\epsilon\) der Fehlerterm ist. Aus einer einfachen Geraden im Streudiagramm wird somit eine (Hyperebene) im Raum um die die Datenpunkte streuen.

Verständnisfrage: Ziel der MLR

Was ist das Ziel der multiplen linearen Regression?

a) Das Finden von Beziehungen zwischen einer abhängigen und mehreren unabhängigen Variablen.
b) Das Erstellen von Entscheidungsbäumen.
c) Die Normalisierung von Daten.

Antwort anzeigen

Richtige Antwort: a) Wir wollen ein mehrdimensionales lineares Modell aufstellen, das die Abhängigkeit einer abhängigen Variablen von mehreren unabhängigen Variablen beschreibt. Geometrisch entspricht dies einer Hyperebene.

Fallstudie

Wir analysieren, wie das Jahresgehalt eines Mitarbeiters (Annu_Salary) von zwei Faktoren beeinflusst wird:

  • Berufserfahrung (Expe_Yrs)
  • Qualifikationsniveau (Skill_lev)

Daten einlesen

Code
sal_data_1 <- read.csv("data/Sal1.txt", header = TRUE, sep = ",")
str(sal_data_1)
'data.frame':   48 obs. of  3 variables:
 $ Annu_Salary: int  4000 6000 8000 10000 12000 14000 16000 14000 18000 20000 ...
 $ Expe_Yrs   : num  0 1 2 3 4 4.5 5 4 6 7 ...
 $ Skill_lev  : num  0.5 1 1.5 2 2.5 3.5 4 4 4 4.5 ...
Code
summary(sal_data_1)
  Annu_Salary       Expe_Yrs       Skill_lev    
 Min.   : 4000   Min.   :0.000   Min.   :0.500  
 1st Qu.:10000   1st Qu.:2.438   1st Qu.:2.425  
 Median :14500   Median :4.750   Median :3.150  
 Mean   :13854   Mean   :4.373   Mean   :3.079  
 3rd Qu.:18000   3rd Qu.:6.263   3rd Qu.:4.000  
 Max.   :22000   Max.   :8.500   Max.   :5.000  

(Wer selbst mit dem Datensatz arbeiten möchte: Sal1.txt – Ergänzende Textdaten.)

Explorative Datenanalyse

Streudiagramm‑Matrix mit Korrelation

Code
GGally::ggpairs(
  sal_data_1[, c("Expe_Yrs", "Skill_lev", "Annu_Salary")],
  title = "Streudiagramm-Matrix: Erfahrung, Qualifikationsniveau und Jahresgehalt",
  upper = list(continuous = "cor"),
  lower = list(continuous = "points"),
  diag  = list(continuous = "densityDiag")
)

Streudiagramm-Matrix: Berufserfahrung, Qualifikationsniveau und Jahresgehalt

Verständnisfrage: Streudiagramm‑Matrix

Welche der folgenden Aussagen ist basierend auf der Streudiagramm‑Matrix plausibel?

a) Das Qualifikationsniveau zeigt keinen Zusammenhang mit dem Gehalt.
b) Die Prädiktoren sind vollständig unabhängig voneinander.
c) Es gibt eine starke positive Korrelation zwischen Berufserfahrung und Jahresgehalt.

Antwort anzeigen

Richtige Antwort: c) Die Matrix zeigt einen klaren positiven linearen Zusammenhang zwischen Berufserfahrung und Jahresgehalt.

Anmerkung: Die “Density”, die hier als kontinuierliche Funktion in der Matrix dargestellt wird ist die Wahrscheinlichkeitsdichtefunktion der jeweiligen Variablen: \[f(x) = \lim_{h\rightarrow 0} P(x \leq X \leq x+h) / h\] .

Visualisierung in 3D mit Plotly

Code
plot_ly(
  sal_data_1,
  x = ~Expe_Yrs,
  y = ~Skill_lev,
  z = ~Annu_Salary,
  type = "scatter3d",
  mode = "markers",
  marker = list(size = 5, color = ~Annu_Salary, colorscale = "Viridis")
) %>%
  layout(
    title = "3D-Visualisierung: Erfahrung, Qualifikationsniveau und Jahresgehalt",
    scene = list(
      xaxis = list(title = "Berufserfahrung (Jahre)"),
      yaxis = list(title = "Qualifikationsniveau"),
      zaxis = list(title = "Jahresgehalt")
    )
  )

3D-Visualisierung: Erfahrung, Qualifikationsniveau und Jahresgehalt

Geometrisch ist das MLR‑Modell eine (Hyper-)Ebene, die die Daten annähert.

Erinnern wir uns daran, dass geometrisch unser zu berechnendes Modell der multiplen linearen Regression eine Hyperebene im Raum darstellt, um die Daten zu modellieren. Drehen wir hier den Betrachtungspunkt unserer 3D Darstellung, sehen wir schon, dass die Punkte offenbar (visuell) gut in einer Ebene liegen.

Diskussion der Ergebnisse der Explorativen Datenanalyse

Die Streudiagramm-Matrix kombiniert Streudiagramme und Korrelationen, um uns ein klares Bild von den Beziehungen zwischen den Variablen zu geben. Betrachten wir die wichtigsten Beobachtungen:

  1. Hohe positive Korrelationen:

    • Berufserfahrung (Expe_Yrs) und Jahresgehalt (Annu_Salary): Die Korrelation von 0.989 zeigt einen starken positiven linearen Zusammenhang. Das bedeutet, dass mehr Erfahrung tendenziell mit einem höheren Gehalt einhergeht.
    • Qualifikationsniveau (Skill_lev) und Jahresgehalt (Annu_Salary): Eine Korrelation von 0.941 deutet ebenfalls auf einen starken positiven Zusammenhang hin.
  2. Zusammenhang zwischen den Prädiktoren: Berufserfahrung und Qualifikationsniveau zeigen eine hohe Korrelation von 0.892. Das könnte auf Multikollinearität hinweisen, die in der Modellbildung berücksichtigt werden muss.

  3. Verteilungen der Variablen: Die Verteilungen auf der Diagonale zeigen uns die Eigenschaften der einzelnen Variablen:

    • Berufserfahrung und Qualifikationsniveau sind gleichmässig verteilt.
    • Das Jahresgehalt hat eine leichte Konzentration im Bereich von 10.000 bis 15.000.

Modellbildung (MLR)

Nach der explorativen Datenanalyse erstellen wir nun ein lineares Regressionsmodell, um die Beziehung zwischen den Prädiktoren (Berufserfahrung, Qualifikationsniveau) und der Zielvariablen (Jahresgehalt) formal zu modellieren.

  1. Erstellung des Regressionsmodells

Wir verwenden die Funktion lm() in R, um ein lineares Regressionsmodell zu erstellen.

Code
sal_model_1 <- lm(Annu_Salary ~ Expe_Yrs + Skill_lev, data = sal_data_1)
summary(sal_model_1)

Call:
lm(formula = Annu_Salary ~ Expe_Yrs + Skill_lev, data = sal_data_1)

Residuals:
   Min     1Q Median     3Q    Max 
-605.6 -318.5  -23.8  354.3  666.0 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3011.66     162.58   18.52  < 2e-16 ***
Expe_Yrs     1589.68      50.86   31.26  < 2e-16 ***
Skill_lev    1263.65     102.03   12.38 4.25e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 377.5 on 45 degrees of freedom
Multiple R-squared:  0.995, Adjusted R-squared:  0.9948 
F-statistic:  4469 on 2 and 45 DF,  p-value: < 2.2e-16

Modellvoraussetzungen – Übersicht

Damit wir die Koeffizienten unseres Modells und seine Güte seriös beurteilen können, müssen wir die Modellvoraussetzungen prüfen.

Zu ihnen zählen:

  1. Lineare Beziehung zwischen den Prädiktoren und der abhängigen Variablen.

  2. Homoskedastizität (konstante Varianz der Fehler/Residuen).

  3. Unabhängigkeit der Fehler/Residuen (keine Autokorrelation).

  4. Normalverteilung der Residuen.

  5. Multikollinearität der Prädiktoren

1) Linearität – Component‑Residual‑Plots

Lineare Beziehungen können mit Komponent-Residuen-Diagrammen (crPlots) getestet werden.

Hierbei muss man sich die geometrische Interpretation des Modells vor Augen führen. Unser Modell ist eine Hyperebene im (Hyper)Raum (vergleiche unsere plotly Darstellung!), die unsere Datenpunkte so gut wie möglich beschreiben soll. Stellen wir uns vor, es gäbe z.B.Nichtlinearitäten in den Daten (Wellen, Krümmungen etc.) dann wäre ein lineares Modell ein schlechtes Modell. Die Komponenten-Residuen-Diagramme helfen dabei, dies zu evaluieren. Geometrisch können wir uns qualitativ vorstellen, dass für jedes Diagramm die Hyperebene so betrachtet wird, dass die Einflüsse der nicht betrachteten Prädiktoren herausgerechnet sind. D.h. wir sehen nur den Einfluss des jeweils dargestellten Prädiktors. Diese müssen linear sein.

Wie sehen sie für unsere beiden Prädiktoren aus?

Code
car::crPlots(sal_model_1)

Wir sehen nur in dem Qualifikationsniveau (Skill_lev) eine gewisse Welligkeit, aber weitgehend eine lineare Abhängigkeit \(\rightarrow\) erfüllt.

2) Homoskedastizität – Scale‑Location‑Plot

Für die Homoskedastizität schauen wir uns den sog. Scale Location Plot an:

Code
plot(sal_model_1, which = 3)

Was zeigt der Scale-Location-Plot?

Der Scale-Location-Plot stellt die Wurzel der standardisierten Residuen auf der y-Achse und die angepassten Werte (fitted values) auf der x-Achse dar.

Mathematische Grundlage:

  1. Standardisierte Residuen (\(r_i\)): \[r_i = \frac{e_i}{\hat{\sigma}}\]

    wobei \(e_i\) die Residuen und \(\hat{\sigma}\) die geschätzte Standardabweichung der Residuen ist.

  2. Darstellung im Plot:

    • x-Achse: Angepasste Werte (\(\hat{Y}_i\)).
    • y-Achse: Die Wurzel der absoluten standardisierten Residuen: \[y = \sqrt{|r_i|}\]

Wenn die Punkte zufällig gestreut sind, ist die Annahme der Homoskedastizität erfüllt.

Ziel dieses Plots ist es zu überprüfen, ob die Varianz der Residuen über den Bereich der angepassten Werte hinweg konstant bleibt. Interpretation des Scale-Location-Plots:

  1. Randomisierte Verteilung der Punkte: Wenn die Punkte zufällig um eine nahezu horizontale Linie verteilt sind, zeigt dies an, dass die Varianz der Fehler/Residuen über den gesamten Bereich der angepassten Werte konstant ist. Dies unterstützt die Annahme der Homoskedastizität.

  2. Zunehmende oder abnehmende Streuung: Falls die Punkte eine systematische Form aufweisen, wie z.B. einen Trichter (Verengung oder Verbreiterung), deutet dies auf Heteroskedastizität hin, d.h. die Varianz der Fehler/Residuen ändert sich in Abhängigkeit von den angepassten Werten.

  3. Zweck: Der Plot hilft uns zu erkennen, ob es Muster in der Varianz der Fehler gibt, die möglicherweise auf Heteroskedastizität hinweisen.

Bei unserem Modell: Die Residuen sehen zufällig streuend aus. Auch dies können wir testen, mit dem Non-constant Variance Score Test. Hier ist die Nullhypothese, dass die Bedingung der Homoskedastizität erfüllt ist (= Varianz der Residuen konstant ist).

Code
ncvTest(sal_model_1)
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 0.1810408, Df = 1, p = 0.67048

Die Nullhypothese kann nicht verworfen werden kann, da der p-Wert höher als 0.05 liegt. Homoskedastizität darf folglich angenommen werden.

Verständnisfrage: Homoskedastizität

Warum ist die Homoskedastizität eine wichtige Annahme?

a) Sie prüft den Zusammenhang zwischen Prädiktoren und Zielvariable.
b) Sie fordert eine konstante Varianz der Residuen über den Wertbereich der (angepassten) Werte und erlaubt unverzerrte, effiziente Schätzungen.
c) Sie garantiert die Normalverteilung der Residuen.
d) Sie minimiert den Einfluss von Ausreissern.

Antwort anzeigen

Richtige Antwort: b) Konstante Varianz der Residuen über den ganzen Wertebereich ist zentral für valide Standardfehler und Tests.

3) Unabhängigkeit der Residuen – keine Autokorrelation - Durbin‑Watson Test

Eine wichtige Annahme der linearen Regression ist, dass die Fehlerterme (Residuen) des Modells unabhängig voneinander sind. Dies bedeutet, dass der Fehler eines Datenpunkts nicht mit den Fehlern der anderen Datenpunkte korreliert. Wenn diese Annahme verletzt wird, spricht man von** Autokorrelation**.

Mit dem Durbin-Watson Test können wir auf Autokorrelation testen:

Code
car::durbinWatsonTest(sal_model_1)
 lag Autocorrelation D-W Statistic p-value
   1       0.2987001      1.338564    0.02
 Alternative hypothesis: rho != 0

Interpretation des Durbin-Watson-Tests:

  • Werte nahe 2: Keine Autokorrelation.

  • Werte unter 2: Positive Autokorrelation (Fehler in aufeinanderfolgenden Beobachtungen sind ähnlich).

  • Werte über 2: Negative Autokorrelation (Residuen wechseln zwischen positiven und negativen Werten).

Wenn der Durbin-Watson-Wert signifikant (p-Wert <0.05 -> Autokorrelation) von 2 abweicht, deutet dies auf das Vorhandensein von Autokorrelation hin, d.h. man muss sich die Residuen der jeweiligen Prädiktoren ansehen und überlegen, woher diese kommen könnten.

Unser Wert von 0.2987 ist deutlich unter 2. Dies deutet also auf eine positive Autokorrelation hin. D.h., dass Abweichungen vom Modell (Fehler/Residuen) bei Berufserfahrung und Qualifikationsniveau (teilweise) systematisch erfolgen. Diese Voraussetzung ist also nur teilweise erfüllt.

Für eine weitere Vertiefung siehe: Auszug Durbin Wason Test Hedderich Sachs

Verständnisfrage: Unabhängigkeit der Residuen

Warum ist die Annahme der Unabhängigkeit der Residuen wichtig?

a) Sie verhindert systematische Beziehungen zwischen Fehlern und sichert die Gültigkeit der Inferenz.
b) Sie minimiert den Einfluss von Ausreissern.
c) Sie zeigt an, dass keine Nichtlinearitäten vorliegen.
d) Sie stellt konstante Varianz der Fehler sicher.

Antwort anzeigen

Richtige Antwort: a) Wenn Residuen nicht unabhängig sind (Autokorrelation), entstehen systematische Beziehungen zwischen Fehlern, was die Standardfehler verzerrt und statistische Tests ungültig macht.

4) Normalverteilung der Residuen – QQ‑Plot & Shapiro‑Wilk Test

Diese Bedingung haben wir schon früher bei der linearen Einfachregression analysiert. Fertigen wir den QQ-Plot an.

Code
plot(sal_model_1, which = 2)

Der visuelle Eindruck des Residuenplotts zeigt für die aussenliegenden Quantilen Abweichungen. Deshalb testen wir mit dem Shapiro-Wilk-Test auf Normalverteilung der Residuen.

Code
shapiro.test(residuals(sal_model_1))

    Shapiro-Wilk normality test

data:  residuals(sal_model_1)
W = 0.9551, p-value = 0.06401

Beim Shapiro-Wilk Test ist die Nullhypothese, dass die Normalverteilungsannahme bestand hat. Da hier der p-Wert über 0.05 liegt, verwerfen wir die Nullhypothese knapp nicht.

Verständnisfrage: Linearität

Warum ist die Überprüfung der Linearität wichtig?

a) Sie ermöglicht die Identifikation nichtlinearer Beziehungen, die ggf. durch Transformation oder andere Modelle besser abgebildet werden.
b) Sie hilft primär bei der Erkennung von Ausreissern.
c) Sie ist nur für die Signifikanz der Koeffizienten wichtig.
d) Sie stellt sicher, dass die Residuen normalverteilt sind.

Antwort anzeigen

Richtige Antwort: a) Die Linearitätsannahme betrifft die Form des Zusammenhangs zwischen Prädiktoren und Zielvariable.

5) Multikollinearität (VIF)

Multikollinearität tritt auf, wenn unabhängige Variablen stark miteinander korrelieren. Die macht es jedoch schwierig, die isolierten Effekte jeder Variablen auf die Zielvariable zu schätzen. Dies führt zu Instabilität in den Koeffizienten, das heisst, kleine Änderungen in den Daten können zu grossen Schwankungen bei den Koeffizienten führen, was die Interpretation der Regressionskoeffizienten erschwert.

Da wir bereits die Korrelationskoeffizienten berechnet haben, wissen wir bereits, dass diese >0.8 liegen und damit einen Hinweise auf Multikollinearität geben.

Eine zuverlässige Metrik für die Kollinearität ist der Variance Inflation Factor (VIF). Schauen wir uns kurz die Definition an.

Mathematische Definition

Der VIF für eine unabhängige Variable \(X_j\) in einem linearen Regressionsmodell wird berechnet als:

\[\mathrm{VIF}_j = \frac{1}{1- R_j^2}\]

Code
car::vif(sal_model_1)
 Expe_Yrs Skill_lev 
 4.907852  4.907852 

wobei \(R_j^2\) das Bestimmtheitsmass ist, das aus der Regression von \(X_j\) auf die anderen unabhängigen Variablen im Modell resultiert.

Ausführlicher wird es im folgenden Video besprochen:

Der VIF misst also, wie stark die Varianz von \(X_j\) durch die anderen Prädiktoren erklärt wird.

Wer sich nicht mehr an die Definition von \(R^2\) erinnert:

Das Bestimmtheitsmass \(R^2\):

\[R^2 = 1 - \frac{SS_{\mathrm{residual}}}{SS_{\mathrm{total}}} = \frac{\sum_{i} \left( \hat{y}_i - \overline{y} \right)^2}{\sum_{i} \left( y_i - \overline{y} \right)^2}\]

wobei: \(SS_{\mathrm{residual}}\) die Summe der Quadrate der Residuen (die Fehlerquadratsumme) ist und \(SS_{\mathrm{total}}\) die Gesamtsumme der Quadrate, welche die Gesamtstreuung der abhängigen Variable beschreibt.

Ein \(R^2\)-Wert von 1 bedeutet, dass das Modell alle Variationen der abhängigen Variable perfekt erklärt. Hingegen bedeutet ein \(R^2\)-Wert von 0, dass das Modell keinerlei Erklärungskraft besitzt.

Zurück zu unserem Modell: Wir berechnen die vif Werte für unsere beiden Prädiktoren

Code
vif_value <- vif(sal_model_1)
vif_value
 Expe_Yrs Skill_lev 
 4.907852  4.907852 

Interpretation

  • Ein VIF-Wert von 1 bedeutet, dass keine Multikollinearität vorliegt.
  • Ein VIF-Wert von grösser als 1 deutet auf eine gewisse Korrelation zwischen der betrachteten unabhängigen Variablen und den anderen hin.

In der Praxis gelten VIF-Werte von über 5 oder 10 als Hinweis auf problematische Multikollinearität, was zu instabilen Schätzungen der Regressionskoeffizienten führen kann. Konkret: Der VIF gibt an, um wie viel die Varianz der Koeffizientenschätzung einer unabhängigen Variable aufgrund von Multikollinearität vergrössert wird. Ein hoher VIF-Wert zeigt also an, dass die Varianz der Koeffizienten aufgrund der starken Korrelation mit anderen Prädiktoren vergrössert ist. Dies kann zu statistischen Problemen wie unzuverlässigen Schätzungen und überhöhten Standardfehlern führen.

Unsere beiden Werte liegen knapp unter 5 und sind damit gerade nicht mehr problematisch.

Der VIF-Wert hilft uns also die problematischen Variablen zu identifizieren, die eventuell aus dem Modell entfernt oder durch transformierte Variablen ersetzt werden sollten (s. Block 3 bei der Hauptkomponentenanalyse (PCA)), um Multikollinearität zu reduzieren.

Verständnisfrage: Multikollinearität

Warum ist Multikollinearität ein Problem?

a) Sie verursacht Abhängigkeiten der Residuen.
b) Starke Korrelationen zwischen Prädiktoren führen zu instabilen Koeffizienten und grossen Standardfehlern.
c) Sie zeigt fehlende Linearität an.
d) Sie garantiert konstante Varianz der Residuen.

Antwort anzeigen

Richtige Antwort: b) Wenn Prädiktoren stark korreliert sind, variieren sie gemeinsam. Dadurch wird es unmöglich, ihre individuellen Effekte auf die abhängige Variable zu separieren.

Verständnisfrage: VIF

Was misst der Variance Inflation Factor (VIF)?

a) Wie stark die Varianz eines Koeffizienten durch Korrelationen mit anderen Prädiktoren "aufgebläht" wird.
b) Ob die Residuen normalverteilt sind.
c) Ob die Varianz der Zielvariable konstant bleibt.
d) Den direkten Zusammenhang zwischen Zielvariable und Prädiktoren.

Antwort anzeigen

Richtige Antwort: a) Der VIF ist eine Kollinearitätsmetrik.

Modellvalidierung

Während wir bisher die Modellvoraussetzungen des linearen Modells überprüft haben, gehen wir jetzt weiter zur Modellvalidierung, um die Güte und Qualität des Modells zu überprüfen.

Welche Fragen wollen wir bei der Modellevaluierung beantworten?

  1. Hat (global) unser Modell überhaupt eine Aussagekraft?

Diese Frage beantworten wir mit dem F-Test (ANOVA). Er sagt uns, ob unsere Prädiktoren zusammen signifikant besser vorhersagen als ein reines Raten des Mittelwerts der abhängigen Variable. D.h. wir verwenden nur das Intercept und vernachlässigen alle anderen Prädiktoren im Modell. Dies dient als Referenz für die Güte.

  1. Wieviel der Varianz in unseren Daten kann unser Modell erklären?

Diese Frage wird mit dem \(R^2\) oder besser dem \(\mathrm{adjusted}~R^2\) untersucht, wie wir es auch schon von der Einfachregression her kennen. Wir beginnen mit einer ersten Überprüfung, der ANOVA resp. globalem F-Test und fragen ob unser Modell überhaupt eine signifikante Voraussagekraft besitzt.

Wir rufen uns aber zuerst nochmals die Idee des F-Test und der ANOVA ins Gedächtnis.

ANOVA (Analysis of Variance)/F-Test

Mathematische Grundlagen der ANOVA

Die mathematischen Grundlagen basieren auf der Zerlegung der Gesamtquadratsumme (Total Sum of Squares, SST):

\[\text{SST} = \text{SSR} + \text{SSE}\]

  • SST (Total Sum of Squares): Die Gesamtsumme der Quadrate, berechnet sich mit:

\[\text{SST} = \sum_{i=1}^n (y_i - \bar{y})^2\]

wobei \(y_i\) die beobachteten Werte und \(\bar{y}\) der Mittelwert der abhängigen Variable ist.

  • SSR (Regression Sum of Squares): Die Summe der Quadrate, die durch das Modell erklärt wird:

\[\text{SSR} = \sum_{i=1}^n (\hat{y}_i - \bar{y})^2\]

wobei \(\hat{y}_i\) die durch das Modell vorhergesagten Werte sind.

  • SSE (Error Sum of Squares): Die unerklärte Variation, also die Residuenquadratsumme:

\[\text{SSE} = \sum_{i=1}^n (y_i - \hat{y}_i)^2\]

Er gibt an, wie viel Streung noch übrigbleibt, wenn man das Modell angepasst hat.

Die F-Statistik wird definiert als:

\[F = \frac{\text{MSR}}{\text{MSE}}\]

  • MSR (Mean Square Regression): Mittlere Quadratsumme der Regression, berechnet als:

\[\text{MSR} = \frac{\text{SSR}}{k}\]

wobei \(k\) die Anzahl der Regressoren/Prädiktoren ist.

  • MSE (Mean Square Error): Mittlere Quadratsumme der Fehler, berechnet als:

\[\text{MSE} = \frac{\text{SSE}}{df} = \frac{\text{SSE}}{n-k-1}\]

wobei \(n\) die Stichprobengrösse ist. Durch die Division durch die Anzahl Freiheitsgrade \(df =n-k-1\) wird der MSE erwartungstreu. Zur Erinnerung: Die df wird aus dem Stichproben umfang minus der Anzahl Parameter des Modells berechnet. Hier haben wir k Parameter und ein Interzept \(= k +1\). Die MSE ist eine Metrik, welche die Modellgenauigkeit misst. Je kleiner Sie ist, umso geringer schwanken die Datenpunkte um die Hyperebene.

Wie wird der F-Test formuliert?

Der F-Test prüft die Nullhypothese, ob alle Regressionskoeffizienten (ausser dem Interzept) gleich null sind:

\[H_0: \beta_1 = \beta_2 = ... = \beta_k = 0\]

Die Alternative ist:

\[H_A: \text{Mindestens ein } \beta_i \neq 0\]

Die Berechnung der F-Statistik erfolgt mit:

\[F = \frac{(R^2 / k)}{((1 - R^2) / (n-k-1))}\]

wobei \(R^2\) das bekannte Bestimmtheitsmass (oder auch Determinationskoeffizient) ist.

Der p-Wert des F-Tests gibt an, wie wahrscheinlich die beobachtete F-Statistik unter der Nullhypothese ist.

Verständnisfrage: Interzept im globalen F-Test

Beim globalen F-Test der multiplen linearen Regression (H0: β1=…=βp=0) – welche Referenz wird für das Nullmodell verwendet?

a) Den Interzept des vollen Modells beibehalten und alle anderen Koeffizienten auf 0 setzen.
b) Das Interzept entspricht dem Stichprobenmittel, also \(\hat{\alpha} = \bar{y}\).
c) Den Mittelwert jedes Prädiktors als Referenz.
d) Den Median von y, um Ausreisser robust zu behandeln.

Antwort anzeigen

Richtig: b) Beim globalen F-Test wird das reduzierte Modell unter H0 neu geschätzt: \(y_i = \alpha + \epsilon_i\) mit \(\hat{\alpha} =\bar{y}\). Daher gilt SSEred = Σ(yi−ȳ)² = SST. Option a) ist falsch, weil man dabei den Interzept des Vollmodells festhalten würde (kein korrektes Reduced-Model-Fit).

Durchführung des F-Tests

Nachdem wir die theoretischen Grundlagen des globalenF-Tests besprochen haben, wenden wir ihn nun auf unser Modell sal_model_1 an. Der F-Test prüft, ob unser Modell mit den Prädiktoren Expe_Yrs und Skill_lev eine signifikant bessere Vorhersagekraft hat als ein Nullmodell, das nur den Mittelwert des Jahresgehalts als Vorhersage verwendet.

Die Ergebnisse des globalen F-Tests sind bereits Teil der summary()-Ausgabe unseres Modells. Wir rufen sie erneut auf, um uns gezielt auf diesen Teil zu konzentrieren.

F-Test aus der Modellzusammenfassung extrahieren
# Die summary()-Funktion liefert den F-Test für das Gesamtmodell
summary(sal_model_1)

Call:
lm(formula = Annu_Salary ~ Expe_Yrs + Skill_lev, data = sal_data_1)

Residuals:
   Min     1Q Median     3Q    Max 
-605.6 -318.5  -23.8  354.3  666.0 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3011.66     162.58   18.52  < 2e-16 ***
Expe_Yrs     1589.68      50.86   31.26  < 2e-16 ***
Skill_lev    1263.65     102.03   12.38 4.25e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 377.5 on 45 degrees of freedom
Multiple R-squared:  0.995, Adjusted R-squared:  0.9948 
F-statistic:  4469 on 2 and 45 DF,  p-value: < 2.2e-16

Interpretion der ANOVA/F-Test

Da die F-Statistik das Verhältnis zwischen MSR und MSE betrachtet, ist ein Wert von 4469 für die F-Statistik sehr hoch und auch der p-Wert zeigt mit p-value: < 2.2e-16 einen extrem niedrigen Wert. \(H_0\) wird also deutlich abgelehnt.

1. Adjusted \(R^2\)

Das angepasste Bestimmtheitsmass \(R^2\), auch adjusted \(R^2\) bezeichnet, passt das ursprüngliche \(R^2\)-Mass an die Anzahl der Prädiktoren und an die Stichprobengrösse an.

Die Definition lautet:

\[R^2_{\mathrm{adj}} = 1 - \left( \frac{SS_{\mathrm{res}}/(n-p-1)}{SS_{\mathrm{tot}}/(n-1)} \right)\]

wobei:

\(n\) die Stichprobengrösse ist und \(p\) die Anzahl der Prädiktoren im Modell ist.

Interpretation

Während \(R^2\) eine grobe Schätzung dafür ist, wie gut das Modell die Varianz der abhängigen Variable erklärt, ist adjusted \(R^2\) ein genaueres Mass für die Modellgüte, insbesondere bei Modellen mit mehreren Prädiktoren. Wenn neue Prädiktoren hinzugefügt werden, wird \(R^2\) immer grösser oder bleibt gleich, selbst wenn die neuen Prädiktoren keinen wirklichen Erklärungswert haben. Hingegen sinkt das adjusted \(R^2\), wenn die neuen Prädiktoren keinen signifikanten Beitrag leisten.

Warum ist adjusted \(R^2\) sinnvoll?

Adjusted \(R^2\) ist besonders nützlich, wenn man Modelle mit unterschiedlicher Anzahl von Prädiktoren vergleicht. Ein höheres adjusted \(R^2\) deutet darauf hin, dass das Modell mit mehr Prädiktoren nicht nur zufällig besser ist, sondern tatsächlich eine bessere Erklärung für die abhängige Variable bietet.Da es die Anzahl der Prädiktoren in die Bewertung einbezieht, ist es ein robusteres Mass für die Modellqualität als \(R^2\).

Fazit

Das Bestimmtheitsmass \(R^2\) ist ein nützliches Mass für die Modellgüte, hat aber Einschränkungen bei der Anwendung auf komplexere Modelle mit mehreren Prädiktoren. Adjusted \(R^2\) bietet eine verbesserte Alternative, die die Anzahl der Prädiktoren berücksichtigt und das Risiko von Overfitting verringert.

Zurück zu unserem Beispiel: Mit 0.9948 liegt adjustet \(R^2\) schon sehr nahe an 1, was ein sehr guter Wert ist.

Bevor wir zum AIC weitergehen, wollen wir an dieser Stelle noch kurz einen Blick auf das schrittweise Hinzufügen von Prädiktioren von einem visuellen Standpunkt werfen. Beim Nullmodell (0-D) schätzen wir y einfach nur durch den arithmetischen Mittelwert (\(\bar{y}\)) der abhängigen Variablen. Fügen wir den ersten Prädiktor zum Modell ziehen wir die Datenpunkte in einer Ebene auseinander und fitten die Gerade (1-D). Der nächste Prädiktor zieht die Datenpunkt nochmals, nur im Raum auseinander und aus unserem Modell wird eine Ebene im Raum. Jeder weitere Prädiktor führt dann zu einer Hyperebene als Modell. Ob Prädiktoron tatsächliches zu einer Verbesserung des Modells führen bewerten wir im kommenden Abschnitt, wenn wir im nächsten Abschnitt das ****Akaike Information Criterion als Metrik kennenlernen. ::: {layout-ncol=“2”}

Code
#| label: plot-0d-focused

#| fig-cap: "0-D: Vertikale Streuung der Datenpunkte um den Mittelwert."

# Plot 1: 0-D (Nullmodell)

# Alle Punkte auf einer vertikalen Linie mit Jitter

ggplot(sal_data_1, aes(x = 0, y = Annu_Salary)) +

  geom_jitter(width = 0.05, height = 0, 

              color = "#0072B2", alpha = 0.6, size = 2.5) +

  geom_hline(

    aes(yintercept = mean(Annu_Salary)),

    color = "red", linetype = "dashed", size = 1

  ) +

  labs(

    title = "0-D: Gesamtstreuung",

    subtitle = "Modell: Nur der Mittelwert",

    x = NULL, y = "Jahresgehalt"

  ) +

  theme_minimal() +

  theme(

    axis.text.x = element_blank(),

    axis.ticks.x = element_blank(),

    panel.grid.major.x = element_blank()

  )

Code
#| label: plot-1d-focused

#| fig-cap: "1-D: 'Expansion' der Datenpunkte durch einen Prädiktor."

# Plot 2: 1-D (Einfachregression)

# Expansion in die zweite Dimension

ggplot(sal_data_1, aes(x = Expe_Yrs, y = Annu_Salary)) +

  geom_point(color = "#0072B2", alpha = 0.8, size = 2.5) +

  geom_smooth(method = "lm", se = FALSE, color = "red") +

  labs(

    title = "1-D: Erklärte Streuung",

    subtitle = "Modell: Regressionsgerade",

    x = "Berufserfahrung (Jahre)", y = "Jahresgehalt"

  ) +

  theme_minimal()

:::

Code
#| label: plot-2d-3d

#| fig-cap: "2-D: Modell mit zwei Prädiktoren (Regressionsebene)"

# Plot 3: 2-D (Multiple Regressionsebene)

# Erzeuge ein Gitter für die Ebene
axis_x <- seq(min(sal_data_1$Expe_Yrs), max(sal_data_1$Expe_Yrs), length.out = 10)
axis_y <- seq(min(sal_data_1$Skill_lev), max(sal_data_1$Skill_lev), length.out = 10)

# Berechne die z-Werte (vorhergesagtes Gehalt) für das Gitter

plane_z <- outer(axis_x, axis_y, function(x, y) {
  predict(sal_model_1, newdata = data.frame(Expe_Yrs = x, Skill_lev = y))
})


# Erstelle den 3D-Plot mit Plotly

plot_ly(data = sal_data_1, x = ~Expe_Yrs, y = ~Skill_lev, z = ~Annu_Salary,
        type = "scatter3d", mode = "markers",
        marker = list(size = 5, color = ~Annu_Salary, colorscale = "Viridis", showscale = FALSE)) %>%
  add_surface(x = ~axis_x, y = ~axis_y, z = ~plane_z, opacity = 0.7, colorscale = 'Blues', showscale = FALSE) %>%
  layout(
    title = "2-D: Modell mit zwei Prädiktoren",
    scene = list(
      xaxis = list(title = "Berufserfahrung"),
      yaxis = list(title = "Qualifikation"),
      zaxis = list(title = "Jahresgehalt")
    )
  )

Akaike Information Criterion zur Modellbewertung verwenden

Das Akaike Information Criterion (AIC) ist eine Metrik zur Bewertung und zum Vergleich von Modellen, die ein Gleichgewicht zwischen der Güte der Modellanpassung und der Anzahl der verwendeten Prädiktoren herstellt. Ein Modell mit einer niedrigeren AIC wird bevorzugt, da es eine bessere Modellgüte bietet, ohne zu viele Parameter einzuführen.

Berechnung des AIC:

Das AIC kann in R mit der Funktion AIC() berechnet werden, die Teil der Basisbibliothek stats ist. Es gilt folgende Formel:

\[\mathrm{AIC} = -2\log(\hat L) + 2k\] wobei:

  • \(\hat{L}\) die maximale Likelihood des Modells ist.

  • \(k\) die Anzahl der geschätzten Parameter im Modell ist (einschliesslich des Interzepts).

Da wir nur zwei unabhängige Pradiktoren im Modell haben, können wir drei Modelle vergleichen: Unser bisheriges mit zwei Prädiktoren und jeweils eines mit nur einem Prädiktor (Skill_lev, Expe_Yrs)

Berechnung der noch fehlenden Modelle:

Code
sal_model_2 <- lm(Annu_Salary ~ Expe_Yrs, data = sal_data_1)
sal_model_3 <- lm(Annu_Salary ~ Skill_lev, data = sal_data_1)

Schauen wir uns die Summaries an:

Code
# Zeige beide Modell-Summaries nebeneinander
stargazer(sal_model_2, sal_model_3, type = "text") 

==========================================================
                                  Dependent variable:     
                              ----------------------------
                                      Annu_Salary         
                                   (1)            (2)     
----------------------------------------------------------
Expe_Yrs                       2,151.775***               
                                 (47.679)                 
                                                          
Skill_lev                                    4,109.223*** 
                                               (217.071)  
                                                          
Constant                       4,444.634***    1,201.185  
                                (237.219)      (716.031)  
                                                          
----------------------------------------------------------
Observations                        48            48      
R2                                0.978          0.886    
Adjusted R2                       0.977          0.884    
Residual Std. Error (df = 46)    783.931       1,779.173  
F Statistic (df = 1; 46)       2,036.798***   358.358***  
==========================================================
Note:                          *p<0.1; **p<0.05; ***p<0.01

Checken wir jetzt für alle drei Modell, die Werte für AIC:

Code
sal_model_2 <- lm(Annu_Salary ~ Expe_Yrs, data = sal_data_1)
sal_model_3 <- lm(Annu_Salary ~ Skill_lev, data = sal_data_1)

stargazer::stargazer(sal_model_2, sal_model_3, type = "text")

==========================================================
                                  Dependent variable:     
                              ----------------------------
                                      Annu_Salary         
                                   (1)            (2)     
----------------------------------------------------------
Expe_Yrs                       2,151.775***               
                                 (47.679)                 
                                                          
Skill_lev                                    4,109.223*** 
                                               (217.071)  
                                                          
Constant                       4,444.634***    1,201.185  
                                (237.219)      (716.031)  
                                                          
----------------------------------------------------------
Observations                        48            48      
R2                                0.978          0.886    
Adjusted R2                       0.977          0.884    
Residual Std. Error (df = 46)    783.931       1,779.173  
F Statistic (df = 1; 46)       2,036.798***   358.358***  
==========================================================
Note:                          *p<0.1; **p<0.05; ***p<0.01
Code
cbind(
  AIC_2p = AIC(sal_model_1),
  AIC_Expe = AIC(sal_model_2),
  AIC_Skill = AIC(sal_model_3)
)
       AIC_2p AIC_Expe AIC_Skill
[1,] 710.7369 779.9501    858.63

Interpretation der AIC

Generell: Eine niedrigere AIC bedeutet, dass das Modell besser ist. Wir sehen also, dass die Güte unseres Modells bei Einbeziehung von zwei Prädiktoren wesentlich besser (niedriger Wert) abschneidet, als für die einzelnen Prädiktoren.

Die AIC hilft uns dabei, das Gleichgewicht zwischen Modellgüte und Modellkomplexität zu finden: - Ein niedriger AIC-Wert deutet auf ein besseres Modell hin. Modelle mit einer höheren AIC werden als weniger geeignet angesehen, da sie entweder zu viele Prädiktoren verwenden oder eine geringere Modellgüte bieten.

Vergleich mehrerer Modelle, wichtiger Hinweis

Die AIC gibt keine absolute Bewertung der Modellgüte, sondern nur einen Vergleich zwischen Modellen. Sie sagt also nicht, wie gut ein Modell ist, sondern welches Modell in Bezug auf Komplexität und Güte besser ist.

Fazit

Die AIC ist ein nützliches Werkzeug zur Modellbewertung, insbesondere beim Vergleich von Modellen mit unterschiedlicher Anzahl an Prädiktoren. Sie hilft, das Modell zu finden, das die beste Balance zwischen Modellgüte und Komplexität bietet, und schützt vor Overfitting, das wir schon aus dem Machine Learning Modul kennen.

Verständnisfrage: AIC

Was ist die korrekte Interpretation des AIC?

a) Er gibt die absolute Modellgüte an; Werte > 0 sind gut.
b) Höher ist besser, da mehr Komplexität belohnt wird.
c) Er dient dem Modellvergleich; niedriger ist besser (Balance aus Güte und Komplexität).
d) Er ist unabhängig von der Parameterzahl.

Antwort anzeigen

Richtige Antwort: c) Der AIC vergleicht Modelle unter Penalisierung der Komplexität.

Vorhersage des Jahresgehalts für neue Daten

Code
predictor_newdata <- data.frame(Expe_Yrs = 3, Skill_lev = 3) 
predict(sal_model_1, newdata=predictor_newdata)
       1 
11571.63 

Ein Angestellter mit drei Jahren Berufserfahrung und einem Qualifikationsniveau von 3 würde folglich ein Jahreseinkommen von 11571 $ erwarten können nach unserem Modell.

Fazit:

Unser Modell erfüllt, mit wenigen Einschränkungen, alle Kriterien des linearen Modells und die Regressionshyperfläche wird durch folgende Gleichung beschrieben.

\[Y = \mathrm{Annu_Salary} = \beta_0 + \beta_1 \cdot \mathrm{Expe_Yrs} + \beta_2 \cdot \mathrm{Skill_lev} \]

Verständnisfrage: F‑Test

Was testet der F‑Test in der multiplen Regression?

a) Nur die Signifikanz einzelner Prädiktoren.
b) Ob das Gesamtmodell signifikant besser ist als ein Modell ohne Prädiktoren (erklärte vs. unerklärte Varianz).
c) Ausschliesslich die Normalverteilung der Residuen.
d) Nur Unterschiede zwischen zwei verschachtelten Modellen.

Antwort anzeigen

Richtige Antwort: b) Der F-Test testet, ob das Modell als Ganzes einen signifikanten Erklärungsgehalt hat.

Abschlussbemerkungen

Die multiple lineare Regression ist ein mächtiges statistisches Werkzeug, das Sie nun in seinen Grundzügen beherrschen. Wichtige Punkte zum Mitnehmen:

Die sorgfältige Prüfung der Modellvoraussetzungen ist entscheidend für valide Ergebnisse. Die explorative Datenanalyse hilft, problematische Muster frühzeitig zu erkennen. Verschiedene Gütekriterien (R², AIC, F-Test) ermöglichen eine fundierte Modellbewertung.

Es gibt natürlich noch viele weitere Probleme und Herausforderungen der multiplen linearen Regression in der Praxis, die wir in diesem Rahmen nicht angesprochen haben. So kann man die ANOVA noch vertiefen und kleinere Modelle mit weniger Prädiktoren verwenden, um zu sehen, welches die Variation mit möglichst wenigen Prädiktoren minimiert (partieller F-Test). Auch treten in der Praxis häufig kategorische Variablen auf, welche dann mit sog. Dummy-Variablen codiert werden (0 und 1). Die Vorgehensweise ist wie bei der multiplen logistischen Regression (s. dort). Bei der Modellevaluation wird neben dem AIC auch das BIC (Bayesian Information criterion oder Schwarz Information criterion) verwendet. Sie unterscheiden sich vor allem in der Art des Strafterm (beim BIC \(\ln(n)\cdot k\)) und bevorzugt besonders kleine Modelle (BIC).


Anwendungsaufgabe zur multiplen linearen Regression

WichtigAufgabe 1

Importiere die Daten marketing_conversion.csv und erzeuge eine Zusammenfassung.

WichtigAufgabe 2

Analysiere Zusammenhänge zwischen den Variablen:

  1. Korrelationsmatrix berechnen.
  2. Streudiagramm‑Matrix (z. B. pairs() oder GGally::ggpairs()).
  3. Interpretation im Kontext der Marketing‑Aktivitäten.
WichtigAufgabe 3

Führe eine multiple lineare Regression für Conversion Rate ~ social_media_spend + email_campaigns + website_visitors durch und gib das summary() aus.

WichtigAufgabe 4

Prüfe die Modellvoraussetzungen (Linearität, Homoskedastizität, Unabhängigkeit, Normalverteilung, Multikollinearität). Wo bestehen ggf. Probleme?

WichtigAufgabe 5

Analysiere das summary() hinsichtlich der Signifikanz der Modellparameter und interpretiere diese.

WichtigAufgabe 6

Gegebene VIF‑Werte:

                     VIF
social_media_spend  1.942
email_campaigns     1.105
website_visitors    1.944
  1. Erklären Sie Multikollinearität.
  2. Interpretieren Sie die VIF‑Werte im Kontext.
  3. Welche praktischen Probleme könnten sich ergeben?
WichtigAufgabe 7

Beurteilen Sie Multiple R‑squared, Adjusted R‑squared und die F‑Statistik. Was sagen sie über das Modell aus?

WichtigAufgabe 8

Welche Schlüsse ziehen wir aus der Analyse für das E‑Commerce‑Business?

Lösungsvorschläge

WichtigAufgabe 1

Importiere die Daten marketing_conversion.csv (Ordner data) und erzeuge eine Zusammenfassung.

Code
library(readr)
marketing_conversion <- read_csv("data/marketing_conversion.csv")
head(marketing_conversion)
# A tibble: 6 × 4
  social_media_spend email_campaigns website_visitors conversion_rate
               <dbl>           <dbl>            <dbl>           <dbl>
1              5158.            10.8           68295.          0.0221
2              2378.            15.3           40159.          0.0182
3              3447.            18.7           53559.          0.0276
4              3840.            21.5           55895.          0.0299
5              3504.            11.6           48662.          0.0140
6              2857.            11.7           42149.          0.0211
Code
str(marketing_conversion)
spc_tbl_ [200 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ social_media_spend: num [1:200] 5158 2378 3447 3840 3504 ...
 $ email_campaigns   : num [1:200] 10.8 15.3 18.7 21.5 11.6 ...
 $ website_visitors  : num [1:200] 68295 40159 53559 55895 48662 ...
 $ conversion_rate   : num [1:200] 0.0221 0.0182 0.0276 0.0299 0.014 ...
 - attr(*, "spec")=
  .. cols(
  ..   social_media_spend = col_double(),
  ..   email_campaigns = col_double(),
  ..   website_visitors = col_double(),
  ..   conversion_rate = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
Code
summary(marketing_conversion)
 social_media_spend email_campaigns  website_visitors conversion_rate  
 Min.   : 900.3     Min.   : 8.379   Min.   :24190    Min.   :0.00500  
 1st Qu.:2335.4     1st Qu.:12.962   1st Qu.:42603    1st Qu.:0.01617  
 Median :2961.5     Median :14.812   Median :49728    Median :0.01950  
 Mean   :3175.9     Mean   :15.003   Mean   :49417    Mean   :0.01981  
 3rd Qu.:3840.9     3rd Qu.:16.795   3rd Qu.:55305    3rd Qu.:0.02272  
 Max.   :8784.6     Max.   :23.125   Max.   :74630    Max.   :0.05000  

Wir haben vier numerische Variablen (angenehmerweise ohne NAs).

WichtigAufgabe 2

Analysiere Zusammenhänge zwischen den Variablen:

  1. Korrelationsmatrix berechnen.
  2. Streudiagramm‑Matrix (z. B. pairs() oder GGally::ggpairs()).
  3. Interpretation im Kontext der Marketing‑Aktivitäten.
  1. Korrelationsmatrix
Code
library(dplyr)

num_vars <- marketing_conversion %>%
  select(conversion_rate, social_media_spend, email_campaigns, website_visitors)

cor_mat <- cor(num_vars, use = "pairwise.complete.obs")
round(cor_mat, 3)
                   conversion_rate social_media_spend email_campaigns
conversion_rate              1.000              0.460           0.555
social_media_spend           0.460              1.000           0.283
email_campaigns              0.555              0.283           1.000
website_visitors             0.464              0.691           0.285
                   website_visitors
conversion_rate               0.464
social_media_spend            0.691
email_campaigns               0.285
website_visitors              1.000

2.Streumatrix

Code
pairs(~ conversion_rate + social_media_spend + email_campaigns + website_visitors,
      data = marketing_conversion, main = "Scatterplot-Matrix", pch = 19, cex = 0.6)

  1. Interpretation & Beobachtungen
  • conversion_rate vs. Prädiktoren:

email_campaigns r = 0.555 (mittel-stark, stärkster Zusammenhang) → häufigere/gezieltere E-Mails gehen mit höherer Conversion Rate einher (Segmentierung der Kunden sinnvoll/Reminder).

website_visitors r = 0.464 → mehr qualifizierter Traffic, tendenziell mehr Conversions (Qualität des Traffics bleibt kritisch).

social_media_spend r = 0.460 → höheres Paid-Spend korreliert mit höheren Conversions (Reichweite/Retargeting erwägen).

  • Zwischen den Prädiktoren:

social_media_spend ↔︎ website_visitors r = 0.691 (relativ hoch) → Social-Spend treibt Traffic; mögliches Kollinearitäts-Risiko im Regressionsmodell (wir prüfen später mit VIF).

email_campaigns korreliert nur moderat mit den anderen (~0.28) → eher eigenständiger Hebel.

  • Implikation für die Regression:

Da spend und visitors stark zusammenhängen, könnte der direkte Effekt von spend im multiplen Modell kleiner wirken (ein Teil läuft über „mehr Besucher“ als Mediator!).

Alle drei Prädiktoren sollten (unter sonst gleichen Bedingungen) positive Koeffizienten haben; SEs (Standardfehler) für spend/visitors evtl. erhöht.

Plots (Linearität und Residuenverteilungen) auf Nichtlinearitäten/Trichterform prüfen; ggf. Transformationen (z. B. log) in Erwägung ziehen, falls sichtbar.

WichtigAufgabe 3

Führe eine multiple lineare Regression für Conversion Rate ~ social_media_spend + email_campaigns + website_visitors durch und gib das summary() aus.

Code
mod <- lm(conversion_rate ~ social_media_spend + email_campaigns + website_visitors, data = marketing_conversion)
summary(mod)

Call:
lm(formula = conversion_rate ~ social_media_spend + email_campaigns + 
    website_visitors, data = marketing_conversion)

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0118682 -0.0030083  0.0000625  0.0026948  0.0215046 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -4.611e-03  2.311e-03  -1.995  0.04741 *  
social_media_spend  9.581e-07  3.740e-07   2.562  0.01117 *  
email_campaigns     9.932e-04  1.275e-04   7.791  3.8e-13 ***
website_visitors    1.310e-07  4.803e-08   2.728  0.00694 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.004745 on 196 degrees of freedom
Multiple R-squared:  0.4292,    Adjusted R-squared:  0.4204 
F-statistic: 49.12 on 3 and 196 DF,  p-value: < 2.2e-16
WichtigAufgabe 4

Prüfe die Modellvoraussetzungen (Linearität, Homoskedastizität, Unabhängigkeit, Normalverteilung, Multikollinearität). Wo bestehen ggf. Probleme?

Linearität CR-Plot

Code
library(car)
car::crPlots(mod)

Hier sehen wir erste Anzeichen für Nichtlinearität, besonders bei social media spend, aber nicht dramatisch. Wir sehen, wie es im Residuals vs. Fitted Plot aussieht für alle drei Prädiktoren.

Code
# Basis-Diagnostik
library(ggfortify)
autoplot(mod, which = 1:4, ncol = 2)

Wir sehen in der sog. LOESS Ausgleichskurve (blau) in Residuals vs Fitted eine leichte Krümmung, was ein Hinweis sein kann auch Heteroskedastizität. Schauen wir bei Scale-Location, wo explizit auf Homoskedastizität geschaut wird. Hier sehen wir, dass vor allem einige Ausreisser die LOESS Kurve krümmen. Testen wir noch mit dem Non-constant Variance Score Test:

Code
ncvTest(mod)
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 4.436685, Df = 1, p = 0.035174

Hier sehen wir, dass wenn wir mit einem \(\alpha = 0.05\) testen, würden wir die Nullhypothese verwerfen, testen wir zu \(\alpha = 0.01\) behalten wir sie bei. Wir müssen also wegen der Ausreisser tatsächlich vorsichtig sein. Deshalb schauen wir uns noch Cook’s distance an.

Code
# Einflussreiche Fälle auflisten: Cook's distance
cd <- cooks.distance(mod)
head(sort(cd, decreasing = TRUE), 5)         # Top-5 Cook's D
        12         20          9         19         43 
0.30975677 0.20514733 0.06662290 0.05648115 0.04708214 

Wie wir im Diagramm sehen, dominieren die Ausreisser 12 und 20. Qualitativ besagt Cook’s distance, wie stark sich die Modellparameter ändern würden, wenn man den Ausreisser weglassen würde. Auffällig ist es meistens, wenn Cook’s distance \(D_i>4/n\) (n Stichprobenumfang). In der Praxis müsste man sich die beiden Punkte ansehen, ob dort ggf. Fehler bei der Erfassung oder andere Auffälligkeiten vorliegen. Bei uns gilt \(D_i = 0.3098 > 4/200 = 0.02\), also deutlich über der Daumenregel.

Multikollinearität

Code
# Multikollinearität
car::vif(mod)
social_media_spend    email_campaigns   website_visitors 
          1.942310           1.105364           1.944119 
  • social_media_spend: VIF = 1.942 → √VIF ≈ 1.39 → SE um ~39 % aufgebläht.
  • email_campaigns: VIF = 1.105 → √VIF ≈ 1.05 → praktisch unkritisch.
  • website_visitors: VIF = 1.944 → √VIF ≈ 1.39 → SE um ~39 % aufgebläht.

Fazit: leichte Kollinearität zwischen spend und visitors (konsistent mit r≈0.69), kein ernstes Problem. Alle Grössen << 5 (geschweige denn 10).

WichtigAufgabe 5

Analysiere das summary() hinsichtlich der Signifikanz der Modellparameter und interpretiere diese.

Code
summary(mod)

Call:
lm(formula = conversion_rate ~ social_media_spend + email_campaigns + 
    website_visitors, data = marketing_conversion)

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0118682 -0.0030083  0.0000625  0.0026948  0.0215046 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -4.611e-03  2.311e-03  -1.995  0.04741 *  
social_media_spend  9.581e-07  3.740e-07   2.562  0.01117 *  
email_campaigns     9.932e-04  1.275e-04   7.791  3.8e-13 ***
website_visitors    1.310e-07  4.803e-08   2.728  0.00694 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.004745 on 196 degrees of freedom
Multiple R-squared:  0.4292,    Adjusted R-squared:  0.4204 
F-statistic: 49.12 on 3 and 196 DF,  p-value: < 2.2e-16
  • email_campaigns (β≈0.0009932, p<.001): +1 Kampagne ≈ +0.10 pp Conversion Rate (ceteris paribus). Höchste Präzision (kleinster SE).
  • website_visitors (β≈1.31e-07, p≈.007): +10’000 Visitors ≈ +0.13 pp.
  • social_media_spend (β≈9.58e-07, p≈.011): +1’000 Spend ≈ +0.096 pp.
  • Intercept negativ (−0.46 pp), hier ohne inhaltliche Bedeutung (Extrapolation fern der Daten).

Alle Modellparameter sind hoch signifikant.

WichtigAufgabe 6

Gegebene VIF‑Werte:

                     VIF
social_media_spend  1.942
email_campaigns     1.105
website_visitors    1.944
  1. Erklären Sie Multikollinearität.

  2. Interpretieren Sie die VIF‑Werte im Kontext.

  3. Welche praktischen Probleme könnten sich ergeben?

zu a) Was ist Multikollinearität? Linearer Zusammenhang zwischen Prädiktoren ⇒ Standardfehler der Koeffizienten steigen (Schätzungen instabiler), ohne Bias im Erwartungswert.

zu b) Interpretation:

  • spend und visitors haben milde Kollinearität (VIF ~1.94 ⇒ SEs ca. 1.39× grösser als ohne Korrelation) — konsistent mit r(spend, visitors)=0.691.

  • email_campaigns praktisch unkritisch (VIF≈1.1).

zu c) Praktische Probleme:

Grössere SEs → schwächere t-Werte, unsichere Richtungs-/Grösseninterpretation; Modell kann bei kleinen Datenänderungen schwanken.

Massnahmen: (geht über das hinaus, was wir in der Prüfung fordern) Feature-Engineering (z. B. einen der stark korrelierten Prädiktoren weglassen/zusammenfassen), Regularisierung (Ridge/Lasso), Interpretation auf Partial-Plots stützen.

WichtigAufgabe 7

Beurteilen Sie Multiple R‑squared, Adjusted R‑squared und die F‑Statistik. Was sagen sie über das Modell aus?

  • R² = 0.429 / adj. = 0.420: ca. 42 % der Varianz erklärt; moderat für Marketing-Daten (Rest durch nicht modellierte Treiber/Noise).

  • F(3,196)=49.12, p<2.2e-16: Gesamtmodell ist hochsignifikant ⇒ zumindest ein Prädiktor trägt substantiell zur Erklärung bei.

WichtigAufgabe 8

Welche Schlüsse ziehen wir aus der Analyse für das E‑Commerce‑Business?

  • E-Mail-Hebel ist stark (grösster, präzisester Effekt): Kampagnenqualität und -frequenz priorisieren (Segmentierung, Trigger-Mails, Warenkorbabbruch ansehen).

  • Traffic & Social Media-Spend wirken positiv, aber teilweise über denselben Kanal (Spend → Visitors). Budget-Allokation daher datenbasiert steuern.

  • Conversion rate optimization: Wenn visitors ↑ aber Conversion nicht im gleichen Mass ↑, dann On-Site-Funnel/UX/Checkout optimieren.

Ergänzungen (wird nicht an einer Prüfung erwarte, in der Praxis aber relevant)

  • Experimente: A/B-/Holdout-Tests pro Kanal; inkrementellen Lift messen (Kausalität!).

  • Modellpflege: Diagnostics beobachten; bei Trichter/Nonlinearität Logs oder Splines; ggf. robuste SE berichten.

  • Skalierung der Effekte:

    +5 E-Mail-Kampagnen ≈ +0.50 pp.

    +1’000 Spend ≈ +0.096 pp.

    +10’000 Visitors ≈ +0.13 pp.