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.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.
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.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.shapey las primeras filas condf.head(). - Análisis de nulos: ejecuta
df.isnull().sum()y señala que la variable objetivospeciesno contiene nulos. - Descripción de variables numéricas: ejecuta
df.describe()para obtener estadísticos básicos de todas las columnas numéricas.
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,Q3eIQRpara 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.
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_ratioagrupado porspecies. - Scatter plot de
bill_length_mmvsbill_depth_mmconhue='species'para visualizar la relación original del pico.
Preprocesamiento
Prepara los datos en tres sub-bloques ejecutables secuencialmente:
- Encoding — define
num_colsycat_cols, y genera la matriz de featuresXy el vector objetivoyseparandospecies. Llama internamente aencoding(df). - Split Train/Test — divide el dataset con
test_size=0.2,random_state=42ystratify=y. Muestra las dimensiones resultantes deX_trainyX_test. - Preprocessor — construye un
ColumnTransformerconSimpleImputer(strategy='median')para columnas numéricas y unPipeline([SimpleImputer(strategy='most_frequent'), OneHotEncoder(handle_unknown='ignore')])para las categóricas.
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_predictionsusando la paleta de colorviridis.
XGBoost
Entrena un pipeline de XGBoost con codificación de etiquetas y evalúa su rendimiento:
- Aplica
LabelEncoderay_trainey_testantes 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.
Comparativa
Compara los dos modelos entrenados lado a lado:
- Tabla con
ModeloyAccuracypara Random Forest y XGBoost. - Gráfico de barras (
steelbluepara Random Forest,#ff7f0epara 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.
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.
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:Componentes personalizados
La app utiliza tres componentes propios definidos enapp/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ámetro | Tipo | Descripción |
|---|---|---|
html_coloreado | str | HTML con spans de coloreado generado por colorear_codigo() |
key | str | Clave única de st.session_state para controlar si la animación ya se ejecutó |
height | int | Altura 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ámetro | Tipo | Descripción |
|---|---|---|
label | str | Texto visible del botón |
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 CSS | Contenido coloreado |
|---|---|
keyword | Palabras clave (def, import, for, if, return, etc.) y métodos comunes (fit, predict, head, etc.) |
builtin | Identificadores frecuentes (sns, pd, plt, Pipeline, RandomForestClassifier, XGBClassifier, etc.) |
string | Cadenas de texto entre comillas simples o dobles |
number | Enteros y decimales |
operator | Paréntesis y operadores aritméticos (+, -, *) |
brackets | Corchetes [] y llaves {} |
comment | Líneas que comienzan por # |
app/components/code_viewer.py
| Parámetro | Tipo | Descripción |
|---|---|---|
codigo_puro | str | Código Python en texto plano sin formatear |
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:
- Inicializar la bandera en
Falsesi aún no existe. - Ejecutar la lógica y guardar resultados en sesión cuando el usuario pulsa el botón.
- Renderizar los resultados de forma persistente si la bandera está activa.