Por Jose R. Zapata
Ultima actualización: 24/May/2025
La validación de la integridad de los datos es el proceso de verificar la calidad y coherencia de un conjunto de datos. En proyectos de aprendizaje automático (machine learning), este proceso es fundamental y debe realizarse en cualquier momento que se tengan datos para validar, ya sea en un lote nuevo de datos (batch), justo antes de dividir el conjunto en entrenamiento y prueba, o antes de usarlo para el entrenamiento del modelo.
Esta validación ayuda a identificar y solucionar problemas en los datos, como valores faltantes inconsistentes, duplicados, valores únicos en columnas que deberían variar, o inconsistencias en la representación de valores categóricos. Al garantizar que los datos utilizados para entrenar, probar o predecir con modelos de machine learning sean de alta calidad, se mejora la fiabilidad y el rendimiento de los modelos, evitando errores o resultados sesgados causados por datos sucios (dirty data).
La herramienta Deepchecks ofrece una suite de Integridad de Datos (Data Integrity Suite) que realiza varios checks individuales para validar un conjunto de datos. Aquí se presenta una lista de algunos de estos checks y su propósito, según lo detallado en las fuentes:
- Mixed Nulls (Nulos Mezclados): Verifica la consistencia en la representación de valores nulos dentro de una columna. Por ejemplo, detecta si una columna contiene nulos representados de diferentes maneras, como
NaN
,None
, o cadenas vacías, y comprueba si el número de tipos de nulos diferentes supera un umbral. - Percent Of Nulls (Porcentaje de Nulos): Mide el porcentaje de valores faltantes (nulos) en las columnas.
- String Mismatch (Discrepancia de Cadenas): Identifica variaciones o inconsistencias en la escritura de cadenas de texto dentro de una columna. Por ejemplo, detecta si la misma categoría está escrita de diferentes formas como “organic”, “Organic” y “ORGANIC”. Puede añadir una condición para verificar que no existan variantes de cadena.
- String Length Out Of Bounds (Longitud de Cadena Fuera de Límites): Revisa si la longitud de las cadenas de texto en una columna está fuera de un rango esperado o definido. Puede añadir una condición sobre el ratio de valores atípicos en la longitud de la cadena.
- Feature Label Correlation (Correlación entre Característica y Etiqueta): Calcula la correlación entre las características (features) y la etiqueta (label) del conjunto de datos. Puede añadir una condición basada en el Predictive Power Score (PPS) de las características, por ejemplo, si es menor a un umbral.
- Feature Feature Correlation (Correlación entre Características): Analiza la correlación entre diferentes pares de características. Puede añadir una condición para identificar si hay más de un número especificado de pares de características correlacionadas por encima de un umbral.
- Is Single Value (Es Valor Único): Determina si una columna completa contiene un único valor distinto. Esto puede ser útil para identificar columnas que no aportan información predictiva. Puede añadir una condición para verificar que una columna no contenga solo un valor único.
- Columns Info (Información de Columnas): Probablemente proporciona un resumen de las columnas del conjunto de datos.
- Class Imbalance (Desbalance de Clases): Evalúa si hay un desbalance significativo en la distribución de las clases en la columna de etiqueta (particularmente relevante para tareas de clasificación).
- Outlier Sample Detection (Detección de Muestras Atípicas): Identifica filas o muestras completas dentro del conjunto de datos que pueden considerarse atípicas o anómalas.
- Identifier Label Correlation (Correlación entre Identificador y Etiqueta): Verifica la correlación entre columnas que podrían ser identificadores (como IDs) y la etiqueta. Puede añadir una condición basada en el Predictive Power Score (PPS) de las columnas identificadoras.
- Conflicting Labels (Etiquetas en Conflicto): Detecta casos en los que muestras con valores de características idénticos tienen etiquetas diferentes. Puede añadir una condición sobre el ratio de muestras ambiguas.
- Data Duplicates (Datos Duplicados): Identifica filas que son duplicados exactos dentro del conjunto de datos. Puede añadir una condición para verificar que el ratio de datos duplicados sea menor o igual a un umbral.
- Special Characters (Caracteres Especiales): Busca la presencia de caracteres inusuales o especiales en los datos. Puede añadir una condición sobre el ratio de muestras que contienen únicamente caracteres especiales.
- Mixed Data Types (Tipos de Datos Mezclados): Verifica si una columna contiene más de un tipo de dato. Puede añadir una condición para señalar si los tipos de datos raros en una columna constituyen más de un 10% o menos de un 1% de los datos.
Estos checks permiten una validación detallada de la calidad del conjunto de datos antes de ser utilizado en un flujo de trabajo de machine learning.
Deepchecks vs pandera y great expectations
La diferencia principal de estas herramientas radica en el enfoque y el alcance. La validación de integridad de datos de Deepchecks, mediante su suite data_integrity
, se centra en ejecutar un conjunto de comprobaciones predefinidas para identificar problemas de calidad comunes (como nulos, duplicados, tipos mixtos) en un único conjunto de datos. Por otro lado, Pandera y Great Expectations (GE) son marcos de trabajo más amplios y flexibles para la validación de datos. Pandera se enfoca en definir esquemas declarativos y Check
s personalizables para dataframes, siendo más simple. Great Expectations es un framework más robusto y complejo diseñado para sistemas de producción que utiliza “Expectations” para validar (batch) lotes de datos, generar documentación (Data Docs) y facilitar la integración con pipelines. En esencia, Deepchecks Data Integrity es un tipo específico de validación con pruebas fijas para problemas comunes, mientras que Pandera y Great expectations son herramientas más generales y personalizables que permiten definir y gestionar una gama más amplia de validaciones.
📚 Importar librerias
# base libraries for data science
import warnings
from pathlib import Path
import pandas as pd
from deepchecks.tabular import Dataset
from deepchecks.tabular.suites import data_integrity
warnings.filterwarnings("ignore", category=FutureWarning)
warnings.filterwarnings("ignore", category=RuntimeWarning)
# Leer datos desde un URL
url_data = "https://www.openml.org/data/get_csv/16826755/phpMYEkMl"
dataset = pd.read_csv(url_data, low_memory=False, na_values="?")
Definicion de tipos de datos
# Features numericas
cols_numeric_float = ["age", "fare"]
cols_numeric_int = ["sibsp", "parch"]
cols_numeric = cols_numeric_float + cols_numeric_int
# Features categoricas
cols_categoric = ["sex", "embarked"]
cols_categoric_ord = ["pclass"]
cols_categorical = cols_categoric + cols_categoric_ord
Categoricas
dataset[cols_categoric] = dataset[cols_categoric].astype("category")
dataset["pclass"] = pd.Categorical(dataset["pclass"], categories=[3, 2, 1], ordered=True)
Numericas
dataset[cols_numeric_float] = dataset[cols_numeric_float].astype("float")
dataset[cols_numeric_int] = dataset[cols_numeric_int].astype("int8")
Variable Target
target = "survived"
dataset[target] = dataset[target].astype("int8")
Si existen duplicados en el dataset, es importante eliminarlos para evitar cualquier sesgo en el conjunto de datos o fuga de datos (data leak) cuando se entrena un modelo de aprendizaje automático.
dataset = dataset.drop_duplicates()
Validación de Integridad de los datos
ds = Dataset(dataset, cat_features=cols_categorical, label=target)
# Run Suite:
integ_suite = data_integrity()
suite_result = integ_suite.run(ds)
# Los resultados se pueden guardar como html o exportarse a json
suite_result.show_not_interactive()
Data Integrity Suite
The suite is composed of various checks such as: Feature Label Correlation, Data Duplicates, Conflicting Labels, etc...
Each check may contain conditions (which will result in pass ✓ /
fail ✖ / warning ! / error ⁈) as well as
other outputs such as plots or tables.
Suites, checks and conditions can all be modified. Read more about
custom suites.
Conditions Summary
Status | Check | Condition | More Info |
---|---|---|---|
! | String Mismatch | No string variants | Found 1 out of 7 columns with amount of variants above threshold: {'home.dest': ['swedenworcesterma', 'londonnewyorkny', 'parisfrancenewyorkny']} |
✓ | Mixed Nulls | Number of different null types is less or equal to 1 | Passed for 14 relevant columns |
✓ | Mixed Data Types | Rare data types in column are either more than 10% or less than 1% of the data | 14 columns passed: found 2 columns with negligible types mix, and 12 columns without any types mix |
✓ | Feature Label Correlation | Features' Predictive Power Score is less than 0.8 | Passed for 13 relevant columns |
✓ | Feature-Feature Correlation | Not more than 0 pairs are correlated above 0.9 | All correlations are less than 0.9 except pairs [] |
✓ | Single Value in Column | Does not contain only a single value | Passed for 14 relevant columns |
✓ | Special Characters | Ratio of samples containing solely special character is less or equal to 0.1% | Passed for 14 relevant columns |
✓ | Data Duplicates | Duplicate data ratio is less or equal to 5% | Found 0% duplicate data |
✓ | String Length Out Of Bounds | Ratio of string length outliers is less or equal to 0% | Passed for 5 relevant columns |
✓ | Conflicting Labels | Ambiguous sample ratio is less or equal to 0% | Ratio of samples with conflicting labels: 0% |
Check With Conditions Output
String Mismatch
Detect different variants of string categories (e.g. "mislabeled" vs "mis-labeled") in a categorical column. Read More...
Conditions Summary
Status | Condition | More Info |
---|---|---|
! | No string variants | Found 1 out of 7 columns with amount of variants above threshold: {'home.dest': ['swedenworcesterma', 'londonnewyorkny', 'parisfrancenewyorkny']} |
Additional Outputs
Value | Count | % In data | ||
---|---|---|---|---|
Column Name | Base form | |||
home.dest | swedenworcesterma | Sweden Worcester, MA | 3 | 0.23% |
swedenworcesterma | Sweden Worcester, MA | 5 | 0.38% | |
londonnewyorkny | London New York, NY | 1 | 0.08% | |
londonnewyorkny | London / New York, NY | 2 | 0.15% | |
parisfrancenewyorkny | Paris, France New York, NY | 1 | 0.08% | |
parisfrancenewyorkny | Paris, France / New York, NY | 2 | 0.15% |
Mixed Nulls
Search for various types of null values, including string representations of null. Read More...
Conditions Summary
Status | Condition | More Info |
---|---|---|
✓ | Number of different null types is less or equal to 1 | Passed for 14 relevant columns |
Additional Outputs
Count | Percent of data | ||
---|---|---|---|
Column Name | Value | ||
age | math.nan | 263 | 20.09% |
fare | math.nan | 1 | 0.08% |
cabin | numpy.nan | 1014 | 77.46% |
embarked | numpy.nan | 2 | 0.15% |
boat | numpy.nan | 823 | 62.87% |
body | math.nan | 1188 | 90.76% |
home.dest | numpy.nan | 564 | 43.09% |
Mixed Data Types
Detect columns which contain a mix of numerical and string values. Read More...
Conditions Summary
Status | Condition | More Info |
---|---|---|
✓ | Rare data types in column are either more than 10% or less than 1% of the data | 14 columns passed: found 2 columns with negligible types mix, and 12 columns without any types mix |
Additional Outputs
ticket | boat | |
---|---|---|
Strings | 26.89% | 18.11% |
Numbers | 73.11% | 81.89% |
Strings examples | ['A/5 1478', 'STON/O 2. 31012...', 'STON/O 2. 31012...'] | ['B', 'D', 'C'] |
Numbers examples | [2,653, 370,374, 349,235] | [5, 13, 9] |
Feature Label Correlation
Return the PPS (Predictive Power Score) of all features in relation to the label. Read More...
Conditions Summary
Status | Condition | More Info |
---|---|---|
✓ | Features' Predictive Power Score is less than 0.8 | Passed for 13 relevant columns |
Additional Outputs
Feature-Feature Correlation
Checks for pairwise correlation between the features. Read More...
Conditions Summary
Status | Condition | More Info |
---|---|---|
✓ | Not more than 0 pairs are correlated above 0.9 | All correlations are less than 0.9 except pairs [] |
Additional Outputs
Check Without Conditions Output
Outlier Sample Detection
Detects outliers in a dataset using the LoOP algorithm. Read More...
Additional Outputs
Outlier Probability Score | pclass | survived | name | sex | age | sibsp | parch | ticket | fare | cabin | embarked | boat | body | home.dest | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
720 | 1.00 | 3 | 0 | Colbert, Mr. Patrick | male | 24.00 | 0 | 0 | 371109 | 7.25 | nan | Q | nan | nan | Co Limerick, Ireland Sherbrooke, PQ |
971 | 0.99 | 3 | 0 | Linehan, Mr. Michael | male | nan | 0 | 0 | 330971 | 7.88 | nan | Q | nan | nan | nan |
803 | 0.96 | 3 | 0 | Foley, Mr. Joseph | male | 26.00 | 0 | 0 | 330910 | 7.88 | nan | Q | nan | nan | Ireland Chicago, IL |
1193 | 0.95 | 3 | 0 | Scanlan, Mr. James | male | nan | 0 | 0 | 36209 | 7.72 | nan | Q | nan | nan | nan |
1167 | 0.95 | 3 | 0 | Sadlier, Mr. Matthew | male | nan | 0 | 0 | 367655 | 7.73 | nan | Q | nan | nan | nan |
Other Checks That Weren't Displayed
Check | Reason |
---|---|
Identifier Label Correlation - Train Dataset | DatasetValidationError: Dataset does not contain an index or a datetime. see Dataset docs |
Single Value in Column | Nothing found |
Special Characters | Nothing found |
Data Duplicates | Nothing found |
String Length Out Of Bounds | Nothing found |
Conflicting Labels | Nothing found |
Análisis de Resultados
En general, el conjunto de datos presenta buena integridad en muchos aspectos evaluados por los checks predefinidos de la suite. La mayoría de las condiciones de los checks se superaron, incluyendo:
- la detección de duplicados (0% encontrado)
- la consistencia en la representación de nulos (un solo tipo de nulo por columna)
- la mezcla de tipos de datos (tipos raros dentro de umbrales aceptables)
- la correlación entre características y la etiqueta (PPS < 0.8)
- la correlación entre características (ningún par > 0.9)
- la presencia de valores únicos, caracteres especiales y la longitud de cadenas fuera de límites, así como etiquetas en conflicto.
Sin embargo, se identificó una advertencia (!): String Mismatch (Discrepancia de Cadenas) en la columna home.dest
. Esto indica que, aunque el check se ejecutó, encontró variantes de escritura para los valores de cadena en esa columna que superaron el umbral definido, señalando inconsistencias como “swedenworcesterma” vs “Sweden Worcester, MA”. Adicionalmente, aunque no fallaron las condiciones, la suite también realizó y mostró los resultados de la Detección de Muestras Atípicas (Outlier Sample Detection), identificando filas con altas probabilidades de ser outliers. Algunos checks, como Identifier Label Correlation, no se ejecutaron por falta de metadatos relevantes (como índice o datetime) en el dataset.
Conclusiones
Los resultados de la validación de integridad de datos con Deepchecks sugieren que el dataset está mayormente limpio y cumple con muchas validaciones básicas predefinidas. El principal problema de calidad de datos destacado por la suite, que requiere atención, es la inconsistencia en el formato de las cadenas de texto en la columna home.dest
. Además, la detección de muestras atípicas, aunque no marcó un fallo directo según las condiciones mostradas, proporciona información valiosa que podría requerir una investigación o tratamiento adicional dependiendo del objetivo del proyecto. La suite data_integrity
de Deepchecks cumple su propósito de identificar rápidamente problemas comunes de calidad en un solo conjunto de datos mediante checks predefinidos.
📖 References
- https://docs.deepchecks.com/stable/tabular/auto_tutorials/quickstarts/plot_quick_data_integrity.html
- https://joserzapata.github.io/courses/python-ciencia-datos/ml/
- https://joserzapata.github.io/courses/python-ciencia-datos/clasificacion/
- Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems 2nd Edition - Aurélien Géron
- https://joserzapata.github.io/post/lista-proyecto-machine-learning/