Współczynnik determinacji R² — interpretacja i ograniczenia
Współczynnik determinacji R² prostymi słowami i rysunkami: rozkład wariancji (TSS = ESS + RSS), co znaczy R²=0,7, dlaczego wysokie R² to nie zawsze dobry model
Pytanie, na które odpowiada R²
Zbudowałeś model. Naturalne pytanie: jak dobrze pasuje do danych? Ile zmienności $y$ udało się wyjaśnić, a ile zostało „niewyjaśnionej reszty"?
Na to odpowiada współczynnik determinacji $R^2$ — liczba od 0 do 1:
- $R^2 = 1$ — model wyjaśnia wszystko (punkty idealnie na prostej)
- $R^2 = 0$ — model nie wyjaśnia nic (równie dobrze zgadywać średnią)
- $R^2 = 0{,}7$ — model wyjaśnia 70% zmienności $y$
Pochodzenie miary: rozkład wariancji
Pomysł: każdy punkt odchyla się od średniej $\bar{y}$. To całkowite odchylenie da się rozbić na dwie części — tę, którą model wyjaśnia, i tę, która zostaje jako reszta.
Sumując kwadraty po wszystkich punktach, dostajemy tożsamość rozkładu wariancji:
$$ \underbrace{\sum (y_i-\bar{y})^2}_{\text{TSS — całkowita}} = \underbrace{\sum (\hat{y}_i-\bar{y})^2}_{\text{ESS — wyjaśniona}} + \underbrace{\sum (y_i-\hat{y}_i)^2}_{\text{RSS — reszta}} $$Definicja R²
$R^2$ to udział wariancji wyjaśnionej w całkowitej:
$$ R^2 = \frac{\text{ESS}}{\text{TSS}} = 1 - \frac{\text{RSS}}{\text{TSS}} $$Wysokie a niskie R² — porównanie wizualne
Pułapki — wysokie R² to nie wszystko
- R² rośnie po dodaniu KAŻDEJ zmiennej — nawet bezsensownej. Dlatego do porównywania modeli używamy skorygowanego $\bar{R}^2$, który karze za zbędne zmienne.
- Wysokie R² ≠ poprawny model. Można mieć $R^2=0{,}99$ przy źle dobranej formie funkcyjnej albo przy pozornej regresji na niestacjonarnych szeregach.
- Niskie R² ≠ bezużyteczny model. W danych przekrojowych o ludziach $R^2=0{,}3$ bywa normą — zachowania ludzkie są z natury „szumne", a model i tak może poprawnie mierzyć efekt przyczynowy.
Skorygowane R²
$$ \bar{R}^2 = 1 - \frac{\text{RSS}/(n-k-1)}{\text{TSS}/(n-1)} $$Uwzględnia liczbę zmiennych $k$. Może spaść po dodaniu nieistotnej zmiennej — i właśnie dlatego jest uczciwsze przy wyborze modelu.
W kodzie
# R — R² i skorygowane R² są w summary
model <- lm(y ~ x1 + x2, data = dane)
summary(model)$r.squared # R²
summary(model)$adj.r.squared # skorygowane R²
# Python (statsmodels)
model.rsquared # R²
model.rsquared_adj # skorygowane
Multiple R-squared: 0.7012, Adjusted R-squared: 0.6985
Zapamiętaj
- $R^2 = \frac{\text{wariancja wyjaśniona}}{\text{wariancja całkowita}} = 1 - \frac{\text{RSS}}{\text{TSS}}$, zakres 0–1.
- Mówi, jaki ułamek zmienności $y$ tłumaczy model.
- Rośnie po dodaniu dowolnej zmiennej → do porównań używaj skorygowanego $\bar{R}^2$.
- Wysokie $R^2$ nie gwarantuje poprawności; niskie nie przekreśla modelu przyczynowego.