Einfache lineare Regression

Regression
Modelldiagnostik
Interpretation
R
Python
Ein Prädiktor, Steigung und Achsenabschnitt, Bestimmtheitsmass und Residuen.

Alle Beispiele rechnen mit fest eingetragenen Zahlen. R und Python schätzen dasselbe Modell auf denselben Daten und müssen deshalb dieselben Koeffizienten ausgeben; die Ausgaben unterscheiden sich nur in Anordnung und Benennung.

Kurzsteckbrief

Fragestellung Wie verändert sich eine metrische Zielgrösse, wenn eine einzelne Einflussgrösse steigt, und wie gut lässt sie sich daraus vorhersagen?
Zielvariable metrisch
Prädiktoren genau einer, metrisch oder zweistufig kategorial
Was die Methode liefert Achsenabschnitt und Steigung mit Konfidenzintervall und p-Wert, Bestimmtheitsmass, Residualstreuung, Residuen für die Diagnostik
R-Funktion lm(y ~ x, data = df), gelesen mit summary() und confint()
Python-Funktion smf.ols("y ~ x", data=df).fit(), gelesen mit .summary()
Verwandte Methoden Korrelation, multiple lineare Regression, Korrelationstests

Wann diese Methode, wann nicht

Typische Fragestellungen: Verbrauch aus Laufzeit, Miete aus Fläche, Ertrag aus Düngermenge. Gemeinsam ist ihnen eine metrische Zielgrösse, eine einzige Einflussgrösse und ein Zusammenhang, der im beobachteten Bereich annähernd geradlinig verläuft.

Der Unterschied zur Korrelation ist die Richtung. Die Korrelation beschreibt symmetrisch, wie eng zwei Grössen zusammenhängen. Die Regression legt fest, welche Grösse vorhergesagt wird, und liefert dafür eine Gleichung mit Einheiten.

Sie passt nicht in diesen Fällen:

Situation Stattdessen
Mehrere Einflussgrössen, oder eine soll kontrolliert werden multiple lineare Regression
Zielvariable binär logistische Regression
Nur die Frage, ob überhaupt ein Zusammenhang besteht Korrelationstest
Erkennbar krummer Zusammenhang Transformation, Polynomterm oder ein anderes Modell
Zielvariable ist eine Zeit bis zu einem Ereignis mit zensierten Fällen Kaplan-Meier und Cox-Modell

Grundidee und Modell

Gesucht ist die Gerade, die möglichst nah an allen Punkten liegt. Nah heisst: die Summe der quadrierten senkrechten Abstände zwischen beobachteten und vorhergesagten Werten ist minimal. Quadriert wird, damit sich Abweichungen nach oben und unten nicht aufheben und grosse Abweichungen stärker zählen.

\[y_i = \beta_0 + \beta_1 x_i + \varepsilon_i\]

Bestandteil Bedeutung
\(y_i\) beobachteter Wert der Zielvariable
\(\beta_0\) Achsenabschnitt, erwarteter Wert von \(y\) bei \(x = 0\)
\(\beta_1\) Steigung, erwartete Änderung von \(y\) je Einheit von \(x\)
\(x_i\) Wert des Prädiktors
\(\varepsilon_i\) Residuum, der nicht erklärte Rest, mit Erwartungswert null und konstanter Varianz

Geschätzt wird mit der Methode der kleinsten Quadrate; es gibt eine geschlossene Lösung, also kein Iterieren und keine Konvergenzprobleme. Die geschätzte Gerade geht immer durch den Punkt der beiden Mittelwerte.

Bei genau einem Prädiktor gilt zusätzlich: das Bestimmtheitsmass ist exakt das Quadrat der Korrelation zwischen \(x\) und \(y\), und der p-Wert der Steigung ist derselbe wie der des Pearson-Korrelationstests. Beide Verfahren beantworten dieselbe Frage in verschiedener Sprache.

Voraussetzungen und ihre Prüfung

Voraussetzung Was sie bedeutet Prüfung Folge bei Verletzung Vorgehen
Linearität Der Zusammenhang ist im beobachteten Bereich geradlinig Streudiagramm, Residuen gegen Vorhersage Steigung ist ein Kompromiss über verschiedene Bereiche und beschreibt keinen davon richtig Transformation, Polynomterm, Bereich einschränken
Unabhängigkeit Beobachtungen beeinflussen sich nicht Erhebungsdesign, bei zeitlicher Ordnung Durbin-Watson Standardfehler zu klein, p-Werte zu optimistisch Zeitreihen- oder Mehrebenenmodell
Homoskedastizität Streuung der Residuen ist über den Vorhersagebereich konstant Residuenplot, Breusch-Pagan-Test Schätzwerte bleiben brauchbar, Standardfehler und Intervalle nicht robuste Standardfehler, Transformation
Normalverteilte Residuen Residuen streuen annähernd normal QQ-Plot betrifft Tests und Intervalle bei kleinem n Transformation, Bootstrap
Keine einflussreichen Einzelfälle Kein einzelner Punkt bestimmt die Gerade Cook-Distanz, Hebelwerte, Streudiagramm Steigung hängt an einer Beobachtung Fall prüfen, Modell mit und ohne ihn berichten

Die Voraussetzungen betreffen die Residuen, nicht die Rohdaten. Weder \(x\) noch \(y\) müssen normalverteilt sein; eine rechtsschiefe Zielgrösse ist kein Grund zur Sorge, solange die Residuen es nicht sind.

Output lesen

R, summary(modell):

Grösse Was sie sagt Faustregel oder Falle
Call die geschätzte Formel prüfen, ob Ziel- und Einflussgrösse nicht vertauscht sind
Residuals Minimum, Quartile, Median der Residuen Median deutlich neben null deutet auf Schieflage
(Intercept) Estimate erwarteter Wert von y bei x gleich null nur deutbar, wenn null im Datenbereich sinnvoll ist
Estimate des Prädiktors Steigung, erwartete Änderung je Einheit in den Einheiten der Variablen
Std. Error Unsicherheit der Schätzung wächst mit der Streuung, sinkt mit n und mit der Spannweite von x
t value Estimate durch Std. Error Betrag über etwa 2 heisst bei üblichem n signifikant
Pr(>|t|) p-Wert für die Nullhypothese, dass der Koeffizient null ist für die Steigung identisch mit dem Pearson-Korrelationstest
Residual standard error typische Abweichung einer Vorhersage in der Einheit von y die praktisch nützlichste Gütezahl
Freiheitsgrade n minus 2 zwei geschätzte Parameter
Multiple R-squared Anteil der erklärten Streuung bei einem Prädiktor exakt das Quadrat der Korrelation
Adjusted R-squared um die Parameterzahl korrigiert kann negativ werden, wenn der Prädiktor nichts erklärt
F-statistic mit p-Wert Gesamttest des Modells bei einem Prädiktor gleichwertig zum t-Test der Steigung
confint() Konfidenzintervall je Koeffizient schliesst es null ein, ist der Koeffizient nicht signifikant

Python, modell.summary(), mit den Unterschieden zu R:

Grösse Was sie sagt Unterschied zu R
coef, std err, t, P>|t| wie in R nur andere Bezeichnung
[0.025 0.975] Konfidenzintervall steht direkt in der Tabelle, in R braucht es confint()
R-squared, Adj. R-squared wie in R identisch berechnet
Df Residuals, Df Model Freiheitsgrade in eigenen Zeilen statt im Fliesstext
AIC, BIC, Log-Likelihood Kennzahlen für Modellvergleiche in R über AIC(modell)
Omnibus, Jarque-Bera, Skew, Kurtosis Normalität der Residuen in R nicht enthalten, dort der QQ-Plot
Durbin-Watson Autokorrelation der Residuen Werte um 2 sind unauffällig
kein Residual standard error fehlt in der Tabelle über np.sqrt(modell.mse_resid)

Interpretationsfallen

  • Der Achsenabschnitt ist meist keine Aussage. Er beschreibt den Fall \(x = 0\), und der liegt oft ausserhalb der Daten. Wer ihn deuten will, zentriert den Prädiktor.
  • Ein hohes R² heisst nicht, dass das Modell stimmt. Beispiel 3 zeigt das Gegenteil. Angemessenheit beantworten die Residuen, nicht das Bestimmtheitsmass.
  • Ein niedriges R² heisst nicht, dass das Modell falsch ist. Bei stark streuenden Daten kann ein korrekt spezifiziertes Modell wenig Streuung erklären und die Steigung trotzdem gut schätzen.
  • Die Steigung ist keine Kausalität. Sie beschreibt, wie sich \(y\) mit \(x\) ändert, nicht warum. Eine dritte, nicht erhobene Grösse kann beides treiben, siehe Korrelation.
  • Vertauschen ändert das Ergebnis. Die Regression von \(y\) auf \(x\) ist nicht die Umkehrung der Regression von \(x\) auf \(y\), weil jeweils andere Abstände minimiert werden. Die Korrelation dagegen ist symmetrisch.
  • Vorhersagen nur im beobachteten Bereich. Ausserhalb ist die Linearität nicht geprüft; die Zahl kommt trotzdem und sieht genauso aus.
  • Konfidenzband und Vorhersageband sind zweierlei. Das schmale Band gilt dem Mittelwert bei gegebenem \(x\), das breite einer einzelnen künftigen Beobachtung.

Ergebnis berichten

Vorlage für den Ergebnissatz:

Eine einfache lineare Regression von [Zielvariable] auf [Prädiktor] ergibt eine Steigung von [Schätzwert] [Einheit] je [Einheit des Prädiktors] (95-Prozent-Konfidenzintervall [unten] bis [oben], t([Freiheitsgrade]) = [t], p = [p]). Das Modell erklärt [R²] der Streuung, die typische Abweichung einer Vorhersage beträgt [Residualstreuung] [Einheit] (n = [n]).

Immer genannt werden Steigung in ihrer Einheit, Konfidenzintervall, Teststatistik mit Freiheitsgraden, p-Wert, R², Residualstreuung und n, dazu welche Voraussetzungen geprüft wurden und mit welchem Ergebnis.

Abgrenzung zu verwandten Methoden

Methode Wann diese statt der einfachen linearen Regression
Korrelation nur die Enge des Zusammenhangs interessiert, keine Richtung und keine Vorhersage
Korrelationstests nur die Frage, ob ein Zusammenhang besteht, ohne Modellgleichung
Multiple lineare Regression mehrere Einflussgrössen, oder eine soll konstant gehalten werden
Logistische Regression Zielvariable binär
Regressionsdiagnostik Vertiefung zu Residuen, Hebelwerten und Ausreissern
t-Test für zwei Stichproben der Prädiktor ist zweistufig kategorial; rechnerisch derselbe Fall, andere Darstellung

Beispiele

Jedes Beispiel steht in einem eigenen Reiter.

Frage und Datenlage

Von 24 Anlagen liegen die Betriebsstunden einer Woche und der Verbrauch in Litern vor. Gefragt ist, um wie viele Liter der Verbrauch je zusätzlicher Betriebsstunde steigt, und wie genau sich der Verbrauch aus der Laufzeit vorhersagen lässt.

Beide Grössen sind metrisch, es gibt genau einen Prädiktor, und die Richtung steht fest: Die Laufzeit erklärt den Verbrauch, nicht umgekehrt. Das ist die Standardsituation der einfachen linearen Regression.

Modell schätzen

anlagen <- data.frame(
  laufzeit = c(3.2, 6.0, 6.0, 6.8, 7.7, 8.1, 8.8, 9.0, 9.3, 10.3, 10.6, 10.9,
               11.8, 11.9, 13.8, 13.9, 14.1, 14.3, 15.8, 16.4, 17.0, 18.4,
               18.6, 19.4),
  verbrauch = c(26.8, 41.7, 26.5, 41.1, 28.2, 37.7, 31.6, 47.3, 45.0, 49.7,
                38.4, 48.6, 43.9, 44.6, 55.7, 58.2, 54.7, 50.3, 53.3, 68.6,
                65.2, 69.8, 79.2, 63.4)
)

modell <- lm(verbrauch ~ laufzeit, data = anlagen)
summary(modell)

Call:
lm(formula = verbrauch ~ laufzeit, data = anlagen)

Residuals:
   Min     1Q Median     3Q    Max 
-8.959 -5.723  1.316  3.790 10.934 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   15.184      3.585   4.236 0.000339 ***
laufzeit       2.854      0.286   9.980 1.25e-09 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.106 on 22 degrees of freedom
Multiple R-squared:  0.8191,    Adjusted R-squared:  0.8109 
F-statistic:  99.6 on 1 and 22 DF,  p-value: 1.252e-09
confint(modell)
               2.5 %   97.5 %
(Intercept) 7.749859 22.61882
laufzeit    2.260834  3.44690
anlagen = pd.DataFrame({
    "laufzeit": [3.2, 6.0, 6.0, 6.8, 7.7, 8.1, 8.8, 9.0, 9.3, 10.3, 10.6, 10.9,
                 11.8, 11.9, 13.8, 13.9, 14.1, 14.3, 15.8, 16.4, 17.0, 18.4,
                 18.6, 19.4],
    "verbrauch": [26.8, 41.7, 26.5, 41.1, 28.2, 37.7, 31.6, 47.3, 45.0, 49.7,
                  38.4, 48.6, 43.9, 44.6, 55.7, 58.2, 54.7, 50.3, 53.3, 68.6,
                  65.2, 69.8, 79.2, 63.4],
})

modell = smf.ols("verbrauch ~ laufzeit", data=anlagen).fit()
print(modell.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:              verbrauch   R-squared:                       0.819
Model:                            OLS   Adj. R-squared:                  0.811
Method:                 Least Squares   F-statistic:                     99.60
Date:                Mon, 14 Sep 2026   Prob (F-statistic):           1.25e-09
Time:                        07:18:47   Log-Likelihood:                -76.434
No. Observations:                  24   AIC:                             156.9
Df Residuals:                      22   BIC:                             159.2
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     15.1843      3.585      4.236      0.000       7.750      22.619
laufzeit       2.8539      0.286      9.980      0.000       2.261       3.447
==============================================================================
Omnibus:                        3.388   Durbin-Watson:                   2.477
Prob(Omnibus):                  0.184   Jarque-Bera (JB):                1.373
Skew:                           0.039   Prob(JB):                        0.503
Kurtosis:                       1.831   Cond. No.                         36.3
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
print("Residualstreuung:", round(np.sqrt(modell.mse_resid), 4))
Residualstreuung: 6.1063

Output Zeile für Zeile

Ausgabe Wert hier Bedeutung Wie er zu lesen ist
(Intercept) Estimate 15.184 erwarteter Verbrauch bei Laufzeit null Rechnerisch nötig, inhaltlich hier ohne Aussage: Die kleinste beobachtete Laufzeit beträgt 3.2 Stunden, für den Stillstand liegen keine Daten vor.
laufzeit Estimate 2.854 Steigung in Litern je Betriebsstunde Die zentrale Zahl. Eine Stunde mehr Laufzeit geht im Mittel mit 2.85 Litern mehr Verbrauch einher.
Std. Error der Steigung 0.286 Unsicherheit dieser Schätzung Rund ein Zehntel der Steigung. Sie sinkt mit mehr Beobachtungen und mit einer breiteren Spanne der Laufzeiten.
t value der Steigung 9.980 Schätzwert geteilt durch Standardfehler Die Steigung ist knapp zehn Standardfehler von null entfernt.
Pr(>|t|) der Steigung 1.25e-09 p-Wert für “die wahre Steigung ist null” Praktisch ausgeschlossen. Der Wert des Achsenabschnitts (p = 0.00034) wird meistens gar nicht getestet, weil die Hypothese “y ist null bei x gleich null” selten interessiert.
confint() bzw. [0.025 0.975] 2.261 bis 3.447 plausibler Bereich für die Steigung Die aussagekräftigste Zeile: Der wahre Effekt liegt vermutlich zwischen 2.3 und 3.4 Litern je Stunde. Diese Spanne, nicht der p-Wert, entscheidet über die praktische Nutzbarkeit.
Residual standard error 6.106 auf 22 Freiheitsgraden typische Abweichung einer Vorhersage in Litern Wer den Verbrauch aus der Laufzeit vorhersagt, liegt typischerweise um rund 6 Liter daneben. Die praktisch nützlichste Gütezahl, weil sie in der Einheit der Messung steht.
Freiheitsgrade 22 n minus 2 24 Beobachtungen, zwei geschätzte Parameter.
Multiple R-squared 0.8191 Anteil erklärter Streuung Rund 82 Prozent der Verbrauchsunterschiede gehen auf die Laufzeit zurück.
Adjusted R-squared 0.8109 um die Parameterzahl korrigiert Bei einem Prädiktor kaum verschieden. Der Abstand wächst mit der Zahl der Prädiktoren.
F-statistic 99.60 auf 1 und 22 df, p = 1.25e-09 Gesamttest des Modells Bei genau einem Prädiktor redundant: F ist exakt das Quadrat des t-Werts (9.98² = 99.6), und die p-Werte sind identisch.

Bestimmtheitsmass und Korrelation

Bei einem Prädiktor ist R² exakt das Quadrat der Korrelation. Das lässt sich direkt nachrechnen und ist der beste Merksatz gegen die Verwechslung der beiden Zahlen.

round(c(r = cor(anlagen$laufzeit, anlagen$verbrauch),
        r_quadrat = cor(anlagen$laufzeit, anlagen$verbrauch)^2,
        aus_dem_modell = summary(modell)$r.squared), 4)
             r      r_quadrat aus_dem_modell 
        0.9050         0.8191         0.8191 
r = anlagen["laufzeit"].corr(anlagen["verbrauch"])
print("r =", round(r, 4), " r^2 =", round(r**2, 4),
      " R^2 =", round(modell.rsquared, 4))
r = 0.905  r^2 = 0.8191  R^2 = 0.8191

Die Korrelation beträgt 0.905, ihr Quadrat 0.8191, und genau das steht als R² im Modell. Wichtig ist der Unterschied in der Bedeutung: r = 0.905 ist ein Mass für die Enge des Zusammenhangs ohne Einheit, R² = 0.82 ein Anteil an der Streuung. Die Steigung von 2.854 Litern je Stunde sagt dagegen etwas über die Grösse des Effekts, und die drei Zahlen sind nicht ineinander überführbar, ohne die Streuungen zu kennen.

Voraussetzungen prüfen

par(mfrow = c(1, 3), mar = c(4, 4, 3, 1))
plot(anlagen$laufzeit, anlagen$verbrauch, pch = 16, col = "grey30",
     xlab = "Laufzeit (h)", ylab = "Verbrauch (l)", main = "Daten und Gerade")
abline(modell, col = "steelblue", lwd = 2)
plot(modell, which = 1)
plot(modell, which = 2)
par(mfrow = c(1, 1))

bptest(modell)

    studentized Breusch-Pagan test

data:  modell
BP = 0.00024274, df = 1, p-value = 0.9876
Abbildung 1: Beispiel 1: Streudiagramm mit Gerade, Residuen gegen Vorhersage, QQ-Plot der Residuen.
fig, axes = plt.subplots(1, 3, figsize=(7, 3.0))
axes[0].scatter(anlagen["laufzeit"], anlagen["verbrauch"], s=14, color="0.3")
gerade = np.linspace(3, 20, 50)
axes[0].plot(gerade, modell.params.iloc[0] + modell.params.iloc[1] * gerade,
             color="steelblue", linewidth=2)
axes[0].set_xlabel("Laufzeit (h)")
axes[0].set_ylabel("Verbrauch (l)")
axes[0].set_title("Daten und Gerade")
axes[1].scatter(modell.fittedvalues, modell.resid, s=14, color="0.3")
axes[1].axhline(0, linestyle="--", color="black")
axes[1].set_xlabel("Vorhersage")
axes[1].set_title("Residuen")
sm.qqplot(modell.resid, line="s", ax=axes[2])
axes[2].set_title("QQ-Plot")
plt.tight_layout()
plt.show()
Abbildung 2: Beispiel 1: dieselbe Diagnostik in Python.
lm_stat, lm_p, f_stat, f_p = sm.stats.diagnostic.het_breuschpagan(
    modell.resid, modell.model.exog)
print("Breusch-Pagan LM =", round(lm_stat, 4), " p =", round(lm_p, 4))
Breusch-Pagan LM = 0.0002  p = 0.9876

Links steigen die Punkte gleichmässig an, ohne Bogen. In der Mitte streuen die Residuen strukturlos um die Nulllinie, und der Streubereich bleibt von links nach rechts etwa gleich breit. Rechts liegen die Punkte nah an der Geraden. Der Breusch-Pagan-Test bestätigt das mit einem p-Wert von 0.988: kein Hinweis auf ungleiche Streuung. Ein grosser p-Wert ist hier die gute Nachricht, weil die Nullhypothese die konstante Streuung ist.

Interpretation und Ergebnissatz

Drei Zahlen tragen die Aussage, und sie beantworten drei verschiedene Fragen. Die Steigung von 2.854 Litern je Stunde beantwortet “wie stark”. Das Intervall von 2.26 bis 3.45 beantwortet “wie sicher”. Die Residualstreuung von 6.1 Litern beantwortet “wie brauchbar für eine einzelne Vorhersage”. Ein Modell kann bei allen drei Fragen unterschiedlich gut abschneiden, und der p-Wert beantwortet keine davon.

Der Verbrauch steigt mit der Betriebszeit: Je zusätzlicher Betriebsstunde nimmt er im Mittel um 2.85 Liter zu (95-Prozent-Konfidenzintervall 2.26 bis 3.45, t(22) = 9.98, p < 0.001). Das Modell erklärt 82 Prozent der Streuung, die typische Abweichung einer Vorhersage beträgt 6.1 Liter (n = 24). Residuen und Streudiagramm zeigen keine Auffälligkeiten.

Frage und Datenlage

Aus derselben Halle liegen für 20 Tage die Hallentemperatur in Grad Celsius und der Tagesverbrauch vor. Die Vermutung lautet, dass wärmere Tage den Verbrauch treiben. Das Beispiel zeigt, wie ein Nullbefund aussieht und was er nicht bedeutet.

Modell schätzen

halle <- data.frame(
  temperatur = c(15.6, 16.1, 16.3, 17.0, 17.2, 18.0, 18.5, 18.9, 19.2, 19.5,
                 19.7, 20.4, 21.2, 21.4, 21.5, 21.8, 21.9, 22.2, 22.4, 23.5),
  verbrauch = c(56.3, 63.1, 56.5, 55.7, 52.6, 61.1, 43.9, 60.6, 75.7, 50.8,
                59.5, 93.8, 48.1, 40.5, 54.9, 81.7, 84.4, 45.4, 66.8, 60.1)
)

modell_b2 <- lm(verbrauch ~ temperatur, data = halle)
summary(modell_b2)

Call:
lm(formula = verbrauch ~ temperatur, data = halle)

Residuals:
    Min      1Q  Median      3Q     Max 
-21.807  -8.044  -1.008   4.126  32.463 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  41.5439    27.1568   1.530    0.143
temperatur    0.9702     1.3750   0.706    0.489

Residual standard error: 14.16 on 18 degrees of freedom
Multiple R-squared:  0.02692,   Adjusted R-squared:  -0.02715 
F-statistic: 0.4979 on 1 and 18 DF,  p-value: 0.4895
confint(modell_b2)
                 2.5 %    97.5 %
(Intercept) -15.510357 98.598172
temperatur   -1.918629  3.859092
halle = pd.DataFrame({
    "temperatur": [15.6, 16.1, 16.3, 17.0, 17.2, 18.0, 18.5, 18.9, 19.2, 19.5,
                   19.7, 20.4, 21.2, 21.4, 21.5, 21.8, 21.9, 22.2, 22.4, 23.5],
    "verbrauch": [56.3, 63.1, 56.5, 55.7, 52.6, 61.1, 43.9, 60.6, 75.7, 50.8,
                  59.5, 93.8, 48.1, 40.5, 54.9, 81.7, 84.4, 45.4, 66.8, 60.1],
})

modell_b2 = smf.ols("verbrauch ~ temperatur", data=halle).fit()
print(modell_b2.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:              verbrauch   R-squared:                       0.027
Model:                            OLS   Adj. R-squared:                 -0.027
Method:                 Least Squares   F-statistic:                    0.4979
Date:                Mon, 14 Sep 2026   Prob (F-statistic):              0.489
Time:                        07:18:48   Log-Likelihood:                -80.337
No. Observations:                  20   AIC:                             164.7
Df Residuals:                      18   BIC:                             166.7
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     41.5439     27.157      1.530      0.143     -15.510      98.598
temperatur     0.9702      1.375      0.706      0.489      -1.919       3.859
==============================================================================
Omnibus:                        2.293   Durbin-Watson:                   2.211
Prob(Omnibus):                  0.318   Jarque-Bera (JB):                1.373
Skew:                           0.642   Prob(JB):                        0.503
Kurtosis:                       2.997   Cond. No.                         170.
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

Output Zeile für Zeile

Ausgabe Wert hier Wie er zu lesen ist
Steigung 0.970 Rechnerisch steigt der Verbrauch um knapp einen Liter je Grad. Der Wert allein sagt nichts, solange die Unsicherheit fehlt.
Std. Error 1.375 Grösser als die Steigung selbst. Damit ist die Schätzung von reinem Rauschen nicht zu unterscheiden.
t value 0.706 Weniger als ein Standardfehler Abstand zur Null.
Pr(>|t|) 0.489 Ein Wert dieser Grösse entsteht bei fehlendem Zusammenhang in rund der Hälfte aller Stichproben.
Konfidenzintervall -1.919 bis 3.859 Die wichtigste Zeile. Das Intervall enthält die Null, ist aber fast sechs Liter je Grad breit: Ein deutlicher Effekt in beide Richtungen bleibt mit diesen Daten vereinbar.
Multiple R-squared 0.0269 Nicht einmal drei Prozent der Streuung sind erklärt.
Adjusted R-squared -0.0271 Negativ, und das ist kein Fehler. Das korrigierte Mass zieht für jeden Parameter etwas ab; erklärt der Prädiktor weniger, als ein zufälliger Prädiktor im Mittel erklären würde, rutscht es unter null. Ein sicheres Zeichen dafür, dass der Prädiktor nichts beiträgt.
Residual standard error 14.163 auf 18 Freiheitsgraden Die Vorhersage aus der Temperatur ist kaum besser als der blosse Mittelwert des Verbrauchs.
F-statistic 0.498, p = 0.489 Wie erwartet identisch mit dem t-Test der Steigung.

Interpretation und Ergebnissatz

Der Nullbefund erlaubt genau eine Aussage: In diesen Daten ist kein Zusammenhang erkennbar. Er erlaubt nicht die Aussage, dass keiner existiert. Der Unterschied steht im Konfidenzintervall, das Effekte bis zu 3.9 Litern je Grad weiterhin zulässt. Bei 20 Beobachtungen und einer Temperaturspanne von nur acht Grad ist das kein Wunder: Die Genauigkeit der Steigung hängt nicht nur an n, sondern auch an der Spannweite des Prädiktors.

Wer diesen Zusammenhang ernsthaft prüfen will, erhebt mehr Tage und vor allem Tage mit stärker unterschiedlichen Temperaturen.

Für die Hallentemperatur ergibt sich kein nachweisbarer Zusammenhang mit dem Tagesverbrauch (Steigung 0.97 Liter je Grad, 95-Prozent-Konfidenzintervall -1.92 bis 3.86, t(18) = 0.71, p = 0.49, R² = 0.03, n = 20). Das Intervall lässt Effekte in beide Richtungen zu; ein Einfluss ist damit nicht ausgeschlossen, sondern unbelegt.

Frage und Datenlage

An 24 Werkzeugen wurde die Laufzeit in tausend Stunden und der Verschleiss in Mikrometern gemessen. Verschleiss wächst bei vielen Prozessen überproportional, weil eine bereits abgenutzte Schneide schneller weiter abnutzt. Genau dieser Fall ist gefährlich, weil er sich in den Kennzahlen gut versteckt.

Modell schätzen

werkzeug <- data.frame(
  laufzeit = c(3.8, 3.8, 3.9, 4.0, 4.1, 7.0, 7.6, 7.9, 9.5, 9.7, 9.9, 10.4,
               11.4, 11.8, 12.4, 14.1, 14.5, 16.7, 16.7, 17.4, 18.0, 18.3,
               19.6, 20.0),
  verschleiss = c(31.9, 35.3, 16.0, 27.5, 22.2, 48.0, 44.3, 57.6, 73.8, 74.0,
                  70.4, 81.7, 89.2, 92.7, 114.1, 130.4, 155.5, 193.1, 171.4,
                  203.8, 205.6, 221.2, 250.8, 244.1)
)

modell_b3 <- lm(verschleiss ~ laufzeit, data = werkzeug)
summary(modell_b3)

Call:
lm(formula = verschleiss ~ laufzeit, data = werkzeug)

Residuals:
     Min       1Q   Median       3Q      Max 
-24.0024 -14.2466  -0.6001  11.8892  27.9486 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -44.5903     8.0917  -5.511 1.54e-05 ***
laufzeit     13.6689     0.6454  21.178 4.02e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 16.81 on 22 degrees of freedom
Multiple R-squared:  0.9532,    Adjusted R-squared:  0.9511 
F-statistic: 448.5 on 1 and 22 DF,  p-value: 4.015e-16
werkzeug = pd.DataFrame({
    "laufzeit": [3.8, 3.8, 3.9, 4.0, 4.1, 7.0, 7.6, 7.9, 9.5, 9.7, 9.9, 10.4,
                 11.4, 11.8, 12.4, 14.1, 14.5, 16.7, 16.7, 17.4, 18.0, 18.3,
                 19.6, 20.0],
    "verschleiss": [31.9, 35.3, 16.0, 27.5, 22.2, 48.0, 44.3, 57.6, 73.8, 74.0,
                    70.4, 81.7, 89.2, 92.7, 114.1, 130.4, 155.5, 193.1, 171.4,
                    203.8, 205.6, 221.2, 250.8, 244.1],
})

modell_b3 = smf.ols("verschleiss ~ laufzeit", data=werkzeug).fit()
print(modell_b3.summary().tables[1])
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    -44.5903      8.092     -5.511      0.000     -61.371     -27.809
laufzeit      13.6689      0.645     21.178      0.000      12.330      15.007
==============================================================================
print("R^2 =", round(modell_b3.rsquared, 4),
      " Residualstreuung =", round(np.sqrt(modell_b3.mse_resid), 3))
R^2 = 0.9532  Residualstreuung = 16.808

Output Zeile für Zeile

Ausgabe Wert hier Wie er zu lesen ist
Steigung 13.669 Sieht überzeugend aus.
Std. Error 0.645 Sehr klein gegenüber der Steigung.
t value 21.178 Enorm.
Pr(>|t|) 4.0e-16 Hochsignifikant.
Multiple R-squared 0.9532 95 Prozent erklärte Streuung. Nach den Kennzahlen ein Musterbeispiel.
(Intercept) -44.590 Hier steckt der erste Hinweis: Das Modell sagt für ein neues Werkzeug einen negativen Verschleiss voraus, was physikalisch unmöglich ist.
Residual standard error 16.808 Und der zweite Hinweis: Bei Messwerten zwischen 16 und 251 Mikrometern ist das viel, gerade für ein Modell mit R² = 0.95.

Alle klassischen Gütezahlen sind gut, und das Modell ist trotzdem falsch. Warum, zeigen erst die Residuen.

Voraussetzungen prüfen

par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
plot(werkzeug$laufzeit, werkzeug$verschleiss, pch = 16, col = "grey30",
     xlab = "Laufzeit (1000 h)", ylab = "Verschleiss (Mikrometer)",
     main = "Gerade auf krummen Daten")
abline(modell_b3, col = "steelblue", lwd = 2)
plot(fitted(modell_b3), resid(modell_b3), pch = 16, col = "grey30",
     xlab = "Vorhersage", ylab = "Residuum", main = "Residuen mit Bogen")
abline(h = 0, lty = 2)
lines(lowess(fitted(modell_b3), resid(modell_b3)), col = "firebrick", lwd = 2)
par(mfrow = c(1, 1))
Abbildung 3: Beispiel 3: Gerade auf gekrümmten Daten und der Bogen im Residuenplot.
fig, (links, rechts) = plt.subplots(1, 2, figsize=(7, 3.2))
links.scatter(werkzeug["laufzeit"], werkzeug["verschleiss"], s=14, color="0.3")
x_gitter = np.linspace(3.5, 20.5, 50)
links.plot(x_gitter,
           modell_b3.params.iloc[0] + modell_b3.params.iloc[1] * x_gitter,
           color="steelblue", linewidth=2)
links.set_xlabel("Laufzeit (1000 h)")
links.set_ylabel("Verschleiss (Mikrometer)")
links.set_title("Gerade auf krummen Daten")
rechts.scatter(modell_b3.fittedvalues, modell_b3.resid, s=14, color="0.3")
rechts.axhline(0, linestyle="--", color="black")
glatt = sm.nonparametric.lowess(modell_b3.resid, modell_b3.fittedvalues)
rechts.plot(glatt[:, 0], glatt[:, 1], color="firebrick", linewidth=2)
rechts.set_xlabel("Vorhersage")
rechts.set_title("Residuen mit Bogen")
fig.tight_layout()
plt.show()
Abbildung 4: Beispiel 3: dieselbe Gegenüberstellung in Python.

Der Residuenplot zeigt das Muster, das eine übersehene Krümmung immer erzeugt: Die Residuen sind an beiden Rändern positiv und in der Mitte negativ, die Glättungslinie bildet einen deutlichen Bogen. Im linken Bild ist zu sehen, warum: Die Gerade liegt bei kleinen und grossen Laufzeiten über den Punkten und im mittleren Bereich darunter.

Modell korrigieren

modell_b3q <- lm(verschleiss ~ laufzeit + I(laufzeit^2), data = werkzeug)
summary(modell_b3q)

Call:
lm(formula = verschleiss ~ laufzeit + I(laufzeit^2), data = werkzeug)

Residuals:
    Min      1Q  Median      3Q     Max 
-11.685  -5.106   0.957   5.208  13.243 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)   16.77453    7.27097   2.307   0.0313 *  
laufzeit       0.05442    1.43629   0.038   0.9701    
I(laufzeit^2)  0.59307    0.06134   9.668 3.49e-09 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 7.368 on 21 degrees of freedom
Multiple R-squared:  0.9914,    Adjusted R-squared:  0.9906 
F-statistic:  1214 on 2 and 21 DF,  p-value: < 2.2e-16
modell_b3q = smf.ols("verschleiss ~ laufzeit + I(laufzeit**2)",
                     data=werkzeug).fit()
print(modell_b3q.summary().tables[1])
====================================================================================
                       coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------------
Intercept           16.7745      7.271      2.307      0.031       1.654      31.895
laufzeit             0.0544      1.436      0.038      0.970      -2.933       3.041
I(laufzeit ** 2)     0.5931      0.061      9.668      0.000       0.466       0.721
====================================================================================
print("R^2 =", round(modell_b3q.rsquared, 4),
      " Residualstreuung =", round(np.sqrt(modell_b3q.mse_resid), 3))
R^2 = 0.9914  Residualstreuung = 7.368
Vergleich Gerade Mit quadratischem Term
0.9532 0.9914
Residualstreuung 16.808 µm 7.368 µm
Achsenabschnitt -44.590 (unmöglich) 16.774 (plausibel)

Die Residualstreuung sinkt auf weniger als die Hälfte, und der Achsenabschnitt wird physikalisch sinnvoll. Am R² wäre der Unterschied kaum aufgefallen: 0.95 gegen 0.99 sieht nach Feinschliff aus, ist aber der Unterschied zwischen falschem und passendem Modell.

Bemerkenswert im korrigierten Modell: Der lineare Term ist mit p = 0.97 völlig unbedeutend, der quadratische mit p < 0.001 hochsignifikant. Der lineare Term bleibt trotzdem im Modell. Polynomterme werden von unten aufgebaut und nicht einzeln nach p-Werten entfernt, sonst hängt das Ergebnis am willkürlich gewählten Nullpunkt der x-Achse.

Interpretation und Ergebnissatz

Die Lehre aus diesem Beispiel: Kennzahlen erkennen das Problem nicht. R² war hoch, der p-Wert winzig, und beides blieb auch dann so, als das Modell nachweislich falsch war. Erkannt wird die Fehlspezifikation am Residuenplot und an der Plausibilitätsprüfung des Achsenabschnitts. Deshalb wird der Residuenplot angesehen, bevor irgendeine Zahl berichtet wird.

Ein rein lineares Modell beschreibt den Zusammenhang nicht angemessen; die Residuen zeigen eine deutliche Krümmung und der Achsenabschnitt ist negativ. Berichtet wird das Modell mit quadratischem Term (R² = 0.99, Residualstreuung 7.4 Mikrometer, n = 24); der quadratische Koeffizient beträgt 0.593 Mikrometer je (1000 h)² (p < 0.001).

Frage und Datenlage

Zu den 24 Anlagen aus Beispiel 1 kommt eine weitere hinzu: 45 Betriebsstunden bei nur 20 Litern Verbrauch. Der Wert stammt aus einer Anlage, deren Zähler in der Woche ausgefallen war. Er liegt weit rechts ausserhalb der übrigen Laufzeiten und weit unter der Geraden.

Modell schätzen

mit_fall <- rbind(anlagen, data.frame(laufzeit = 45.0, verbrauch = 20.0))

modell_b4 <- lm(verbrauch ~ laufzeit, data = mit_fall)
summary(modell_b4)

Call:
lm(formula = verbrauch ~ laufzeit, data = mit_fall)

Residuals:
    Min      1Q  Median      3Q     Max 
-35.668  -8.551   0.755   7.939  30.222 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  44.2644     5.8949   7.509 1.25e-07 ***
laufzeit      0.2534     0.3871   0.655    0.519    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 15.08 on 23 degrees of freedom
Multiple R-squared:  0.01829,   Adjusted R-squared:  -0.02439 
F-statistic: 0.4285 on 1 and 23 DF,  p-value: 0.5192
einfluss <- data.frame(
  cook = cooks.distance(modell_b4),
  hebel = hatvalues(modell_b4)
)
round(tail(einfluss, 3), 3)
     cook hebel
23  0.137 0.060
24  0.034 0.066
25 23.906 0.711
mit_fall = pd.concat(
    [anlagen, pd.DataFrame({"laufzeit": [45.0], "verbrauch": [20.0]})],
    ignore_index=True)

modell_b4 = smf.ols("verbrauch ~ laufzeit", data=mit_fall).fit()
print(modell_b4.summary().tables[1])
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     44.2644      5.895      7.509      0.000      32.070      56.459
laufzeit       0.2534      0.387      0.655      0.519      -0.547       1.054
==============================================================================
print("R^2 =", round(modell_b4.rsquared, 4))
R^2 = 0.0183
einfluss = modell_b4.get_influence()
print("Cook-Distanz des letzten Falls:",
      round(einfluss.cooks_distance[0][-1], 3))
Cook-Distanz des letzten Falls: 23.906
print("Hebelwert des letzten Falls:  ",
      round(einfluss.hat_matrix_diag[-1], 3))
Hebelwert des letzten Falls:   0.711
print("mittlerer Hebelwert:          ",
      round(einfluss.hat_matrix_diag.mean(), 3))
mittlerer Hebelwert:           0.08

Output Zeile für Zeile

Ausgabe Ohne den Fall Mit dem Fall Wie das zu lesen ist
Steigung 2.854 0.253 Der Effekt verschwindet fast vollständig. Eine einzige von 25 Beobachtungen dreht die inhaltliche Aussage um.
Std. Error 0.286 0.387 Auch die Unsicherheit steigt.
Pr(>|t|) < 0.001 0.519 Aus einem hochsignifikanten Befund wird ein Nullbefund.
Konfidenzintervall 2.26 bis 3.45 -0.55 bis 1.05 Die beiden Intervalle überschneiden sich nicht einmal.
Multiple R-squared 0.8191 0.0183 Von 82 Prozent auf unter 2 Prozent.
Cook-Distanz des Falls 23.906 Sie misst, wie stark sich alle Vorhersagen ändern, wenn genau dieser Punkt weggelassen wird. Werte über 1 gelten als auffällig; 23.9 ist eine Grössenordnung darüber.
Hebelwert des Falls 0.711 Der Hebel misst, wie extrem der x-Wert liegt. Der Durchschnitt beträgt hier 0.08 (zwei Parameter geteilt durch 25 Beobachtungen); dieser Punkt hat fast den neunfachen Wert.

Hebel und Cook-Distanz sind nicht dasselbe. Ein Punkt mit hohem Hebel liegt weit aussen auf der x-Achse, richtet aber keinen Schaden an, solange er auf der Linie der übrigen liegt. Gefährlich wird die Kombination: extremer x-Wert und Abweichung nach oben oder unten. Genau die misst die Cook-Distanz.

Voraussetzungen prüfen

par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
plot(mit_fall$laufzeit, mit_fall$verbrauch, pch = 16, col = "grey30",
     xlab = "Laufzeit (h)", ylab = "Verbrauch (l)", main = "Alle 25 Fälle")
points(45, 20, pch = 16, col = "firebrick", cex = 1.4)
abline(modell_b4, col = "firebrick", lwd = 2)
abline(modell, col = "steelblue", lwd = 2, lty = 2)
legend("topright", c("mit", "ohne"), col = c("firebrick", "steelblue"),
       lty = c(1, 2), lwd = 2, bty = "n", cex = 0.8)
plot(cooks.distance(modell_b4), type = "h", lwd = 2,
     xlab = "Beobachtung", ylab = "Cook-Distanz", main = "Cook-Distanzen")
abline(h = 1, lty = 2, col = "firebrick")
par(mfrow = c(1, 1))
Abbildung 5: Beispiel 4: dieselben Daten mit und ohne den einen Fall.
fig, (links, rechts) = plt.subplots(1, 2, figsize=(7, 3.2))
links.scatter(mit_fall["laufzeit"], mit_fall["verbrauch"], s=14, color="0.3")
links.scatter([45], [20], s=45, color="firebrick")
x_gitter = np.linspace(3, 46, 50)
links.plot(x_gitter,
           modell_b4.params.iloc[0] + modell_b4.params.iloc[1] * x_gitter,
           color="firebrick", linewidth=2, label="mit")
links.plot(x_gitter,
           modell.params.iloc[0] + modell.params.iloc[1] * x_gitter,
           color="steelblue", linewidth=2, linestyle="--", label="ohne")
links.set_xlabel("Laufzeit (h)")
links.set_ylabel("Verbrauch (l)")
links.set_title("Alle 25 Fälle")
links.legend(frameon=False, fontsize=8)
cook = modell_b4.get_influence().cooks_distance[0]
rechts.vlines(range(len(cook)), 0, cook, linewidth=2)
rechts.axhline(1, linestyle="--", color="firebrick")
rechts.set_xlabel("Beobachtung")
rechts.set_ylabel("Cook-Distanz")
rechts.set_title("Cook-Distanzen")
fig.tight_layout()
plt.show()
Abbildung 6: Beispiel 4: dieselbe Gegenüberstellung in Python.

Im linken Bild ist zu sehen, wie der eine Punkt die Gerade zu sich herunterzieht. Rechts ragt seine Cook-Distanz so weit über die Schwelle von 1 hinaus, dass die übrigen 24 Werte optisch auf der Nulllinie verschwinden.

Interpretation und Ergebnissatz

Entscheidend ist, was jetzt nicht passiert: Der Punkt wird nicht kommentarlos gelöscht, weil er stört. Die Reihenfolge lautet erstens Ursache klären, zweitens entscheiden, drittens beides berichten.

Befund zur Ursache Vorgehen
Nachweislicher Messfehler, hier der ausgefallene Zähler Fall ausschliessen, Ausschluss und Begründung im Bericht nennen
Gültiger, aber andersartiger Betriebszustand getrennt modellieren oder als zusätzliche Variable aufnehmen
Gültiger Wert, Ursache unklar Modell mit und ohne den Fall berichten und die Abhängigkeit offenlegen

Im Beispiel ist die Ursache bekannt, der Fall fliegt heraus, und der Bericht sagt das ausdrücklich. Wäre die Ursache unbekannt geblieben, müsste im Bericht stehen, dass die gesamte Aussage an einer einzigen Beobachtung hängt.

Von 25 Anlagen wurde eine ausgeschlossen, deren Verbrauchszähler nachweislich ausgefallen war (45 Betriebsstunden bei 20 Litern; Cook-Distanz 23.9, Hebelwert 0.71). Ohne sie steigt der Verbrauch je Betriebsstunde um 2.85 Liter (95-Prozent-Konfidenzintervall 2.26 bis 3.45, p < 0.001, R² = 0.82, n = 24); unter Einschluss des Falls wäre die Steigung auf 0.25 Liter gefallen und nicht mehr nachweisbar gewesen (p = 0.52).

Verständnisfragen

Ein Modell liefert R² = 0.95, der Residuenplot zeigt einen deutlichen Bogen. Was folgt?

Das Modell ist gut, R² ist hoch
R² misst erklärte Streuung, nicht Angemessenheit. Ein falsches Modell kann viel Streuung erklären, siehe Beispiel 3.
Das Modell ist falsch spezifiziert, trotz hohem R²
Richtig. Der Bogen zeigt eine übersehene Krümmung. Die Steigung ist ein Kompromiss und stimmt in keinem Bereich; Vorhersagen an den Rändern liegen daneben.
Die Daten enthalten Ausreisser
Ausreisser zeigen sich als einzelne weit entfernte Punkte, nicht als durchgehendes Muster.

In Beispiel 2 gibt R ein Adjusted R-squared von -0.0271 aus. Ist das ein Rechenfehler?

Nein, das korrigierte Mass kann negativ werden
Richtig. Es zieht für jeden geschätzten Parameter etwas ab. Erklärt der Prädiktor weniger, als ein beliebiger Prädiktor im Mittel erklären würde, rutscht der Wert unter null. Das ist ein deutliches Zeichen dafür, dass er nichts beiträgt.
Ja, ein Anteil kann nicht negativ sein
Das gewöhnliche R² ist ein Anteil und liegt zwischen 0 und 1. Das korrigierte ist ein Schätzer und nicht auf diesen Bereich beschränkt.
Ja, die Daten müssen fehlerhaft sein
Die Daten sind in Ordnung, nur der Prädiktor ist es nicht.

Die Cook-Distanz einer Beobachtung beträgt 23.9, ihr Hebelwert 0.71. Was ist der Unterschied zwischen beiden Zahlen?

Der Hebel misst, wie extrem der x-Wert liegt, die Cook-Distanz, wie stark der Punkt das Ergebnis verändert
Richtig. Ein Punkt mit hohem Hebel ist harmlos, solange er auf der Linie der übrigen liegt. Gefährlich ist die Kombination aus extremem x-Wert und Abweichung von der Geraden, und genau die misst die Cook-Distanz.
Beide messen dasselbe in verschiedener Skalierung
Dann könnte es keinen Punkt mit hohem Hebel und kleiner Cook-Distanz geben, den gibt es aber.
Der Hebel bezieht sich auf y, die Cook-Distanz auf x
Genau umgekehrt gedacht: Der Hebel hängt allein an den x-Werten.

In Beispiel 1 beträgt R² 0.82 und die Residualstreuung 6.1 Liter. Welche der beiden Zahlen sagt mehr über die Nutzbarkeit einer einzelnen Vorhersage?

Die Residualstreuung, weil sie in Litern angegeben ist
Richtig. Sie sagt unmittelbar, um wie viel eine Vorhersage typischerweise danebenliegt. Ob 6 Liter viel oder wenig sind, entscheidet der Anwendungsfall.
R², weil es die Modellgüte misst
R² ist relativ zur Gesamtstreuung. Bei sehr unterschiedlichen Laufzeiten wird es hoch, ohne dass die einzelne Vorhersage genauer würde.
Beide gleichermassen
Sie hängen zusammen, beantworten aber verschiedene Fragen: R² den Anteil erklärter Streuung, die Residualstreuung den typischen Fehler.

Der Achsenabschnitt beträgt 15.2 Liter, die kleinste beobachtete Laufzeit 3.2 Stunden. Was darf berichtet werden?

Bei stillstehender Anlage werden 15.2 Liter verbraucht
Der Wert null liegt ausserhalb des beobachteten Bereichs; für ihn ist das Modell nicht geprüft.
Der Achsenabschnitt ist ein Rechenwert und hier nicht inhaltlich deutbar
Richtig. Wer eine deutbare Zahl braucht, zentriert die Laufzeit, dann beschreibt der Achsenabschnitt den Verbrauch bei mittlerer Laufzeit.
Der Wert ist ein Hinweis auf einen Modellfehler
Er ist weder falsch noch auffällig, nur ausserhalb des Bereichs, für den Daten vorliegen. Auffällig wäre er erst, wenn er unmöglich ist, wie der negative Verschleiss in Beispiel 3.

Der p-Wert der Steigung beträgt 1.25e-09, der p-Wert des Pearson-Korrelationstests für dieselben Daten ebenfalls. Zufall?

Nein, bei einem Prädiktor sind die beiden Tests identisch
Richtig. Der t-Test der Steigung und der Pearson-Korrelationstest prüfen dieselbe Nullhypothese und liefern dieselbe Teststatistik. Gleiches gilt für den F-Test des Gesamtmodells, dessen Wert genau das Quadrat des t-Werts ist.
Ja, das ist eine zufällige Übereinstimmung
Sie tritt bei jedem Datensatz mit einem Prädiktor auf.
Nein, weil beide Verfahren Normalverteilung voraussetzen
Die gemeinsame Voraussetzung erklärt nicht, warum die Zahlen exakt gleich sind.

Verlinkte Ressourcen