🐍 Regresión Simple y Múltiple con Python

La guía más divertida para aprender modelado predictivo usando Google Colab, datos CSV y sklearn

👨‍🏫 Profe Regresión · 30+ años enseñando Python y Estadística

🍨 1. Regresión Lineal Simple

Objetivo: Predecir las ventas de helado según la temperatura. ¡El calor derrite hasta los bolsillos!

📊 El modelo matemático

\[ \text{Ventas} = b_0 + b_1 \times \text{Temperatura} \]
📏 Coeficientes estimados: \(b_0 \approx 200\), \(b_1 \approx 12\)

🎯 Interpretación: Por cada grado que sube la temperatura, las ventas aumentan ~12 dólares.

# Importar librerías
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 1. Generar datos sintéticos y guardar CSV
np.random.seed(42)
temperaturas = np.random.uniform(15, 40, 100)
ventas = 200 + 12 * temperaturas + np.random.normal(0, 30, 100)
df = pd.DataFrame({'temperatura': temperaturas, 'ventas': ventas})
df.to_csv('heladeria.csv', index=False)

# 2. Cargar datos desde CSV (como en un proyecto real)
datos = pd.read_csv('heladeria.csv')
X = datos[['temperatura']]  # Variable independiente (debe ser 2D)
y = datos['ventas']     # Variable dependiente

# 3. Crear y entrenar el modelo
modelo = LinearRegression()
modelo.fit(X, y)

# 4. Mostrar resultados
print(f"Intercepto (b0): {modelo.intercept_:.2f}")
print(f"Pendiente (b1): {modelo.coef_[0]:.2f}")

# 5. Predecir para una nueva temperatura
nueva_temp = 32
prediccion = modelo.predict([[nueva_temp]])
print(f"Para {nueva_temp}°C se esperan ${prediccion[0]:.2f} en ventas.")

# 6. Visualización
plt.scatter(X, y, alpha=0.6, label='Datos')
plt.plot(X, modelo.predict(X), color='red', linewidth=2, label='Recta')
plt.xlabel('Temperatura (°C)')
plt.ylabel('Ventas ($)')
plt.legend()
plt.title('Regresión Simple - Heladería')
plt.show()

🕹️ ¡Experimenta tú mismo!

🍦 Ventas previstas: 500.00 $

🏡 2. Regresión Lineal Múltiple

Objetivo: Predecir el valor mediano de una vivienda en California usando tres variables: ingreso mediano, antigüedad de la casa y número medio de habitaciones.

📈 Modelo matemático

\[ \text{MedHouseVal} = b_0 + b_1 \cdot \text{MedInc} + b_2 \cdot \text{HouseAge} + b_3 \cdot \text{AveRooms} \]
📏 Coeficientes obtenidos: \(b_0 \approx -2.736\), \(b_1 \approx 0.430\), \(b_2 \approx 0.012\), \(b_3 \approx -0.143\)
# Importar todo lo necesario
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_california_housing
import matplotlib.pyplot as plt

# 1. Obtener datos reales y guardarlos como CSV (para simular carga)
housing = fetch_california_housing(as_frame=True)
df = housing.frame
df.to_csv('housing.csv', index=False)

# 2. Cargar desde CSV
datos = pd.read_csv('housing.csv')
# Seleccionamos 3 predictores clave
X = datos[['MedInc', 'HouseAge', 'AveRooms']]
y = datos['MedHouseVal']

# 3. Dividir en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(
  X, y, test_size=0.2, random_state=42
)

# 4. Entrenar el modelo múltiple
modelo_multi = LinearRegression()
modelo_multi.fit(X_train, y_train)

# 5. Mostrar coeficientes
coef = pd.DataFrame({
  'Variable': X.columns,
  'Coeficiente': modelo_multi.coef_
})
print(coef)
print(f"Intercepto: {modelo_multi.intercept_:.3f}")

# 6. Evaluación en prueba
predicciones = modelo_multi.predict(X_test)
r2 = modelo_multi.score(X_test, y_test)
print(f"R² en prueba: {r2:.3f}")

# 7. Visualización de predicciones vs reales
plt.scatter(y_test, predicciones, alpha=0.4)
plt.plot([0, 5], [0, 5], 'r--')
plt.xlabel('Valor real (cientos de miles $)')
plt.ylabel('Predicción')
plt.title('Predicciones vs. Valores Reales')
plt.show()

🧮 Calculadora de predicción

💰 Valor previsto: 2.137 cientos de miles de $

💡 Un mayor ingreso incrementa fuertemente el valor; la antigüedad apenas lo mueve, y más habitaciones (sin otros ajustes) pueden incluso reducirlo.

💼 3. Regresión con Variables Categóricas

Objetivo: Predecir el salario según años de experiencia y nivel educativo (Bachillerato, Licenciatura, Maestría, Doctorado).

🧬 Codificación one‑hot

Convertimos la educación en columnas binarias (dummies) y dejamos “Bachillerato” como categoría base.

\[ \text{Salario} = b_0 + b_1 \cdot \text{Experiencia} + b_2 \cdot \text{Licenciatura} + b_3 \cdot \text{Maestría} + b_4 \cdot \text{Doctorado} \]
📏 Coeficientes del modelo entrenado: \(b_0 \approx 30000\), \(b_1 \approx 5000\), \(b_2 \approx 10000\), \(b_3 \approx 25000\), \(b_4 \approx 45000\)
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression

# 1. Generar datos sintéticos
np.random.seed(7)
n = 150
experiencia = np.random.uniform(0, 20, n)
niveles = np.random.choice(
  ['Bachillerato', 'Licenciatura', 'Maestría', 'Doctorado'],
  size=n, p=[0.2, 0.4, 0.25, 0.15]
)
# Mapa de plus salarial según nivel
bonus_edu = {'Bachillerato': 0, 'Licenciatura': 10000,
       'Maestría': 25000, 'Doctorado': 45000}
salario = 30000 + 5000 * experiencia + np.vectorize(bonus_edu.get)(niveles)
salario += np.random.normal(0, 5000, n) # ruido

df = pd.DataFrame({'experiencia': experiencia,
          'educacion': niveles,
          'salario': salario})
df.to_csv('salarios.csv', index=False)

# 2. Cargar y preparar datos
datos = pd.read_csv('salarios.csv')
# Crear dummies (one-hot encoding) sin la primera categoría
df_dummies = pd.get_dummies(datos, columns=['educacion'], drop_first=True)
X = df_dummies.drop('salario', axis=1)
y = df_dummies['salario']

# 3. Modelo de regresión
modelo = LinearRegression()
modelo.fit(X, y)

# 4. Resultados
coef = pd.DataFrame({
  'Variable': X.columns,
  'Coeficiente': modelo.coef_
})
print(coef)
print(f"Intercepto (Bachillerato, 0 exp): {modelo.intercept_:.2f}")

# 5. Predicción para un perfil concreto
perfil = pd.DataFrame({
  'experiencia': [7],
  'educacion_Licenciatura': [1], # Licenciatura
  'educacion_Maestría': [0],
  'educacion_Doctorado': [0]
})
pred = modelo.predict(perfil)
print(f"Salario estimado: ${pred[0]:,.2f}")

🎛️ Simulador de sueldo

💵 Salario previsto: 55000 $/año