Validacion de datos en python

Por Jose R. Zapata

Ultima actualización: 24/May/2025

Invítame a un Café

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 Checks 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

StatusCheckConditionMore Info
!
String MismatchNo string variantsFound 1 out of 7 columns with amount of variants above threshold: {'home.dest': ['swedenworcesterma', 'londonnewyorkny', 'parisfrancenewyorkny']}
Mixed NullsNumber of different null types is less or equal to 1Passed for 14 relevant columns
Mixed Data TypesRare data types in column are either more than 10% or less than 1% of the data14 columns passed: found 2 columns with negligible types mix, and 12 columns without any types mix
Feature Label CorrelationFeatures' Predictive Power Score is less than 0.8Passed for 13 relevant columns
Feature-Feature CorrelationNot more than 0 pairs are correlated above 0.9All correlations are less than 0.9 except pairs []
Single Value in ColumnDoes not contain only a single valuePassed for 14 relevant columns
Special CharactersRatio of samples containing solely special character is less or equal to 0.1%Passed for 14 relevant columns
Data DuplicatesDuplicate data ratio is less or equal to 5%Found 0% duplicate data
String Length Out Of BoundsRatio of string length outliers is less or equal to 0%Passed for 5 relevant columns
Conflicting LabelsAmbiguous 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
StatusConditionMore Info
!
No string variantsFound 1 out of 7 columns with amount of variants above threshold: {'home.dest': ['swedenworcesterma', 'londonnewyorkny', 'parisfrancenewyorkny']}
Additional Outputs
Showing only the top 10 columns, you can change it using n_top_columns param
  ValueCount% In data
Column NameBase form   
home.destswedenworcestermaSweden Worcester, MA30.23%
swedenworcestermaSweden Worcester, MA50.38%
londonnewyorknyLondon New York, NY10.08%
londonnewyorknyLondon / New York, NY20.15%
parisfrancenewyorknyParis, France New York, NY10.08%
parisfrancenewyorknyParis, France / New York, NY20.15%


Go to top


Mixed Nulls

Search for various types of null values, including string representations of null. Read More...

Conditions Summary
StatusConditionMore Info
Number of different null types is less or equal to 1Passed for 14 relevant columns
Additional Outputs
Showing only the top 10 columns, you can change it using n_top_columns param
  CountPercent of data
Column NameValue  
agemath.nan26320.09%
faremath.nan10.08%
cabinnumpy.nan101477.46%
embarkednumpy.nan20.15%
boatnumpy.nan82362.87%
bodymath.nan118890.76%
home.destnumpy.nan56443.09%


Go to top


Mixed Data Types

Detect columns which contain a mix of numerical and string values. Read More...

Conditions Summary
StatusConditionMore Info
Rare data types in column are either more than 10% or less than 1% of the data14 columns passed: found 2 columns with negligible types mix, and 12 columns without any types mix
Additional Outputs
Showing only the top 10 columns, you can change it using n_top_columns param
 ticketboat
Strings26.89%18.11%
Numbers73.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]


Go to top


Feature Label Correlation

Return the PPS (Predictive Power Score) of all features in relation to the label. Read More...

Conditions Summary
StatusConditionMore Info
Features' Predictive Power Score is less than 0.8Passed for 13 relevant columns
Additional Outputs

jpeg

The Predictive Power Score (PPS) is used to estimate the ability of a feature to predict the label by itself (Read more about Predictive Power Score). A high PPS (close to 1) can mean that this feature's success in predicting the label is actually due to data leakage - meaning that the feature holds information that is based on the label to begin with.


Go to top


Feature-Feature Correlation

Checks for pairwise correlation between the features. Read More...

Conditions Summary
StatusConditionMore Info
Not more than 0 pairs are correlated above 0.9All correlations are less than 0.9 except pairs []
Additional Outputs

jpeg

* Displayed as absolute values.
* Some features in the dataset are neither numerical nor categorical and therefore not calculated.


Go to top


Check Without Conditions Output

Outlier Sample Detection

Detects outliers in a dataset using the LoOP algorithm. Read More...

Additional Outputs
The Outlier Probability Score is calculated by the LoOP algorithm which measures the local deviation of density of a given sample with respect to its neighbors. These outlier scores are directly interpretable as a probability of an object being an outlier (see link for more information).

 Outlier Probability Scorepclasssurvivednamesexagesibspparchticketfarecabinembarkedboatbodyhome.dest
7201.0030Colbert, Mr. Patrickmale24.00003711097.25nanQnannanCo Limerick, Ireland Sherbrooke, PQ
9710.9930Linehan, Mr. Michaelmalenan003309717.88nanQnannannan
8030.9630Foley, Mr. Josephmale26.00003309107.88nanQnannanIreland Chicago, IL
11930.9530Scanlan, Mr. Jamesmalenan00362097.72nanQnannannan
11670.9530Sadlier, Mr. Matthewmalenan003676557.73nanQnannannan


Go to top


Other Checks That Weren't Displayed

CheckReason
Identifier Label Correlation - Train DatasetDatasetValidationError: Dataset does not contain an index or a datetime. see Dataset docs
Single Value in ColumnNothing found
Special CharactersNothing found
Data DuplicatesNothing found
String Length Out Of BoundsNothing found
Conflicting LabelsNothing found


Go to top

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

Jose R. Zapata

Anterior
Siguiente