Curso: Análisis de datos con lenguaje R (básico)
Instructor: Enrique Escalante Notario
Dataset: UCI Heart Disease

1 Introducción

El análisis de datos clínicos permite transformar mediciones y características de los pacientes en evidencia útil para reconocer patrones y estudiar posibles factores asociados con una condición de salud. En este proyecto se analiza el conjunto de datos UCI Heart Disease, con el propósito de identificar variables relacionadas con la presencia de enfermedad cardiaca y construir modelos estadísticos que permita estimar su probabilidad a partir de la información disponible.

El trabajo se desarrolló en R, utilizando sus herramientas para organizar, limpiar, transformar, visualizar y analizar los datos de manera reproducible. El proceso incluyó la revisión y depuración de la base original, el análisis exploratorio, la aplicación de métodos inferenciales para seleccionar variables relevantes y, finalmente, la construcción de modelos de regresión. Se utilizó una regresión lineal múltiple para estudiar la frecuencia cardiaca máxima (max_hr) y regresión logística múltiple para modelar la presencia de enfermedad cardiaca (ahd).

Más que establecer una regla de diagnóstico, el proyecto busca mostrar cómo distintas etapas del análisis estadístico pueden integrarse para obtener conclusiones sustentadas en los datos. Por ello, sus resultados tienen un alcance académico y deben interpretarse como evidencia de asociación dentro del conjunto de datos estudiado.

2 Planteamiento del problema

El conjunto de datos UCI Heart Disease reúne información clínica y demográfica de pacientes evaluados por posible enfermedad cardiaca. Entre las variables disponibles se encuentran la edad, el sexo, el tipo de dolor torácico, la presión arterial en reposo, el colesterol, la frecuencia cardiaca máxima, la angina inducida por ejercicio y distintos resultados de pruebas cardiovasculares. La variable objetivo es AHD, que clasifica a cada paciente según la ausencia (No) o presencia (Yes) de enfermedad cardiaca.

El problema de interés consiste en estudiar cuáles de estas características presentan mayor relación con la presencia de enfermedad cardiaca y determinar si consideradas conjuntamente, permiten construir un modelo estadístico útil para estimar su probabilidad. Para ello, se exploraron inicialmente las variables de manera descriptiva y gráfica, y posteriormente se evaluaron sus asociaciones mediante herramientas inferenciales y procedimientos de selección de variables.

Dado que AHD es una variable categórica binaria, su modelado se realizó mediante regresión logística. De manera complementaria, se utilizó max_hr, una variable numérica continua, como respuesta en un modelo de regresión lineal múltiple para estudiar qué características se relacionan con la frecuencia cardiaca máxima. El propósito de ambos análisis es académico y no pretende establecer relaciones causales ni constituir un procedimiento de diagnóstico clínico.

3 Descripción del dataset

El archivo original Heart Disease contiene 303 observaciones correspondientes a pacientes y 14 variables de interés clínico y demográfico, además de una columna auxiliar utilizada como índice. Cada fila representa a un paciente y la información disponible combina variables numéricas y categóricas.

Entre las variables numéricas se encuentran la edad (Age), presión arterial en reposo (RestBP), colesterol sérico (Chol), frecuencia cardiaca máxima alcanzada (MaxHR) y depresión del segmento ST inducida por ejercicio (Oldpeak). También se incluye Ca, que representa el número de vasos principales observados mediante fluoroscopía y puede considerarse una variable numérica discreta u ordinal.

Las variables categóricas incluyen el sexo (Sex), tipo de dolor torácico (ChestPain), glucosa en ayunas (Fbs), resultado electrocardiográfico en reposo (RestECG), angina inducida por ejercicio (ExAng), pendiente del segmento ST (Slope) y resultado asociado con talasemia (Thal).

La variable objetivo es AHD, de naturaleza categórica binaria, que indica ausencia (No) o presencia (Yes) de enfermedad cardiaca. Durante la preparación de los datos se identificaron valores faltantes y, después del proceso de limpieza, se trabajó con 297 pacientes con información completa.

4 Metodología general

El desarrollo del proyecto se organizó tomando como referencia la metodología CRISP-DM, que permite estructurar un análisis de datos en etapas relacionadas entre sí y revisar decisiones anteriores cuando los resultados hacen necesario realizar ajustes.

Comprensión del problema. Se definió como objetivo estudiar las variables asociadas con la presencia de enfermedad cardiaca, utilizando AHD como variable de respuesta.

Comprensión de los datos. Se importó la base original, se revisaron sus dimensiones, estructura y tipos de variables, y se identificaron valores faltantes, posibles inconsistencias y características relevantes de cada variable.

Preparación de los datos. Se eliminaron registros incompletos y columnas que no aportaban información al análisis, se estandarizaron nombres y categorías y se generaron nuevas variables que facilitaron la exploración y el modelado.

Modelado. A partir del análisis exploratorio e inferencial se seleccionaron variables candidatas para dos tipos de modelos. Se construyó una regresión lineal múltiple para explicar max_hr y modelos de regresión logística múltiple para estudiar la probabilidad de presencia de enfermedad cardiaca, la cual es la variable ahd.

Evaluación. Los modelos obtenidos se compararon e interpretaron para determinar qué variables contribuían al modelo y valorar su capacidad para representar la información observada.

Despliegue y comunicación. Finalmente, el proceso, los resultados, las visualizaciones y las conclusiones se integraron en un informe reproducible elaborado en R Markdown para su publicación en RPubs.

Estas etapas no se consideraron independientes: la exploración permitió detectar aspectos que requirieron nuevas transformaciones, mientras que los resultados inferenciales orientaron la selección de variables para el modelado. Seguir una metodología de este tipo permite mantener una secuencia lógica, documentar las decisiones tomadas y hacer que el análisis sea reproducible.

5 Limpieza y transformación de datos

La Actividad 1 se centró en revisar la calidad de la base original Heart Disease y preparar una versión adecuada para los análisis posteriores. El archivo inicial contenía 303 registros. Se inspeccionaron la estructura y los tipos de variables, los nombres de las columnas, la presencia de valores faltantes, posibles duplicados y otras inconsistencias.

Se identificaron seis observaciones con información faltante, cuatro en la variable ca y dos en thal. Debido a que representaban una proporción pequeña del total, se decidió eliminar estos registros y trabajar únicamente con casos completos, obteniéndose una base de 297 pacientes. También se eliminó la columna que funcionaba únicamente como conteo de las observaciones y se estandarizaron los nombres de las variables para facilitar su manipulación en R.

Además, algunas variables fueron transformadas para mejorar su interpretación y utilización en los análisis. El sexo y la presencia de enfermedad cardiaca (ahd) se expresaron mediante categorías descriptivas; se creó una versión binaria de la variable objetivo (ahd_binaria) y se construyó una variable de grupos de edad. Estas decisiones permitieron obtener una base consistente, sin valores faltantes y con variables apropiadas para las etapas exploratoria, inferencial y de modelado.

6 Análisis exploratorio y visualización de datos

En la Actividad 2 se realizó un análisis exploratorio de las 297 observaciones de la base limpia. Para las variables numéricas se calcularon medidas descriptivas como media, mediana, desviación estándar, mínimo y máximo, complementadas con histogramas y diagramas de caja. En las variables categóricas se estudiaron las frecuencias absolutas y relativas de sus diferentes niveles.

La variable objetivo presentó una distribución relativamente equilibrada: 160 pacientes (53.9 %) fueron clasificados sin enfermedad cardiaca y 137 (46.1 %) con enfermedad. Posteriormente, las variables numéricas y categóricas se analizaron agrupándolas según ahd, lo que permitió observar diferencias entre ambos grupos y detectar características potencialmente asociadas con la presencia de enfermedad.

Los diagramas de caja también permitieron identificar observaciones potencialmente atípicas en algunas variables numéricas. Estos valores fueron conservados, ya que podían corresponder a mediciones clínicas reales y su identificación gráfica, por sí sola, no era suficiente para justificar su eliminación.

Finalmente, se exploraron relaciones entre las variables mediante comparaciones gráficas y análisis de correlación. Se observaron patrones particularmente notorios en variables como la frecuencia cardiaca máxima (max_hr), la depresión del segmento ST (oldpeak), la angina inducida por ejercicio (ex_ang), el tipo de dolor torácico, el número de vasos principales (ca) y thal. Estos resultados se consideraron evidencia exploratoria y sirvieron como punto de partida para el posterior análisis inferencial y la selección de variables.

6.1 Visualizaciones principales

A partir del análisis exploratorio se seleccionaron las visualizaciones que muestran con mayor claridad la distribución de la variable objetivo y algunas de las diferencias observadas entre los pacientes con y sin enfermedad cardiaca.

library(tidyverse)

heart_eda <- read.csv("a2_Chacon_Richar_eda.csv")
ggplot(heart_eda, aes(x = ahd)) +
  geom_bar() +
  labs(
    title = "Distribución de la presencia de enfermedad cardiaca",
    x = "Presencia de enfermedad cardiaca",
    y = "Número de pacientes"
  ) +
  theme_minimal()

La variable objetivo presenta una distribución relativamente equilibrada. De los 297 pacientes, 160 (53.9 %) se clasificaron sin enfermedad cardiaca y 137 (46.1 %) con enfermedad.

ggplot(heart_eda, aes(x = ahd, y = max_hr)) +
  geom_boxplot() +
  labs(
    title = "Frecuencia cardiaca máxima según presencia de enfermedad",
    x = "Presencia de enfermedad cardiaca",
    y = "Frecuencia cardiaca máxima"
  ) +
  theme_minimal()

Los pacientes con enfermedad cardiaca tienden a presentar una frecuencia cardiaca máxima menor que aquellos sin enfermedad. La separación observada entre ambos grupos sugiere que max_hr podría ser una variable relevante para explicar la presencia de enfermedad cardiaca.

ggplot(heart_eda, aes(x = ahd, y = oldpeak)) +
  geom_boxplot() +
  labs(
    title = "Depresión del segmento ST según presencia de enfermedad",
    x = "Presencia de enfermedad cardiaca",
    y = "Oldpeak"
  ) +
  theme_minimal()

Los valores de oldpeak tienden a ser mayores entre los pacientes con enfermedad cardiaca. También se observan algunos valores elevados que pueden considerarse potencialmente atípicos.

ggplot(heart_eda, aes(x = thal, fill = ahd)) +
  geom_bar(position = "fill") +
  labs(
    title = "Presencia de enfermedad cardiaca según Thal",
    x = "Resultado de Thal",
    y = "Proporción",
    fill = "AHD"
  ) +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

La proporción de pacientes con enfermedad cardiaca cambia considerablemente entre las categorías de thal. La categoría reversable presenta una mayor proporción de enfermedad, mientras que en la categoría normal predomina la ausencia de enfermedad.

ggplot(heart_eda, aes(x = chest_pain, fill = ahd)) +
  geom_bar(position = "fill") +
  labs(
    title = "Presencia de enfermedad según tipo de dolor torácico",
    x = "Tipo de dolor torácico",
    y = "Proporción",
    fill = "AHD"
  ) +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

El tipo de dolor torácico muestra diferencias claras entre los grupos. En particular, la categoría asymptomatic presenta una mayor proporción de pacientes con enfermedad cardiaca que las demás categorías.

6.2 Principales hallazgos del análisis exploratorio

Las comparaciones realizadas según ahd mostraron diferencias visibles en varias variables. Entre las numéricas, max_hr tendió a presentar valores menores en los pacientes con enfermedad cardiaca, mientras que oldpeak y ca mostraron valores mayores en este grupo. También se observaron diferencias en la edad, aunque menos marcadas que en las variables anteriores. Entre las variables categóricas, los patrones más notorios aparecieron en chest_pain, ex_ang y thal.

En cuanto a la dispersión, chol, max_hr y rest_bp presentaron una variabilidad considerable en sus respectivas escalas de medición. Esta comparación debe interpretarse con cautela, ya que las variables se encuentran expresadas en unidades diferentes.

Los diagramas de caja permitieron identificar posibles valores atípicos principalmente en rest_bp, chol, max_hr y oldpeak. Estos registros fueron conservados, debido a que no se encontró evidencia suficiente para considerarlos errores y podían corresponder a valores clínicos reales.

En conjunto, las variables que parecieron más relevantes durante el análisis exploratorio fueron max_hr, oldpeak, ca, chest_pain, ex_ang y thal, debido a las diferencias observadas entre los grupos definidos por ahd. Estos resultados son de carácter descriptivo y sirvieron para orientar el análisis inferencial y la posterior selección de variables.

7 Análisis inferencial y selección de variables

7.1 Principales resultados de la Actividad 3

El análisis inferencial permitió evaluar formalmente algunos de los patrones observados durante el análisis exploratorio. Se calcularon intervalos de confianza para variables numéricas, se realizaron pruebas de comparación entre los grupos definidos por ahd, pruebas de asociación para variables categóricas y un análisis de correlación entre variables numéricas. Finalmente, estos resultados se utilizaron para proponer variables candidatas para el modelado.

Los intervalos de confianza permitieron estimar, con un nivel de confianza del 95 %, rangos plausibles para las medias poblacionales de las principales variables numéricas. Estos intervalos proporcionaron una medida de la incertidumbre asociada con las estimaciones obtenidas a partir de la muestra y complementaron las estadísticas descriptivas calculadas previamente.

Las comparaciones de variables numéricas entre los pacientes con y sin enfermedad cardiaca mostraron evidencia de diferencias para varias características. Mediante la prueba t de Welch se obtuvieron diferencias estadísticamente significativas para age (\(p<0.001\)), rest_bp (\(p=0.0088\)), max_hr (\(p<0.001\)) y oldpeak (\(p<0.001\)). En cambio, para chol no se encontró evidencia suficiente de diferencia mediante esta prueba (\(p=0.165\)).

Como análisis complementario se utilizaron pruebas de Wilcoxon en variables cuya distribución o presencia de valores atípicos hacía conveniente una comparación no paramétrica. Para oldpeak se mantuvo una evidencia clara de diferencia entre los grupos (\(p<0.001\)), mientras que para chol se obtuvo un resultado cercano al nivel de significancia convencional (\(p=0.0467\)). En consecuencia, la evidencia para chol se consideró menos consistente que para las demás variables.

Para estudiar la relación entre las variables categóricas y ahd se utilizaron pruebas de independencia chi-cuadrado. Se encontró evidencia de asociación con la presencia de enfermedad cardiaca para sex, chest_pain, rest_ecg, ex_ang, slope, ca y thal.

Los patrones más notorios se observaron en chest_pain, ex_ang, ca y thal. Por ejemplo, la enfermedad fue más frecuente entre los pacientes con dolor torácico asintomático, con angina inducida por ejercicio, con mayor número de vasos principales afectados y con un resultado reversable en thal. En contraste, fbs no presentó evidencia de asociación con ahd (\(p=1\)).

El análisis de correlación entre las variables numéricas permitió examinar posibles relaciones lineales y detectar problemas de redundancia. No se observaron correlaciones suficientemente altas entre las principales variables numéricas como para sugerir un problema evidente de multicolinealidad. Por tanto, la matriz de correlación no justificó por sí sola la eliminación de variables antes del modelado.

Selección de variables candidatas. Considerando conjuntamente los resultados del EDA, las pruebas de hipótesis, las pruebas de asociación y las correlaciones, se definieron conjuntos de variables candidatas para los dos tipos de modelado.

Para la regresión lineal, cuya variable respuesta fue max_hr, se consideraron seis predictores: age, sex, rest_bp, chol, oldpeak y ahd. La selección se apoyó en las relaciones observadas entre las variables numéricas y max_hr, así como en las comparaciones de max_hr entre las categorías de sex y ahd.

# Correlaciones con max_hr
cor_lineal <- heart_eda |>
  select(age, rest_bp, chol, oldpeak, max_hr) |>
  cor(use = "complete.obs")

round(
  cor_lineal["max_hr", c("age", "rest_bp", "chol", "oldpeak")],
  3
)
##     age rest_bp    chol oldpeak 
##  -0.395  -0.049   0.000  -0.348
# Comparaciones de max_hr para variables categóricas
c(
  sex = t.test(max_hr ~ sex, data = heart_eda)$p.value,
  ahd = t.test(max_hr ~ ahd, data = heart_eda)$p.value
)
##          sex          ahd 
## 2.638291e-01 6.107938e-14

Los resultados muestran que age y oldpeak presentan las relaciones lineales más claras con max_hr, con correlaciones de aproximadamente -0.395 y -0.348, respectivamente. En cambio, rest_bp y chol muestran correlaciones muy débiles. Por otra parte, las comparaciones por grupos indican diferencias en max_hr tanto según sex (\(p=0.026\)) como, de manera especialmente marcada, según ahd (\(p<0.001\)). Con base en estos resultados y en el análisis previo, se consideraron age, sex, rest_bp, chol, oldpeak y ahd como predictores candidatos para el modelo lineal, permitiendo posteriormente evaluar su aporte conjunto.

Para la regresión logística, cuya variable respuesta fue ahd, se consideraron inicialmente nueve predictores: age, sex, chest_pain, max_hr, ex_ang, oldpeak, slope, ca y thal. La selección se apoyó en las diferencias observadas para las variables numéricas y en las pruebas de asociación realizadas para las variables categóricas.

# Variables numéricas candidatas para explicar AHD
p_num_log <- sapply(
  c("age", "max_hr", "oldpeak"),
  function(v) {
    t.test(heart_eda[[v]] ~ heart_eda$ahd)$p.value
  }
)

# Variables categóricas candidatas para explicar AHD
p_cat_log <- sapply(
  c("sex", "chest_pain", "ex_ang", "slope", "ca", "thal"),
  function(v) {
    suppressWarnings(
      chisq.test(table(heart_eda[[v]], heart_eda$ahd))$p.value
    )
  }
)

round(c(p_num_log, p_cat_log), 4)
##        age     max_hr    oldpeak        sex chest_pain     ex_ang      slope 
##      1e-04      0e+00      0e+00      0e+00      0e+00      0e+00      0e+00 
##         ca       thal 
##      0e+00      0e+00

En conjunto, estas pruebas respaldaron el uso de las variables anteriores como candidatas para el modelado de ahd. Sin embargo, la selección en esta etapa no implica que todas deban permanecer en el modelo final, ya que una variable puede mostrar una relación importante de manera individual y aportar poca información adicional cuando se analiza simultáneamente con otros predictores. Por esta razón, en la siguiente etapa se ajustaron y compararon diferentes modelos.

8 Modelado estadístico básico

En la Actividad 4 se construyeron modelos estadísticos con dos objetivos diferentes. Primero se ajustó un modelo de regresión lineal múltiple para estudiar la frecuencia cardiaca máxima (max_hr). Posteriormente se ajustaron dos modelos de regresión logística múltiple para estudiar la presencia de enfermedad cardiaca mediante ahd: un modelo inicial y un modelo reducido. La elección del tipo de regresión respondió a la naturaleza de cada variable respuesta.

Antes del ajuste, las variables categóricas utilizadas en los modelos se definieron como factores para que R las tratara de acuerdo con su naturaleza.

heart_modelo <- heart_eda |>
  mutate(
    sex = factor(sex),
    chest_pain = factor(chest_pain),
    ex_ang = factor(ex_ang),
    slope = factor(slope),
    ca = factor(ca),
    thal = factor(thal),
    ahd = factor(ahd)
  )

8.1 Modelo de regresión lineal múltiple

La variable respuesta fue max_hr y se utilizaron seis variables predictoras: age, sex, rest_bp, chol, oldpeak y ahd. El objetivo fue evaluar cómo estas características se relacionan conjuntamente con la frecuencia cardiaca máxima alcanzada.

modelo_lm_1 <- lm(
  max_hr ~ age + sex + rest_bp + chol + oldpeak + ahd,
  data = heart_modelo
)

metricas_lm <- tibble(
  R2 = summary(modelo_lm_1)$r.squared,
  R2_ajustado = summary(modelo_lm_1)$adj.r.squared
)

knitr::kable(
  metricas_lm,
  format = "html",
  digits = 3,
  col.names = c("R²", "R² ajustado"),
  caption = "Métricas del modelo de regresión lineal"
) |>
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Métricas del modelo de regresión lineal
R² ajustado
0.319 0.305

El modelo obtuvo un \(R^2\) aproximado de 0.319 y un \(R^2\) ajustado de 0.305. Esto significa que las seis variables incluidas explican alrededor del 31.9 % de la variabilidad observada en max_hr. Entre los coeficientes más relevantes se encontraron age y oldpeak, ambos con asociaciones negativas con la frecuencia cardiaca máxima. También se observaron diferencias relacionadas con ahd.

8.2 Modelos de regresión logística múltiple

Para estudiar directamente la presencia de enfermedad cardiaca se utilizó ahd_binaria como respuesta, donde 0 representa ausencia y 1 presencia de enfermedad.

El modelo logístico inicial utilizó nueve variables predictoras: age, sex, chest_pain, max_hr, ex_ang, oldpeak, slope, ca y thal.

Posteriormente se ajustó un modelo logístico reducido con seis variables predictoras: sex, chest_pain, oldpeak, slope, ca y thal. Por lo tanto, respecto al modelo inicial se eliminaron age, max_hr y ex_ang.

# Modelo logístico inicial: 9 predictores
modelo_log_1 <- glm(
  ahd_binaria ~ age + sex + chest_pain + max_hr +
    ex_ang + oldpeak + slope + ca + thal,
  data = heart_modelo,
  family = binomial
)

# Modelo logístico reducido: 6 predictores
modelo_log_0 <- glm(
  ahd_binaria ~ sex + chest_pain + oldpeak +
    slope + ca + thal,
  data = heart_modelo,
  family = binomial
)

En regresión logística, los coeficientes indican cambios en las odds de presentar enfermedad cardiaca, manteniendo constantes las demás variables. Entre los términos que conservaron mayor relevancia en el modelo reducido estuvieron los relacionados con sex, chest_pain, oldpeak, ca y thal.

Para comparar los dos modelos se utilizaron el AIC y la exactitud de clasificación, considerando un umbral de probabilidad de 0.5.

# Probabilidades estimadas
prob_log_1 <- predict(
  modelo_log_1,
  type = "response"
)

prob_log_0 <- predict(
  modelo_log_0,
  type = "response"
)

# Clasificación con umbral de 0.5
pred_log_1 <- ifelse(prob_log_1 >= 0.5, 1, 0)
pred_log_0 <- ifelse(prob_log_0 >= 0.5, 1, 0)

# Tabla comparativa
metricas_log <- tibble(
  Modelo = c(
    "Inicial (9 predictores)",
    "Reducido (6 predictores)"
  ),
  AIC = c(
    AIC(modelo_log_1),
    AIC(modelo_log_0)
  ),
  Exactitud = c(
    mean(pred_log_1 == heart_modelo$ahd_binaria),
    mean(pred_log_0 == heart_modelo$ahd_binaria)
  )
)

knitr::kable(
  metricas_log,
  digits = 3,
  caption = "Comparación de los modelos logísticos"
)
Comparación de los modelos logísticos
Modelo AIC Exactitud
Inicial (9 predictores) 225.478 0.875
Reducido (6 predictores) 224.204 0.865

El modelo inicial presentó un AIC de 225.48 y una exactitud aproximada de 87.5 %, mientras que el modelo reducido obtuvo un AIC de 224.20 y una exactitud aproximada de 86.5 %. El modelo inicial clasificó correctamente una proporción ligeramente mayor de pacientes, pero el modelo reducido utilizó tres predictores menos y obtuvo un AIC menor. Por esta razón, el modelo reducido se consideró una alternativa más sencilla, al mantener un desempeño similar con menos variables.

La comparación debe interpretarse con cautela, ya que la exactitud fue calculada sobre los mismos 297 pacientes utilizados para ajustar los modelos. Por tanto, estas métricas describen su comportamiento en la muestra analizada y no garantizan el mismo desempeño con pacientes nuevos. Los modelos tienen un propósito académico y no deben interpretarse como herramientas de diagnóstico clínico sin una validación posterior.

9 Resultados principales

El análisis exploratorio mostró diferencias entre los pacientes con y sin enfermedad cardiaca. Entre las variables numéricas destacaron max_hr, que tendió a presentar valores menores en pacientes con enfermedad, y oldpeak y ca, cuyos valores tendieron a ser mayores. Entre las variables categóricas, los patrones más notorios se observaron en chest_pain, ex_ang y thal.

El análisis inferencial confirmó varios de estos hallazgos. Se encontraron diferencias estadísticamente significativas por ahd para age, rest_bp, max_hr y oldpeak. Asimismo, las pruebas de independencia mostraron evidencia de asociación con ahd para sex, chest_pain, rest_ecg, ex_ang, slope, ca y thal. En contraste, fbs no mostró evidencia de asociación, mientras que los resultados para chol fueron menos consistentes entre las pruebas realizadas.

A partir de la evidencia exploratoria e inferencial se construyó un modelo de regresión lineal múltiple para max_hr utilizando seis variables predictoras: age, sex, rest_bp, chol, oldpeak y ahd. El modelo obtuvo un \(R^2\) de 0.319 y un \(R^2\) ajustado de 0.305, por lo que explicó aproximadamente el 31.9 % de la variabilidad observada en la frecuencia cardiaca máxima. Entre los efectos más claros se encontraron las asociaciones negativas de age y oldpeak con max_hr.

Para estudiar la presencia de enfermedad cardiaca se ajustó inicialmente un modelo de regresión logística con nueve variables predictoras: age, sex, chest_pain, max_hr, ex_ang, oldpeak, slope, ca y thal. Este modelo presentó un AIC de 225.48 y una exactitud aproximada de 87.5 % al utilizar un umbral de clasificación de 0.5.

Posteriormente se obtuvo un modelo logístico reducido con seis variables: sex, chest_pain, oldpeak, slope, ca y thal. El modelo reducido presentó un AIC de 224.20 y una exactitud aproximada de 86.5 %. Aunque la exactitud disminuyó ligeramente, el modelo utilizó tres variables menos y obtuvo un AIC menor, por lo que se consideró una alternativa más sencilla que mantiene un desempeño similar con menos variables. Entre sus efectos más destacados se encontraron los asociados con sex, chest_pain, oldpeak, ca y thal; por ejemplo, se obtuvieron odds ratios aproximados de 3.81 para el sexo masculino, 1.63 para oldpeak y 5.16 para la categoría reversible de thal.

En conjunto, los resultados indican que la presencia de enfermedad cardiaca en esta muestra no parece estar relacionada con una sola característica, sino con la combinación de varios indicadores clínicos. Estos hallazgos deben interpretarse como asociaciones estadísticas dentro del conjunto de datos analizado y no como relaciones causales ni como un procedimiento de diagnóstico médico.

10 Problemas encontrados durante el desarrollo

Durante el proyecto se identificaron principalmente problemas relacionados con valores faltantes, nombres poco adecuados de variables y variables categóricas que inicialmente estaban codificadas como numéricas. También fue necesario decidir cómo tratar posibles valores atípicos y seleccionar las pruebas estadísticas más apropiadas según el tipo y comportamiento de cada variable.

El análisis exploratorio permitió reconocer patrones y diferencias iniciales, mientras que el análisis inferencial aportó evidencia para seleccionar las variables candidatas. En el modelado, la regresión lineal múltiple explicó aproximadamente el 31.9 % de la variabilidad de max_hr. Por otra parte, el modelo logístico inicial alcanzó una exactitud aproximada de 87.5 %, mientras que el modelo reducido obtuvo 86.5 % y disminuyó el AIC de 225.48 a 224.20. De esta manera, el modelo reducido permitió mantener un desempeño similar utilizando menos variables y una estructura más sencilla. Sin embargo, este análisis no permite afirmar que se haya encontrado el modelo más sencillo o el modelo óptimo, ya que podrían evaluarse otras combinaciones de variables y realizarse procedimientos adicionales de selección y validación.

11 Conclusiones

El análisis del conjunto Heart Disease permitió identificar que la presencia de enfermedad cardiaca está asociada con varias características clínicas y no con una sola variable. Entre las variables que mostraron mayor relevancia a lo largo de las distintas etapas estuvieron age, sex, max_hr, oldpeak, ca, chest_pain, ex_ang y thal.

El análisis exploratorio permitió reconocer patrones y diferencias iniciales, mientras que el análisis inferencial aportó evidencia para seleccionar las variables candidatas. En el modelado, la regresión lineal múltiple explicó aproximadamente el 31.9 % de la variabilidad de max_hr. Por otra parte, el modelo logístico inicial alcanzó una exactitud aproximada de 87.5 %, mientras que el modelo reducido obtuvo 86.5 % y disminuyó el AIC de 225.48 a 224.20. De esta manera, el modelo reducido permitió mantener un desempeño similar utilizando menos variables y una estructura más sencilla. Sin embargo, este análisis no permite afirmar que se haya encontrado el modelo más sencillo o el modelo óptimo, ya que podrían evaluarse otras combinaciones de variables y realizarse procedimientos adicionales de selección y validación.

Los resultados deben interpretarse con cautela, ya que corresponden a una muestra específica y muestran asociaciones, no relaciones causales. Además, los modelos tienen un propósito académico y no deben utilizarse como herramientas de diagnóstico clínico sin una validación adicional con nuevos datos.

12 Referencias

Triola, M. F. (2018). Elementary Statistics (13th ed.). Pearson.

Wasserman, L. (2004). All of Statistics: A Concise Course in Statistical Inference. Springer.

Wickham, H., Çetinkaya-Rundel, M., & Grolemund, G. (2023). R for Data Science (2nd ed.). O’Reilly.

Zar, J. H. (2010). Biostatistical Analysis (5th ed.). Pearson.