Volver al inicio

Regresión Múltiple en Python: scikit-learn

El artículo cubre regresión lineal múltiple en el conjunto de datos Advertising. Describe base matemática, preparación de datos, entrenamiento del modelo LinearRegression, métricas de calidad (R²=0.90) y diagnósticos de residuos.

Construye regresión múltiple: TV, Radio, Sales
Advertisement 728x90

Regresión lineal múltiple en Python: modelado con múltiples predictores

La regresión lineal múltiple amplía la regresión simple al incorporar múltiples variables independientes. El modelo ajusta un hiperplano en un espacio multidimensional para predecir la variable objetivo Y utilizando predictores X₁ hasta Xₙ. Cada coeficiente βᵢ refleja el impacto aislado de su factor respectivo, manteniendo todas las demás variables constantes. Usando el conjunto de datos Advertising, predeciremos las ventas basadas en los presupuestos de publicidad en TV, Radio y Diario.

Formulación matemática

La ecuación del modelo es:

Y = β₀ + β₁X₁ + β₂X₂ + ⋯ + βₙXₙ + ε

Google AdInline article slot

β₀ es la intersección, βᵢ son los coeficientes de regresión y ε representa los residuos. Los valores óptimos de β se calculan mediante mínimos cuadrados ordinarios (OLS):

β̂ = (XᵀX)⁻¹Xᵀy

Aquí, X es la matriz extendida de características (con una columna de unos), y y es el vector objetivo. Las suposiciones clave incluyen relaciones lineales y homocedasticidad de residuos.

Google AdInline article slot

Preparación de los datos

Divida los datos en conjuntos de entrenamiento y prueba (80/20) para evaluar el rendimiento de generalización y evitar sobreajuste. Aplique codificación One-Hot para variables categóricas y use StandardScaler para estandarizar las características numéricas—esto mejora la interpretabilidad de los coeficientes.

Pasos clave de preparación:

  • Verifique valores faltantes y valores atípicos.
  • Codifique variables categóricas.
  • Divida el conjunto de datos: train_test_split(X, y, test_size=0.2, random_state=42).
  • Escale las características: StandardScaler().fit_transform(X_train).

Implementación con el conjunto de datos Advertising

Conjunto de datos: 200 observaciones, prediciendo Ventas a partir de presupuestos de publicidad en TV, Radio y Diario.

Google AdInline article slot

Importar y cargar datos

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error

plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")

df = pd.read_csv("Advertising.csv")
if 'Unnamed: 0' in df.columns:
    df = df.drop('Unnamed: 0', axis=1)
df.columns = ['TV', 'Radio', 'Newspaper', 'Sales']
print(df.head())
print(f"Tamaño de los datos: {df.shape}")

Primeras filas:

| TV | Radio | Newspaper | Sales |

|-------|-------|-----------|-------|

| 230.1 | 37.8 | 69.2 | 22.1 |

| 44.5 | 39.3 | 45.1 | 10.4 |

EDA y correlaciones

Estadísticas descriptivas:

| | TV | Radio | Newspaper | Sales |

|-------|--------|-------|-----------|-------|

| media | 147.04 | 23.26 | 30.55 | 14.02 |

| desv. | 85.85 | 14.85 | 21.78 | 5.22 |

Correlación con Ventas: TV (0.78), Radio (0.58), Diario (0.23).

Los gráficos de dispersión revelan relaciones lineales fuertes entre TV-Ventas y Radio-Ventas, pero una relación débil para Diario.

Entrenamiento del modelo

X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

print(f"Intersección: {model.intercept_:.4f}")
for name, coef in zip(X.columns, model.coef_):
    print(f"{name}: {coef:.4f}")

Resultados:

  • Intersección: 2.9791
  • TV: 0.0447
  • Radio: 0.1892
  • Diario: 0.0028

Interpretación: Por cada aumento de $1,000 en anuncios de TV, las ventas aumentan en ~44.7 unidades; Radio genera ~189.2 unidades adicionales. El impacto del Diario es prácticamente nulo.

Evaluación del modelo

y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse:.2f}, RMSE: {rmse:.2f}, MAE: {mae:.2f}, R²: {r2:.4f}")

Métricas:

  • MSE: 3.17
  • RMSE: 1.78
  • MAE: 1.46
  • R²: 0.8994

Un valor de R² de 0.90 indica que el modelo explica el 90 % de la variabilidad en las ventas. RMSE y MAE proporcionan la magnitud del error en unidades reales de ventas.

Diagnóstico de residuos

  • Histograma de residuos: simétrico alrededor de cero.
  • Residuos vs predicciones: sin patrones visibles (homocedasticidad).
  • Gráfico de dispersión de valores reales vs predichos muestra puntos agrupados cerca de la línea diagonal.

Conclusiones clave

  • La regresión múltiple aísla los efectos de los predictores controlando factores confusos.
  • El coeficiente cercano a cero para Diario sugiere que aporta poca capacidad predictiva.
  • R² = 0.90 refleja un poder explicativo fuerte, pero siempre verifique el VIF para multicolinealidad.
  • Analice siempre los residuos para validar supuestos de linealidad y normalidad.
  • El escalado no es necesario para OLS, pero mejora la interpretabilidad de los coeficientes.

— Editorial Team

Advertisement 728x90

Leer después