Volver al curso

Data Science con Python: Análisis de Datos para Tu Carrera

leccion
13 / 23
intermediate
8 horas
Analisis Estadistico con Python

Correlacion y Regresion Lineal

Lectura
55 min~4 min lectura

Correlacion y Regresion Lineal

Encontrando Relaciones Entre Variables

Una 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:

  1. Usa el dataset del Titanic y calcula correlaciones entre variables numericas
  2. Crea un heatmap de correlaciones
  3. Ajusta una regresion lineal entre edad y tarifa pagada
  4. Haz una regresion multiple para predecir salarios con experiencia, educacion y edad
  5. Interpreta los resultados explicando que significan los coeficientes
  6. 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.