Clase 01 — Datos que no mienten
1 — Introducción · Por qué importa la calidad de datos
En ciencia de datos hay un principio que se repite siempre: un modelo es tan bueno como los datos con los que se entrena. GAGO — basura que entra, basura que sale. Pero hay algo más profundo. Incluso sin modelos — solo con reportes, dashboards o análisis descriptivos — los datos de mala calidad producen decisiones equivocadas. Y lo más peligroso es que esas decisiones parecen justificadas porque están respaldadas por números.
Un dato no es bueno o malo en abstracto. Es confiable o no confiable para una pregunta específica. Los precios con outliers son basura para calcular ticket promedio, pero son señal para auditar errores de carga.
La calidad de datos no es una tarea técnica de limpieza que se hace al principio y se olvida. Es una disciplina transversal que atraviesa todo el ciclo de vida del dato.
Las tres preguntas de esta clase
¿Cómo automatizar esa medición para que ocurra en cada carga de datos nueva?
¿Cómo comunicar los hallazgos a audiencias técnicas y no técnicas?
El recorrido sigue el orden lógico de una auditoría real: profiling exploratorio → reglas formales con Great Expectations → limpieza documentada → validación final.
2 — Contexto: el dato como activo · Gobierno de Datos
La calidad de datos no existe en el vacío. Es una de las disciplinas del Gobierno de Datos — el conjunto de prácticas, procesos y estructuras organizacionales que permiten gestionar los datos como un activo estratégico.
El marco DAMA-DMBOK2 define el Gobierno de Datos como "el ejercicio de la autoridad, el control y la toma de decisiones compartida sobre la gestión de los activos de datos". En términos prácticos: quién decide qué, cómo se garantiza la calidad, quién es responsable de qué datos.
Metas de un programa de calidad
| Meta | Descripción |
|---|---|
| Enfoque gobernado | Los datos cumplan con su propósito (fit for purpose) |
| Estándares y métricas | Definición de controles a lo largo de todo el ciclo de vida del dato |
| Procesos de medición | Medir, monitorear y reportar los niveles de calidad |
| Mejora continua | Identificar oportunidades en procesos y sistemas |
3 — El dataset · Olist Brazilian E-Commerce
Olist es una empresa brasileña de tecnología para e-commerce, fundada en 2015 en Curitiba. Modelo de negocio: marketplace que actúa como intermediario entre vendedores pequeños y medianos y los grandes marketplaces brasileños (Mercado Libre, Americanas, Submarino).
Olist publicó datos reales de transacciones entre 2016 y 2018 en Kaggle. Aproximadamente 100.000 órdenes procesadas en ese período. Los problemas de calidad ocurren naturalmente — no fueron inyectados artificialmente.
Los 9 archivos del dataset
| Archivo | Filas | Qué contiene |
|---|---|---|
olist_orders_dataset | 99.441 | Órdenes: estado, fechas, cliente |
olist_order_items_dataset | 112.650 | Ítems por orden: producto, precio, flete |
olist_order_reviews_dataset | 99.224 | Reseñas: puntaje, texto, fecha |
olist_customers_dataset | 99.441 | Clientes: ubicación, identificadores |
olist_products_dataset | 32.951 | Productos: categoría, dimensiones |
olist_sellers_dataset | 3.095 | Vendedores: ubicación |
olist_order_payments_dataset | 103.886 | Pagos: método, cuotas, valor |
olist_geolocation_dataset | 1.000.163 | Coordenadas por código postal |
product_category_name_translation | 71 | Traducción de categorías PT → EN |
4 — Estructura de los datos
Olist distribuye sus datos siguiendo un esquema normalizado: cada tabla tiene una responsabilidad única. Las tablas se relacionan a través de claves identificadoras (IDs).
Es el ID de la transacción. Cada orden genera un
customer_id nuevo, aunque sea la misma persona comprando por segunda vez.
| Campo | Qué identifica |
|---|---|
customer_id | Una orden — diferente en cada compra, aunque sea la misma persona |
customer_unique_id | La persona real — único por comprador |
Tipos de datos en pandas
| Tipo pandas | Lo que representa | Ejemplo |
|---|---|---|
int64 | Entero | 1, 42, -7 |
float64 | Decimal | 3.14, 99.90 |
object | Texto / cadena | "entregado", "SP" |
bool | Verdadero / Falso | True, False |
datetime64 | Fecha y hora | 2017-01-01 12:00:00 |
category | Categórico con valores fijos | bajo / medio / alto |
5 — Las 6 dimensiones de calidad de datos
El framework más extendido en la industria (DAMA UK / ISO 8000) define dimensiones para medir la calidad de datos. Cada dimensión responde una pregunta distinta y requiere técnicas de detección distintas.
| Dimensión | Pregunta que responde | Señal típica | Riesgo si se ignora |
|---|---|---|---|
| Completitud | ¿Están todos los valores? | Columnas con % de nulos alto | Análisis sesgados, promedios incorrectos |
| Unicidad | ¿Hay duplicados? | order_id repetido | Doble conteo de ventas, métricas infladas |
| Validez | ¿Los valores están en rango? | Precio = 0 o negativo | KPIs distorsionados por errores de carga |
| Consistencia | ¿Se cumplen las reglas de negocio? | Entregado sin fecha de entrega | Reportes financieros incorrectos |
| Exactitud | ¿Los valores representan la realidad? | Typos: 'electornics' | Agrupaciones rotas, categorías fantasma |
| Representatividad | ¿Los datos cubren bien el fenómeno? | SP sobrerrepresentado | Modelos que discriminan regiones o perfiles |
5.1 — Completitud
Mide qué proporción de los valores esperados están efectivamente presentes. La distinción entre tipos de nulos importa porque la estrategia de tratamiento es distinta.
Los nulos se clasifican en MCAR, MAR y MNAR (teoría de Rubin, 1976). Los MNAR son los más problemáticos porque el dato faltante está correlacionado con el valor que debería tener.
# Python
df.isnull().sum() / len(df) * 100 # % de nulos por columna
# Power Query
Transformar > Estadísticas > Contar valores en blanco
5.2 — Unicidad
Un dataset tiene buena unicidad cuando cada entidad del mundo real aparece exactamente una vez. La detección requiere distinguir entre duplicado exacto y duplicado parcial.
# Python — duplicados exactos
df.duplicated().sum()
# Por clave de negocio
df.duplicated(subset=['order_id']).sum()
# Power Query
Agrupar por id_orden > Contar filas > filtrar donde conteo > 1
5.3 — Validez
Verifica que los valores cumplan las restricciones definidas para cada campo: rangos numéricos, formatos de texto, pertenencia a un catálogo. Es la dimensión más fácil de automatizar.
mostly=0.95 significa que al menos el 95% de las filas debe cumplir la regla. Fundamental para datos de producción con excepciones legítimas.
5.4 — Consistencia
Verifica que las relaciones entre columnas sean coherentes con las reglas de negocio. Requiere más conocimiento del dominio que las otras dimensiones.
Ejemplos en Olist: fecha de entrega anterior a la fecha de pedido — flete = 0 en órdenes entregadas — precio positivo pero flete nulo.
5.5 — Exactitud
El caso más frecuente son los errores de tipeo en variables categóricas. 'electronics', 'Electronics', 'ELECTRONICS' y 'electornics' son cuatro strings distintos para pandas, pero representan el mismo concepto.
# Normalización básica — siempre primer paso
df['categoria'] = df['categoria'].str.lower().str.strip()
# Distancia de edición (Levenshtein)
from thefuzz import fuzz
fuzz.ratio('electornics', 'electronics') # → 95
5.6 — Representatividad
La más frecuentemente ignorada y la más peligrosa. Un dataset puede tener completitud perfecta, cero duplicados y todos los valores en rango — y aun así producir conclusiones equivocadas.
El sesgo de representatividad no lo detecta ningún validador automático. Requiere fuente externa de referencia y criterio profesional.
En el dataset Olist: SP representa el 21.8% de la población de Brasil pero aparece con ~32% de los registros.
Dimensiones complementarias
La Integridad referencial y la Actualidad (Freshness) complementan las 6 dimensiones core en entornos de producción.
6 — ydata-profiling · auditoría exploratoria automática
Genera un reporte HTML completo con estadísticas descriptivas, distribuciones, correlaciones y alertas de calidad. Para datasets con más de 100.000 filas, siempre usar minimal=True primero.
from ydata_profiling import ProfileReport
profile = ProfileReport(df, title="Olist — Auditoría Clase 01", minimal=True)
profile.to_file("reporte_calidad.html")
Tipos de alertas que genera
| Alerta | Qué detecta | Dimensión |
|---|---|---|
MISSING | % de valores nulos superior al umbral | Completitud |
DUPLICATES | Registros exactamente duplicados | Unicidad |
SKEWED | Distribución muy asimétrica (cola larga) | Validez / Outliers |
HIGH_CARDINALITY | Demasiados valores únicos en categórica | Exactitud (typos) |
HIGH_CORRELATION | Correlación fuerte entre dos columnas | Redundancia |
ZEROS | Alto porcentaje de valores cero | Validez |
CONSTANT | La columna tiene siempre el mismo valor | Utilidad del dato |
Comparar datasets — detección de drift
profile_actual.compare(profile_anterior).to_file('comparacion.html')
7 — Great Expectations · contratos de datos en producción
ydata-profiling te dice QUÉ encontró en los datos. Great Expectations te dice si los datos CUMPLEN o NO CUMPLEN lo que esperabas. El primero es exploratorio. El segundo es operacional.
# Flujo de validación en producción
Datos nuevos → Pipeline → [GE valida] → ¿Cumple las reglas?
Sí: continúa
No: alerta + detención
Los 4 componentes clave de GE 1.x
| Componente | Qué es | Analogía |
|---|---|---|
DataContext | El núcleo que gestiona toda la configuración | El proyecto en sí |
ExpectationSuite | Colección de reglas para un dataset | El contrato de datos |
ValidationDefinition | Conecta un batch de datos con una suite | El acto de validar |
Checkpoint | Ejecuta múltiples validaciones y genera reportes | La auditoría completa |
Expectations más usadas
| Expectation | Qué verifica |
|---|---|
ExpectColumnValuesToNotBeNull | No tiene nulos (mostly opcional) |
ExpectColumnValuesToBeUnique | Todos los valores son únicos |
ExpectColumnValuesToBeBetween | Valores en rango [min, max] |
ExpectColumnValuesToBeInSet | Valores pertenecen a un catálogo |
ExpectCompoundColumnsToBeUnique | Unicidad sobre clave compuesta |
e.expectation_type. En validación: r.expectation_config.type.
8 — Pipeline de limpieza · principios y decisiones
Un pipeline de limpieza sin documentación es tan peligroso como datos sucios. Eliminar un registro es una decisión de negocio, no solo una decisión técnica.
Los 5 pasos del pipeline de esta clase
| Paso | Operación | Acción | Justificación |
|---|---|---|---|
| 1 | Duplicados exactos | Eliminar | Toda fila completamente idéntica es un error de carga |
| 2 | Precios inválidos | Eliminar | Precio ≤ 0 es imposible en e-commerce |
| 3 | Puntajes fuera de [1-5] | Eliminar | La escala Olist es Likert 1-5. Los nulos se conservan |
| 4 | Normalizar categorías | Transformar | lower+strip unifica escrituras distintas del mismo valor |
| 5 | Flete = 0 en órdenes activas | Marcar como nulo | Dato desconocido es más honesto que un cero incorrecto |
Decisiones típicas por tipo de problema
| Problema | Opción A | Opción B | Opción C |
|---|---|---|---|
| Duplicados exactos | Eliminar menos uno | Eliminar todos | Conservar y marcar |
| Nulos en col. crítica | Eliminar la fila | Imputar (media/moda) | Crear categoría 'Sin dato' |
| Outliers de precio | Eliminar | Truncar (winsorizing) | Marcar con flag |
| Typos en categoría | Normalizar (lower+strip) | Mapear a catálogo | Eliminar |
9 — Excel y Power Query como herramientas de diagnóstico
Power Query es el motor de transformación de datos integrado en Excel desde la versión 2016. Cada paso queda registrado como un paso aplicado — lo que en Python llamaríamos un pipeline documentado.
Equivalencias clave: Python vs Power Query
| Operación | Python / pandas | Power Query (M) |
|---|---|---|
| Cargar CSV | pd.read_csv("archivo.csv") | Datos > Obtener datos > Desde texto/CSV |
| Ver tipos | df.dtypes | Ícono junto al nombre de columna (ABC, 123…) |
| Contar nulos | df.isnull().sum() | Transformar > Estadísticas > Contar valores en blanco |
| Eliminar duplicados | df.drop_duplicates() | Inicio > Quitar filas > Quitar duplicados |
| Normalizar texto | df["col"].str.lower().str.strip() | Transformar > Formato > Minúsculas + Recortar |
| Agrupar y contar | df["col"].value_counts() | Transformar > Agrupar por > Contar filas |
¿Cuándo usar cada herramienta?
| Excel + Power Query | Python |
|---|---|
| Dataset cabe en memoria (hasta ~500k filas) | Dataset grande o muy grande |
| El equipo no tiene experiencia en Python | El análisis necesita ser reproducible y automatizado |
| Análisis exploratorio y puntual | Se van a aplicar modelos de machine learning |
| El resultado se comparte en formato universal | El pipeline corre periódicamente sin intervención manual |
10 — Sesgos de representatividad · la dimensión invisible
El dataset de datos técnicamente impecables que produce conclusiones equivocadas porque no representa bien la realidad es el escenario más difícil de detectar y el más costoso para el negocio.
Sesgo geográfico
SP representa el 32% de los registros cuando es el 21.8% de la población. Un modelo de demanda entrenado con estos datos sobreestimará la demanda en SP y subestimará el noreste.
Sesgo de supervivencia
Solo están los clientes activos. Los que se fueron por mala experiencia no están. Ejemplo clásico: los aviones de la Segunda Guerra Mundial — se analizaban los impactos en los que volvieron. Los que más necesitaban refuerzo eran los que no volvían.
Sesgo temporal
Un modelo entrenado con datos de 2020-2021 aprendió patrones durante la pandemia. Si se aplica en 2026 sin reentrenamiento, sus predicciones reflejarán una realidad que ya no existe.
Sesgo de canal
Una empresa con e-commerce y tiendas físicas tendrá datos perfectos del canal digital y datos fragmentarios del canal físico.
11 — Resumen · Las 3 ideas centrales
La calidad no es binaria. Un dato es confiable o no confiable para una pregunta específica. El mismo outlier puede ser basura para un reporte de ventas y una señal valiosa para una auditoría de sistema.
El profiling explora, GE controla. ydata-profiling es la herramienta del analista que entiende un dataset nuevo. Great Expectations es la herramienta del ingeniero que garantiza calidad en producción. Los proyectos maduros usan los dos.
La representatividad es la dimensión más difícil. Los nulos se ven. Los duplicados se cuentan. El sesgo requiere fuente externa de referencia y criterio profesional. Ninguna herramienta lo detecta automáticamente.
12 — Glosario
13 — Recursos para seguir estudiando
Documentación oficial
ydata-profiling docs.profiling.ydata.ai Great Expectations docs.greatexpectations.io DAMA UK — 6 dimensiones de calidad dqglobal.comMateriales de esta clase
Kaggle — Notebooks y datasets de la Clase 01 kaggle.com/work/collections/18297674 GitHub — Repositorio Clase 01 github.com/MaraDestefanis/Clases_Magistrales_Sesion01_LosdatosquenomientenDataset
Brazilian E-Commerce (Olist) — Kaggle 100.000+ órdenes reales con múltiples tablasLecturas recomendadas
Fundamentals of Data Engineering — Reis & Housley — cap. 6: Data Quality
The Data Warehouse Toolkit — Kimball — cap. sobre data quality y auditoría
DAMA-DMBOK2 — Data Management Body of Knowledge (segunda edición)