Saltar a contenido

🌸 Práctica 1: Exploración del dataset Iris

Antes de empezar (lee estas referencias)

Lee al menos el propósito y los parámetros principales de cada función antes de usarlas.

Parte A — EDA en Colab

0. Resultado esperado

  • Notebook en Google Colab con EDA completo
  • 4–6 visualizaciones guardadas en results/visualizaciones/
  • Insights documentados (markdown) y checklist de calidad

1. Google Colab (5–10 min)

  1. Abre https://colab.research.google.com/
  2. Inicia sesión
  3. Crea un nuevo notebook (Python 3)
  4. Instala dependencias si falta seaborn (solo si el import falla):
# Si ves NameError al usar seaborn, ejecuta esto y reintenta
!pip -q install seaborn
import seaborn as sns
  1. Verifica entorno:
import sys, pandas as pd, seaborn as sns, matplotlib
print(sys.version)
print(pd.__version__, sns.__version__, matplotlib.__version__)

Guardar resultados en Google Drive (recomendado en Colab)

from pathlib import Path
try:
    from google.colab import drive
    drive.mount('/content/drive')
    ROOT = Path('/content/drive/MyDrive/ID-UT1-iris')
except Exception:
    ROOT = Path.cwd() / 'ID-UT1-iris'

PLOTS_DIR = ROOT / 'results' / 'visualizaciones'
PERF_DIR = ROOT / 'results' / 'perfiles'
REPORT_DIR = ROOT / 'results' / 'reportes'
for d in (PLOTS_DIR, PERF_DIR, REPORT_DIR):
    d.mkdir(parents=True, exist_ok=True)
print('Outputs →', ROOT)

2. Investigar el dataset (10 min)

  • Lee la ficha del dataset Iris (UCI Machine Learning Repository) y un resumen en Kaggle.
  • Identifica: objetivo, variables, unidades, tamaño, fuentes y supuestos.

Referencias sugeridas: - UCI Iris: https://archive.ics.uci.edu/dataset/53/iris - Kaggle Iris: https://www.kaggle.com/datasets/uciml/iris

3. Preguntas de negocio (5 min)

  • Ejemplos: ¿Se separan las especies con 1–2 variables? ¿Qué correlaciones fuertes existen? ¿Qué variables parecen más discriminantes?
  • Escribe 3–5 preguntas propias y ordénalas por prioridad.

Pistas:

  • Redactá preguntas que puedas responder con descripciones, conteos y gráficos simples (sin modelado todavía).
  • Priorizá variables con unidades claras y comparables entre especies.
  • Evitá preguntas que requieran ingeniería de features o modelos; eso vendrá después.

4. Carga de datos (elige 1–2 y documenta) (10–15 min)

Pistas:

  • Verificá df.shape, primeras filas con DataFrame.head y tipos con DataFrame.dtypes apenas cargues los datos.
  • Si el origen tiene nombres distintos, renombrá para consolidar (species, sepal_length, ...).
  • Documentá el origen exacto (URL/API/librería) en tu README.md.

A) Cargar desde seaborn (rápido)

import seaborn as sns
df = sns.load_dataset('iris')
df.head()

B) Cargar desde scikit-learn y convertir a DataFrame

from sklearn.datasets import load_iris
import pandas as pd
data = load_iris(as_frame=True)
df = data.frame
df.rename(columns={'target': 'species'}, inplace=True)
df.head()

C) Kaggle API (Colab)

!pip -q install kaggle
from google.colab import files
files.upload()  # subí tu kaggle.json
!mkdir -p ~/.kaggle && cp kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json
!kaggle datasets download -d uciml/iris -p data
!unzip -o data/iris.zip -d data

import pandas as pd
df = pd.read_csv('data/Iris.csv')
df.rename(columns={
    'SepalLengthCm':'sepal_length',
    'SepalWidthCm':'sepal_width',
    'PetalLengthCm':'petal_length',
    'PetalWidthCm':'petal_width',
    'Species':'species'
}, inplace=True)
df = df.drop(columns=['Id'], errors='ignore')
df.head()

D) Subir CSV manualmente (Colab)

from google.colab import files
import io, pandas as pd
uploaded = files.upload()
df = pd.read_csv(io.BytesIO(uploaded[list(uploaded.keys())[0]]))
df.head()

E) Desde URL (CSV público)

import pandas as pd
url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'
df = pd.read_csv(url)
df.head()

5. Chequeos básicos y data dictionary (10–15 min)

import pandas as pd
df.shape, df.dtypes, df.isna().sum()
display(df.describe(include='all').T)

Construye un pequeño data dictionary (nombre, tipo, descripción, unidad) como markdown en el notebook.

Pistas:

  • Si species es texto, considerá df['species'] = df['species'].astype('category').
  • Guardá describe y isna en results/perfiles/ para trazabilidad.

6. Plausibilidad y rangos (10 min)

  • Construye results/reportes/range_check.csv con columnas: feature, unidad, tipo, rango_esperado, %missing, obs_min, obs_max, flag.

Pistas:

5.1) Missingness (5 min) - Exportá results/perfiles/missing.csv con df.isna().sum().sort_values() y results/perfiles/missing_pct.csv con proporciones. - Grafica un barplot de missing por columna en results/visualizaciones/missing.png.

Pistas:

7. Análisis estadístico (10–15 min)

desc = df.describe()
corr = df.select_dtypes('number').corr()
print(desc); print(corr)

Pistas:

  • Si hay no linealidad, probá df.corr(method='spearman') además de Pearson.
  • Mirá magnitud y signo; no confundas correlación con causalidad.

Opcional (forma de la distribución): - Calcula asimetría y curtosis y exporta a results/perfiles/skew_kurt.csv con df.select_dtypes('number').agg(['skew','kurt']). - Exporta covarianzas a results/perfiles/cov.csv con df.select_dtypes('number').cov().

Duplicados e imbalance (rápido)

  • Duplicados: df.duplicated().sum() (no limpiar ahora).
  • Imbalance categórico: df['species'].value_counts(normalize=True) y exporta a results/perfiles/species_dist.csv.

Pistas:

  • Considerá marcar categorías con <5% como “raras” para seguimiento en UT2.

8. Visualizaciones (mínimas y opcionales) (20–30 min)

Genera y guarda: - Histogramas con KDE por especie - Matriz de correlaciones - Pairplot por especie - Boxplots por variable y especie - Barplot de missing por columna

Perfiles automatizados (opcional)

!pip -q install ydata-profiling
from ydata_profiling import ProfileReport
profile = ProfileReport(df, title='Iris – Profile', minimal=True)
profile.to_file(f'{REPORT_DIR}/profile_iris.html')

Nota: úsalo como apoyo; tu entregable principal sigue siendo las tablas/figuras pedidas.

Ejemplo de guardado en Colab:

import seaborn as sns, matplotlib.pyplot as plt
plt.style.use('seaborn-v0_8')

# Correlaciones
corr = df.select_dtypes('number').corr()
sns.heatmap(corr, annot=True, cmap='Blues')
plt.tight_layout()
plt.savefig(PLOTS_DIR / 'corr.png', dpi=200, bbox_inches='tight')
plt.close()

# Pairplot (puede demorar en Colab)
pair = sns.pairplot(df, hue='species', diag_kind='kde')
pair.savefig(PLOTS_DIR / 'pairplot.png')

Pistas:

  • Usá plt.tight_layout() y dpi=200 al guardar para buena legibilidad.
  • Asegurate de etiquetar ejes y títulos de forma clara.

9. Diccionario de datos (plantilla)

Guarda results/reportes/data_dictionary.md con columnas: nombre, tipo, unidad, descripción, notas.

10. Insights y comunicación

  • Escribe 4–5 insights claros y cuantificados: qué, cuánto, por qué podría importar.

Pistas:

  • Estructura sugerida: “Qué observé” → “Cuánto/medida” → “Por qué podría importar”.
  • Referenciá figuras/tablas con nombres de archivo o títulos.

11. Entrega

  • Subir notebook/script, imágenes y breve README.md con hallazgos

✅ Quality Gates

  1. Notebook corre sin errores.
  2. ≥2 visualizaciones guardadas en results/visualizaciones/.
  3. Diccionario de datos básico publicado.
  4. ≥3 insights accionables.
  5. Fuentes y pasos de ingesta documentados.

🧯 Errores comunes (ampliado)

  • Títulos/ejes legibles; guardar figuras antes de show; manejar warnings de seaborn.
  • Tipos de datos inesperados → revisa dtypes, convierte con astype si hace falta.

Resultados de ejemplo (en el repo)

Los siguientes artefactos están generados en examples/UT1/01-exploracion-iris/results/:

  • perfiles/iris_desc.csv, perfiles/iris_corr.csv
  • perfiles/missing.csv, perfiles/missing_pct.csv, perfiles/species_dist.csv
  • perfiles/skew_kurt.csv, perfiles/cov.csv
  • plots/corr.png, plots/pairplot.png, plots/missing.png
  • reportes/range_check.csv