← Regresión lineal aplicada con Python
Conceptos clave de la regresión lineal
Preview gratis Sección 1 · Fundamentos de OLS e interpretación
En este video
- Dibujas la nube de aleta contra masa de 342 pingüinos con scatter y ves que la tendencia es clara pero con ruido
- Ajustas la recta con polyfit y con smf.ols, y lees la pendiente: 49.69 gramos más por cada milímetro de aleta, con R² de 0.759
- Predices con predict la masa de aletas de 190, 200 y 210 mm, y ves por qué el intercepto y la extrapolación fuera del rango observado no se interpretan
- Coloreas por especie con hue y ves que la regresión mide asociación, no causalidad
- Comparas regresión simple y múltiple: la pendiente de la aleta baja de 49.69 a 48.14 con el pico y a 27.43 con la especie, y el R² sube a 0.822
# datos.py
import seaborn as sns
df = sns.load_dataset("penguins")
cols = ["body_mass_g", "flipper_length_mm",
"bill_length_mm"]
df = df.dropna(subset=cols)
print(len(df))
print(df[cols].mean().round(1))
# dispersion.py
# Paso que el video ejecuta sin mostrarlo en pantalla:
import numpy as np
import matplotlib.pyplot as plt
x = df["flipper_length_mm"]
y = df["body_mass_g"]
plt.scatter(x, y, s=16, alpha=0.5)
plt.xlabel("aleta (mm)")
plt.ylabel("masa (g)")
plt.show()
# recta.py
b1, b0 = np.polyfit(x, y, 1)
y_hat = b0 + b1 * x
plt.scatter(x, y, s=16, alpha=0.5)
plt.plot(x, y_hat, color="C1", lw=3)
plt.vlines(x, y, y_hat, color="C3", lw=0.7)
plt.show()
# ajuste.py
for m in [30, b1, 70]:
y_m = y.mean() + m * (x - x.mean())
sse = ((y - y_m) ** 2).sum() / 1e6
plt.plot(x, y_m, label=f"{m:.1f} g/mm: {sse:.1f} M")
plt.scatter(x, y, s=10, alpha=0.3)
plt.legend()
plt.show()
# modelo.py
import statsmodels.formula.api as smf
f = "body_mass_g ~ flipper_length_mm"
m1 = smf.ols(f, data=df).fit()
print(m1.params.round(2))
print(round(m1.rsquared, 3))
# predecir.py
b1 = m1.params["flipper_length_mm"]
print(round(10 * b1, 1))
nuevas = {"flipper_length_mm": [190, 200, 210]}
print(m1.predict(nuevas).round(0))
xs = np.linspace(0, 235, 50)
plt.plot(xs, b0 + b1 * xs, color="C1", lw=3)
plt.scatter(x, y, s=10, alpha=0.4)
plt.axvspan(x.min(), x.max(), alpha=0.12)
plt.axhline(0, color="gray", lw=1)
plt.show()
sns.scatterplot(data=df, hue="species",
x="flipper_length_mm",
y="body_mass_g", s=30)
plt.plot(x, y_hat, color="black", lw=2)
plt.show()
f2 = f + " + bill_length_mm"
m2 = smf.ols(f2, data=df).fit()
print(m2.params.round(2))
print(round(m2.rsquared, 3))