🌸 Práctica 1: Exploración del dataset Iris¶
Antes de empezar (lee estas referencias)¶
- Pandas: DataFrame.describe
- Pandas: read_csv
- Seaborn: load_dataset
- Seaborn: pairplot
- Seaborn: heatmap
- Matplotlib: savefig
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)¶
- Abre
https://colab.research.google.com/
- Inicia sesión
- Crea un nuevo notebook (Python 3)
- 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
- 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)¶
- Lee: seaborn.load_dataset
- Lee: pandas.read_csv
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)¶
- Lee: DataFrame.describe
- Lee: DataFrame.dtypes
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
yisna
enresults/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:
- Usá DataFrame.select_dtypes para identificar columnas numéricas.
df[col].
agg(['min','max'])
ydf[col].
isna().mean()
ayudan a llenar la tabla.- Para
flag
, compará contra tu rango esperado con Series.between o Series.isin.
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:
df.isna().sum()
y división porlen(df)
para porcentajes; usa Series.sort_values.- Para el gráfico, usá seaborn.barplot sobre el índice y valores del Series.
7. Análisis estadístico (10–15 min)¶
- Lee: DataFrame.corr
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 aresults/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)¶
- Lee: seaborn.heatmap
- Lee: seaborn.pairplot
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)¶
- Instala y genera un reporte HTML con ydata-profiling:
!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()
ydpi=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¶
- Notebook corre sin errores.
- ≥2 visualizaciones guardadas en
results/visualizaciones/
. - Diccionario de datos básico publicado.
- ≥3 insights accionables.
- 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 conastype
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