Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/HelenDiMo/pildora-bootcamp-preprocesamiento/llms.txt

Use this file to discover all available pages before exploring further.

La app Streamlit es una demo educativa interactiva que recorre el pipeline completo de Machine Learning paso a paso, desde la carga del dataset hasta la comparación de modelos. Antes de cada ejecución, muestra el código Python real con una animación de máquina de escribir carácter a carácter, permitiendo leer el código antes de lanzarlo. La app funciona tanto en local como desplegada en la nube de Streamlit Community Cloud.

Acceso rápido

Demo en la nube

Ejecuta la app desplegada sin necesidad de instalar nada en local.

Ejecutar en local

Clona el repositorio y lanza la app con un único comando.

Secciones de la app

La barra lateral de navegación contiene nueve secciones que siguen el orden natural del pipeline. Cada sección muestra el código con la animación de máquina de escribir y luego ofrece un botón de ejecución para obtener los resultados reales.
1

Cargar Dataset y Exploración Inicial

Carga el dataset Palmer Penguins mediante sns.load_dataset('penguins') y presenta tres bloques ejecutables de forma independiente:
  • Carga del dataset: muestra df.shape y las primeras filas con df.head().
  • Análisis de nulos: ejecuta df.isnull().sum() y señala que la variable objetivo species no contiene nulos.
  • Descripción de variables numéricas: ejecuta df.describe() para obtener estadísticos básicos de todas las columnas numéricas.
2

Outliers

Visualiza y trata los valores atípicos de bill_length_mm usando el método IQR (capping / winsorizing):
  • Boxplot antes del tratamiento, calculando Q1, Q3 e IQR para determinar los límites válidos [lower_bound, upper_bound].
  • Aplicación de .clip(lower_bound, upper_bound) para capar los outliers sin eliminar filas.
  • Boxplot después del capping, junto con el recuento de valores capados y los límites calculados.
3

Feature Engineering

Crea la variable derivada bill_ratio como cociente entre bill_length_mm y bill_depth_mm, y produce dos visualizaciones en columnas paralelas:
  • Boxplot de bill_ratio agrupado por species.
  • Scatter plot de bill_length_mm vs bill_depth_mm con hue='species' para visualizar la relación original del pico.
4

Preprocesamiento

Prepara los datos en tres sub-bloques ejecutables secuencialmente:
  • Encoding — define num_cols y cat_cols, y genera la matriz de features X y el vector objetivo y separando species. Llama internamente a encoding(df).
  • Split Train/Test — divide el dataset con test_size=0.2, random_state=42 y stratify=y. Muestra las dimensiones resultantes de X_train y X_test.
  • Preprocessor — construye un ColumnTransformer con SimpleImputer(strategy='median') para columnas numéricas y un Pipeline([SimpleImputer(strategy='most_frequent'), OneHotEncoder(handle_unknown='ignore')]) para las categóricas.
5

Random Forest

Entrena un pipeline completo de Random Forest y evalúa su rendimiento:
  • Construye Pipeline([('preprocessor', preprocessor), ('model', RandomForestClassifier(n_estimators=200, random_state=42))]).
  • Muestra el accuracy con cuatro decimales.
  • Presenta el classification report en forma de tabla (pd.DataFrame).
  • Renderiza la matriz de confusión con ConfusionMatrixDisplay.from_predictions usando la paleta de color viridis.
6

XGBoost

Entrena un pipeline de XGBoost con codificación de etiquetas y evalúa su rendimiento:
  • Aplica LabelEncoder a y_train e y_test antes del entrenamiento (fit_transform / transform).
  • Construye Pipeline([('preprocessor', preprocessor), ('model', XGBClassifier(n_estimators=200, max_depth=4, learning_rate=0.1, random_state=42, eval_metric='mlogloss'))]).
  • Muestra el accuracy con cuatro decimales.
  • Presenta el classification report con los nombres originales de especie (decodificados con le.inverse_transform).
  • Renderiza la matriz de confusión usando la paleta de color plasma.
7

Comparativa

Compara los dos modelos entrenados lado a lado:
  • Tabla con Modelo y Accuracy para Random Forest y XGBoost.
  • Gráfico de barras (steelblue para Random Forest, #ff7f0e para XGBoost) con eje Y escalado a [0, 1].
  • Recomendación automática: determina el mejor modelo comparando las accuracies y muestra un mensaje de éxito con el ganador.
8

Conclusiones y análisis final

Genera el resumen interpretativo completo del experimento:
  • Resumen de métricas: accuracy de ambos modelos con cuatro decimales.
  • Interpretación dinámica: si XGBoost gana, explica por qué el boosting captura mejor las sutilezas morfológicas; si gana Random Forest, argumenta la estabilidad del ensamble por promediado; si empatan, describe las fronteras de decisión limpias del dataset.
  • Recomendaciones para producción: directrices sobre cuándo elegir cada modelo según criterios de estabilidad, escalabilidad y complejidad de despliegue.
9

Ficha de Criterio Ético

Reflexión ética estructurada en cuatro expanders desplegables:
  • Contexto del dataset — origen del dataset Palmer Penguins (Dra. Kristen Gorman, Estación Palmer), sus 344 observaciones y sus limitaciones de generalización geográfica.
  • Riesgos algorítmicos — sobreajuste en datasets pequeños (100 % accuracy), opacidad de los modelos de caja negra y necesidad de cross-validation.
  • Riesgos si el flujo se aplica a datos sensibles — sesgos amplificados, fugas de información entre train/test, métricas infladas e impacto en salud, crédito, RRHH o evaluación de riesgo.
  • Nota final — aclaración de que la ficha es una reflexión complementaria, no un análisis formal de impacto algorítmico.

Ejecutar localmente

Clona el repositorio, instala las dependencias y lanza la app directamente desde la raíz del proyecto:
git clone https://github.com/HelenDiMo/pildora-bootcamp-preprocesamiento.git
cd pildora-bootcamp-preprocesamiento
pip install -r requirements.txt
streamlit run app/streamlit_app.py
El comando debe ejecutarse desde la raíz del proyecto (pildora-bootcamp-preprocesamiento/), no desde dentro de la carpeta app/. La app carga la hoja de estilos con la ruta relativa app/assets/styles.css; si se lanza desde otro directorio, fallará con FileNotFoundError.

Componentes personalizados

La app utiliza tres componentes propios definidos en app/components/ para la presentación interactiva del código.

retro_typewriter_code(html_coloreado, key, height)

Renderiza código Python con sintaxis resaltada y una animación de máquina de escribir carácter a carácter. Utiliza streamlit.components.v1.html para incrustar el código en un iframe con JavaScript. El estado de la animación se persiste en localStorage del navegador para no repetirla en rerenders posteriores. Fuente: app/components/buttons.py
ParámetroTipoDescripción
html_coloreadostrHTML con spans de coloreado generado por colorear_codigo()
keystrClave única de st.session_state para controlar si la animación ya se ejecutó
heightintAltura del iframe en píxeles

run_button(label)

Wrapper simple sobre st.button() que devuelve True cuando el usuario pulsa el botón. No mantiene estado propio. Fuente: app/components/buttons.py
ParámetroTipoDescripción
labelstrTexto visible del botón
Retorna: bool

colorear_codigo(codigo_puro)

Resalta sintaxis de código Python generando HTML con <span> etiquetados con clases CSS. Procesa el código línea a línea aplicando las siguientes categorías:
Clase CSSContenido coloreado
keywordPalabras clave (def, import, for, if, return, etc.) y métodos comunes (fit, predict, head, etc.)
builtinIdentificadores frecuentes (sns, pd, plt, Pipeline, RandomForestClassifier, XGBClassifier, etc.)
stringCadenas de texto entre comillas simples o dobles
numberEnteros y decimales
operatorParéntesis y operadores aritméticos (+, -, *)
bracketsCorchetes [] y llaves {}
commentLíneas que comienzan por #
Fuente: app/components/code_viewer.py
ParámetroTipoDescripción
codigo_purostrCódigo Python en texto plano sin formatear
Retorna: str — HTML con spans coloreados listo para pasar a retro_typewriter_code().

Gestión de estado con st.session_state

La app utiliza un patrón de persistencia explícita: cada sección guarda sus resultados en st.session_state junto con una bandera _ejecutado. Esto evita que los resultados desaparezcan al interactuar con otros widgets (problema de re-renderizado habitual en Streamlit). El flujo de cada sección sigue siempre el mismo esquema:
  1. Inicializar la bandera en False si aún no existe.
  2. Ejecutar la lógica y guardar resultados en sesión cuando el usuario pulsa el botón.
  3. Renderizar los resultados de forma persistente si la bandera está activa.
if "df_cargado" not in st.session_state:
    st.session_state["df_cargado"] = False

if run_button("Cargar Dataset"):
    df = load_penguins()
    st.session_state["df"] = df
    st.session_state["df_cargado"] = True

if st.session_state["df_cargado"]:
    df = st.session_state["df"]
    st.write(df.head())
La app requiere completar las secciones en orden. Si navegas directamente a la Sección 5 (Random Forest) sin haber completado las Secciones 1–4, verás el mensaje de advertencia: "Primero debes cargar el dataset en la sección 1." y la ejecución se detendrá con st.stop(). La única excepción es la Sección 9 (Ficha de Criterio Ético), que no depende de ningún dato cargado.

Build docs developers (and LLMs) love