Conjunto de datos procesado con registros de mediciones de laboratorio continuas para la clasificación binaria de la potabilidad del agua. Integra variables físico-químicas (pH, dureza, sólidos disueltos) con imputación por mediana.
Comparación detallada de las métricas de clasificación para los modelos entrenados con el conjunto de datos original y el conjunto sintético generado.
| Clase | Precisión | Recall | F1-Score | Soporte |
|---|---|---|---|---|
| Clase 0 | 0.62 | 0.92 | 0.74 | 122 |
| Clase 1 | 0.44 | 0.10 | 0.17 | 78 |
| Accuracy | 0.60 | |||
| Macro Avg | 0.53 | 0.51 | 0.45 | 200 |
| Weighted Avg | 0.55 | 0.60 | 0.51 | 200 |
| Clase | Precisión | Recall | F1-Score | Soporte |
|---|---|---|---|---|
| Clase 0 | 0.67 | 0.69 | 0.68 | 122 |
| Clase 1 | 0.49 ⬆ +0.05 | 0.47 ⬆ +0.37 | 0.48 ⬆ +0.31 | 78 |
| Accuracy | 0.60 — | |||
| Macro Avg | 0.58 ⬆ +0.05 | 0.58 ⬆ +0.07 | 0.58 ⬆ +0.13 | 200 |
| Weighted Avg | 0.60 ⬆ +0.05 | 0.60 — | 0.60 ⬆ +0.09 | 200 |
El conjunto de datos de Potabilidad del Agua (Water Potability) contiene métricas de calidad de agua para 3,276 cuerpos de agua diferentes. El acceso a agua potable segura es esencial para la salud, un derecho humano básico y un componente de políticas efectivas para la protección de la salud. Este conjunto de datos permite clasificar si el agua es potable (segura para el consumo humano) o no, basándose en 10 parámetros fisicoquímicos como pH, dureza, sólidos disueltos, cloraminas, sulfatos, conductividad, carbono orgánico, trihalometanos y turbidez. El objetivo es determinar si el agua es segura para el consumo humano (variable Potability).
El acceso a agua potable segura es un problema crítico de salud y desarrollo a nivel nacional, regional y local. Según la Organización Mundial de la Salud (OMS):
En algunas regiones, se ha demostrado que las inversiones en el suministro de agua y saneamiento pueden generar un beneficio económico neto, ya que las reducciones en los efectos adversos para la salud y los costos de atención médica superan los costos de las intervenciones.
El archivo water_potability.csv contiene 3,276 registros con 10 columnas (9 variables predictoras y 1 variable objetivo). Las características son de tipo numérico y representan diferentes parámetros fisicoquímicos del agua.
| Variable | Tipo | Descripción | Unidad | Rango / Valor Típico |
|---|---|---|---|---|
| A. Parámetros Fisicoquímicos | ||||
| ph | Numérico | pH del agua (medida de acidez/alcalinidad) | - | 0-14 (6.5-8.5 según OMS) |
| Hardness | Numérico | Dureza del agua (capacidad de precipitar jabón) | mg/L | - |
| Solids | Numérico | Sólidos disueltos totales (TDS) | ppm | Desirable: 500 mg/L, Máximo: 1000 mg/L |
| Chloramines | Numérico | Cantidad de cloraminas (desinfectante) | ppm | Hasta 4 mg/L (seguro) |
| Sulfate | Numérico | Cantidad de sulfatos disueltos | mg/L | 3-30 mg/L (agua dulce) |
| Conductivity | Numérico | Conductividad eléctrica del agua | μS/cm | No debe exceder 400 μS/cm (OMS) |
| Organic_carbon | Numérico | Carbono orgánico total (TOC) | ppm | < 2 mg/L (agua tratada) |
| Trihalomethanes | Numérico | Trihalometanos (subproductos de cloración) | μg/L | Hasta 80 ppm (seguro) |
| Turbidity | Numérico | Turbidez del agua (propiedades de emisión de luz) | NTU | Recomendado: 5.00 NTU |
| B. Variable Objetivo | ||||
| Potability | Binaria (Target) | Indica si el agua es segura para el consumo humano | - | 1 = Potable 0 = No potable |
| Parámetro | Unidad | Límite Recomendado | Fuente |
|---|---|---|---|
| pH | - | 6.5 - 8.5 | OMS |
| Solids (TDS) | mg/L | 500 (deseable) / 1000 (máximo) | WHO |
| Chloramines | mg/L | ≤ 4 | EPA |
| Conductivity | μS/cm | ≤ 400 | OMS |
| Organic_carbon | mg/L | < 2 (tratada) / < 4 (fuente) | US EPA |
| Trihalomethanes | ppm | ≤ 80 | EPA |
| Turbidity | NTU | ≤ 5 | OMS |
Referencias: OMS (Organización Mundial de la Salud), EPA (Agencia de Protección Ambiental de EE.UU.), US EPA (Agencia de Protección Ambiental de EE.UU.)
El conjunto de datos contiene mediciones fisicoquímicas de cuerpos de agua y no incluye información personal identificable de individuos o comunidades. Los datos son anónimos y se utilizan exclusivamente para fines de investigación académica en calidad de agua y salud pública. Restricción de confidencialidad: El uso de los datos está restringido a fines académicos y de investigación. La publicación de resultados debe limitarse a métricas de evaluación, resultados agregados y metodología del modelo.
Este conjunto de datos es ideal para problemas de clasificación y evaluación de calidad de agua. Se recomienda:
El acceso a agua potable segura es un derecho humano fundamental y un Objetivo de Desarrollo Sostenible (ODS 6) de las Naciones Unidas. La calidad del agua es esencial para:
Este dataset permite desarrollar modelos de clasificación que pueden ayudar a evaluar la potabilidad del agua de manera rápida y eficiente, especialmente en regiones con recursos limitados para realizar análisis de laboratorio completos.
Water Potability Dataset. Kaggle. https://www.kaggle.com/datasets/adityakadiwal/water-potability
train_test_split con parámetro stratify para preservar exactamente la proporción original de clases (desbalance de potabilidad).📊 Resultado: Dataset de 3,276 muestras de agua (con versión reducida estratificada de 1,000 ejemplos) con 9 variables predictoras (mediciones físico-químicas) y 1 variable objetivo binaria (Potability). Desbalance moderado (~60% agua no potable / ~40% agua potable) — escenario ideal para validación de técnicas de generación de datos sintéticos y evaluación del índice TabDSFidelity en contextos de calidad del agua y salud pública, donde las mediciones fisicoquímicas son determinantes para la clasificación de potabilidad.
💧 Fuente: Water Potability Dataset (Kaggle) - Datos de calidad del agua para consumo humano.
🔬 Variables físico-químicas: pH, dureza, sólidos disueltos totales (TDS), cloraminas, sulfatos, conductividad eléctrica, carbono orgánico total, trihalometanos, turbidez — parámetros críticos para la potabilidad del agua.
📋 Unidades de medida: pH (0-14), Hardness (mg/L), Solids (ppm), Chloramines (ppm), Sulfate (mg/L), Conductivity (µS/cm), Organic_carbon (ppm), Trihalomethanes (µg/L), Turbidity (NTU).
📁 Leyenda disponible: Archivo leyenda_water_potability.txt con descripción completa de la variable objetivo y todas las variables predictoras con sus unidades de medida.
🎯 Variable objetivo: Potability (1 = Agua potable/segura para consumo, 0 = Agua no potable/no segura).
🧹 Limpieza aplicada: Imputación con mediana de valores perdidos, estandarización de tipos, reducción estratificada a 1,000 ejemplos.
| Variable | Descripción de Calidad del Agua | Tipo | Rango / Categorías | Unidad | ¿Objetivo? |
|---|---|---|---|---|---|
ph |
Nivel de pH (acidez/alcalinidad del agua) | Numérico | 1.76 - 11.45 | N/A | No |
Hardness |
Dureza del agua (sales de calcio y magnesio) | Numérico | 77.46 - 323.12 | mg/L | No |
Solids |
Total de Sólidos Disueltos (TDS) - Mineralización | Numérico | 320.94 - 52,060.23 | ppm | No |
Chloramines |
Concentración de cloraminas (desinfectante) | Numérico | 2.39 - 12.65 | ppm | No |
Sulfate |
Concentración de sulfatos disueltos | Numérico | 187.17 - 476.54 | mg/L | No |
Conductivity |
Conductividad eléctrica (iones disueltos) | Numérico | 181.48 - 656.92 | μS/cm | No |
Organic_carbon |
Carbono Orgánico Total (TOC) | Numérico | 4.47 - 23.92 | ppm | No |
Trihalomethanes |
Trihalometanos (subproductos de cloración) | Numérico | 8.18 - 120.03 | μg/L | No |
Turbidity |
Turbidez (claridad del agua, partículas en suspensión) | Numérico | 1.68 - 6.74 | NTU | No |
Potability |
Potabilidad del agua (apta para consumo humano) - OBJETIVO | Binario | 0: No Potable, 1: Potable | N/A | Sí |
Esta sección detalla los códigos y significados de las variables categóricas y binarias presentes en el conjunto de datos de Potabilidad del Agua. Comprender estas codificaciones es fundamental para la correcta interpretación de los resultados de calidad del agua.
Potability
🎯 Objetivo
| Código | Significado |
|---|---|
| 0 | No Potable - Agua no segura para consumo humano |
| 1 | Potable - Agua apta para consumo humano |
Variable Objetivo: Clasifica la potabilidad del agua basada en parámetros fisicoquímicos.
Formato: 0 = No Potable, 1 = Potable
Potability
🎯 Variable Objetivo: Potabilidad (0: No Potable, 1: Potable)
Nota: Única variable binaria en el dataset.
ph < 4.5 → Potability = 0 (pH ácido extremo → no potable)ph > 10.0 → Potability = 0 (pH básico extremo → no potable)Sulfate > 480 → Potability = 0 (Sulfatos altos → no potable)Trihalomethanes > 100 → Potability = 0 (THMs altos → no potable)Turbidity > 6.0 → Potability = 0 (Turbidez alta → no potable)Solids > 30000 → Conductivity > 500 (Sólidos altos → conductividad alta)Conductivity < 300 → Solids < 25000 (Conductividad baja → sólidos bajos)Hardness > 250 → ph > 5.0 (Dureza alta → pH no extremo)Trihalomethanes > 80 → Organic_carbon > 5 (THMs altos → carbono orgánico alto)Trihalomethanes > 80 → Chloramines > 2 (THMs altos → cloraminas altas)Chloramines > 10 → Potability = 0 (Cloraminas altas → no potable)Potability == 1 → Turbidity < 5.0Potability == 1 → Sulfate < 400Potability == 1 → ph > 5.5Hardness > 280 → Conductivity > 300Solids < 5000 → Hardness < 180| Valor escala | 0.03 |
|---|---|
| Probabilidad Base | 0.1 |
| epochs | 500 |
|---|---|
| batch_size | 50 |
| generator_lr | 0.0002 |
| discriminator_lr | 0.0002 |
| pac | 10 |
| generator_dim | (256, 256) |
| discriminator_dim | (256, 256) |
| embedding_dim | 128 |
| l2scale | 1e-05 |
| epochs | 500 |
|---|---|
| batch_size | 50 |
| embedding_dim | 128 |
| compress_dims | (128, 128) |
| decompress_dims | (128, 128) |
| l2scale | 1e-5 |
| loss_factor | 2 |
| Random Seed | 42 |
|---|---|
| Python | 3.12.12 |
Para reproducir exactamente este conjunto de datos, ejecute el script de generación con la semilla aleatoria 42.
Los resultados pueden variar ligeramente según la versión de las librerías.
El conjunto original ha sido sometido a un proceso de balanceo de clases y generación sintética para mejorar la representación de clases minoritarias. Nota: se ha empleado un conjunto de validación para evaluar el índice de fidelidad. Se han generado tres familias de conjuntos:
El mejor conjunto de cada etapa fue seleccionado mediante el índice TabDSFidelity.
| Algoritmo | Ratio | N° Ejemplos | AUC-ROC | F1 | Accuracy | TabDSFidelity | Jensen-Shannon | Kolmogorov-Smirnov | Kullback-Leibler | Correlación | Tiempo Total (s) | Dist. Promedio | Copias Exactas | Ataque MIA | Mejor |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Random Oversampling | 1 | 732 | 0.604 | 0.617 | 0.630 | 5.767 | 0.131 | 0.987 | 0.024 | 0.983 | 57.676 | 0 | 732 | 0.464 | |
| Smote | 1 | 732 | 0.608 | 0.600 | 0.605 | 3.924 | 0.257 | 0.994 | 0.024 | 0.986 | 52.875 | 0.006 | 600 | 0.484 | |
| Borderline SMOTE | 1 | 732 | 0.636 | 0.602 | 0.600 | 4.967 | 0.258 | 0.977 | 0.024 | 0.986 | 56.516 | 0.006 | 600 | 0.484 | |
| ADASYN | 1.107 | 771 | 0.601 | 0.579 | 0.575 | 1.961 | 0.289 | 0.968 | 0.037 | 0.987 | 81.584 | 0.007 | 600 | 0.482 | |
| SMOTE RSB* Adaptado | 1.003 | 731 | 0.646 | 0.635 | 0.635 | 7.402 | 0.257 | 0.983 | 0.024 | 0.989 | 100.605 | 0.009 | 600 | 0.496 | 🏆 |
| SMOTE RSB* Adaptado + Reglas | 1.003 | 731 | 0.647 | 0.625 | 0.625 | 6.839 | 0.256 | 0.981 | 0.024 | 0.989 | 52.790 | 0.009 | 600 | 0.487 | |
| OOF PSO para Balanceo | 1 | 732 | 0.620 | 0.619 | 0.645 | 4.367 | 0.253 | 0.034 | 0.024 | 0.748 | 56.454 | 0.037 | 600 | 0.474 | |
| OOF PSO para Balanceo + Reglas | 2.660 | 732 | 0.651 | 0.601 | 0.660 | 5.013 | 0.251 | 0.000 | 0.032 | 0.648 | 60.132 | 0.056 | 566 | 0.466 |
| Algoritmo | Ratio | N° Ejemplos | AUC-ROC | F1 | Accuracy | TabDSFidelity | Jensen-Shannon | Kolmogorov-Smirnov | Kullback-Leibler | Correlación | Tiempo Total (s) | Dist. Promedio | Copias Exactas | Ataque MIA | Mejor |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SMOTE RSB* + Ruido Gaussiano | 1.019 | 7243 | 0.550 | 0.604 | 0.615 | 7.432 | 0.799 | 0.327 | 0.022 | 0.985 | 78.371 | 0.126 | 0 | 0.449 | |
| SMOTE RSB* + Ruido Gaussiano + Reglas | 1.203 | 7243 | 0.609 | 0.601 | 0.630 | 8.303 | 0.799 | 0.327 | 0.008 | 0.981 | 211.418 | 0.126 | 0 | 0.463 | 🏆 |
| CTGAN | 1.053 | 10000 | 0.481 | 0.486 | 0.480 | 1.560 | 0.810 | 0.041 | 0.030 | 0.905 | 278.051 | 0.077 | 0 | 0.483 | |
| CTGAN + Reglas del Dominio | 1.615 | 10000 | 0.499 | 0.502 | 0.505 | 2.376 | 0.810 | 0.041 | 0.000 | 0.916 | 434.152 | 0.076 | 0 | 0.480 | |
| TVAE | 1.139 | 10000 | 0.601 | 0.549 | 0.545 | 4.336 | 0.832 | 0.021 | 0.041 | 0.972 | 244.840 | 0.056 | 0 | 0.554 | |
| TVAE + Reglas del Dominio | 1.001 | 10000 | 0.644 | 0.610 | 0.610 | 6.648 | 0.832 | 0.021 | 0.024 | 0.972 | 427.969 | 0.056 | 0 | 0.527 | |
| OOF PSO para Aumento | 1 | 10000 | 0.531 | 0.516 | 0.510 | 1.636 | 0.827 | 0.000 | 0.024 | 0.510 | 128.607 | 0.263 | 0 | 0.412 | |
| OOF PSO para Aumento + Reglas | 321.581 | 10000 | 0.559 | 0.618 | 0.620 | 5.225 | 0.827 | 0.000 | 1.586 | 0.616 | 277.809 | 0.271 | 0 | 0.561 | |
| SMOTE RSB* Refinado | 1 | 7000 | 0.592 | 0.601 | 0.610 | 6.654 | 0.828 | 0.230 | 0.024 | 0.984 | 73.378 | 0.030 | 0 | 0.473 | |
| SMOTE RSB* Refinado + Reglas | 1.183 | 7000 | 0.627 | 0.607 | 0.615 | 7.228 | 0.828 | 0.230 | 0.009 | 0.983 | 206.565 | 0.033 | 0 | 0.446 |
| Algoritmo | Ratio | N° Ejemplos | AUC-ROC | F1 | Accuracy | TabDSFidelity | Jensen-Shannon | Kolmogorov-Smirnov | Kullback-Leibler | Correlación | Tiempo Total (s) | Dist. Promedio | Copias Exactas | Ataque MIA | Mejor |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SMOTE RSB* + Ruido Gaussiano | 1.018 | 7974 | 0.603 | 0.622 | 0.630 | 7.932 | 0.724 | 0.365 | 0.023 | 0.986 | 146.578 | 0.124 | 0 | 0.459 | |
| SMOTE RSB* + Ruido Gaussiano + Reglas | 1.183 | 7974 | 0.586 | 0.556 | 0.580 | 6.351 | 0.724 | 0.365 | 0.009 | 0.983 | 278.216 | 0.124 | 0 | 0.443 | |
| CTGAN | 1.049 | 10731 | 0.475 | 0.505 | 0.500 | 1.968 | 0.743 | 0.054 | 0.030 | 0.911 | 359.068 | 0.072 | 123 | 0.490 | |
| CTGAN + Reglas del Dominio | 1.562 | 10731 | 0.516 | 0.481 | 0.480 | 1.951 | 0.743 | 0.054 | 0.000 | 0.921 | 519.336 | 0.072 | 123 | 0.497 | |
| TVAE | 1.128 | 10731 | 0.645 | 0.560 | 0.555 | 4.885 | 0.764 | 0.031 | 0.040 | 0.974 | 337.949 | 0.052 | 123 | 0.505 | |
| TVAE + Reglas del Dominio | 1.001 | 10731 | 0.613 | 0.579 | 0.580 | 5.017 | 0.764 | 0.031 | 0.024 | 0.974 | 521.465 | 0.052 | 123 | 0.518 | |
| OOF PSO para Aumento | 1.000 | 10731 | 0.582 | 0.571 | 0.570 | 3.543 | 0.758 | 0.000 | 0.024 | 0.520 | 205.787 | 0.242 | 123 | 0.494 | |
| OOF PSO para Aumento + Reglas | 26.099 | 10731 | 0.603 | 0.626 | 0.630 | 5.343 | 0.758 | 0.000 | 0.641 | 0.616 | 353.828 | 0.249 | 123 | 0.475 | |
| SMOTE RSB* Refinado | 1.000 | 7731 | 0.614 | 0.592 | 0.595 | 6.592 | 0.741 | 0.264 | 0.024 | 0.985 | 140.750 | 0.028 | 180 | 0.464 | |
| SMOTE RSB* Refinado + Reglas | 1.165 | 7731 | 0.632 | 0.645 | 0.655 | 8.131 | 0.741 | 0.264 | 0.011 | 0.984 | 275.039 | 0.029 | 180 | 0.454 | 🏆 |
Para interpretar correctamente los resultados de los conjuntos de datos generados, es fundamental comprender qué mide cada métrica y cómo se relacionan entre sí. A continuación, se detalla cada una de las métricas utilizadas en la evaluación:
¿Qué mide? Capacidad del modelo para distinguir entre clases (Ej: mortalidad vs supervivencia).
Interpretación:
Ejemplo: AUC-ROC = 0.82 significa que hay un 82% de probabilidad de que el modelo clasifique correctamente un paciente fallecido frente a uno superviviente.
¿Qué mide? Media armónica entre precisión y sensibilidad (recall).
Interpretación:
Ejemplo: F1 = 0.76 indica que el modelo mantiene un buen balance entre identificar correctamente a los pacientes que fallecen (sensibilidad) y no etiquetar erróneamente a los que sobreviven (precisión).
¿Qué mide? Proporción de predicciones correctas sobre el total.
Interpretación:
Ejemplo: Accuracy = 0.75 significa que el 75% de las predicciones del modelo son correctas.
⚠️ Nota: En conjuntos desbalanceados, esta métrica puede ser engañosa. Es mejor usar F1-Score o AUC-ROC.
¿Qué mide? Calidad global del conjunto sintético comparado con el original.
Interpretación:
Ejemplo: TabDSFidelity = 8.08 indica que el conjunto sintético mantiene una alta similitud con el original, preservando las relaciones y distribuciones de los datos reales, además de maximizar su eficacia predictiva.
💡 Importante: Este es el índice para seleccionar el mejor conjunto de datos sintéticos. Para este caso, el peso empleado para las métricas "AUC-ROC", "F1-Score" y "Accuracy" fue (2) y para el resto de las métricas fue (1).
¿Qué mide? Similitud entre las distribuciones de variables numéricas del conjunto sintético y el original.
Interpretación:
Ejemplo: JS = 0.118 indica que las distribuciones de las variables numéricas (edad, presión arterial, etc.) son bastante similares a las del conjunto original.
📌 Nota: Es el promedio de la divergencia de Jensen-Shannon calculada para todas las variables numéricas.
¿Qué mide? Probabilidad estadística de que las muestras numéricas del conjunto sintético provengan de la misma distribución continua que el original.
Interpretación:
Ejemplo: KS p-valor = 0.753 indica que hay evidencia fuerte a favor de que las distribuciones acumulativas de la variable sintética y la original son equivalentes.
📌 Nota: Se reporta el promedio de los p-valores obtenidos mediante la prueba de Kolmogorov-Smirnov de dos muestras para las variables numéricas.
¿Qué mide? Divergencia entre las distribuciones de variables categóricas del conjunto sintético y el original.
Interpretación:
Ejemplo: KL = 0.014 indica que la distribución de las variables categóricas (género, mortalidad) es muy similar a la del conjunto original.
📌 Nota: Es el promedio de la divergencia de Kullback-Leibler para todas las variables categóricas. A diferencia de JS y KS, esta métrica se aplica solo a variables categóricas.
¿Qué mide? Preservación de las relaciones entre variables del conjunto original.
Interpretación:
Ejemplo: Correlación = 0.976 significa que las relaciones entre variables (ej. edad y mortalidad) se mantienen en un 97.6% respecto al conjunto original.
¿Qué mide? Tiempo total de ejecución del proceso de generación del conjunto.
Interpretación:
Ejemplo: Tiempo total = 69.45s significa que el proceso completo de generación del conjunto balanceado tomó aproximadamente 1.16 minutos.
⏱️ Nota: Incluye el tiempo de generación sintética + cálculo de métricas.
Estas métricas evalúan el riesgo de exposición de información sensible y la capacidad de un atacante para inferir datos de los pacientes a partir del conjunto de datos sintéticos.
¿Qué mide? La distancia promedio entre cada registro sintético y su registro más cercano en el conjunto de datos original.
Interpretación:
Ejemplo: Distancia promedio = 0.015 en SMOTE indica que los registros sintéticos están relativamente cerca de los originales, lo que podría implicar un riesgo de privacidad moderado.
Metodología: Calculada utilizando la Distancia de Gower, la cual maneja internamente tipos de datos mixtos, normalizando las variables numéricas y penalizando diferencias categóricas para devolver un índice estandarizado entre 0 y 1.
Recomendación: Valores < 0.01 deben ser evaluados con precaución. Idealmente, buscar valores > 0.02 para garantizar la privacidad.
¿Qué mide? Número de registros sintéticos que son copias idénticas de registros en el conjunto de datos original.
Interpretación:
Ejemplo: SMOTE RSB* Refinado genera 76 copias exactas de 8817 registros (0.86%), lo que representa un riesgo de privacidad que debe ser evaluado.
Importante: La presencia de copias exactas es uno de los indicadores más críticos de fuga de datos. Idealmente, este valor debe ser 0.
¿Qué mide? Tasa de éxito (medida en AUC-ROC) de un atacante para determinar si un registro específico pertenece al conjunto de datos original.
Interpretación:
Ejemplo: MIA = 0.553 significa que el atacante tiene un éxito ligeramente superior al 50% aleatorio, lo que indica un riesgo de privacidad bajo/moderado.
Objetivo: Buscar valores lo más cercanos a 0.5. Valores > 0.6 indican que el conjunto sintético no protege adecuadamente la privacidad.
Formatos incluidos: CSV.
Díaz Bastida, M., Pérez Vázquez, R. A., & Bello Pérez, R. (2026). High-Fidelity Synthetic Dataset for Water Potability Prediction (Version 1). figshare. https://doi.org/10.6084/m9.figshare.32945999.v1