Correlacion y Regresion Lineal
Encontrando Relaciones Entre VariablesUna de las preguntas mas comunes en data science es: estan relacionadas estas dos variables? La correlacion y la regresion lineal te dan las herramientas para responder esto cuantitativamente.
Correlacion de Pearson
La correlacion mide la fuerza y direccion de la relacion lineal entre dos variables. Va de -1 a +1.
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
# Dataset de ejemplo
np.random.seed(42)
n = 200
df = pd.DataFrame({
'experiencia': np.random.randint(0, 25, n),
'horas_capacitacion': np.random.randint(0, 200, n),
'edad': np.random.randint(22, 60, n)
})
df['salario'] = 40000 + df['experiencia'] * 2500 + np.random.normal(0, 8000, n)
df['evaluacion'] = 2.5 + df['horas_capacitacion'] * 0.01 + np.random.normal(0, 0.5, n)
df['evaluacion'] = df['evaluacion'].clip(1, 5)
# Correlacion de Pearson
corr_exp_sal, p_exp = stats.pearsonr(df['experiencia'], df['salario'])
print(f"Correlacion experiencia-salario: r={corr_exp_sal:.3f} (p={p_exp:.4f})")
# Matriz de correlacion
print("\nMatriz de correlacion:")
matriz_corr = df.corr().round(3)
print(matriz_corr)
# Interpretacion
def interpretar_correlacion(r):
r_abs = abs(r)
if r_abs >= 0.7:
fuerza = 'fuerte'
elif r_abs >= 0.4:
fuerza = 'moderada'
elif r_abs >= 0.2:
fuerza = 'debil'
else:
fuerza = 'muy debil o inexistente'
direccion = 'positiva' if r > 0 else 'negativa'
return f"{fuerza} {direccion}"
print(f"\nExp-Salario: correlacion {interpretar_correlacion(corr_exp_sal)}")
Visualizar correlaciones
# Heatmap de correlaciones
fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(matriz_corr, annot=True, cmap='RdBu_r', center=0, fmt='.2f', ax=ax)
ax.set_title('Matriz de Correlaciones')
plt.tight_layout()
plt.show()
# Scatter con linea de tendencia
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# Experiencia vs Salario
sns.regplot(data=df, x='experiencia', y='salario', ax=axes[0], scatter_kws={'alpha': 0.3})
axes[0].set_title(f'Experiencia vs Salario (r={corr_exp_sal:.3f})')
# Horas vs Evaluacion
corr_h_e, _ = stats.pearsonr(df['horas_capacitacion'], df['evaluacion'])
sns.regplot(data=df, x='horas_capacitacion', y='evaluacion', ax=axes[1], scatter_kws={'alpha': 0.3})
axes[1].set_title(f'Capacitacion vs Evaluacion (r={corr_h_e:.3f})')
plt.tight_layout()
plt.show()
Regresion Lineal Simple
La regresion lineal modela la relacion y = mx + b donde queremos predecir y a partir de x.
from sklearn.linear_model import LinearRegression
# Preparar datos
X = df[['experiencia']].values # Variable independiente
y = df['salario'].values # Variable dependiente
# Crear y entrenar modelo
modelo = LinearRegression()
modelo.fit(X, y)
# Resultados
print(f"Intercepto (b): ${modelo.intercept_:,.2f}")
print(f"Pendiente (m): ${modelo.coef_[0]:,.2f} por anio")
print(f"R-squared: {modelo.score(X, y):.4f}")
# Interpretacion
print(f"\nInterpretacion:")
print(f"Un empleado sin experiencia ganaria ~${modelo.intercept_:,.0f}")
print(f"Cada anio de experiencia agrega ~${modelo.coef_[0]:,.0f} al salario")
print(f"El modelo explica el {modelo.score(X, y)*100:.1f}% de la variacion en salarios")
# Prediccion
for exp in [0, 5, 10, 15, 20]:
pred = modelo.predict([[exp]])[0]
print(f" {exp} anios de experiencia -> Salario predicho: ${pred:,.0f}")
Con SciPy (mas detallado)
# linregress da mas informacion estadistica
slope, intercept, r_value, p_value, std_err = stats.linregress(df['experiencia'], df['salario'])
print(f"Pendiente: {slope:.2f} (error est: {std_err:.2f})")
print(f"Intercepto: {intercept:.2f}")
print(f"R: {r_value:.4f}")
print(f"R-squared: {r_value**2:.4f}")
print(f"P-valor: {p_value:.2e}")
print(f"Estadisticamente significativa? {'Si' if p_value < 0.05 else 'No'}")
Regresion Lineal Multiple
# Multiples variables independientes
X_multi = df[['experiencia', 'horas_capacitacion', 'edad']]
y = df['salario']
modelo_multi = LinearRegression()
modelo_multi.fit(X_multi, y)
print("Regresion Multiple:")
print(f"R-squared: {modelo_multi.score(X_multi, y):.4f}")
print(f"\nCoeficientes:")
for col, coef in zip(X_multi.columns, modelo_multi.coef_):
print(f" {col}: ${coef:,.2f}")
print(f" Intercepto: ${modelo_multi.intercept_:,.2f}")
Correlacion NO implica Causalidad
Este es uno de los principios mas importantes de la estadistica:
# Ejemplo: correlacion espuria
np.random.seed(42)
meses = np.arange(1, 13)
ventas_helados = np.array([20, 25, 40, 60, 80, 100, 110, 105, 75, 45, 30, 22])
ahogamientos = np.array([5, 6, 10, 15, 25, 35, 40, 38, 20, 10, 7, 5])
corr, p = stats.pearsonr(ventas_helados, ahogamientos)
print(f"Correlacion helados-ahogamientos: r={corr:.3f} (p={p:.4f})")
print("ALTA correlacion! Pero los helados NO causan ahogamientos.")
print("Variable confundidora: la TEMPERATURA (verano).")
Video Recomendado
Regresion Lineal en Python - Tutorial Completo
Ejercicio Practico
Crea un notebook 13_correlacion_regresion.ipynb:
- Usa el dataset del Titanic y calcula correlaciones entre variables numericas
- Crea un heatmap de correlaciones
- Ajusta una regresion lineal entre edad y tarifa pagada
- Haz una regresion multiple para predecir salarios con experiencia, educacion y edad
- Interpreta los resultados explicando que significan los coeficientes
- Da un ejemplo de correlacion espuria
💡 Concepto Clave
Revisemos los puntos más importantes de esta lección antes de continuar.
Resumen
- Correlacion de Pearson: Mide relacion lineal entre -1 y +1
- p-valor: Indica si la correlacion es estadisticamente significativa
- Regresion lineal: Predecir una variable a partir de otras
- R-squared: Que proporcion de la variacion explica el modelo
- Coeficientes: Cuanto cambia Y por cada unidad de cambio en X
- Correlacion != Causalidad: Siempre buscar variables confundidoras
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
- Comprendo el concepto principal y puedo explicarlo con mis palabras
- Entiendo cómo aplicarlo en mi situación específica
- Necesito repasar algunas partes antes de continuar
- Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.