Se buscará aplicar las técnicas estadísticas inferencial de Intervalo de confianza y contraste de hipótesis y regresión lineal simple, para poder comparar y predecir los diagnostico en problemas del corazón. Se tomó como muestra objetivo con 100 observaciones de pacientes. Donde se aplicará la estadística descriptiva e inferencial. Se aplicará la ayuda del software R Studio, que nos ayudará a procesar y facilitar el depurado de las variables, el resumen descriptivo y la creación de los modelos para la parte inferencial.
.
OBJETIVO GENERAL
Realizar un análisis inferencial a la base de datos de diagnóstico cardiaco usando el software R Studio.
DATOS
Este conjunto de datos se obtuvo de la página Machine Learning Repository con las fuentes Hungarian Institute of Cardiology. Budapest: Andras Janosi, M.D.; University Hospital, Zurich, Switzerland: William Steinbrunn, M.D.; University Hospital, Basel, Switzerland: Matthias Pfisterer, M.D.; V.A. Medical Center, Long Beach and Cleveland Clinic Foundation: Robert Detrano, M.D., Ph.D.: https://archive.ics.uci.edu/ml/datasets/Heart+Disease y https://www.kaggle.com/nareshbhat/eda-classification-interpretation-ensembling-92 Esta base de datos contiene 76 atributos, pero todos los experimentos publicados se refieren a la utilización de un subconjunto de 14 de ellos. En particular, la base de datos de Cleveland es la única que ha sido utilizada por los investigadores de la ML para esta fecha. (Machine Learning Repository, 2018)
############################################
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2 v purrr 0.3.4
## v tibble 3.0.4 v dplyr 1.0.2
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(moments)
Importamos la data de heart y la guardamos con el nombre corazón
corazon <- 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(corazon) <- c( "age", "sex", "cp", "trestbps", "chol","fbs", "restecg","thalach","exang", "oldpeak","slope", "ca", "thal", "num")
set.seed(46)
la renombramos la variable con el nombre data
data <-corazon[sample(1:dim(corazon)[1],size=30,replace = FALSE),]
names(data)
## [1] "age" "sex" "cp" "trestbps" "chol" "fbs"
## [7] "restecg" "thalach" "exang" "oldpeak" "slope" "ca"
## [13] "thal" "num"
str(data)
## 'data.frame': 30 obs. of 14 variables:
## $ age : num 51 55 46 58 38 38 62 43 64 41 ...
## $ sex : num 0 1 1 1 1 1 1 0 0 1 ...
## $ cp : num 3 4 3 4 1 3 3 3 3 3 ...
## $ trestbps: num 140 140 150 100 120 138 130 122 140 112 ...
## $ chol : num 308 217 231 234 231 175 231 213 313 250 ...
## $ fbs : num 0 0 0 0 0 0 0 0 0 0 ...
## $ restecg : num 2 0 0 0 0 0 0 0 0 0 ...
## $ thalach : num 142 111 147 156 182 173 146 165 133 179 ...
## $ exang : num 0 1 0 0 1 0 0 0 0 0 ...
## $ oldpeak : num 1.5 5.6 3.6 0.1 3.8 0 1.8 0.2 0.2 0 ...
## $ slope : num 1 3 2 1 2 1 2 2 1 1 ...
## $ ca : num 1 0 0 1 0 NA 3 0 0 0 ...
## $ thal : num 3 7 3 7 7 3 7 3 7 3 ...
## $ num : int 0 3 1 2 4 0 0 0 0 0 ...
Seleccionamos las variables cuantitativas a utilizar.
##########################################
#seleccionar muestra cuantitativa
df<-subset(data,select = c(1,4,8,10))
str(df)
## 'data.frame': 30 obs. of 4 variables:
## $ age : num 51 55 46 58 38 38 62 43 64 41 ...
## $ trestbps: num 140 140 150 100 120 138 130 122 140 112 ...
## $ thalach : num 142 111 147 156 182 173 146 165 133 179 ...
## $ oldpeak : num 1.5 5.6 3.6 0.1 3.8 0 1.8 0.2 0.2 0 ...
#################################
#cuantitativa
resumen2<-function(y){
q<-quantile(y, prob=c(0.25,0.5,0.75))
nombre<-c("min","max","media","sd","cuart 1","cuart 2","cuart 3","asimetria","kurtorsi")
valor<-round(c(min(y),max(y),mean(y),sd(y),q[1],q[2],q[3],skewness(y),kurtosis(y)),3)
data.frame(nombre,valor)}
resumen2(df$age)
## nombre valor
## 1 min 35.000
## 2 max 64.000
## 3 media 52.167
## 4 sd 8.129
## 5 cuart 1 46.750
## 6 cuart 2 52.000
## 7 cuart 3 58.000
## 8 asimetria -0.460
## 9 kurtorsi 2.258
resumen2(df$trestbps)
## nombre valor
## 1 min 100.000
## 2 max 150.000
## 3 media 127.833
## 4 sd 13.924
## 5 cuart 1 120.000
## 6 cuart 2 130.000
## 7 cuart 3 139.500
## 8 asimetria -0.358
## 9 kurtorsi 2.293
resumen2(df$thalach)
## nombre valor
## 1 min 97.000
## 2 max 186.000
## 3 media 154.900
## 4 sd 20.777
## 5 cuart 1 146.250
## 6 cuart 2 156.500
## 7 cuart 3 171.250
## 8 asimetria -0.929
## 9 kurtorsi 3.676
resumen2(df$oldpeak)
## nombre valor
## 1 min 0.000
## 2 max 5.600
## 3 media 1.140
## 4 sd 1.366
## 5 cuart 1 0.125
## 6 cuart 2 0.600
## 7 cuart 3 1.750
## 8 asimetria 1.568
## 9 kurtorsi 5.203
Se calcula los resultados descriptivos a las variables cuantitativa, donde se encuentra que la mayoría tiene una media y mediana similares, por lo que ayuda a que se minimice el problema del sesgo, esto se puede evidencia con un valor cercano a cero en la asimetría. Sin embargo, las variables: oldpeak, tienen una mayor separación entre su media y mediana por lo que provoca problemas de sesgo, y se evidencia observando su asimetría con valores muy alejado del cero. También, estas mismas variables tienen una dispersión alta en su desviación estándar comparado el rango de su intervalo, por lo que también es propenso a sufrir de valores atípico. Esto se evidencia con un alto valor en su curtosis con un valor superior a 3.
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
Plot1<- ggplot(df,aes(age)) +geom_histogram( binwidth=5, fill="#0099ff",color="#cccccc") +
labs(title="Histograma", y="Frecuencia", x="edad ") +
geom_vline(xintercept = mean(df$age), color="#3EFB3F",size=1.5)+ theme_classic(base_size=15)
Plot2 <- ggplot(df,aes(trestbps)) +geom_histogram( binwidth=12, fill="#0099ff",color="#cccccc") +
labs(title="Histograma", y="Frecuencia", x="presión sanguínea en reposo") +
geom_vline(xintercept = mean(df$trestbps), color="#3EFB3F",size=1.5)+ theme_classic(base_size=15)
Plot3 <- ggplot(df,aes(thalach)) +geom_histogram( binwidth=14, fill="#0099ff",color="#cccccc") +
labs(title="Histograma", y="Frecuencia", x="máxima frecuencia cardíaca alcanzada") +
geom_vline(xintercept = mean(df$thalach), color="#3EFB3F",size=1.5)+ theme_classic(base_size=15)
Plot4 <- ggplot(df,aes(oldpeak)) +geom_histogram( binwidth=0.8, fill="#0099ff",color="#cccccc") +
labs(title="Histograma", y="Frecuencia", x="depresión ST por ejercicio en relación descanso") +
geom_vline(xintercept = mean(df$oldpeak), color="#3EFB3F",size=1.5)+ theme_classic(base_size=15)
grid.arrange(Plot1, Plot2, Plot3, Plot4, ncol = 2)
Se observa en los histogramas que las gráficas de age, trestbps, thalach y oldpeak, todas tienen sesgo en su distribución con respecto a la media. En especial la que tienen el sesgo más grande es la variable oldpeak(depresión) y thalach(máxima frecuencia) .
Plot1<- ggplot(df, aes(factor(0),y=age)) +
geom_boxplot()+labs(title="Diagrama de caja", y="", x="age",color=NULL)+
theme_classic(base_size=15) + coord_flip()
Plot2 <- ggplot(df,aes(factor(0),y=trestbps)) +
geom_boxplot()+labs(title="Diagrama de caja", y="", x="presión sanguínea en reposo") +
theme_classic(base_size=15) + coord_flip()
Plot3 <- ggplot(df,aes(factor(0),y=thalach)) +
geom_boxplot()+labs(title="Diagrama de caja", y="", x="máxima frecuencia cardíaca alcanzada") +
theme_classic(base_size=15) + coord_flip()
Plot4 <- ggplot(df,aes(factor(0),y=oldpeak)) +
geom_boxplot()+labs(title="Diagrama de caja", y="", x="depresión ST por ejercicio en relación descanso") +
theme_classic(base_size=15) + coord_flip()
grid.arrange(Plot1, Plot2, Plot3, Plot4, ncol = 2)
En los diagramas de caja, se observa como todos presentan problema de aberrancia en su extremo superior, a excepción de la edad, que no presenta aberrancias.
########################################
#bondad de ajuste distribucion normal
Supuesto de normalidad Se probará la normalidad de los residuos, por medio de la prueba de K-S
Hipótesis Nula H0: X siguen una distribución normal
Hipótesis Alterna H1: X no siguen una distribución
Valor de la significancia =0.01
#normalidad de age
x<-df$age
xen <- seq(min(x), max(x), by=0.1)
plot(xen, pnorm(xen, mean=mean (x), sd=sd(x)), type="l", col="red", xlab="residuos", ylab="" ,main= "bondad de ajuste")
plot(ecdf(x), add=TRUE)
ks.test(df$thalach, "pnorm",alternative ="two.sided")
## Warning in ks.test(df$thalach, "pnorm", alternative = "two.sided"): ties should
## not be present for the Kolmogorov-Smirnov test
##
## One-sample Kolmogorov-Smirnov test
##
## data: df$thalach
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
#normalidad de trestbps
x<-df$trestbps
xen <- seq(min(x), max(x), by=0.1)
plot(xen, pnorm(xen, mean=mean (x), sd=sd(x)), type="l", col="red", xlab="residuos", ylab="" ,main= "bondad de ajuste")
plot(ecdf(x), add=TRUE)
ks.test(df$thalach, "pnorm",alternative ="two.sided")
## Warning in ks.test(df$thalach, "pnorm", alternative = "two.sided"): ties should
## not be present for the Kolmogorov-Smirnov test
##
## One-sample Kolmogorov-Smirnov test
##
## data: df$thalach
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
#normalidad de thalach
x<-df$thalach
xen <- seq(min(x), max(x), by=0.1)
plot(xen, pnorm(xen, mean=mean (x), sd=sd(x)), type="l", col="red", xlab="residuos", ylab="" ,main= "bondad de ajuste")
plot(ecdf(x), add=TRUE)
ks.test(df$thalach, "pnorm",alternative ="two.sided")
## Warning in ks.test(df$thalach, "pnorm", alternative = "two.sided"): ties should
## not be present for the Kolmogorov-Smirnov test
##
## One-sample Kolmogorov-Smirnov test
##
## data: df$thalach
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
#normalidad de oldpeak
x<-df$oldpeak
xen <- seq(min(x), max(x), by=0.1)
plot(xen, pnorm(xen, mean=mean (x), sd=sd(x)), type="l", col="red", xlab="residuos", ylab="" ,main= "bondad de ajuste")
plot(ecdf(x), add=TRUE)
ks.test(df$thalach, "pnorm",alternative ="two.sided")
## Warning in ks.test(df$thalach, "pnorm", alternative = "two.sided"): ties should
## not be present for the Kolmogorov-Smirnov test
##
## One-sample Kolmogorov-Smirnov test
##
## data: df$thalach
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Su valor p esta por debajo de la significancia 0.01, por lo que se rechaza la hipótesis nula, entonces los residuos no siguen una distribución normal.
Su valor p esta por debajo de la significancia 0.01, por lo que se rechaza la hipótesis nula, entonces los residuos no siguen una distribución normal.
Su valor p está por debajo de la significancia 0.01, por lo que se rechaza la hipótesis nula, entonces los residuos no siguen una distribución normal.
Su valor p está por debajo de la significancia 0.01, por lo que se rechaza la hipótesis nula, entonces los residuos no siguen una distribución normal.
###############################################
#intervalos de confianza
• Se asume el supuesto que cada una de sus poblaciones vienen de una distribución normal. • El tamaño de la muestra es mayor a 30 datos por lo que se usara la Z de la normal
#intervalo de confianza de media
icmedia<-function(x,confianza){
n<-length(x)
med<-mean(x)
s<-sd(x)
confi<-confianza
alpha<-1-confi
z<-qnorm(alpha/2,lower.tail = F)
error<-z*s/sqrt(n)
lim.inf<-round(med-error,2)
lim.sup<-round(med+error,2)
cbind(lim.inf,lim.sup,error)
}
#intervalo de confianza varianza
icvari<-function(x,confianza){
n<-length(x)
s<-sd(x)
confi<-confianza
alpha<-1-confi
inte.infer<-qchisq(alpha/2,n-1,lower.tail = F)
inte.supe<-qchisq(1-alpha/2,n-1,lower.tail = F)
lim.inf<-round((n-1)*s^2/inte.infer,2)
lim.sup<-round((n-1)*s^2/inte.supe,2)
cbind(lim.inf,lim.sup)
}
#variable age
icmedia(df$age,0.99)
## lim.inf lim.sup error
## [1,] 48.34 55.99 3.822734
icvari(df$age,0.99)
## lim.inf lim.sup
## [1,] 36.61 146.04
La media poblacional en la variable age, solo puede tener con un 99% de confianza un intervalo de 52.29 a 57.09. La varianza poblacional en la variable age, solo puede tener con un 99% de confianza un intervalo de 61.89 a 129.32.
#variable trestbps
icmedia(df$trestbps,0.99)
## lim.inf lim.sup error
## [1,] 121.29 134.38 6.54801
icvari(df$trestbps,0.99)
## lim.inf lim.sup
## [1,] 107.43 428.48
La media poblacional en la variable trestbps, solo puede tener con un 99% de confianza un intervalo de 125.14 a 133.82. La varianza poblacional en la variable trestbps, solo puede tener con un 99% de confianza un intervalo de 202.16 a 422.45
#varaible thalach
icmedia(df$thalach,0.99)
## lim.inf lim.sup error
## [1,] 145.13 164.67 9.770956
icvari(df$thalach,0.99)
## lim.inf lim.sup
## [1,] 239.2 954.09
La media poblacional en la variable thalach, solo puede tener con un 99% de confianza un intervalo de 145.76 a 157.04. La varianza poblacional en la variable thalach, solo puede tener con un 99% de confianza un intervalo de 342.02 a 714.72
#variable oldpeak
icmedia(df$oldpeak,0.99)
## lim.inf lim.sup error
## [1,] 0.5 1.78 0.6422794
icvari(df$oldpeak,0.99)
## lim.inf lim.sup
## [1,] 1.03 4.12
La media poblacional en la variable oldpeak, solo puede tener con un 99% de confianza un intervalo de 0.67 a 1.27 La varianza poblacional en la variable oldpeak, solo puede tener con un 99% de confianza un intervalo de 0.96 a 2.01
#################################################
#prueba de hipotesis de una prueba
Para la prueba se usará una significancia del 0.01, para contrastar si se acepta o rechaza la hipótesis planteada. Se asume el supuesto que sus poblaciones vienen de una distribución normal
Hipótesis Nula H0: La media promedio es igual a
Hipótesis Alterna H1: La media promedio diferente a
Valor de la significancia =0.01
t.test(df$age,mu=55,conf.level = 0.99)
##
## One Sample t-test
##
## data: df$age
## t = -1.9092, df = 29, p-value = 0.06618
## alternative hypothesis: true mean is not equal to 55
## 99 percent confidence interval:
## 48.07597 56.25736
## sample estimates:
## mean of x
## 52.16667
El valor p =0.74, es mayor a la insignificancia α = 0.01, entonces no se rechazar la hipótesis nula, el cual su media poblacional para age es igual a =55
t.test(df$trestbps,mu=130,conf.level = 0.99)
##
## One Sample t-test
##
## data: df$trestbps
## t = -0.85231, df = 29, p-value = 0.401
## alternative hypothesis: true mean is not equal to 130
## 99 percent confidence interval:
## 120.8263 134.8403
## sample estimates:
## mean of x
## 127.8333
El valor p =0.76, es mayor a la insignificancia α = 0.01, entonces no se rechazar la hipótesis nula, el cual su media poblacional para trestbps es igual a =130
t.test(df$thalach,mu=150,conf.level = 0.99)
##
## One Sample t-test
##
## data: df$thalach
## t = 1.2917, df = 29, p-value = 0.2066
## alternative hypothesis: true mean is not equal to 150
## 99 percent confidence interval:
## 144.4441 165.3559
## sample estimates:
## mean of x
## 154.9
El valor p =0.52, es mayor a la insignificancia α = 0.01, entonces no se rechazar la hipótesis nula, el cual su media poblacional para thalach es igual
t.test(df$oldpeak,mu=1,conf.level = 0.99)
##
## One Sample t-test
##
## data: df$oldpeak
## t = 0.56146, df = 29, p-value = 0.5788
## alternative hypothesis: true mean is not equal to 1
## 99 percent confidence interval:
## 0.4526991 1.8273009
## sample estimates:
## mean of x
## 1.14
El valor p =0.79, es mayor a la insignificancia α = 0.01, entonces no se rechazar la hipótesis nula, el cual su media poblacional para oldpeak es igual a =1
################################################
#matriz de correlacion
cor<-round(cor(df),2)
cor
## age trestbps thalach oldpeak
## age 1.00 0.10 -0.32 0.00
## trestbps 0.10 1.00 0.00 0.19
## thalach -0.32 0.00 1.00 -0.37
## oldpeak 0.00 0.19 -0.37 1.00
El valor p =0.79, es mayor a la insignificancia α = 0.01, entonces no se rechazar la hipótesis nula, el cual su media poblacional para oldpeak es igual a =1
#regresion lineal modelo 1
lr1<-lm(thalach~ age,df)
summary(lr1)
##
## Call:
## lm(formula = thalach ~ age, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -49.789 -6.143 4.612 14.526 30.138
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 197.9283 24.1288 8.203 6.28e-09 ***
## age -0.8248 0.4572 -1.804 0.082 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20.01 on 28 degrees of freedom
## Multiple R-squared: 0.1041, Adjusted R-squared: 0.07214
## F-statistic: 3.255 on 1 and 28 DF, p-value: 0.08199
Se realiza la matriz de correlación entre todas las variables y se evidencia que no hay variables fuertemente correlacionadas entre sí. Donde la mayor correlación encontrada es -0.33 que no representa que haya una fuerte relación entre variables. • El thalach y age están correlacionado débilmente de manera inversa con un –0.33. • El thalach y oldpeak están correlacionado débilmente también de manera inversa con un –0.30.
#grafico de dispersion
ggplot(df, aes(thalach,age)) +geom_point()+geom_smooth(method = "lm",se=F,colour="#0099ff")+
labs(title="Grafico de dispersion", y="thalach", x="age",color=NULL) +
theme_classic(base_size=15)
## `geom_smooth()` using formula 'y ~ x'
Se buscará un modelo matemático para predecir el thalach (máxima frecuencia cardíaca alcanzada) con la edad. Se tiene que un R cuadrado igual a 0.111, entonces el 11.1% de los datos es explicado por el modelo, entonces el modelo no tiene una suficiente dependencia de linealidad para explicar el modelo. y=194 - 0.78x_
#validacion del modelo
ggplot(df, aes(age, lr1$residuals)) +
geom_point() + geom_smooth(color = "firebrick") + geom_hline(yintercept = 0, color="#0099ff",size=1) +
theme_classic(base_size=15)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
se observa como la dispersión del residuo es muy grande, por lo que tiene valores atípicos en sus residuos
Hipótesis Nula H0: El error aleatorio sigue una distribucion normal
Hipótesis Alterna H1: El error aleatorio no sigue una distribucion normal
Valor de la significancia =0.01
#normalidad de residuos
x<-lr1$residuals
ks.test(x,"pnorm",mean(x),sd(x))
##
## One-sample Kolmogorov-Smirnov test
##
## data: x
## D = 0.15301, p-value = 0.44
## alternative hypothesis: two-sided
Su valor p esta por debajo de la significancia 0.01, por lo que se rechaza la hipótesis nula, entonces los residuos siguen una distribución normal.
#regresion lineal modelo 2
lr2<-lm(thalach~ oldpeak,df)
summary(lr2)
##
## Call:
## lm(formula = thalach ~ oldpeak, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -57.565 -8.088 2.086 11.639 41.945
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 161.262 4.711 34.231 <2e-16 ***
## oldpeak -5.581 2.675 -2.087 0.0461 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.67 on 28 degrees of freedom
## Multiple R-squared: 0.1346, Adjusted R-squared: 0.1037
## F-statistic: 4.354 on 1 and 28 DF, p-value: 0.04614
Se buscará un modelo matemático para predecir el thalach (máxima frecuencia cardíaca alcanzada) con el oldpeak. Se tiene que un R cuadrado igual a 0.090, entonces el 9.0% de los datos es explicado por el modelo, entonces el modelo no tiene una suficiente dependencia de linealidad para explicar el modelo. y=156 - 5.67x_
#grafico de dispersion
ggplot(df, aes(thalach,oldpeak)) +geom_point()+geom_smooth(method = "lm",se=F,colour="#0099ff")+
labs(title="Grafico de dispersion", x="oldpeak", y="thalach",color=NULL) +
theme_classic(base_size=15)
## `geom_smooth()` using formula 'y ~ x'
se observa como la dispersión del residuo es muy grande, por lo que tiene valores atípicos en sus residuos
#validacion del modelo
ggplot(df, aes(oldpeak, lr2$residuals)) +
geom_point() + geom_smooth(color = "firebrick") + geom_hline(yintercept = 0, color="#0099ff",size=1) +
theme_classic(base_size=15)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Hipótesis Nula H0: El error aleatorio sigue una distribucion normal
Hipótesis Alterna H1: El error aleatorio no sigue una distribucion normal
Valor de la significancia =0.01
#normalidad de residuos
x<-lr2$residuals
ks.test(x,"pnorm",mean(x),sd(x))
##
## One-sample Kolmogorov-Smirnov test
##
## data: x
## D = 0.12605, p-value = 0.6807
## alternative hypothesis: two-sided
Su valor p esta por debajo de la significancia 0.01, por lo que se rechaza la hipótesis nula, entonces los residuos siguen una distribución normal.
###Conclusión
De la base de datos de diagnóstico de corazón, se tomaron una muestra de 100 casos en pacientes, las cuales se realizaron las diferentes pruebas estadísticas inferenciales y se llegó a los siguientes resultados:
• No existieron correlaciones o dependencia entre variables, El thalach y age están correlacionado débilmente de manera inversa con un –0.33. El thalach y oldpeak están correlacionado débilmente también de manera inversa con un –0.30.
• Para la regresión lineal simple al tener un bajo R2 el modelo no tendra una buena predicción. Esto se debe a la baja correlación que había entre la predicción y los predictores.
• En los contrastes para comprobar la normalidad en las variables para poder realizar el intervalo de confianza y contraste de hipótesis, todos sus valor p se rechazaron, debido a los problemas de sus valores atípicos que tenía en sus extremos, entonces ninguno seguía una distribución normal.