Objetivo General:

Identificar la presencia de enfermedad cardiaca en el paciente mediante Análisis estadístico descriptivo univariante y multivariante.

Descripción de la base de datos:

La base de datos Heart Disease fue obtenida del repositorio de UCI Machine Learning, compuesto de 14 atributos o variables, distribuidas en 5 variables cuantitativas y 9 variables categóricas, con 303 observaciones en total. Los cuales se describen a continuación:
  • Edad: edad del paciente (V. Cuantitativa discreta)
  • Sexo: Sexo del paciente (Categórica con dos niveles: Femenino y Masculino)
  • Cp: Tipo de dolor en el pecho (Categórica con 4 tipos)
    • Tipo 1: Angina típica
    • Tipo 2: Angina Atípica
    • Tipo 3: Dolor no anginal
    • Tipo 4: Asintomático
  • trestbps: Presión arterial en reposo en mm Hg al ingreso al hospital (V. continua)
  • chol: Colesterol sérico en mg /dl (V. continua)
  • fbs: azúcar en sangre en ayunas > 120 mg/dl (categórica con 2 niveles: verdadero, falso)
  • restecg: Resultados electrocardiográficos en reposo (Categórica con 3 niveles)
    • Nivel 0: Normal
    • Nivel 1: Tener anormalidad de onda ST-T (inversiones de onda T y / o elevación o Depresión de ST de > 005 mV)
    • Nivel 2: Muestra hipertropía ventricular izquierda probable o definitiva según los criterios de Estes.
  • thalach: Frecuencia cardiaca máxima alcanzada (V. continua)
  • exang: Angina inducida por el ejercicio (Categórica con dos niveles: Si, No)
  • oldpeak: Depresión del ST inducida por el ejercicio en relación con el descanso (V. continua)
  • slope: La pendiente del segmento ST de ejercicio pico (categórica con 3 niveles)
    • Valor 1: ascenso
    • Valor 2: plano
    • Valor 3: descenso
  • ca: Numero de vasos principales (0-3) coloreados por fluoroscopia (Categórica con 4 niveles: 1-2-3-4)
  • thal: El estado del corazón según la prueba de Thallium (Categórica con 3 niveles)
    • N = normal;
    • DF = defecto fijo
    • DR = defecto reversible
  • num : Presencia de enfermedad cardíaca (estado de enfermedad angiográfica) (Categórica con 4 niveles)
    • 0: Saludable
    • 1: diagnosticado como etapa 1
    • 2: Diagnosticado como etapa 2
    • 3: Diagnosticado como etapa 3
    • 4: diagnosticado como etapa 4
Para un mejor entendimiento de la base de datos, la variable (num) la consideraremos solo con dos niveles, en este caso ( 0 = “No”, es decir, esta saludable, no presenta enfermedad en el corazón) y del (1-4 = “Si”, es decir, presenta enfermedad en el corazón), para eso se creó otra variable llamada “Heart”. A continuación, se muestran las 6 primeras filas de la base de datos a estudiar:

Datos a analizar

#DATOS DE ENFERMEDADES DEL corazón

#Para leer desde INTERNET
dataD <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data",header=FALSE,sep=",",na.strings = '?')

#RENOMBRAR LAS COLUMNAS
names(dataD) <- c( "age", "sex", "cp", "trestbps", "chol","fbs", "restecg","thalach","exang", "oldpeak","slope", "ca", "thal", "num")

#Modificacion de la data
dataD$sex[dataD$sex==1]<- "Masculino"
dataD$sex[dataD$sex==0]<- "Femenino"
dataD$cp[dataD$cp==1] <- "Tipo 1"
dataD$cp[dataD$cp==2] <- "Tipo 2"
dataD$cp[dataD$cp==3] <- "Tipo 3"
dataD$cp[dataD$cp==4] <- "Tipo 4"
dataD$fbs[dataD$fbs==1] <- "verdadero"
dataD$fbs[dataD$fbs==0] <- "falso"
dataD$restecg[dataD$restecg==0] <- "Nivel 0"
dataD$restecg[dataD$restecg==1] <- "Nivel 1"
dataD$restecg[dataD$restecg==2] <- "Nivel 2"
dataD$exang[dataD$exang==1] <- "Si"
dataD$exang[dataD$exang==0] <- "No"
dataD$slope[dataD$slope==1] <- "Valor 1"
dataD$slope[dataD$slope==2] <- "Valor 2"
dataD$slope[dataD$slope==3] <- "Valor 3"
dataD$thal[dataD$thal==3] <- "N"
dataD$thal[dataD$thal==6] <- "DF"
dataD$thal[dataD$thal==7] <- "DR"
#Nueva Columna
c <- dataD$num
heart <- data.frame("Heart"=c(c))
heart$Heart[heart$Heart==0] <- "No"
heart$Heart[heart$Heart==1] <- "Si"
heart$Heart[heart$Heart==2] <- "Si"
heart$Heart[heart$Heart==3] <- "Si"
heart$Heart[heart$Heart==4] <- "Si"
#Agregando Heart a dataD
dataD <- cbind(dataD,heart)

pander::pandoc.table(
head(dataD))
Table continues below
age sex cp trestbps chol fbs restecg thalach
63 Masculino Tipo 1 145 233 verdadero Nivel 2 150
67 Masculino Tipo 4 160 286 falso Nivel 2 108
67 Masculino Tipo 4 120 229 falso Nivel 2 129
37 Masculino Tipo 3 130 250 falso Nivel 0 187
41 Femenino Tipo 2 130 204 falso Nivel 2 172
56 Masculino Tipo 2 120 236 falso Nivel 0 178
exang oldpeak slope ca thal num Heart
No 2.3 Valor 3 0 DF 0 No
Si 1.5 Valor 2 3 N 2 Si
Si 2.6 Valor 2 2 DR 1 Si
No 3.5 Valor 3 0 N 0 No
No 1.4 Valor 1 0 N 0 No
No 0.8 Valor 1 0 N 0 No

Exploración de los datos

Exploramos los datos por cada característica de manera individual. Del mismo modo se procedió con la visualización bivariante o multivariante.

Bloque 1 : Análisis Univariante

Para este tipo de Análisis se procedió a la visualización de cada variable de manera independiente, clasificándolas mediante variables categóricas y variables cuantitativas (discretas o continuas) con sus respectivas medidas de dispersión, tendencia central y posición.

Medidas estadisticas de variables cuantitativas

V.Cuantitativas <- data.frame("age"= dataD$age,"Trestbps"= dataD$trestbps,"chol"=dataD$chol,"thalach"=dataD$thalach,"oldpeak"=dataD$oldpeak)
knitr::kable(summary(V.Cuantitativas))
age Trestbps chol thalach oldpeak
Min. :29.00 Min. : 94.0 Min. :126.0 Min. : 71.0 Min. :0.00
1st Qu.:48.00 1st Qu.:120.0 1st Qu.:211.0 1st Qu.:133.5 1st Qu.:0.00
Median :56.00 Median :130.0 Median :241.0 Median :153.0 Median :0.80
Mean :54.44 Mean :131.7 Mean :246.7 Mean :149.6 Mean :1.04
3rd Qu.:61.00 3rd Qu.:140.0 3rd Qu.:275.0 3rd Qu.:166.0 3rd Qu.:1.60
Max. :77.00 Max. :200.0 Max. :564.0 Max. :202.0 Max. :6.20

Desviacion Estandar

z <- data.frame("Variable"= c("age","Trestbps","chol","thalach","oldpeak"),"Desv.Estandar"= c(sqrt(var(dataD$age)),sqrt(var(dataD$trestbps)),sqrt(var(dataD$chol)),sqrt(var(dataD$thalach)),sqrt(var(dataD$oldpeak))))
knitr::kable(z)
Variable Desv.Estandar
age 9.038662
Trestbps 17.599748
chol 51.776918
thalach 22.875003
oldpeak 1.161075
Histogramas y Diagramas de cajas para variables cuantitativas
————————————————————-Gráfico 1————————————————————-
library(ggplot2)
par(2)

NULL

#Histograma de Edad
ggplot(V.Cuantitativas, aes(age)) + 
  geom_histogram(aes(fill=..count..), bins=10, color="white") +
  geom_vline(aes(xintercept=mean(age)), color="red") +
  geom_vline(aes(xintercept=median(age)), color= "darkgreen") +
  labs(title = "Histograma de Edad",
       x = "Edades",
       y = "Frecuencia") +
  scale_fill_continuous(name="Frecuencia") +
  theme_classic()

boxplot(V.Cuantitativas$age, xlab = "Edades",col = "lightblue",bg = 'transparent',horizontal = T)
Interpretación Gráfico 1 hecha por Josue Valencia:
Según el gráfico 1, el mínimo de Edad en pacientes es de 29 años y el máximo de edad es de 77 años. El promedio de edad entre pacientes resulto de 54 años, con una mediana de 56 años muy cercana al valor de la media, pero mayor a ésta, por lo que se considera que la edad presenta un comportamiento asimétrico negativo, esto se refleja observando el histograma, la línea roja refleja el valor de la media y la línea negra el valor de la mediana, los datos presentan una variación de 9.03 con respecto a la media, también se puede observar que los datos tienen más concentración en las edades entre 50 a 60 años. Si se observa el diagrama de cajas el 25% de pacientes tienen edades menores a 48 años y el 50% de los pacientes tienen edades menores a 56 años y el 75% de pacientes tienen edades menores a 61 años.

————————————————————-Gráfico 2————————————————————-

#Histograma de Trestbp
ggplot(V.Cuantitativas, aes(Trestbps)) + 
  geom_histogram(aes(fill=..count..), bins=10, color="white") +
  geom_vline(aes(xintercept=mean(Trestbps)), color="red") +
  geom_vline(aes(xintercept=median(Trestbps)), color= "darkgreen") +
  labs(title = "Histograma de Trestbps",
       x = "Presión arterial en reposo",
       y = "Frecuencia") +
  scale_fill_continuous(name="Frecuencia") +
  theme_classic()

boxplot(V.Cuantitativas$Trestbps, xlab = "Trestbp",col = "lightblue",bg = 'transparent',horizontal = T)
Interpretación Gráfico 2 hecha por Ana Belén Asanza:
La presión arterial en reposo al ingreso del hospital de los pacientes tienen un valor promedio de 131.7 mm hg (milímetro de mercurio), siendo el valor de la presión mínima de 94 mm hg y la máxima de 200 mm hg. Los datos de presión arterial tienen una variación con respecto a la media de 17.59 y el 25% de los pacientes tienen la presión menor a 120 mm hg, el 50% de pacientes presentan una presión menor a 130 mm hg y el 75% de pacientes una presión menor a 140 mm hg. Los datos tienen un comportamiento asimétrico positivo. También en el diagrama de cajas se observan valores atípicos fuera de los bigotes.

————————————————————-Gráfico 3————————————————————-

#Histograma de chol
ggplot(V.Cuantitativas, aes(chol)) + 
  geom_histogram(aes(fill=..count..), bins=6, color="white") +
  geom_vline(aes(xintercept=mean(chol)), color="red") +
  geom_vline(aes(xintercept=median(chol)), color= "darkgreen") +
  labs(title = "Histograma de chol",
       x = "Colesterol serico en mg/dl",
       y = "Frecuencia") +
  scale_fill_continuous(name="Frecuencia") +
  theme_classic()

boxplot(V.Cuantitativas$chol, xlab = "chol",col = "lightblue",bg = 'transparent',horizontal = T)
Interpretación Gráfico 3 hecha por Ana Belén Asanza:
En la prueba de medir el colesterol, los pacientes presentaron un promedio de 246.7 mg/dl (miligramos por decilitro). El valor mínimo de colesterol fue de 120 mg/dl y el máximo de 564 mg/dl. Estos valores tienen una variación de 51.77 con respecto al valor de la media. También, el 25% de los pacientes corresponden a un a valor de colesterol de 211 mg/dl, el 50% menor a 241 mg/dl y el 75% con un valor menor a 275 mg/dl, presentando un comportamiento asimétrico positivo, y hay existencia de valores atípicos fuera de los bigotes del diagrama de cajas.

————————————————————-Gráfico 4————————————————————-

#Histograma de thalach
ggplot(V.Cuantitativas, aes(thalach)) + 
  geom_histogram(aes(fill=..count..), bins=10, color="white") +
  geom_vline(aes(xintercept=mean(thalach)), color="red") +
  geom_vline(aes(xintercept=median(thalach)), color= "darkgreen") +
  labs(title = "Histograma de Thalach",
       x = " Frec. cardiaca máxima alcanzada",
       y = "Total de frecuencias") +
  scale_fill_continuous(name="Total frecuencia") +
  theme_classic()

boxplot(V.Cuantitativas$Trestbps, xlab = "thalach",col = "lightblue",bg = 'transparent',horizontal = T)
Interpretación Gráfico 4: hecha por Paul del Pezo
La frecuencia cardiaca en promedio de los pacientes es de 149.6, la mínima frecuencia es de 71 y la máxima de 202. La variación de los datos fue de 22.87 con respecto a la media. El 25% de los pacientes presentaron una frecuencia menor o igual a 133.5, el 50% de ellos una frecuencia menor o igual a 153, y el 75% una frecuencia menor o igual a 166. Los datos tienen un comportamiento asimétrico positivo, y hay existencia de valores atípicos.

————————————————————-Gráfico 5————————————————————-

#Histograma de oldpeak
ggplot(V.Cuantitativas, aes(oldpeak)) + 
  geom_histogram(aes(fill=..count..), bins=8, color="white") +
  geom_vline(aes(xintercept=mean(oldpeak)), color="red") +
  geom_vline(aes(xintercept=median(oldpeak)), color= "darkgreen") +
  labs(title = "Histograma de oldpeak",
       x = "Depresión del ST inducida por el ejercicio en relación con el descanso ",
       y = "Frecuencia") +
  scale_fill_continuous(name="Frecuencia") +
  theme_classic()

boxplot(V.Cuantitativas$Trestbps, xlab = "oldpeak",col = "lightblue",bg = 'transparent',horizontal = T)
Interpretación Gráfico 5: hecha por Paul del Pezo
El valor promedio de la Depresión ST inducida por el ejercicio en relación al descanso es de 1.04, el valor mínimo es de 0 y el máximo de 6.20. El 25% de pacientes presentaron que la Depresión del ST disminuía o era igual a 0, y el 50% disminuía o era igual a 0.80, y el 75% a un valor menor o igual a 1.60. Los valores de la Depresión del ST con respecto a su media tienen una variación de 1.16. Los datos presentan un comportamiento asimétrico positivo, y hay existencia de valores atípicos fuera de los bigotes.

Tablas de Frecuencias Variables Cualitativas

—– Tabla de frecuencias de : Sexo del paciente —–

library(descr)
library(scales)
tabla.1 <- data.frame(freq((dataD$sex), plot = FALSE))
knitr::kable(tabla.1)
Frequency Percent
Femenino 97 32.0132
Masculino 206 67.9868
Total 303 100.0000
#gráfico
d <- data.frame(tabla.1)
d<- d[1:2,]
d<- cbind(d,data.frame("Sexo"=c("Femenino","Masculino")))
d$Percent<- round(d$Percent,digits = 3)
ggplot(d,aes(x="",y=Percent, fill=Sexo))+
  geom_bar(stat = "identity", color="grey") +
  geom_text(aes(label = percent(Percent*100/10,decimal.mark = ".")),
            position = position_stack(vjust = 0.5),color = "black",size = 3) +
  coord_polar(theta = "y") + 
  scale_fill_manual(values = c("salmon","Lightblue")) + 
  theme_void() +
  labs(title = "Gráfico : Sexo")
Interpretación hecha por Ana Belén Asanza: De los pacientes a quienes se les realizó el estudio, el 32%, es decir, 97 pacientes eran mujeres y el 67.98%, correspondiente a 206 pacientes eran hombres.

—– Tabla de frecuencias de : Tipos de Dolor en el pecho —–

La angina de pecho es un tipo de dolor provocado por la reducción de flujo sanguíneo al corazón.

Según el servicio de Cardiología del Hospital Virgen de la Salud, Toledo. España (González, 2017), el dolor anginoso típico cumple las tres características siguientes:
* Malestar retroesternal típico
* Provocado por el esfuerzo o el estrés emocional
* Se alivia en unos minutos con reposo o nitratos
El dolor anginoso atípico (probable): cumple dos de las características anteriores.
Dolor no anginoso: Cumple una o ninguna de las características anteriores.

tabla.2 <- data.frame(freq((dataD$cp), plot = FALSE))
knitr::kable(tabla.2)
Frequency Percent
Tipo 1 23 7.590759
Tipo 2 50 16.501650
Tipo 3 86 28.382838
Tipo 4 144 47.524752
Total 303 100.000000
#gráfico
d <- data.frame(tabla.2)
d<- d[1:4,]
d<- cbind(d,data.frame("cp"=c("Tipo 1","Tipo 2","Tipo 3","Tipo 4")))
d$Percent<- round(d$Percent,digits = 3)
ggplot(d,aes(x="",y=Percent, fill=cp))+
  geom_bar(stat = "identity", color="grey") +
  geom_text(aes(label = percent(Percent*100/10,decimal.mark = ".")),
            position = position_stack(vjust = 0.5),color = "black",size = 3) +
  coord_polar(theta = "y") + 
  scale_fill_manual(values = c("Lightblue","salmon","yellow","Pink")) + 
  theme_void() +
  labs(title = "Gráfico : Tipos de dolor en el Pecho")
Interpretación hecha por Ana Belén Asanza:
El 47.52 % de los pacientes resultaron ser Tipo 4: asintomáticos, es decir, no presentan los síntomas del dolor en el pecho, el 28.38 % no presentan Tipo 3: dolor anginal, el 16.50% presentaron tener Tipo 2: angina atípica y el 7.59 % Tipo 1: angina típica.

—– Tabla de frecuencias de : Azúcar en sangre en ayunas —–

tabla.3 <- data.frame(freq((dataD$fbs), plot = FALSE))
knitr::kable(tabla.3)
Frequency Percent
falso 258 85.14851
verdadero 45 14.85149
Total 303 100.00000
#gráfico
d <- data.frame(tabla.3)
d<- d[1:2,]
d<- cbind(d,data.frame("fbs"=c("falso","verdadero")))
d$Percent<- round(d$Percent,digits = 3)
ggplot(d,aes(x="",y=Percent, fill=fbs))+
  geom_bar(stat = "identity", color="grey") +
  geom_text(aes(label = percent(Percent*100/10,decimal.mark = ".")),
            position = position_stack(vjust = 0.5),color = "black",size = 3) +
  coord_polar(theta = "y") + 
  scale_fill_manual(values = c("Lightblue","pink")) + 
  theme_void() +
  labs(title = "Gráfico: Azúcar en sangre en ayunas")
Interpretación hecha por Paul del Pezo:
El 85.14 % de los pacientes no presentaron tener azúcar en la sangre en ayunas, y solo el 14.85% presentaron azúcar en la sangre.

—– Tabla de frecuencias de : Resultados electrocardiográficos en reposo —–

tabla.4<- data.frame(freq((dataD$restecg), plot = FALSE))
knitr::kable(tabla.4)
Frequency Percent
Nivel 0 151 49.834983
Nivel 1 4 1.320132
Nivel 2 148 48.844884
Total 303 100.000000
#gráfico
d <- data.frame(tabla.4)
d<- d[1:3,]
d<- cbind(d,data.frame("restecg"=c("Nivel 0","Nivel 1","Nivel 2")))
d$Percent<- round(d$Percent,digits = 3)
ggplot(d,aes(x="",y=Percent, fill=restecg))+
  geom_bar(stat = "identity", color="grey") +
  geom_text(aes(label = percent(Percent*100/10,decimal.mark = ".")),
            position = position_stack(vjust = 0.5),color = "black",size = 3) +
  coord_polar(theta = "y") + 
  scale_fill_manual(values = c("Lightblue","pink","salmon")) + 
  theme_void() +
  labs(title = "Gráfico : Resultados electrocardiográficos ")
Interpretación hecha por Paul del Pezo:
El 49.83% de los pacientes presentaron resultados electrocardiográficos en condiciones Nivel 0: normales, el 48.84% presentaron Nivel 2: Hipertropía ventricular izquierda probable o definitiva según los criterios de Estes. El 1.32% presento Nivel 1: anormalidad de onda ST-T (inversiones de onda T y / o elevación o Depresión de ST de > 005 mV).

—– Tabla de frecuencias de : Angina inducida por el ejercicio —–

tabla.5<- data.frame(freq((dataD$exang), plot = FALSE))
knitr::kable(tabla.5)
Frequency Percent
No 204 67.32673
Si 99 32.67327
Total 303 100.00000
#gráfico
d <- data.frame(tabla.5)
d<- d[1:2,]
d<- cbind(d,data.frame("exang"=c("No","Si")))
d$Percent<- round(d$Percent,digits = 3)
ggplot(d,aes(x="",y=Percent, fill=exang))+
  geom_bar(stat = "identity", color="grey") +
  geom_text(aes(label = percent(Percent*100/10,decimal.mark = ".")),
            position = position_stack(vjust = 0.5),color = "black",size = 3) +
  coord_polar(theta = "y") + 
  scale_fill_manual(values = c("Lightblue","pink")) + 
  theme_void() +
  labs(title = "Gráfico: Angina inducida por el ejercicio ")
Interpretación hecha por Paul del Pezo:
El 67.32 % de los pacientes no generaron dolor de angina por el ejercicio, y el 32.67% presentaban defecto reversible y el 5.98 % un defecto fijo.

—- Tabla de frecuencias de: Estado del corazón según la prueba de Thallium —-

Los diferentes patrones gammagráficos en la perfusión miocárdica que podrían presentarse en una prueba de Thallium son (Wikipedia, 2019):
  • Normal: Distribución homogénea y con adecuada intensidad a lo largo del ventrículo izquierdo, sin defectos o áreas hipocaptantes.
  • Defecto reversible: Alteración perfusoria dada por menor captación (concentración) en una región del ventrículo izquierdo que aparece durante la fase de estrés pero que mejora o incluso se normaliza durante la fase de reposo, a esto se le denomina isquemia.
  • Defecto Fijo: Alteración perfusoria dada por menor captación (concentración) en una región del ventrículo izquierdo que aparece durante la fase de estrés y que no mejora durante la fase de reposo, a esto se le denomina necrosis (infarto).
tabla.6<- data.frame(freq((dataD$thal), plot = FALSE))
knitr::kable(tabla.6)
Frequency Percent Valid.Percent
DF 18 5.940594 5.980066
DR 117 38.613861 38.870432
N 166 54.785479 55.149502
NA’s 2 0.660066 NA
Total 303 100.000000 100.000000
#gráfico
d <- data.frame(tabla.6)
d<- d[1:3,]
d<- cbind(d,data.frame("thal"=c("DF","DR","N")))
d$Percent<- round(d$Valid.Percent,digits = 3)
ggplot(d,aes(x="",y=Percent, fill=thal))+
  geom_bar(stat = "identity", color="grey") +
  geom_text(aes(label = percent(Valid.Percent*100/10,decimal.mark = ".")),
            position = position_stack(vjust = 0.5),color = "black",size = 3) +
  coord_polar(theta = "y") + 
  scale_fill_manual(values = c("Lightblue","pink","salmon")) + 
  theme_void() +
  labs(title = "Gráfico: Estado del corazón")
Interpretación hecha por Josue Valencia:
De los resultados, el 55.14% de los pacientes tenían un estado normal cardiaco, el 38.87% tenían defecto reversible, y el 5.98 % presentan defecto fijo.

—- Tabla de frecuencias de: Número de vasos principales (0-3) coloreados por flourosopia —-

tabla.7<- data.frame(freq((dataD$ca), plot = FALSE))
knitr::kable(tabla.7)
Frequency Percent Valid.Percent
0 176 58.085809 58.862876
1 65 21.452145 21.739130
2 38 12.541254 12.709030
3 20 6.600660 6.688963
NA’s 4 1.320132 NA
Total 303 100.000000 100.000000
#gráfico
d <- data.frame(tabla.7)
d<- d[1:4,]
d<- cbind(d,data.frame("ca"=c("0","1","2","3")))
d$Percent<- round(d$Valid.Percent,digits = 3)
ggplot(d,aes(x="",y=Percent, fill=ca))+
  geom_bar(stat = "identity", color="grey") +
  geom_text(aes(label = percent(Valid.Percent*100/10,decimal.mark = ".")),
            position = position_stack(vjust = 0.5),color = "black",size = 3) +
  coord_polar(theta = "y") + 
  scale_fill_manual(values = c("Lightblue","pink","salmon","red")) + 
  theme_void() +
  labs(title = "N de Vasos coloreados por flourosopia")+
  theme(axis.title=element_text(size=4))
Interpretación hecha por Josue Valencia:
De los pacientes, el 58.86% presentaron un color por fluorosopia en el vaso 0, el 21.73 % presentaron colores de fluorosopia en el vaso 1, el 12.70% tuvieron pintado por fluorosopia el vaso 2, y el 6.68 % el vaso 3.

—- Tabla de frecuencias de: Presencia de enfermedad cardiaca —-

tabla.8<- data.frame(freq((dataD$Heart), plot = FALSE))
knitr::kable(tabla.8)
Frequency Percent
No 164 54.12541
Si 139 45.87459
Total 303 100.00000
#gráfico
d <- data.frame(tabla.8)
d<- d[1:2,]
d<- cbind(d,data.frame("Heart"=c("No","Si")))
d$Percent<- round(d$Percent,digits = 3)
ggplot(d,aes(x="",y=Percent, fill=Heart))+
  geom_bar(stat = "identity", color="grey") +
  geom_text(aes(label = percent(Percent*100/10,decimal.mark = ".")),position = position_stack(vjust = 0.5),color = "black",size = 3) + coord_polar(theta = "y") + 
  scale_fill_manual(values = c("Lightblue","pink","salmon","red")) + 
  theme_void() +
  labs(title = "Gráfico: Presencia de enfermedad cardiaca  ")
Interpretación hecha por Josue Valencia:
El 54.12% de los pacientes presentaron enfermedad cardiaca, y el 45.87% se encontraban saludables.

Bloque 2: Análisis Bivariante o Multivariante

—- Matriz de correlación —-

#Matriz de correlacion
library(corrplot)
## corrplot 0.84 loaded
M <- cor(V.Cuantitativas)
corrplot(M, method="number")
Interpretación Grupal:
Si se observa la matriz de correlacion, a medida que aumenta el color rojo o azul, la correlacion entre variables se hace cada vez más fuerte. En este caso las variables son muy débiles, ninguna supera el 0.5 para concluir que existe al menos una correlacion moderada o fuerte entre las variables.

—- Matriz de Varianzas y Covarianzas —-

#Matriz de Varianzas y covarianzas
library(lavaan)
cov <- cov(V.Cuantitativas)
knitr::kable(cov)
age Trestbps chol thalach oldpeak
age 81.69742 45.328678 97.787489 -81.423065 2.138850
Trestbps 45.32868 309.751120 118.573340 -18.258005 3.865638
chol 97.78749 118.573340 2680.849190 -4.064652 2.799282
thalach -81.42307 -18.258005 -4.064652 523.265775 -9.112209
oldpeak 2.13885 3.865638 2.799282 -9.112209 1.348095
Interpretación Grupal:
El análisis con respecto a la covarianza es similar a la de correlación excepto que los datos no se encuentran estandarizados. Los elementos que se encuentran fuera de la diagonal son las covarianzas, que asemejan la relación entre las variables, y en caso de que estas fueran independientes, su correlacion seria cero. Respetando la regla de “La covarianza de variables independientes es cero y no al revés”, en caso de que la covarianza sea cero, habría que realizar un test de independencia de las variables como “test Chi- cuadrado”, para afirmar si las variables son independientes o no. Por otro lado, los elementos de la diagonal representan las varianzas.

—- Matriz de diagramas de dispersión —-

#Matriz de diagramas de dispersion
pairs(V.Cuantitativas[,1:5], pch = 19,  cex = 0.5,
      col = "salmon",
            lower.panel=NULL)
Interpretación Grupal:
En esta gráfica se aprecia el comportamiento con respecto a la relación entre variables, y se puede corroborar su comportamiento donde se observan que no tienen una tendencia positiva o negativa definida, es decir, una variable aumenta y la otra aumenta, o una variable disminuye conforme la otra aumenta. En este caso quien podría “decirse” que tiene pendiente negativa es age vs thalach, con una correlacion negativa de -0.39, siendo esta aún débil.

—- Diagrama de Cajas: Edad vs Sexo —-

Femenino

fem <- dataD[dataD$sex=="Femenino",]
masc <- dataD[dataD$sex=="Masculino",]

# Medidas de dispersi?n
summary(fem$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   34.00   50.00   57.00   55.72   63.00   76.00

Masculino

summary(masc$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   29.00   47.00   54.50   53.83   59.75   77.00
ggplot(dataD, aes(x=sex, y=age, fill=sex) ) +
  geom_boxplot(alpha=0.3, outlier.colour = "blue") +
  labs(x="Género", y="Edad") +
  guides(fill=FALSE) +
  coord_flip() +              
  stat_summary(geom= "point", fun=mean, shape=16, size=4, color="red") +
  geom_point(position = position_jitter(width = 0.1), alpha = 0.2)
Interpretación Grupal:
Según el gráfico, la edad promedio de mujeres es de 55 años, siendo la mínima edad de 34 años y la máxima de 76 años y la edad promedio en hombres es de 53 años, la mínima 29 años y la máxima 77 años.

—- Diagrama de Cajas: Angina de pecho vs Edad —-

AngTipic <- dataD[dataD$cp=="Tipo 1",]
AngAtipi <- dataD[dataD$cp=="Tipo 2",]
AngAsintom <- dataD[dataD$cp=="Tipo 3",]
AngNoDolor <- dataD[dataD$cp=="Tipo 4",]

Angina típica

# Medidas de dispersi?n
summary(AngTipic$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   34.00   51.50   59.00   55.87   63.50   69.00

Angina atípica

summary(AngAtipi$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   29.00   44.25   52.00   51.36   57.00   74.00

Asintomático

summary(AngAsintom$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    37.0    47.0    53.0    53.7    60.0    76.0

Dolor no anginal

summary(AngNoDolor$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   35.00   51.00   57.00   55.72   62.00   77.00
#gráfico
ggplot(dataD, aes(x=cp, y=age, fill=cp) ) +
  geom_boxplot(alpha=0.3, outlier.colour = "blue") +
  labs(x="Tipos de Angina de Pecho", y="Edad") +
  guides(fill=FALSE) +
  coord_flip() +              
  stat_summary(geom= "point", fun=mean, shape=16, size=4, color="red") +
  geom_point(position = position_jitter(width = 0.1), alpha = 0.2)
Interpretación Grupal:
Según el gráfico, las edades según el Tipo de Angina de pecho se encuentran en promedio entre los 51 años y 55 años. Observando que la mayor parte de pacientes oscilan con Dolor de pecho Tipo 4: Dolor no anginal, con un promedio de edad de 55 años, y un mínimo de 35 y una edad máxima de 77 años. Donde el 25% de las personas que tienen la edad de 51 años o menos padecen de Angina Tipo 4, el 50% de pacientes con edad de 57 años o menos padecen de Angina Tipo 4 y el 75% de edades de 62 años o menos padecen de Angina Tipo 4.

—- Diagrama de cajas: Frecuencia Cardiaca vs Resultados electrocardiográficos en reposo —-

Un electrocardiograma (ECG) es un procedimiento simple e indoloro que mide la actividad eléctrica del corazón. Cada vez que el corazón late, una señal eléctrica circula a través de él. Un electrocardiograma muestra si su corazón está latiendo a un ritmo y con una fuerza normal. También muestra el tamaño y la posición de las cámaras del corazón. Un electrocardiograma anormal puede ser un signo de daño o enfermedad del corazón. (MedlinePlus, 2020)

Electrocardiograma estado Normal Según frecuencia cardiaca

CardNor <- dataD[dataD$restecg=="Nivel 0",]
AnorST <- dataD[dataD$restecg=="Nivel 1",]
HipVent <- dataD[dataD$restecg=="Nivel 2",]

# Medidas de dispersi?n
#Electrocardiograma estado Normal Según frecuencia cardiaca
summary(CardNor$thalach)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    71.0   139.5   158.0   151.8   169.0   194.0

Electrocardiograma estado Anormal Según frecuencia cardiaca

#Electrocardiograma estado Anormal Según frecuencia cardiaca
summary(AnorST$thalach)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   116.0   116.8   123.5   125.8   132.5   140.0

Electrocardiograma estado H.V.I Según frecuencia cardiaca

#Electrocardiograma estado H.V.I Según frecuencia cardiaca
summary(HipVent$thalach)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      90     132     150     148     162     202
#gráfico
ggplot(dataD, aes(x=restecg, y=thalach, fill=restecg) ) +
  geom_boxplot(alpha=0.3, outlier.colour = "blue") +
  labs(x="Resultados electrocardiográficos en reposo", y="Frecuencia cardiaca max alcanzada") +
  guides(fill=FALSE) +
  coord_flip() +              
  stat_summary(geom= "point", fun=mean, shape=16, size=4, color="red") +
  geom_point(position = position_jitter(width = 0.1), alpha = 0.2)
Interpretación Grupal:
Como se observa en la gráfica la mayoría de los pacientes oscilan según su frecuencia cardiaca entre el nivel 0 y 2 en los resultados electrocardiográficos, pero los pacientes oscilan más por el nivel 0, es decir, su frecuencia cardiaca y según resultado electrocardiográfico, la frecuencia a la que late el corazón se encuentra en los rangos normales, pero así mismo una gran parte de los pacientes presentan un nivel 2, es decir, Hipertropía ventricular izquierda probable o definitiva.

—- Diagrama de cajas: Colesterol sérico vs Angina de pecho —-

Angina típica según colesterol

AngTipic <- dataD[dataD$cp=="Tipo 1",]
AngAtipi <- dataD[dataD$cp=="Tipo 2",]
AngAsintom <- dataD[dataD$cp=="Tipo 3",]
AngNoDolor <- dataD[dataD$cp=="Tipo 4",]

# Medidas de dispersi?n
#Angina tipica  según colesterol
summary(AngTipic$chol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   182.0   212.0   234.0   237.1   267.0   298.0

Angina atípica según colesterol

##Angina atipica  según colesterol
summary(AngAtipi$chol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   157.0   208.5   238.0   244.8   278.5   342.0

Asintomático según colesterol

#Asintomatico  según colesterol
summary(AngAsintom$chol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   126.0   212.0   234.0   244.0   267.8   564.0

Dolor no anginal según colesterol

#Dolor no  anginal según colesterol
summary(AngNoDolor$chol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   131.0   211.8   248.0   250.5   286.0   409.0
#gráfico
ggplot(dataD, aes(x=cp, y=chol, fill=cp) ) +
  geom_boxplot(alpha=0.3, outlier.colour = "blue") +
  labs(x="Tipo de Angina de pecho", y="Colesterol") +
  guides(fill=FALSE) +
  coord_flip() +              
  stat_summary(geom= "point", fun=mean, shape=16, size=4, color="red") +
  geom_point(position = position_jitter(width = 0.1), alpha = 0.2)
Interpretación Grupal:
Como se observa en el gráfico no hay mucha diferencia entre el valor del colesterol y si una persona presenta dolor en el pecho, ya que la mayoría de los pacientes se centraban en valores entre 208 y 286 en colesterol, siendo en mayor proporción un Tipo 4: Asintomáticos, es decir, no presentan síntomas de algún tipo de angina de pecho.

—- Diagrama de cajas: Depresión del ST inducida por el ejercicio en relacion con el descanso vs La pendiente del segmento ST —-

Según el segmento ST: * En condiciones normales es plano o isoeléctrico. * Un ligero ascenso del ST (1 a 1.5 mm), ligeramente convexo, con morfología normal, en precordiales derechas, se puede ver en personas sanas. Sin embargo, la elevación aguda del segmento ST en el electrocardiograma, es uno de los signos más tempranos de infarto agudo del miocardio y generalmente esta relacionado con la oclusión aguda y completa de una arteria coronaria. * El descenso del segmento ST de forma aguda, es un signo de daño miocárdico, al igual que la elevación. (Aguilera, 2020)

Valor 1

ascenso <- dataD[dataD$slope=="Valor 1",]
plano <- dataD[dataD$slope=="Valor 2",]
descenso <- dataD[dataD$slope=="Valor 3",]

summary(ascenso$oldpeak)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0000  0.0000  0.4085  0.7750  4.0000

Valor 2

summary(plano$oldpeak)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.600   1.200   1.429   2.000   4.200

Valor 3

summary(descenso$oldpeak)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   1.400   2.600   2.714   3.600   6.200
#gráfico
ggplot(dataD, aes(x=slope, y=oldpeak, fill=slope) ) +
  geom_boxplot(alpha=0.3, outlier.colour = "blue") +
  labs(x="Pendiente del segmento ST", y="Depresión del ST") +
  guides(fill=FALSE) +
  coord_flip() +              
  stat_summary(geom= "point", fun=mean, shape=16, size=4, color="red") +
  geom_point(position = position_jitter(width = 0.1), alpha = 0.2)
Interpretación Grupal:
La mayor proporción de pacientes tienen una pendiente del ST plana del segmento ST, es decir están en condiciones normales inducida por el ejercicio, oscilando entre 0.60 y 2. Sin embargo también se observa que una proporción menor tiene una pendiente en ascenso (elevación) ligera de la Depresión del ST inducida por el ejercicio con valores de la Depresión oscilando entre 0 a 0.40, lo cual no es grave.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Presión arterial —-

ggplot(data=dataD, aes(x= trestbps, y= Heart, fill=Heart)) + geom_bar(stat="identity") +labs(x="Presión arterial", y="Presencia de enfermedad cardiaca") +
  guides(fill=F) + coord_flip() 
Interpretación Grupal:
Como se observa los pacientes ingresados al hospital , basándonos en datos anteriores, estos presentaban en promedio una presión por encima de lo normal, es decir alta, aún asi la mayoria de pacientes no presencian enfermedad en el corazón, aúnque tambien la proporcion de personas que si podrian presenciar enfermedad es alta

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Colesterol —-

ggplot(data=dataD, aes(x=chol, y=Heart, fill=Heart)) + geom_bar(stat="identity")+labs(x="Colesterol", y="Presencia de enfermedad") +
  guides(fill=F) + coord_flip() 
Interpretación Grupal:
Del mismo modo según datos anteriores, los pacientes en promedio presentaban colesterol alto, con el siguiente gráfico podemos observar que en efecto hay presencia de enfermedad en corazón y tambien una proporcion que no estan presentando enfermedad cardiaca.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Frecuencia cardiaca máxima alcanzada —-

ggplot(data=dataD, aes(x=Heart, y=thalach, fill=Heart)) + geom_bar(stat="identity") +labs(x="Presencia de enfermedad cardiaca", y="Frec. cardiaca máxima")

ggplot(data=dataD, aes(x=num,fill = Heart)) + geom_bar(position = "dodge")+labs(x="Presencia de enferemedad cardiaca - Etapas")
Interpretación Grupal:
Como se puede observar la frecuencia del latido el corazón también no afecta en la presencia de enfermedad cardiaca, se identificó que la frecuencia cardiaca de los pacientes se encontraba en los rangos normales según resultados electrocardiográficos,por tanto gran cantidad de pacientes no presentan enfermedad, sin embargo, hay una cantidad no muy variada de pacientes que si presencian enfermedad , revisando el siguiente gráfico pueden que se encuentren en Etapa 1.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Depresión del ST —-

ggplot(data=dataD, aes(x=Heart, y= oldpeak, fill=Heart)) + geom_bar(stat="identity") +labs(x="Presencia de enfermedad cardiaca", y="Depresión del ST")
Interpretación Grupal:
Según los valores del segmento ST si fueron perjudiciales para que los pacientes presenten por esta variable enfermedades del corazón.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Tipo de angina —-

ggplot(data=dataD, aes(x=cp,fill = Heart)) + geom_bar(position = "dodge")+labs(x="Tipo de angina")
Interpretación Grupal:
Aquellos pacientes que son Tipo 4: Asintomatico hay más posibilidad de que si generen enfermedades al corazón, pero aquellos que presentan Tipo 3: Dolor no anginal sí.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Azúcar en la sangre en ayunas —-

ggplot(data=dataD, aes(x=fbs,fill = Heart)) + geom_bar(position = "dodge")+labs(x="Azúcar en la sangre")
Interpretación Grupal:
Aquellos que no presentaron tener azúcar en sangre podrían tener presencia de enfermedad, pero también se observa que otro gran porcentaje no podría presentar.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Angina inducida por el ejercicio —-

ggplot(data=dataD, aes(x=exang,fill = Heart)) + geom_bar(position = "dodge") +labs(x="Angina inducida por el ejercicio")
Interpretación Grupal:
Aquellos que no presentaron dolor en pecho después de algún ejercicio podrían tienen mayor posibilidad de no presentar enfermedades al corazón a diferencia de aquellos que si presentaron.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Pendiente del segmento ST —-

ggplot(data=dataD, aes(x=slope,fill = Heart)) + geom_bar(position = "dodge")+labs(x="Pendiente del segmento ST")
Interpretación Grupal:
Aquellos pacientes que a lo mejor presentaron un ascenso en la pendiente no tienen posibilidad de enfrentar enfermedades del corazón, y también se observa que los pacientes con pendiente plana habría la posibilidad de presentar enfermedad.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs Numero de vasos principales (0-3) coloreados por fluoroscopia —-

ggplot(data=dataD, aes(x=ca,fill = Heart)) + geom_bar(position = "dodge")+labs(x="Num Vasos principales")
Interpretación Grupal:
Aquellos que presentaron un color de fluorosopia en el vaso 0, no podrían presentar enfermedades al corazón.

—- Diagrama de barras : Presencia de enfermedad cardiaca vs estado del corazón según la prueba de Thallium —-

Tallium test: Es un método imagenológico nuclear que muestra qué tan bien fluye la sangre hacia el músculo cardíaco, tanto en reposo como en actividad.

ggplot(data=dataD, aes(x=thal,fill = Heart)) + geom_bar(position = "dodge", ) +labs(x="Estado del corazón")
Interpretación Grupal:
Los pacientes según el Thallium test están en mayor cantidad en condiciones normales por tanto no hay la posibilidad de que presencien enfermedad en el corazón, sin embargo, aquellos que presencian un defecto irreversible si.

Conclusiones finales realizadas por el grupo:

  • Las concentraciones de edades en pacientes están entre 48 años y 61 años, siendo en mayor porcentaje hombres.
  • Con lo expuesto anteriormente, los pacientes ingresados al hospital presentan en promedio una presión arterial alta (hipertensión).
  • Los pacientes en promedio están en el rango de colesterol alto.
  • Con respecto a los resultados electrocardiográficos y la frecuencia a la que late el corazón, casi la mitad de las pacientes presentaron estar en rangos normales, es decir, saludables, y según el Tallium test está la posibilidad de que no presencien enfermedad en el corazón,pero se evidencio que cambios en el segmento del ST, incluso aquellas personas que no presencian ningun dolor en el pecho (Asintomaticos) y que tenian un estado del corazón reversible, estarian presentando enfermedad en el corazón.

Referencias ekg/segmento-st.html Catalan, M. l. (abril de 2015). ResearcheGate. Obtenido de Criterios para interpretar el criterio de correlación: https://www.researchgate.net/figure/Figura-14-Criterios-para-interpretar-el-coeficiente-de-correlacion_fig8_317371135