Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Análisis Exploratorio de Datos (EDA): Integridad Clínica y Atributos Cardiovasculares

Authors
Affiliations
Universidad del Norte
Universidad del Norte
Universidad del Norte

Introducción

El presente proyecto aborda el desafío de la clasificación supervisada en el ámbito de la salud mediante el uso del dataset “Heart Failure Prediction”, con el objetivo de construir un modelo capaz de identificar el riesgo de patología coronaria a partir de indicadores clínicos y metabólicos. Esta iniciativa responde a una problemática crítica, ya que las enfermedades cardiovasculares (EC) se mantienen como la principal causa de muerte a nivel mundial (WHF, 2023), con tasas de mortalidad en adultos que alcanzan los 434.6 decesos por cada 100,000 habitantes en regiones como Estados Unidos (Woodruff et al., 2025). Más allá del algoritmo, el trabajo se enfoca en la implementación de un flujo completo de Machine Learning bajo principios de MLOps, garantizando un ciclo de vida robusto que abarca desde el análisis exploratorio hasta el monitoreo continuo, respondiendo así a la necesidad global de sistemas de vigilancia epidemiológica más consistentes (Townsend et al., 2021).

La relevancia de este enfoque técnico es evidente al observar la dinámica de las EC en las Américas, donde el aumento absoluto de casos debido al envejecimiento poblacional y la transición de la carga hacia países de medianos ingresos en América Latina exige estrategias de prevención más eficaces (Joseph et al., 2025). Factores de riesgo persistentes como la obesidad y la diabetes subrayan la urgencia de contar con herramientas de detección temprana que minimicen los falsos negativos, pues un diagnóstico omitido puede derivar en consecuencias fatales. Por lo tanto, la integración de este modelo en un entorno de MLOps busca no solo precisión estadística en la identificación del riesgo, sino una operatividad capaz de capturar interacciones complejas de los datos, mejorando sustancialmente la capacidad de respuesta clínica y la toma de decisiones oportunas en salud pública.

Distribución de la Variable de Respuesta

Inicialmente, se estudia la distribución de la variable objetivo (HeartDisease), la cual constituye el eje central de la estrategia de evaluación en este modelo de predicción clínica. Este indicador binario clasifica el estado del paciente en dos categorías: 0 para pacientes sin evidencia de enfermedad cardíaca y 1 para aquellos con presencia de la condición. Comprender el balance entre estas clases es un paso fundamental en el análisis exploratorio, ya que permite caracterizar la prevalencia del evento de interés dentro del conjunto de datos y establecer una base sólida para las comparaciones bivariadas subsiguientes.

El siguiente gráfico ilustra la distribución de la variable en el conjunto de datos:

Source
plot_categorical_distribution(
    df, column='HeartDisease', 
    display_name='Enfermedad Cardíaca',
    level_mapping={0: 'Ausencia (0)', 1: 'Presencia (1)'},
    title="Distribución de Enfermedad Cardíaca", ylabel="Porcentaje (%)"
)
Loading...

Tal como se observa en la figura, existe una distribución relativamente equilibrada entre ambas clases, con una ligera predominancia de pacientes diagnosticados con enfermedad cardíaca (55.3%) frente a aquellos sin la condición (44.7%). Esta proporción es favorable para el proceso de aprendizaje, ya que, a diferencia de escenarios con un desbalance severo, permite que el modelo capture de forma natural los patrones discriminantes de ambas categorías sin necesidad de recurrir a técnicas de remuestreo sintético.

Desde una perspectiva clínica, contar con una base de datos donde la clase positiva es ligeramente mayoritaria facilita el entrenamiento en la detección de casos críticos, lo cual es fundamental para minimizar los falsos negativos. En consecuencia, esta estructura proporciona un entorno adecuado para obtener una evaluación estable y representativa del desempeño, permitiendo que las métricas de clasificación reflejen con mayor fidelidad la capacidad del sistema para identificar el riesgo cardiovascular en condiciones reales.

Arquitectura del Conjunto de Datos

Una vez analizada la variable objetivo, es imperativo examinar la arquitectura del conjunto de datos para garantizar la integridad de la información y la validez de los resultados predictivos. En esta etapa, se evalúa la calidad de los atributos mediante la identificación de valores nulos y la verificación de la consistencia en los tipos de datos, lo cual permite distinguir entre variables con alta fidelidad informativa y aquellas cuya representatividad podría verse comprometida por la ausencia de registros.

Este diagnóstico facilita la caracterización técnica de los atributos, estableciendo la base del preprocesamiento al diferenciar claramente entre variables numéricas y categóricas. Dicha distinción es fundamental para estructurar un flujo de procesamiento coherente, definiendo estrategias específicas de escalamiento, codificación y tratamiento de datos faltantes que eviten inconsistencias en las etapas posteriores del pipeline. La siguiente tabla resume las variables presentes en el dataset junto a su tipificación técnica:

Source
column_types = df.dtypes
type_groups = {}

for col_name, dtype in column_types.items():
    type_groups[str(dtype)] = type_groups.get(str(dtype), []) + [col_name]

resumen_tipos = pd.DataFrame([
    {
        'Tipo de Dato': t, 
        'Cantidad': len(cols), 
        'Variables': ", ".join(cols)
    } 
    for t, cols in type_groups.items()
])

format_dict_tipos = {
    "Cantidad": lambda x: smart_format(x, "{:,.0f}")
}

styled_types = resumen_tipos.style.hide(axis='index').set_table_styles([
    {'selector': '', 'props': [('margin-left', 'auto'), ('margin-right', 'auto'),
                                 ('width', 'auto'), ('border-collapse', 'collapse')]},
    {'selector': 'th', 'props': [('text-align', 'center'), ('background-color', '#f2f2f2'),
                                   ('color', 'black'), ('font-weight', 'bold'),
                                   ('border', '1px solid black'), ('padding', '10px')]},
    {'selector': 'td', 'props': [('text-align', 'center'), ('border', '1px solid black'),
                                   ('padding', '10px')]}
])

styled_types = styled_types.set_properties(subset=['Tipo de Dato', 'Cantidad'], **{'text-align': 'center'})
styled_types = styled_types.set_properties(subset=['Variables'], **{'text-align': 'left'})
styled_types = styled_types.format(format_dict_tipos)
display(HTML("<div style='text-align: center; width: 100%;'>" + styled_types.to_html() + "</div>"))
Loading...

El conjunto de datos presenta una arquitectura mixta y equilibrada, donde las variables numéricas coexisten con atributos categóricos que describen dimensiones clínicas fundamentales como el sexo, el tipo de angina o los resultados electrocardiográficos. Un examen inicial de esta estructura confirma que no existen errores de asignación en los tipos de datos, lo que asegura que la naturaleza de cada columna es coherente con su significado médico. Esta diversidad en los datos reafirma la necesidad de un preprocesamiento capaz de aplicar transformaciones diferenciadas, garantizando un tratamiento estadístico adecuado para cada grupo de variables.

Por otro lado, el análisis de integridad mediante un mapa de densidad de información (missingness map) reveló una ausencia total de valores nulos explícitos en el conjunto de datos. Si bien este hallazgo es un indicador positivo de la completitud de los registros, no descarta la presencia de inconsistencias ocultas. Por lo tanto, resulta imperativo realizar una revisión detallada de las variables continuas para descartar el uso de valores de relleno o ‘placeholders’ que, bajo la apariencia de datos válidos, podrían alterar las distribuciones reales y sesgar las inferencias del modelo

Source
plot_missingness_map(df , title = 'Mapa de Densidad de Información (Missingness Map)',
                    xlabel= 'Atributos (Variables)', ylabel = 'Registros (Observaciones)')
Loading...

Análisis Univariado

En esta etapa se examina la distribución de probabilidad de las variables continuas con el objetivo de identificar posibles datos atípicos y evaluar desviaciones respecto a la distribución gaussiana. Para ello, se utilizan diagramas de cajas y análisis de densidad que permiten caracterizar la dispersión y los comportamientos extremos en el conjunto de datos. Es importante precisar que, si bien se emplean diversas herramientas diagnósticas, como la prueba de Lilliefors para normalidad o el filtro de Hampel para la detección de outliers, estas no se utilizan como criterio para eliminar información de forma indiscriminada ni para alterar la morfología natural de las variables.

El propósito de este diagnóstico es estrictamente analítico y preventivo. Solo en aquellos casos donde se encuentre evidencia inequívoca de errores de digitación o presencia de valores de relleno (placeholders) que carezcan de sentido clínico, los registros serán marcados como valores ausentes (NA) para su posterior imputación. De este modo, se garantiza que cualquier ajuste en el conjunto de datos responda a la corrección de inconsistencias técnicas y no a una manipulación de la variabilidad biológica, preservando así la integridad de las señales que el modelo deberá capturar.

Edad

La Edad (Age) es una de las variables demográficas más relevantes en el estudio de patologías cardiovasculares. Representa el tiempo de vida de los pacientes expresado en años y actúa como un marcador indirecto del envejecimiento vascular y del tiempo de exposición acumulativo a otros factores de riesgo. A continuación, se presentan dos figuras que detallan la morfología de esta variable en la muestra:

Source
plot_numeric_diagnostics(df,"Age" ,"Edad (años)", show_qq = True, spanish = True)
Loading...

En términos morfológicos, se observa una distribución notablemente simétrica con un marcado parecido a la distribución gaussiana teórica, concentrándose la mayor parte de los datos en el rango de los 40 a 70 años. Resulta fundamental destacar que el filtro de Hampel no detectó ninguna observación como posible dato atípico, lo cual confirma la integridad de la variable y la ausencia de ruidos extremos que pudieran distorsionar los estadísticos descriptivos.

No obstante, el Q-Q Plot revela leves desviaciones en las colas, donde los cuantiles observados se alejan sutilmente de la línea de referencia. Tales discrepancias, potenciadas por la alta sensibilidad estadística derivada del tamaño de la muestra (N=918N=918), conducen a que la prueba de Lilliefors identifique una falta de normalidad (D=0.063,p<0.001D=0.063, p < 0.001). Sin embargo, para efectos prácticos, la proximidad visual a la campana de Gauss y la solidez de la muestra indican que la distribución de la edad se aproxima de manera óptima a la normalidad.

Presión Arterial en Reposo

La Presión Arterial en Reposo (RestingBP) cuantifica la tensión sistólica del paciente en un estado de inactividad física, expresada habitualmente en mmHg. Clínicamente, este indicador es fundamental para la identificación de la hipertensión, factor que incrementa sustancialmente el riesgo de daño miocárdico y eventos vasculares. A continuación, se presentan las figuras que detallan la morfología de esta variable en la muestra

Source
plot_numeric_diagnostics(df,"RestingBP" ,"Presión Arterial en Reposo (mmHg)", show_qq = False, spanish = True)
Loading...

Se observa, en primera instancia, la presencia de un registro con un valor de 0 mmHg en la presión arterial, cifra que resulta clínicamente incompatible con la vida. Es altamente probable que dicho valor represente una notación equivocada o una codificación errónea de información faltante durante la recolección de los datos. Dado que esta observación carece de validez fisiológica y distorsiona severamente los cálculos de tendencia central y dispersión, se procede a su retiro del dataset para asegurar la calidad de la auditoría. A continuación, se presenta la distribución de la presión arterial en reposo después de la exclusión del registro de la base de datos:

Source
df['RestingBP'] = df['RestingBP'].replace(0, np.nan)
plot_numeric_diagnostics(df,"RestingBP" ,"Presión Arterial en Reposo (mmHg)", show_qq = False, ylim=(0, 0.05), spanish = True)
Loading...

Tras la exclusión del registro, la morfología de la Presión Arterial en Reposo revela una distribución mucho más coherente con la realidad fisiológica, concentrándose la mayor parte de la muestra en el rango de los 100 a 170 mmHg. Al eliminar la distorsión que generaba el valor de 0 mmHg, el histograma permite apreciar una asimetría positiva moderada, característica de las variables clínicas donde los valores elevados representan condiciones patológicas como la hipertensión sistólica.

Resulta fundamental evaluar las observaciones que el filtro de Hampel marca como posibles atípicos por encima de los 175 mmHg. Si bien estos puntos se encuentran estadísticamente alejados de la tendencia central, no se hallan evidencias de que correspondan a errores de digitación o fallos en la captura de la información. Por el contrario, dichos valores se sitúan dentro del rango clínico esperado para pacientes con enfermedad coronaria severa o en crisis hipertensivas.

Dado que estas observaciones no violan la lógica biológica y representan casos reales de alto riesgo, se mantendrán en el dataset como atípicos de negocio (business outliers). Su permanencia es vital para el modelado predictivo, ya que aportan información crítica sobre los extremos de gravedad en la población estudiada.

Colesterol

El Colesterol Sérico (Cholesterol) representa la concentración de lípidos en el torrente sanguíneo, medida habitualmente en mg/dL. En el ámbito de la medicina cardiovascular, este parámetro constituye un indicador crítico para la evaluación del riesgo de aterosclerosis y el desarrollo de patologías coronarias obstructivas. A continuación, se presentan las figuras que detallan la morfología y el comportamiento estadístico de esta variable en la muestra, facilitando la identificación de la distribución de los niveles lipídicos y la detección de posibles anomalías o valores atípicos en los registros.

Source
plot_numeric_diagnostics(df,"Cholesterol" ,"Colesterol Sérico (Mg/dl)", show_qq = False, ylim=(0, 0.013), spanish = True)
Loading...

Los gráficos revelan la presencia de 172 registros con un valor de 0 mg/dL en el colesterol sérico, lo cual representa el 18.74% de la muestra total. Esta cifra resulta clínicamente incompatible con los procesos fisiológicos básicos y la viabilidad celular, por lo que es altamente probable que dichos valores correspondan a una codificación errónea de información no recolectada o a fallos en la digitalización de los datos durante la etapa de captura. Debido a que estas observaciones carecen de validez biológica y distorsionan severamente los estadísticos de tendencia central y dispersión, se procede a su exclusión de este análisis morfológico para asegurar la integridad de la auditoría. A continuación, se presenta la distribución del colesterol sérico tras la omisión de estos valores nulos:

df['Cholesterol'] = df['Cholesterol'].replace(0, np.nan)
plot_numeric_diagnostics(df,"Cholesterol" ,"Colesterol Sérico (Mg/dl)", show_qq = False, ylim=(0, 0.013), spanish = True)
Loading...

Tras la exclusión de las observaciones problemáticas identificadas previamente, las figuras indican un sesgo positivo considerablemente más acentuado que el observado en la presión arterial. Esta asimetría hacia la derecha confirma que, en el caso del colesterol sérico, el resultado de la prueba de Lilliefors (D=0.056,p<0.001D = 0.056, p < 0.001) resulta relevante y refleja una desviación genuina de la normalidad teórica. Dicha divergencia trasciende el simple efecto del tamaño de la muestra y se manifiesta con claridad en la notable longitud de la cola superior del histograma.

Respecto a las observaciones identificadas por el filtro de Hampel, se visualizan registros que superan el límite superior de aproximadamente 380 mg/dL, alcanzando incluso valores cercanos a los 600 mg/dL. Si bien estas cifras son estadísticamente atípicas, no exceden los límites fisiológicos documentados en cuadros clínicos de hipercolesterolemia severa o de origen genético. En consecuencia, tales registros no se consideran errores de digitalización, sino atípicos de negocio debido a su relevancia clínica para la identificación de perfiles de alto riesgo cardiovascular. Por lo tanto, se recomienda su permanencia en el conjunto de datos para preservar la representatividad de los casos críticos en los análisis posteriores.

Frecuencia Cardíaca Máxima

La Frecuencia Cardíaca Máxima (MaxHR) registra el nivel más alto de latidos por minuto alcanzado por el paciente, generalmente durante una prueba de esfuerzo o actividad física intensa. En el contexto de la medicina cardiovascular, este parámetro es un indicador fundamental de la capacidad cronotrópica del corazón y de la respuesta del sistema nervioso simpático. La reducción de este valor suele estar asociada tanto al envejecimiento natural como a la presencia de ciertas patologías cardíacas o al efecto de medicamentos beta-bloqueadores. A continuación, se presentan las figuras que detallan la morfología y el comportamiento estadístico de esta variable:

Source
plot_numeric_diagnostics(df,"MaxHR" ,"Frecuencia Cardíaca Máxima (BPM)", show_qq = True, ylim=(0, 0.018), spanish = True)
Loading...

En términos morfológicos, la Frecuencia Cardíaca Máxima presenta un rango empírico que oscila entre los 60 y 202 BPM, valores que se sitúan plenamente dentro de los límites fisiológicamente posibles para la población de estudio. La distribución muestra una concentración principal de los registros entre los 100 y 180 BPM. Este intervalo resulta altamente coherente con la naturaleza de la muestra, compuesta mayoritariamente por adultos de entre 40 y 70 años evaluados en un contexto de enfermedad cardíaca; dicho rango abarca desde las respuestas cronotrópicas moderadas hasta los límites fisiológicos esperados en pruebas de esfuerzo para este grupo etario. Es pertinente señalar que el filtro de Hampel no identificó ninguna observación como dato atípico, lo cual, sumado a la validez clínica del rango detectado, refuerza la consistencia interna de la variable y la ausencia de ruidos extremos o errores de digitalización en el conjunto de datos.

Al igual que en el análisis de la edad, aunque la prueba de Lilliefors (D=0.047,p<0.001D=0.047, p < 0.001) indica desviaciones estadísticamente significativas de la normalidad, la inspección visual revela una distribución predominantemente simétrica y equilibrada. El gráfico Q-Q Plot confirma esta tendencia al mostrar que los cuantiles observados se ajustan satisfactoriamente a la línea de referencia, exhibiendo únicamente discrepancias leves en los extremos superiores. En consecuencia, para efectos prácticos, la variable exhibe una aproximación óptima a la distribución normal, manteniendo un comportamiento visualmente consistente con las expectativas teóricas para este indicador.

Oldpeak

La variable Oldpeak cuantifica la depresión del segmento ST inducida por el ejercicio en comparación con el estado de reposo, medida habitualmente en milímetros (mm) mediante una prueba de esfuerzo. En la práctica cardiológica, este parámetro constituye uno de los indicadores no invasivos más valiosos para detectar isquemia miocárdica, ya que una desviación pronunciada del segmento ST suele correlacionarse con una obstrucción significativa de las arterias coronarias. A continuación, se presentan las figuras que detallan la morfología y el comportamiento estadístico de esta variable, permitiendo analizar su distribución y la presencia de valores que, por su magnitud, podrían señalar condiciones críticas de salud cardiovascular.

Source
plot_numeric_diagnostics(df,"Oldpeak" ,"Depresión del segmento ST (mm)", show_qq = False,  ylim=(0, 1.6), spanish = True)
Loading...

En términos morfológicos, la depresión del segmento ST (Oldpeak) presenta un rango empírico de -2.6 a 6.2 mm, con una alta concentración de registros en 0 mm. Se identifica un grupo minoritario de 13 registros (1.42%) con valores negativos que, aunque la variable se define como depresión, representan técnicamente una elevación del segmento ST. Dado que la elevación es un hallazgo electrofisiológico documentado en condiciones como el espasmo coronario o la repolarización precoz, estos datos se consideran biológicamente válidos y reflejan la diversidad clínica de la muestra, descartándose como errores de captura.

La distribución exhibe un sesgo positivo extremo, lo que resulta en una morfología claramente desviada de la normalidad, siendo esta la variable con mayor asimetría del dataset. Respecto al filtro de Hampel, aunque se señalan como atípicos los valores superiores a 3.3 mm, registros de hasta 6 mm son fisiológicamente posibles en cuadros de isquemia miocárdica severa. Por tanto, estas observaciones se mantienen como atípicos de negocio de alta relevancia clínica, ya que representan precisamente los casos con mayor probabilidad de compromiso cardiovascular crítico en esta base de datos.

Síntesis y Resumen Descriptivo

Tras concluir el análisis detallado de las dimensiones cuantitativas, se procede a consolidar un panorama general de la integridad del dataset. Es imperativo señalar que, si bien los reportes preliminares sugerían una ausencia total de registros nulos, la inspección técnica permitió identificar que las variables de Colesterol Sérico (Cholesterol) y Presión Arterial en Reposo (RestingBP) presentan datos faltantes (codificados originalmente como ceros). No obstante, dado que en ambos casos la proporción de inconsistencias se mantiene por debajo del 20%, la imputación se perfila como una opción estadísticamente viable para preservar la integridad de la muestra. El siguiente gráfico ilustra la proporción de datos faltantes identificados en cada atributo:

Source
df_analisis = df.copy()
df_analisis['RestingBP'] = df_analisis['RestingBP'].replace(0, np.nan)
df_analisis['Cholesterol'] = df_analisis['Cholesterol'].replace(0, np.nan)

m_counts = df_analisis.isnull().sum()
m_counts = m_counts[m_counts > 0]
m_pcts = (m_counts / len(df_analisis)) * 100

plt.rcParams.update({
    'axes.edgecolor': 'black',
    'axes.linewidth': 1.5 
})
sns.set_style("white")

fig, ax = plt.subplots(figsize=(7, 5))
colors_c = ['#d62728', '#1f77b4']

bars = ax.bar(
    m_pcts.index, 
    m_pcts.values, 
    color=colors_c[:len(m_pcts)], 
    edgecolor='black', 
    alpha=0.8, 
    width=0.6
)

ax.set_ylim(0, 110)
ax.set_yticks(np.arange(0, 101, 10))
ax.set_title("Proporción de Datos Faltantes (%)", fontsize=12, fontweight='bold', pad=15)
ax.set_ylabel("Porcentaje (%)", fontsize=11, fontweight='bold')
ax.set_xlabel("Atributos con Inconsistencias", fontsize=11, fontweight='bold', labelpad=10)

ax.yaxis.grid(True, linestyle='--', alpha=0.4)

for i, bar in enumerate(bars):
    height = bar.get_height()
    n_val = m_counts.iloc[i]
    ax.text(
        bar.get_x() + bar.get_width() / 2., height + 2,
        f'{int(n_val):,}', 
        ha='center', va='bottom',
        fontsize=13, fontweight='bold'
    )

for spine in ax.spines.values():
    spine.set_visible(True)

plt.tight_layout()

buf = io.BytesIO()
fig.savefig(buf, format='png', bbox_inches='tight', dpi=100)
plt.close(fig)
data = base64.b64encode(buf.getbuffer()).decode("ascii")

display(HTML(f"""
<div style="text-align: center; width: 100%;">
    <img src="data:image/png;base64,{data}">
</div>
"""))
Loading...

Es fundamental establecer una distinción metodológica entre ambos hallazgos. Mientras que la ausencia de un único registro en RestingBP representa un evento aislado cuya imputación no compromete la estructura estocástica del dataset, el volumen de datos faltantes en Cholesterol (18.7%) exige un análisis riguroso de sus mecanismos de pérdida.

Para determinar si estamos ante un escenario de datos faltantes completamente al azar (MCAR) o si existe un sesgo sistemático (MAR), se implementa un diseño de pruebas de asociación. Este análisis utiliza el coeficiente de V de Cramér (basado en χ2\chi^2) para las dimensiones categóricas y la prueba U de Mann-Whitney para las continuas. El objetivo es contrastar si el subgrupo de pacientes con valores omitidos difiere significativamente en su perfil clínico respecto a aquellos con registros completos. Esta validación es un paso crítico, ya que la detección de efectos medianos o grandes en estas pruebas obligaría a descartar imputaciones simples en favor de modelos multivariados más robustos, preservando así la validez de las inferencias posteriores.

Source
df_missing_analysis = df.copy()
df_missing_analysis['Cholesterol_Missing'] = df_missing_analysis['Cholesterol'].isna().astype(int)
cat_vars = ['Sex', 'ChestPainType', 'FastingBS', 'RestingECG', 'ExerciseAngina', 'ST_Slope', 'HeartDisease']
analyze_chi2_association(df_missing_analysis, target = 'Cholesterol_Missing', feature_list = cat_vars, spanish=True)
Loading...

Los resultados del análisis de asociación mediante χ2\chi^2 y V de Cramér evidencian una dependencia sistemática entre la omisión de registros en Cholesterol y el perfil clínico de los pacientes. En particular, las variables FastingBS y HeartDisease presentan una asociación de tamaño mediano (V=0.32V = 0.32, p<0.001p < 0.001), lo que sugiere que la probabilidad de encontrar un valor faltante es significativamente mayor en pacientes con glucemia elevada o con un diagnóstico positivo de enfermedad cardíaca. Este hallazgo es consistente con un mecanismo de datos faltantes en el azar (MAR, Missing At Random), donde la “incompletitud” del dato está condicionada por otras variables observadas en el dataset.

Desde una perspectiva metodológica, la presencia de estas asociaciones significativas invalida el uso de técnicas de imputación simple (como el reemplazo por la media o mediana), ya que estas ignorarían la estructura de correlación identificada y podrían introducir sesgos artificiales en las distribuciones. Por el contrario, la evidencia de un mecanismo MAR robustece la necesidad de implementar algoritmos de imputación multivariada —como MICE o IterativeImputer— que sean capaces de reconstruir los valores de colesterol aprovechando la información predictiva presente en el resto de los atributos clínicos, preservando así la integridad estocástica necesaria para el entrenamiento de los modelos de clasificación.

Análisis más detallados de la distribución por grupo revelan que la falta de registros de colesterol se concentra de manera desproporcionada en los perfiles de mayor riesgo clínico. Mientras que en pacientes con glucemia normal la omisión es marginal, en el grupo con Glucemia Elevada (>120 mg/dl) el dato falta en el 41.7% de los sujetos (89 de 214). Esta asimetría se replica en el diagnóstico principal: en el grupo con Presencia de EC, el nulo afecta a 152 personas (casi el 30% del nivel), frente a solo 20 casos detectados en el grupo sano. La evidencia visual confirma que el perfil lipídico dejó de registrarse sistemáticamente en los pacientes con comorbilidades metabólicas y diagnóstico positivo, dejando un vacío de información precisamente donde el marcador de colesterol es más crítico para la caracterización del riesgo cardiovascular.

Source
plot_categorical_association(
    df_missing_analysis, 
    column='FastingBS', 
    target='Cholesterol_Missing',
    display_name='Glucemia en Ayunas', 
    level_mapping={'0': 'Normal (≤120)', '1': 'Elevada (>120)'},
    target_mapping={'0': 'Con Registro', '1': 'Faltante (NA)'},
    legend_title='Estado del Dato',
    legend_position='upper left', spanish = True
)
Loading...

Similarmente, la desagregación por diagnóstico clínico ratifica que el vacío de información lipídica se concentra en la población de mayor riesgo. Como se observa en la gráfica, mientras que en pacientes con Ausencia de EC la omisión del registro es marginal (solo 20 casos), en el grupo con Presencia de EC la proporción de datos faltantes se dispara significativamente, afectando a 152 pacientes (casi el 30% del nivel). Esta marcada asimetría confirma que el perfil lipídico dejó de registrarse sistemáticamente en los pacientes con diagnóstico positivo, dejando un vacío de información precisamente donde el marcador de colesterol es más crítico para la caracterización del riesgo cardiovascular.

Source
plot_categorical_association(
    df_missing_analysis, 
    column='HeartDisease', 
    target='Cholesterol_Missing',
    display_name='Presencia de Enfermedad Cardíaca', 
    level_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'},
    target_mapping={'0': 'Con Registro', '1': 'Faltante (NA)'},
    legend_title='Estado del Dato',
    legend_position='upper right', spanish = True
)
Loading...

Al evaluar las variables numéricas mediante la prueba U de Mann-Whitney, se observa que la mayoría de los atributos presentan tamaños de efecto despreciables (r<0.1r < 0.1), lo que inicialmente sugeriría un comportamiento cercano a la aleatoriedad. No obstante, las variables MaxHR (r=0.27r = 0.27, p<0.001p < 0.001) y Age (p<0.001p < 0.001) muestran diferencias estadísticamente significativas que no deben ignorarse.

Específicamente, el grupo con datos ausentes de colesterol tiende a ser mayor (mediana de 57.5 años frente a 54.0) y a presentar una frecuencia cardíaca máxima significativamente menor (120 bpm frente a 140 bpm). Clínicamente, una MaxHR baja suele estar asociada a una menor reserva cronotrópica o a una mayor severidad del cuadro cardiovascular. Este hallazgo refuerza la tendencia observada en las variables categóricas: los datos faltantes no se distribuyen uniformemente, sino que se concentran en pacientes con un perfil clínico ligeramente más envejecido y con indicadores de mayor compromiso funcional. Aunque el efecto es pequeño según Rosenthal, la convergencia de estas diferencias con el diagnóstico de enfermedad cardíaca confirma que el mecanismo de pérdida está anclado a la gravedad del paciente.

Source
numeric_cols = ['Age', 'RestingBP', 'MaxHR', 'Oldpeak']
analyze_continuous_association(df = df_missing_analysis, target = 'Cholesterol_Missing', numeric_features = numeric_cols,
    correction_method = "holm", spanish = True, group_names = ("Presente", "Faltante")) 
Loading...

En general, el diagnóstico de los mecanismos de ausencia revela que la falta de información en la variable Cholesterol no es un fenómeno aleatorio, sino un evento sistemático vinculado a la severidad del cuadro clínico del paciente. La convergencia de una asociación mediana con el diagnóstico de HeartDisease y la Glucemia Elevada, sumada a las diferencias significativas en la MaxHR y la Edad, confirma un mecanismo de datos faltantes en el azar (MAR). Los perfiles con mayor compromiso cardiovascular y metabólico son precisamente los que presentan una mayor tasa de omisión, lo que invalida cualquier técnica de imputación simple que ignore estas correlaciones. En consecuencia, la integridad del análisis posterior depende de una estrategia de imputación multivariada que sea capaz de reconstruir el perfil lipídico aprovechando la estructura de dependencia identificada, asegurando que no se subestime el riesgo en la subpoblación más vulnerable del dataset.

Para concluir la caracterización detallada de las dimensiones cuantitativas, se presenta una síntesis estadística que consolida el comportamiento de la muestra. Esta sección de cierre integra una tabla de estadísticos descriptivos que permite visualizar, de manera conjunta, la tendencia central, la variabilidad y los rangos de cada atributo. Dicho resumen no solo sirve como una referencia técnica de la “anatomía” de los datos, sino que actúa como el punto de validación final para confirmar que la base de datos es robusta y coherente antes de iniciar la exploración de los perfiles categóricos y la prevalencia de la patología en el dataset.

Source
numeric_cols = ['Age', 'RestingBP', 'Cholesterol', 'MaxHR', 'Oldpeak']
plot_descriptive_summary(df, numeric_cols, spanish = True)
Loading...

Al consolidar el análisis cuantitativo, se observa una clara concordancia entre la inspección visual y los coeficientes de forma. Las variables de Edad, Presión Arterial (RestingBP) y Frecuencia Cardíaca Máxima (MaxHR) destacan por presentar los niveles más bajos de asimetría y curtosis, ratificándose como las dimensiones más simétricas y estables del dataset. Este equilibrio estadístico facilita su posterior modelado y contrasta con la marcada distorsión de Oldpeak, cuya asimetría extrema es un reflejo fiel de la naturaleza clínica del marcador isquémico. Con esta validación final de los descriptores de tendencia central y dispersión, se cierra la fase numérica asegurando una base sólida para la transición hacia el análisis de las variables categóricas.

Análisis Bivariado

Relación entre Variables Categóricas y la Variable Objetivo

Habiendo consolidado el perfil cuantitativo de la muestra, esta sección aborda la Relación entre Variables Categóricas y la Variable Objetivo. Si bien la descripción individual de estos atributos se omitió en las etapas iniciales en aras de la brevedad, ahora se retoman para identificar los patrones clínicos más determinantes. Para orientar este análisis y evitar una exploración redundante, se ejecutaron múltiples pruebas de independencia Chi-cuadrado de Pearson como filtro preliminar. El criterio rector para seleccionar qué variables presentar no fue únicamente su significancia estadística, sino la magnitud de su tamaño del efecto (V de Cramér). En consecuencia, la caracterización visual y clínica que se desarrolla a continuación se concentra de manera exclusiva en aquellas características que demostraron un poder discriminativo sustancial, priorizando estrictamente las asociaciones clasificadas con un efecto mediano o grande sobre la presencia de la enfermedad cardíaca.

Source
cat_vars = ['Sex', 'ChestPainType', 'FastingBS', 'RestingECG', 'ExerciseAngina', 'ST_Slope']
analyze_chi2_association(df, target = 'HeartDisease', feature_list = cat_vars, spanish=True)
Loading...

El análisis de asociación revela una jerarquía predictiva clara, destacando el protagonismo de las variables categóricas con tamaños de efecto grande y mediano. Los atributos con mayor capacidad discriminativa son la morfología de la pendiente del segmento ST (ST_Slope, V=0.62V = 0.62) y el tipo de dolor torácico (ChestPainType, V=0.54V = 0.54), los cuales exhiben un efecto de magnitud grande y se consolidan como los marcadores clínicos más robustos de la patología. En un segundo nivel de relevancia, pero manteniendo un impacto predictivo sustancial (efecto mediano), se encuentran la presencia de angina inducida por el esfuerzo (ExerciseAngina, V=0.49V = 0.49) y el sexo del paciente (Sex, V=0.31V = 0.31), factores que complementan el perfil de riesgo del paciente bajo estrés cardiovascular y consideraciones epidemiológicas.

Por el contrario, los factores restantes demostraron un poder de asociación menor y no serán el foco principal de la exploración visual. La glucemia en ayunas (FastingBS, V=0.27V = 0.27) refleja un tamaño de efecto pequeño, mientras que la lectura del electrocardiograma en reposo (RestingECG, V=0.08V = 0.08) presenta una asociación clínicamente despreciable frente a la variable objetivo; esto indica que, aunque puedan aportar contexto sistémico, su capacidad para discriminar la presencia de la enfermedad de forma aislada se considera, a priori, limitada.

La distribución de la Pendiente del Segmento ST (ST_Slope), la variable con mayor fuerza de asociación en el análisis, revela un patrón de riesgo fuertemente segmentado. La prevalencia intragrupo muestra que los pacientes con una pendiente horizontal o descendente presentan una incidencia de enfermedad cardíaca cercana al 80%. Este comportamiento concuerda de manera estricta con la expectativa clínica estándar, ya que ambas alteraciones morfológicas en un electrocardiograma de esfuerzo son signos directos de isquemia, evidenciando dificultades en la recuperación eléctrica del ventrículo. Por el contrario, la pendiente ascendente representa la adaptación fisiológica normal de un corazón sano ante el aumento de la demanda metabólica, lo cual se corrobora en los datos al observar que aproximadamente el 80% de los individuos de esta categoría están libres de la patología. Esta marcada polarización empírica entre la respuesta sana y la isquémica explica por qué esta medición constituye el predictor categórico más robusto para la clasificación.

Source
plot_categorical_association(
    df, 
    column='ST_Slope', 
    target='HeartDisease',
    display_name='Pendiente del segmento ST', 
    level_mapping={'Flat': 'Horizontal', 'Up': 'Ascendente', 'Down': 'Descendente'},
    target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'},
    legend_title='Estado de Salud',
    legend_position='upper left', spanish = True
)
Loading...

El análisis del Tipo de Dolor Torácico (ChestPainType), la segunda variable con mayor capacidad de discriminación, expone una dinámica clínica que subraya la importancia del diagnóstico diferencial. Al examinar la prevalencia de la enfermedad según la sintomatología, se constata que la angina atípica (ATA) y el dolor no anginoso (NAP) presentan una asociación comparativamente baja con la patología, superando el 80% y rondando el 65% de casos sanos en sus respectivas categorías. Por el contrario, la angina típica (TA) se comporta conforme a los modelos médicos tradicionales, al registrarse una mayor frecuencia relativa de la enfermedad frente a su ausencia. No obstante, el hallazgo empírico más crítico reside en el grupo asintomático (ASY), el cual concentra la mayor carga de morbilidad del conjunto de datos: cerca del 80% de los pacientes que no refieren dolor torácico convencional padece de hecho la enfermedad. Este perfil subraya el riesgo inherente de la isquemia silente en poblaciones de alto riesgo, donde la ausencia del síntoma clásico no constituye un criterio válido de exclusión clínica.

Source
plot_categorical_association(
    df, 
    column='ChestPainType', 
    target='HeartDisease',
    display_name='Tipo de Dolor Torácico', 
    level_mapping={'TA': 'Angina Típica', 'ATA': 'Angina Atípica', 'NAP': 'Dolor No Anginoso','ASY': 'Asintomático'},
    target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'},
    legend_title='Estado de Salud',
    legend_position='upper right', spanish = True
)
Loading...

La distribución de la Angina Inducida por el Ejercicio (ExerciseAngina), clasificada con un tamaño de efecto moderado en la estratificación previa, refuerza la prominencia de la respuesta del paciente bajo estrés fisiológico. El análisis de la prevalencia relativa revela que la ausencia de este síntoma está predominantemente asociada con un estado de salud cardiovascular, agrupando a un 65% de pacientes libres de la afección frente a un 35% con diagnóstico positivo. En marcada oposición, la aparición de dolor anginoso durante la prueba física opera como un fuerte indicador de compromiso coronario, con una prevalencia de enfermedad que se eleva drásticamente hasta alcanzar el 85% de los casos en este subgrupo. Esta acentuada disparidad subraya empíricamente que, si bien la ausencia de angina de esfuerzo no descarta completamente la afección, su manifestación clínica constituye una señal inequívoca de insuficiencia isquémica.

Source
plot_categorical_association(
    df, 
    column='ExerciseAngina', 
    target='HeartDisease',
    display_name='Angina de Esfuerzo', 
    level_mapping={'Y': 'Sí', 'N': 'No'},
    target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'},
    legend_title='Estado de Salud',
    legend_position='upper left', spanish = True
)
Loading...

Finalmente, la exploración del sexo refleja patrones epidemiológicos bien documentados en la literatura cardiovascular. La distribución proporcional intra-grupo evidencia una disparidad sustancial en la prevalencia de la enfermedad según el sexo biológico. En el grupo femenino, la ausencia de la patología es el escenario predominante, aglutinando aproximadamente al 75% de los casos frente a un 25% de incidencia positiva. En contraposición, la cohorte masculina muestra una inversión drástica de esta tendencia, con una prevalencia de la enfermedad cercana al 65%, superando ampliamente a los individuos sanos dentro de esta misma categoría. Esta divergencia clínica, que subraya una mayor vulnerabilidad masculina en este conjunto de datos, sugiere que el sexo opera como un factor de estratificación de riesgo pertinente, aun cuando no alcance el poder predictivo individual de los marcadores dinámicos de esfuerzo como ST_Slope.

Source
plot_categorical_association(
    df, 
    column='Sex', 
    target='HeartDisease',
    display_name='Sexo', 
    level_mapping={'M': 'Masculino', 'F': 'Femenino'},
    target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'},
    legend_title='Estado de Salud',
    legend_position='upper left', spanish = True
)
Loading...

A modo de síntesis, la exploración desarrollada en esta sección aportó evidencia empírica de que la base de datos contiene indicadores categóricos altamente sólidos para la tarea de clasificación de los pacientes. El análisis de asociación y las distribuciones proporcionales permitieron constatar que el poder discriminativo del conjunto de datos se sustenta en una convergencia de factores de distinta naturaleza; destacando tanto marcadores clínicos directos como determinantes demográficos estructurales, ejemplificados por la influencia del sexo biológico. La comprobada robustez individual de estas variables establece una cimentación analítica rigurosa y pertinente para la futura estructuración de modelos predictivos.

Relación entre Variables Numéricas y la Variable Objetivo

Siguiendo la estructura analítica previa, esta sección aborda las Diferencias entre Grupos para las Variables Numéricas. Partiendo de la caracterización individual detallada en el análisis univariado, el enfoque transita ahora hacia la identificación de los patrones clínicos más determinantes. Para orientar este análisis y evitar una exploración redundante, se ejecutaron múltiples pruebas U de Mann-Whitney como filtro preliminar. El criterio rector para seleccionar qué distribuciones presentar no fue únicamente su significancia estadística, sino la magnitud de su tamaño del efecto (r de Rosenthal). Por consiguiente, el análisis visual y clínico se restringirá a los indicadores numéricos que exhiben una separación empírica sustancial.

Source
numeric_cols = ['Age', 'RestingBP', 'Cholesterol', 'MaxHR', 'Oldpeak']
analyze_continuous_association(df, target = 'HeartDisease', numeric_features = numeric_cols,
    correction_method = "holm", spanish = True, group_names = ("Sin EC", "Con EC")) 
Loading...

El escrutinio de las variables numéricas mediante la prueba U de Mann-Whitney revela que ninguna de las características continuas alcanza un tamaño de efecto catalogado como grande. No obstante, el análisis identifica marcadores con un poder discriminativo moderado que resultan clínicamente relevantes. La frecuencia cardíaca máxima (MaxHR) y la depresión del segmento ST (Oldpeak) se posicionan como las variables con mayor capacidad de separación, ambas con un efecto mediano (r=0.40r = 0.40). Esto evidencia que sus distribuciones de probabilidad global difieren de manera sustancial y sistemática entre los pacientes sanos y aquellos con la patología. Adicionalmente, el comportamiento heterocedástico observado en ambos casos indica que la dispersión intrínseca de estos parámetros biológicos se altera de forma asimétrica ante la presencia de la enfermedad.

Por el contrario, el resto de los parámetros evaluados mostraron una divergencia poblacional estadísticamente débil. La edad (Age, r=0.28r = 0.28) y la presión arterial en reposo (RestingBP, r=0.11r = 0.11) apenas alcanzan tamaños de efecto pequeños, lo que sugiere una superposición considerable en sus distribuciones de probabilidad entre ambos grupos de diagnóstico. Asimismo, las discrepancias globales en la distribución del colesterol (Cholesterol) ostentan el tamaño de efecto más bajo del conjunto (r=0.05r = 0.05), indicando que, al menos de forma aislada e incondicional, este biomarcador no proporciona una frontera analítica clara para distinguir el estado de salud cardiovascular de los pacientes.

La visualización de la Frecuencia Cardíaca Máxima Alcanzada (MaxHR), clasificada con un tamaño de efecto moderado en la estratificación previa, refuerza la prominencia de la capacidad de respuesta cardiovascular del paciente bajo estrés fisiológico. El análisis de las distribuciones de densidad revela que alcanzar frecuencias cardíacas elevadas durante el ejercicio está predominantemente asociado con un estado de salud, donde la curva de los pacientes libres de la afección (color azul) se concentra visiblemente hacia el extremo superior del espectro, con un pico de densidad alrededor de los 160 latidos por minuto. En marcada oposición, la incapacidad de elevar sustancialmente el ritmo cardíaco opera como un fuerte indicador de compromiso coronario. La distribución de los pacientes con diagnóstico positivo (color rojo) se encuentra francamente desplazada hacia la izquierda, concentrando su mayor densidad cerca de los 120 latidos por minuto. Esta acentuada disparidad subraya empíricamente que, si bien alcanzar una frecuencia alta no inmuniza contra la afección, la limitación cronotrópica durante la prueba física constituye un marcador claro de insuficiencia isquémica.

Source
plot_numeric_distribution(df, 'MaxHR', display_name='Frecuencia Cardíaca Máxima (BPM)',
                          legend_position='upper left', legend_title='Estado de Salud',
                          target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'}, spanish = True)
Loading...

Por otro lado, la evaluación de la depresión del segmento ST inducida por el ejercicio (Oldpeak), que también exhibió un tamaño de efecto moderado en la caracterización estadística, expone una dinámica clínica que subraya la relevancia de las alteraciones electrocardiográficas. El análisis de las densidades probabilísticas revela que la ausencia de depresión significativa (valores cercanos a 0 mm) está predominantemente asociada con un estado de salud cardiovascular, concentrando la mayor parte de los pacientes libres de la afección en torno al origen del eje. En constraste, la manifestación de valores elevados de Oldpeak durante la prueba física opera como un fuerte indicador de compromiso coronario. La distribución de los pacientes con diagnóstico positivo se encuentra drásticamente desplazada hacia la derecha, exhibiendo una cola pesada que documenta la prevalencia de la enfermedad en niveles superiores a 1 mm. Estas diferenicas sugieren que, si bien una ligera variación en el segmento ST no confirma de forma absoluta la patología, una depresión profunda constituye un marcador crítico de la presencia de enfermedad cardíaca.

Source
plot_numeric_distribution(df, 'Oldpeak', display_name='Oldpeak (mm)',
                          legend_position='upper right',
                          legend_title='Estado de Salud',
                          target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'}, spanish = True)
Loading...

Finalmente, el análisis de la edad, que presentó un tamaño de efecto pequeño en la fase de filtrado, permite observar la transición del riesgo cardiovascular a través del ciclo vital. El examen de las densidades probabilísticas revela que los pacientes libres de la afección tienden a concentrarse en rangos de edad más jóvenes, con un pico de densidad situado cerca de los 45 años. En contraste, la distribución de los pacientes con diagnóstico positivo muestra un desplazamiento progresivo hacia la derecha, alcanzando su mayor concentración alrededor de los 58 años. Esta divergencia sugiere que, si bien la enfermedad no es exclusiva de la madurez, la probabilidad de presentar un compromiso coronario aumenta sistemáticamente con el envejecimiento, reflejando el carácter acumulativo de los factores de riesgo biológicos. No obstante, la amplia superposición entre ambas curvas confirma que la edad, por sí misma, posee una capacidad discriminativa inferior a la de los marcadores dinámicos obtenidos bajo estrés físico.

Source
plot_numeric_distribution(df, 'Age', display_name='Edad (años)',
                          legend_position='upper left',
                          legend_title='Estado de Salud',
                          target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'}, spanish = True)
Loading...

Análisis de Dependencia

En esta sección se evalúa la relación estadística entre las variables del conjunto de datos y su capacidad discriminativa respecto a la presencia de enfermedad cardiovascular. Dado que los análisis previos sugieren distribuciones no gaussianas y relaciones potencialmente no lineales, se emplea inicialmente la correlación de rangos de Spearman para identificar asociaciones monótonas entre pares de variables continuas. Posteriormente, para capturar dependencias de orden superior y manejar la naturaleza mixta (numérica y categórica) del dataset, se implementa un análisis de Información Mutua (MI) en conjunto con el algoritmo de Mínima Redundancia y Máxima Relevancia (mRMR). Este enfoque híbrido permite no solo cuantificar la relevancia individual de cada atributo, sino también identificar el subconjunto de variables que aporta información única y parsimoniosa para el modelado predictivo.

A continuación, se presenta la matriz de correlación de Spearman, la cual permite visualizar la estructura de interdependencia monotónica de las variables continuas en el conjunto de datos:

Source
plot_spearman_heatmap(df, numeric_cols, annot_size = 12)
Loading...

La inspección de la matriz de correlación revela una marcada independencia estocástica entre la mayoría de los atributos continuos del conjunto de datos, con coeficientes que se mantienen predominantemente en rangos de magnitud baja (rs<0.40|r_s| < 0.40). Esta estructura de datos sugiere una ausencia de redundancia monotónica, lo cual implica que no existen transformaciones no lineales, siempre que preserven el orden, de una variable que puedan explicar satisfactoriamente el comportamiento de otra. Este fenómeno es particularmente evidente en variables críticas como el colesterol y la presión arterial en reposo, cuya correlación con el resto de predictores es casi nula, exceptuando la asociación negativa moderada entre la edad y la frecuencia cardíaca máxima, la cual es consistente con la reducción fisiológica de la capacidad cronotrópica durante el envejecimiento. Desde la perspectiva del modelado, esta cuasi-ortogonalidad de los atributos continuos es altamente beneficiosa para garantizar la estabilidad de los estimadores y evitar conflictos de multicolinealidad en modelos de aprendizaje supervisado.

Por otro lado, los resultados del algoritmo mRMR confirman la alta capacidad discriminativa de variables identificadas previamente en los análisis bivariados, tales como Oldpeak y MaxHR, las cuales presentan las magnitudes de Información Mutua (MI) más elevadas, consolidándose como los predictores principales de la enfermedad cardiovascular. No obstante, el valor diferencial de este enfoque radica en la observación de atributos como FastingBS; si bien esta presenta efectos pequeños en los análisis previos y no posee una relevancia individual dominante en términos de MI, se posiciona en niveles superiores del ranking debido a que aporta información complementaria que no está presente en el resto de los predictores. Este comportamiento permite identificar a priori aquellas características que, al ofrecer una perspectiva única del fenómeno, enriquecen el conocimiento sobre el dataset sin introducir datos repetitivos. Al integrar estos hallazgos con la baja correlación de rangos observada anteriormente, es de esperar que la relación entre los atributos y la patología esté mediada por efectos no lineales e interacciones complejas, factores que deberán ser considerados prioritariamente al seleccionar y ajustar los algortimos de clasificación.

Source
plot_mrmr_importance(df, figsize = (8, 5))
Loading...

Análisis de Componentes Principales

Para finalizar el EDA, se emplea el Análisis de Componentes Principales basado en rangos (Rank-based PCA) como una herramienta de visualización robusta que permite examinar la estructura global del conjunto de datos en un espacio de menor dimensionalidad. A diferencia del enfoque convencional, este método se fundamenta en la matriz de correlación de Spearman, lo que permite mitigar la influencia de valores atípicos y capturar relaciones monótonas no lineales en los atributos continuos (Watanabe et al, 2024, Baxter, 1995). El propósito es observar cómo se distribuyen los grupos en un espacio latente e identificar posibles agrupamientos naturales o patrones de varianza ordinal compartida entre los pacientes.

Es importante señalar que, debido a la baja correlación de rangos detectada en la sección anterior, se anticipa que la capacidad de esta técnica para comprimir la información será reducida. Por lo tanto, el PCA se presenta aquí como un ejercicio diagnóstico final para evaluar la separabilidad de las clases en términos de sus componentes principales robustos, validando así la necesidad de utilizar modelos de mayor complejidad técnica en las etapas posteriores de clasificación.

Source
plot_pca_rank_2d(
    df= df,
    features = ['Age', 'RestingBP', 'Cholesterol', 'MaxHR', 'Oldpeak'],
    target_col = 'HeartDisease',
    legend_title = '', target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'},
    legend_position='upper left'
) 
Loading...

Los resultados del análisis de componentes principales confirman la alta independencia de los atributos continuos y la complejidad del espacio latente del conjunto de datos. En el panel de varianza acumulada, se observa que no existe un subconjunto reducido de componentes que logre capturar la mayor parte de la información, siendo necesario considerar la totalidad de los atributos para alcanzar un umbral representativo del 90%. Por su parte, la proyección en los dos primeros componentes muestra una superposición considerable entre los grupos de pacientes, sin que se aprecien agrupamientos naturales o fronteras de decisión evidentes. Esta distribución dispersa corrobora que la patología no puede explicarse mediante la magnitud lineal de las variables analizadas, reforzando la hipótesis de que la separabilidad de las clases depende de interacciones más complejas. Con el fin de explorar a fondo la estructura de esta proyección y buscar posibles separaciones en dimensiones adicionales, se presenta a continuación una visualización en un espacio de tres dimensiones utilizando los primeros tres componentes principales

Source
features_cont = ['Age', 'RestingBP', 'Cholesterol', 'MaxHR', 'Oldpeak']
plot_pca_3d_interactive(df, features = features_cont, target= 'HeartDisease', legend_title = 'Estado de Salud',
                        target_mapping={'0': 'Ausencia de EC', '1': 'Presencia de EC'})
Loading...
Loading...

Finalmente, la visualización en tres dimensiones de los componentes principales confirma la tendencia observada en las proyecciones anteriores, manteniendo una distribución dispersa y solapada de las clases en el espacio latente. Este comportamiento no es exclusivo de los métodos lineales; exploraciones complementarias mediante algoritmos de proyección no lineal, como UMAP (Uniform Manifold Approximation and Projection; McInnes et al, 2018), revelan patrones de agrupación igualmente difusos. Estos hallazgos sugieren que los atributos continuos, de forma aislada, poseen una capacidad discriminativa limitada respecto a la variable objetivo. En consecuencia, es altamente probable que la eficacia de los modelos predictivos dependa de la integración estratégica de las variables categóricas y de la captura de interacciones complejas que no logran manifestarse en estas representaciones dimensionales reducidas.

Exportación del Conjunto de Datos Final

Tras concluir la fase de análisis exploratorio, se procede con la exportación del conjunto de datos final, el cual servirá como insumo base para la etapa de modelado. Es importante precisar que, en esta instancia, el tratamiento de los datos se limitó exclusivamente a la rectificación de errores de digitación e inconsistencias de registro, preservando la naturaleza original de la información. Otros procesos críticos de ingeniería de características, tales como la codificación de variables categóricas o la imputación de datos, se han reservado deliberadamente para la fase de construcción de modelos; esta decisión técnica busca blindar el experimento contra la fuga de información (data leakage), asegurando que cualquier transformación basada en la distribución de los datos se ejecute estrictamente dentro de los protocolos de validación y entrenamiento de los clasificadores.

df_export = df.copy()
output_path = Path("../data/heart_disease_preprocessed.parquet")
output_path.parent.mkdir(parents=True, exist_ok=True)
df_export.to_parquet(output_path, index=False, engine="pyarrow")
References
  1. Woodruff, R. C., Tong, X., Loustalot, F. V., Khan, S. S., Shah, N. S., Jackson, S. L., & Vaughan, A. S. (2025). Cardiovascular Disease Mortality Trends, 2010–2022: An Update with Final Data. American Journal of Preventive Medicine, 68(2), 391–395. 10.1016/j.amepre.2024.09.014
  2. Townsend, N., Kazakiewicz, D., Lucy Wright, F., Timmis, A., Huculeci, R., Torbica, A., Gale, C. P., Achenbach, S., Weidinger, F., & Vardas, P. (2021). Epidemiology of cardiovascular disease in Europe. Nature Reviews Cardiology, 19(2), 133–143. 10.1038/s41569-021-00607-3
  3. Uhm, T., & Yi, S. (2021). A comparison of normality testing methods by empirical power and distribution of P -values. Communications in Statistics - Simulation and Computation, 52(9), 4445–4458. 10.1080/03610918.2021.1963450
  4. Cohen, J. (2013). Statistical Power Analysis for the Behavioral Sciences. Routledge. 10.4324/9780203771587
  5. Shannon, C. E. (1948). A Mathematical Theory of Communication. Bell System Technical Journal, 27(3), 379–423. 10.1002/j.1538-7305.1948.tb01338.x
  6. Watanabe, K., Naito, K., & Koch, I. (2024). Robustness of Principal Component Analysis with Spearman’s Rank Matrix. Journal of Statistical Theory and Practice, 18(1). 10.1007/s42519-023-00358-z
  7. Baxter, M. J. (1995). Standardization and Transformation in Principal Component Analysis, with Applications to Archaeometry. Applied Statistics, 44(4), 513. 10.2307/2986142
  8. McInnes, L., Healy, J., & Melville, J. (2018). UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction. arXiv. 10.48550/ARXIV.1802.03426