Registro administrativo de citas del sistema público de salud brasileño para la predicción de la inasistencia del paciente a una cita médica programada (No-show). Integra variables sociodemográficas (Scholarship, edad), clínicas (hipertensión, discapacidad) y logísticas.
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.80 | 0.98 | 0.88 | 160 |
| Clase 1 | 0.25 | 0.03 | 0.05 | 40 |
| Accuracy | 0.79 | |||
| Macro Avg | 0.53 | 0.50 | 0.46 | 200 |
| Weighted Avg | 0.69 | 0.79 | 0.71 | 200 |
| Clase | Precisión | Recall | F1-Score | Soporte |
|---|---|---|---|---|
| Clase 0 | 0.84 | 0.88 | 0.86 | 160 |
| Clase 1 | 0.41 ⬆ +0.16 | 0.33 ⬆ +0.30 | 0.36 ⬆ +0.31 | 40 |
| Accuracy | 0.77 ⬇ -0.02 | |||
| Macro Avg | 0.62 ⬆ +0.09 | 0.60 ⬆ +0.10 | 0.61 ⬆ +0.15 | 200 |
| Weighted Avg | 0.75 ⬆ +0.06 | 0.77 ⬇ -0.02 | 0.76 ⬆ +0.05 | 200 |
El conjunto de datos de Inasistencia a Citas Médicas (Medical Appointment No-Shows) contiene 110,527 citas médicas con sus 14 variables asociadas. La variable más importante es si el paciente asistió o no a la cita (No-show). El objetivo es predecir la probabilidad de que un paciente no asista a su cita médica programada, un problema común en sistemas de salud que genera pérdidas de recursos, tiempos de espera prolongados y menor acceso a la atención médica. Cada instancia representa una cita médica programada, con información demográfica, clínica y logística del paciente.
La inasistencia a citas médicas es un problema significativo en sistemas de salud en todo el mundo, con tasas que varían entre el 5% y el 55% dependiendo de la población y el tipo de servicio. Las consecuencias incluyen:
La predicción temprana de pacientes con alto riesgo de inasistencia permite implementar estrategias de intervención como recordatorios telefónicos, mensajes de texto (SMS), o la reprogramación proactiva de citas, mejorando la eficiencia del sistema de salud y la atención al paciente.
La variable Scholarship se refiere al programa Bolsa Família, un programa de transferencia de ingresos del gobierno brasileño.
El dataset contiene 110,527 instancias con 14 atributos (13 variables predictoras y 1 variable objetivo). Las características son de tipo mixto (numéricas, categóricas y binarias).
| Variable | Tipo | Descripción | Notas |
|---|---|---|---|
| A. Variables Identificadoras (A excluir del modelo) | |||
| PatientId | ID (Numérico) | Identificación del paciente | Sin valor predictivo. Excluir del modelo. |
| AppointmentID | ID (Numérico) | Identificación de cada cita | Sin valor predictivo. Excluir del modelo. |
| B. Datos Demográficos | |||
| Gender | Categórica | Sexo del paciente (Male / Female) | Las mujeres representan la mayor proporción |
| Age | Numérico (Entero) | Edad del paciente en años | - |
| Neighbourhood | Categórica | Barrio donde se realiza la cita | Ubicación geográfica de la consulta |
| Scholarship | Binaria | Participación en el programa Bolsa Família (True/False) | Programa de transferencia de ingresos de Brasil |
| C. Información de la Cita | |||
| DataMarcacaoConsulta | Fecha | Día de la cita programada (fecha de la consulta) | Cuando deben visitar al médico |
| DataAgendamento | Fecha | Día en que se registró o llamó para agendar la cita | Siempre anterior a la cita |
| D. Condiciones Clínicas | |||
| Hipertension | Binaria | Paciente con hipertensión (True/False) | - |
| Diabetes | Binaria | Paciente con diabetes (True/False) | - |
| Alcoholism | Binaria | Paciente con alcoholismo (True/False) | - |
| Handcap | Binaria | Paciente con discapacidad (True/False) | - |
| E. Comunicación | |||
| SMS_received | Numérico (Entero) | Número de mensajes SMS enviados al paciente | 1 o más mensajes enviados |
| F. Variable Objetivo | |||
| No-show | Binaria (Target) | Indica si el paciente no asistió a la cita | True = No asistió False = Asistió |
El conjunto de datos ha sido anonimizado para proteger la privacidad de los pacientes. Los identificadores PatientId y AppointmentID son números sin relación con información personal identificable. Restricción de confidencialidad: En cumplimiento de los protocolos de privacidad, 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, sin divulgación de información que permita la reidentificación de pacientes.
Este conjunto de datos es ampliamente utilizado para predecir inasistencia a citas médicas. Se recomienda:
PatientId y AppointmentID del modelado por ser identificadores sin valor predictivoDataMarcacaoConsulta - DataAgendamento (tiempo entre registro y cita)Hipertension, Diabetes, Alcoholism, Handcap) pueden utilizarse directamente como 0/1SMS_received indica el número de mensajes enviados, no solo si se enviaron o noNo-show está codificada como True (No asistió) y False (Asistió)Gender a formato binario (Male/Female) y Neighbourhood mediante codificación one-hotLa inasistencia a citas médicas es un problema crítico en sistemas de salud que afecta tanto a pacientes como a proveedores. Las implicaciones incluyen:
Este dataset permite desarrollar modelos predictivos que identifican pacientes en riesgo de inasistencia, facilitando intervenciones como recordatorios personalizados, reprogramación proactiva y políticas de gestión de citas más eficientes, mejorando así la calidad y eficiencia del sistema de salud.
Hoppen, J. & Aquarela Analytics. Medical Appointment No-Shows Dataset. Kaggle. https://www.kaggle.com/datasets/joniarroba/noshowappointments
📊 Resultado: Dataset de citas médicas (≈110,000 registros después de limpieza) con 10 variables predictoras (demográficas, clínicas, administrativas y temporales) y 1 variable objetivo binaria (No-show). Desbalance moderado (~80% asistencias / ~20% inasistencias) — escenario ideal para validación de técnicas de generación de datos sintéticos y evaluación del índice TabDSFidelity en contextos de predicción de comportamiento de pacientes, destacando la importancia de la ventana temporal (WaitingDays) como predictor clave.
🏥 Fuente: Medical Appointment No Shows (Kaggle) - Datos de citas médicas de Brasil.
⏱️ Variable temporal clave: WaitingDays (días entre reserva y cita) — factor crítico en la probabilidad de inasistencia.
📋 Variables clínicas: Hipertensión, diabetes, alcoholism, discapacidades (Handcap), y recepción de SMS como recordatorio.
📁 Leyenda disponible: Archivo leyenda_no_show.txt con mapeo semántico completo de la variable objetivo, Gender (0=Femenino, 1=Masculino), y Neighbourhood (81 barrios codificados).
🎯 Variable objetivo: No-show (1 = Paciente faltó a la cita, 0 = Paciente asistió).
🧹 Limpieza aplicada: Eliminación de IDs, filtrado de edad negativa (-1), filtrado de días de espera negativos, y eliminación de fechas originales tras extraer WaitingDays.
| Variable | Descripción Clínica | Tipo | Rango / Categorías | Unidad | ¿Objetivo? |
|---|---|---|---|---|---|
Neighbourhood |
Barrio donde se encuentra la unidad de salud (codificado) | Categórico | 0-80 (ver leyenda para códigos) | N/A | No |
Age |
Edad del paciente | Numérico | 0 - 93 | años | No |
Handcap |
Nivel de discapacidad (número de discapacidades) | Numérico | 0 - 2 | N/A | No |
WaitingDays |
Tiempo de espera entre la reserva y la cita | Numérico | 0 - 90 | días | No |
Gender |
Sexo del paciente | Binario | 0: Femenino, 1: Masculino | N/A | No |
Scholarship |
Beneficiario de ayuda social (Bolsa Família) | Binario | 0: No, 1: Sí | N/A | No |
Hipertension |
Diagnóstico de hipertensión arterial | Binario | 0: No, 1: Sí | N/A | No |
Diabetes |
Diagnóstico de diabetes mellitus | Binario | 0: No, 1: Sí | N/A | No |
Alcoholism |
Diagnóstico de alcoholismo | Binario | 0: No, 1: Sí | N/A | No |
SMS_received |
Recepción de recordatorio por SMS | Binario | 0: No, 1: Sí | N/A | No |
No-show |
Absentismo a la cita médica (objetivo) | Binario | 0: Asistió, 1: Faltó (No-show) | 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 No Shows en Citas Médicas. Comprender estas codificaciones es fundamental para la correcta interpretación de los resultados clínicos y de gestión sanitaria.
Neighbourhood
Categórica
Barrios de Vitória (Espírito Santo, Brasil) - Codificación Alfabética
Nota: Codificación basada en orden alfabético. No todos los códigos pueden estar presentes en el subconjunto procesado.
Formato común: 0 = No / Ausencia, 1 = Sí / Presencia
Gender
Sexo (0: Femenino, 1: Masculino)
Scholarship
Ayuda social (Bolsa Família) (0: No, 1: Sí)
Hipertension
Hipertensión arterial (0: No, 1: Sí)
Diabetes
Diabetes mellitus (0: No, 1: Sí)
Alcoholism
Alcoholismo (0: No, 1: Sí)
SMS_received
Recordatorio por SMS (0: No, 1: Sí)
No-show
🎯 Variable Objetivo: Absentismo (0: Asistió, 1: Faltó)
Nota: Todas las variables binarias están codificadas como 0 = No y 1 = Sí.
WaitingDays - Mayor tiempo de espera aumenta el absentismoSMS_received reduce significativamente el No-showWaitingDays == 0 → SMS_received = 0 (Cita inmediata → sin SMS)Age < 2 → No-show = 0 (Menores de 2 años no faltan a citas)Age < 12 → Alcoholism = 0 (Menores de 12 sin alcoholismo)Scholarship == 1 → No-show = 0 (Beca → menor ausentismo)Hipertension == 1 → Age > 18 (Hipertensión → edad adulta)Diabetes == 1 → (Hipertension = 1) OR (Age > 18)Handcap > 1 → (Hipertension = 1) OR (Diabetes = 1)| 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 | 956 | 0.669 | 0.715 | 0.725 | 9.111 | 0.086 | 0.535 | 0.029 | 0.966 | 62.863 | 0 | 956 | 0.431 | 🏆 |
| Smote | 1 | 956 | 0.671 | 0.687 | 0.675 | 6.786 | 0.085 | 0.345 | 0.039 | 0.969 | 52.862 | 0.023 | 609 | 0.469 | |
| Borderline SMOTE | 1 | 956 | 0.656 | 0.711 | 0.705 | 8.161 | 0.093 | 0.334 | 0.037 | 0.968 | 53.375 | 0.023 | 611 | 0.438 | |
| ADASYN | 1.004 | 954 | 0.638 | 0.672 | 0.650 | 5.055 | 0.080 | 0.464 | 0.038 | 0.970 | 52.937 | 0.024 | 608 | 0.447 | |
| SMOTE RSB* Adaptado | 1.306 | 844 | 0.629 | 0.687 | 0.675 | 6.278 | 0.076 | 0.452 | 0.018 | 0.982 | 51.001 | 0.019 | 600 | 0.461 | |
| SMOTE RSB* Adaptado + Reglas | 1.306 | 844 | 0.642 | 0.684 | 0.675 | 6.370 | 0.076 | 0.451 | 0.019 | 0.979 | 51.901 | 0.020 | 602 | 0.478 | |
| OOF PSO para Balanceo | 1 | 956 | 0.650 | 0.709 | 0.740 | 4.820 | 0.295 | 0.000 | 0.199 | 0.559 | 62.907 | 0.151 | 600 | 0.479 | |
| OOF PSO para Balanceo + Reglas | 7.460 | 956 | 0.570 | 0.711 | 0.770 | 5.544 | 0.206 | 0.049 | 0.047 | 0.863 | 67.370 | 0.032 | 577 | 0.459 |
| 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.300 | 4644 | 0.623 | 0.703 | 0.700 | 9.351 | 0.088 | 0.655 | 0.045 | 0.967 | 60.219 | 0.060 | 0 | 0.488 | |
| SMOTE RSB* + Ruido Gaussiano + Reglas | 1.990 | 4644 | 0.505 | 0.686 | 0.705 | 7.605 | 0.088 | 0.655 | 0.034 | 0.961 | 160.200 | 0.060 | 0 | 0.475 | |
| CTGAN | 1.598 | 9642 | 0.601 | 0.568 | 0.525 | 5.440 | 0.128 | 0.495 | 0.089 | 0.937 | 390.185 | 0.084 | 0 | 0.437 | |
| CTGAN + Reglas del Dominio | 1.087 | 9642 | 0.508 | 0.554 | 0.505 | 3.822 | 0.127 | 0.495 | 0.064 | 0.929 | 507.186 | 0.082 | 0 | 0.490 | |
| TVAE | 1.003 | 9622 | 0.581 | 0.677 | 0.650 | 7.621 | 0.152 | 0.349 | 0.082 | 0.945 | 177.238 | 0.064 | 0 | 0.482 | |
| TVAE + Reglas del Dominio | 1.163 | 9622 | 0.573 | 0.681 | 0.665 | 7.704 | 0.152 | 0.349 | 0.077 | 0.947 | 305.999 | 0.063 | 0 | 0.487 | |
| OOF PSO para Aumento | 1.132 | 7519 | 0.557 | 0.637 | 0.600 | 2.749 | 0.422 | 0.000 | 0.579 | 0.672 | 378.163 | 0.191 | 0 | 0.468 | |
| OOF PSO para Aumento + Reglas | 9.501 | 7519 | 0.496 | 0.646 | 0.615 | 2.258 | 0.420 | 0.000 | 0.510 | 0.692 | 490.745 | 0.164 | 0 | 0.508 | |
| SMOTE RSB* Refinado | 1.439 | 5720 | 0.647 | 0.711 | 0.720 | 9.982 | 0.090 | 0.667 | 0.035 | 0.974 | 59.665 | 0.057 | 0 | 0.470 | 🏆 |
| SMOTE RSB* Refinado + Reglas | 2.152 | 5720 | 0.540 | 0.692 | 0.720 | 8.295 | 0.090 | 0.667 | 0.026 | 0.968 | 164.322 | 0.056 | 0 | 0.475 |
| 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.243 | 5600 | 0.617 | 0.690 | 0.690 | 8.204 | 0.086 | 0.636 | 0.038 | 0.970 | 111.335 | 0.049 | 371 | 0.479 | |
| SMOTE RSB* + Ruido Gaussiano + Reglas | 1.757 | 5600 | 0.534 | 0.676 | 0.695 | 6.732 | 0.086 | 0.636 | 0.029 | 0.965 | 211.331 | 0.049 | 371 | 0.480 | |
| CTGAN | 1.529 | 10598 | 0.630 | 0.598 | 0.555 | 5.178 | 0.121 | 0.523 | 0.076 | 0.940 | 450.335 | 0.076 | 191 | 0.576 | |
| CTGAN + Reglas del Dominio | 1.078 | 10598 | 0.534 | 0.599 | 0.555 | 3.673 | 0.121 | 0.523 | 0.054 | 0.934 | 567.408 | 0.075 | 192 | 0.510 | |
| TVAE | 1.002 | 10578 | 0.628 | 0.707 | 0.685 | 8.151 | 0.141 | 0.363 | 0.070 | 0.949 | 243.593 | 0.058 | 190 | 0.473 | |
| TVAE + Reglas del Dominio | 1.147 | 10578 | 0.617 | 0.714 | 0.705 | 8.320 | 0.141 | 0.363 | 0.065 | 0.951 | 371.990 | 0.058 | 190 | 0.482 | |
| OOF PSO para Aumento | 1.117 | 8475 | 0.637 | 0.725 | 0.735 | 5.602 | 0.376 | 0.000 | 0.411 | 0.682 | 436.379 | 0.171 | 233 | 0.451 | |
| OOF PSO para Aumento + Reglas | 6.098 | 8475 | 0.616 | 0.697 | 0.710 | 4.636 | 0.375 | 0.000 | 0.345 | 0.704 | 548.436 | 0.145 | 233 | 0.473 | |
| SMOTE RSB* Refinado | 1.365 | 6676 | 0.662 | 0.707 | 0.710 | 9.420 | 0.087 | 0.664 | 0.032 | 0.975 | 113.737 | 0.049 | 297 | 0.477 | 🏆 |
| SMOTE RSB* Refinado + Reglas | 1.911 | 6676 | 0.554 | 0.699 | 0.725 | 7.763 | 0.087 | 0.664 | 0.023 | 0.971 | 217.677 | 0.049 | 297 | 0.489 |
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 Medical Appointment No-Show Prediction (Version 1). figshare. https://doi.org/10.6084/m9.figshare.32934539.v1