Comience con la idea básica de variación. Su modelo inicial es la suma de las desviaciones al cuadrado de la media. El valor R ^ 2 es la proporción de esa variación que se contabiliza utilizando un modelo alternativo. Por ejemplo, R-cuadrado te dice qué cantidad de la variación en Y puedes eliminar sumando las distancias al cuadrado desde una línea de regresión, en lugar de la media.
Creo que esto queda perfectamente claro si pensamos en el problema de regresión simple trazado. Considere un diagrama de dispersión típico donde tiene un predictor X a lo largo del eje horizontal y una respuesta Y a lo largo del eje vertical.
La media es una línea horizontal en el diagrama donde Y es constante. La variación total en Y es la suma de las diferencias al cuadrado entre la media de Y y cada punto de datos individual. Es la distancia entre la línea media y cada punto individual al cuadrado y sumado.
También puede calcular otra medida de variabilidad después de tener la línea de regresión del modelo. Esta es la diferencia entre cada punto Y y la línea de regresión. En lugar de cada (Y - la media) al cuadrado, obtenemos (Y - el punto en la línea de regresión) al cuadrado.
Si la línea de regresión es cualquier cosa menos horizontal, obtendremos menos distancia total cuando usemos esta línea de regresión ajustada en lugar de la media, es decir, hay menos variación inexplicable. La relación entre la variación adicional explicada y la variación original es su R ^ 2. Es la proporción de la variación original en su respuesta que se explica ajustando esa línea de regresión.

Aquí hay un código R para un gráfico con la media, la línea de regresión y los segmentos desde la línea de regresión a cada punto para ayudar a visualizar:
library(ggplot2)
data(faithful)
plotdata <- aggregate( eruptions ~ waiting , data = faithful, FUN = mean)
linefit1 <- lm(eruptions ~ waiting, data = plotdata)
plotdata$expected <- predict(linefit1)
plotdata$sign <- residuals(linefit1) > 0
p <- ggplot(plotdata, aes(y=eruptions, x=waiting, xend=waiting, yend=expected) )
p + geom_point(shape = 1, size = 3) +
geom_smooth(method=lm, se=FALSE) +
geom_segment(aes(y=eruptions, x=waiting, xend=waiting, yend=expected, colour = sign),
data = plotdata) +
theme(legend.position="none") +
geom_hline(yintercept = mean(plotdata$eruptions), size = 1)