Ejercicios Prácticos
Dos problemas de aplicación: análisis de residuos sobre modelos de regresión lineal y no lineal, y desarrollo de una herramienta interactiva de análisis de correlación con Streamlit.
Introducción
El primer ejercicio aplica los conceptos de regresión lineal sobre datos con distintas estructuras de relación. El segundo requiere integrar análisis estadístico dentro de una aplicación web interactiva.
Ejercicio 1 — Análisis de Residuos de Regresión Simple
Generación de datos
El siguiente código genera dos conjuntos de datos. No hay que modificarlo:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
# Conjunto 1: RELACIÓN LINEAL
n1 = 100
x1 = np.linspace(0, 10, n1)
m_real, b_real = 2.0, 3.0
y1 = m_real * x1 + b_real + np.random.normal(0, 1.5, n1)
# Conjunto 2: RELACIÓN NO LINEAL (cuadrática)
n2 = 100
x2 = np.linspace(0, 10, n2)
y2 = 0.5 * x2**2 - 2 * x2 + 5 + np.random.normal(0, 2.0, n2)
# Visualización de los datos originales
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].scatter(x1, y1, alpha=0.6)
axes[0].set_title("Conjunto 1: Relación lineal")
axes[1].scatter(x2, y2, alpha=0.6, color="#f06595")
axes[1].set_title("Conjunto 2: Relación cuadrática")
plt.tight_layout()
plt.show()
Tareas
Para cada uno de los dos conjuntos de datos:
- Implementar la regresión lineal simple usando las fórmulas de mínimos cuadrados con NumPy (sin usar
sklearnnistatsmodels) - Calcular los valores predichos \(\hat{y}\)
- Calcular los residuos: \(e_i = y_i - \hat{y}_i\)
- Crear un histograma de los residuos
- Crear un scatter plot de residuos vs valores predichos
- Calcular las métricas: ECM, RECM y R²
Las fórmulas que debes implementar:
Pistas Ayuda para la implementación
# Pendiente con numpy
n = len(x1)
m = (n * (x1 * y1).sum() - x1.sum() * y1.sum()) / \
(n * (x1**2).sum() - x1.sum()**2)
# Ordenada al origen
b = y1.mean() - m * x1.mean()
# Predicciones y residuos
y_hat = m * x1 + b
residuos = y1 - y_hat
# Usar plt.subplots() para comparar ambos conjuntos lado a lado
Preguntas de análisis
Una vez completada la implementación, responde en el notebook:
- ¿Qué forma tienen los histogramas de residuos en cada conjunto? ¿Son simétricos y centrados en cero?
- En el scatter plot de residuos vs valores predichos, ¿hay algún patrón visible en el conjunto 2? ¿Qué forma tiene ese patrón?
- ¿Cuál modelo tiene mejor R²? ¿Cuál tiene menor ECM? ¿Tiene sentido ese resultado?
- ¿Qué te dice el gráfico de residuos sobre si el modelo lineal es adecuado para datos cuadráticos?
- ¿Cómo usarías el análisis de residuos para detectar problemas en un modelo real?
Ejercicio 2 — Análisis de Correlación con Streamlit
¿Qué es Streamlit?
Streamlit es una biblioteca de Python que permite construir aplicaciones web interactivas de análisis de datos con muy poco código. No se necesita conocimiento de HTML ni JavaScript.
# Instalar
pip install streamlit
# Ejecutar una aplicación
streamlit run mi_app.py
Streamlit proporciona componentes interactivos como sliders, selectboxes y botones que se integran directamente con Python:
import streamlit as st
import pandas as pd
st.title("Mi aplicación")
opcion = st.selectbox("Elige una columna", ["study_hours", "exam_score"])
umbral = st.slider("Umbral de correlación", 0.0, 1.0, 0.5)
cols = st.multiselect("Variables", ["study_hours", "sleep_hours", "exam_score"])
Tareas
Crea un archivo correlacion_app.py con una aplicación Streamlit que incluya:
- Selector de tipo de correlación: Pearson, Spearman o Kendall usando
st.selectbox() - Selector múltiple de variables numéricas con
st.multiselect() - Slider de umbral para mostrar solo correlaciones mayores a ese valor con
st.slider() - Comparación entre grupos: selector de variable categórica (género, método de estudio) y comparación de las matrices de correlación entre grupos con
df.groupby() - Visualización con
sns.heatmap()yst.pyplot() - Exportar a CSV con
st.download_button()
Código base Estructura sugerida para la aplicación
import streamlit as st
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
st.title("Análisis de Correlación Avanzado")
# Cargar datos
df = pd.read_csv("data/csvs/examenes.csv")
variables_num = df.select_dtypes(include=[np.number]).columns.tolist()
# Sidebar con controles
with st.sidebar:
st.header("Configuración")
tipo_corr = st.selectbox("Tipo de correlación",
["pearson", "spearman", "kendall"])
vars_sel = st.multiselect("Variables a analizar",
variables_num, default=variables_num[:4])
umbral = st.slider("Umbral mínimo de correlación",
0.0, 1.0, 0.0, step=0.05)
var_grupo = st.selectbox("Comparar por grupo",
["gender", "study_method", "exam_difficulty"])
# Sección 1: Correlación general
st.header("Matriz de Correlación General")
if vars_sel:
# Tu código aquí: calcular y visualizar la matriz de correlación
# Sección 2: Comparación entre grupos
st.header(f"Comparación por {var_grupo}")
# Tu código aquí: groupby y heatmaps por grupo
# Sección 3: Exportar
st.header("Exportar")
# Tu código aquí: st.download_button()
Preguntas de investigación:
- ¿La correlación entre horas de estudio y calificación cambia según el género?
- ¿Los resultados varían entre Pearson, Spearman y Kendall?
- ¿Cuándo preferirías Spearman sobre Pearson?
Entrega
Ejercicio 1: notebook ejercicios_practicos.ipynb con todas las celdas ejecutadas y las respuestas escritas en markdown.
Ejercicio 2: archivo correlacion_app.py funcional que se pueda ejecutar con streamlit run correlacion_app.py.