*** Tarea entregable Estudioso Omel David Gutierrez Jaramillo ***

Capitulo 2

Bioestadística

Fredy Medina.

rm(list = ls())
library(tidyverse)
library(plotly)
library(DT)
library(utf8)
library(readr)
library(ggplot2)
# Abrir base de datos ####
data <- read.table('https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data', header = TRUE, sep = ",", quote = "", fill = TRUE)

Tipos de datos:

Para iniciar con la clasificación de los datos e identificar los tipos de variables, trabajaremos con la data “Heart Disease”. Esta fue obtenida del repositorio de UCI Machine Learning. A este tipo de datos, cuando se manejan en forma de una hoja de cálculo, se le llama dataframe.

El siguiente código realiza los siguientes pasos:

Limpia el entorno de trabajo. Carga las bibliotecas necesarias para crear tablas interactivas (DT) y leer datos (readr). Define la URL del conjunto de datos sobre enfermedades cardíacas. Lee el archivo desde la URL en un dataframe. Renombra las columnas del dataframe para mayor claridad. Muestra el dataframe en una tabla interactiva.

rm(list = ls())

url_base= 'https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data'

data <- read.table(url_base, header = TRUE, sep = ",", quote = "", fill = TRUE)
data <- read.table('https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data', header = TRUE, sep = ",", quote = "", fill = TRUE)

names(data) <- c( "age", "sex", "cp", "trestbps", "chol","fbs", "restecg","thalach","exang", "oldpeak","slope", "ca", "thal", "num")

datatable(data)

Que significa cada elemento del codigo

rm(list = ls()):

Esta línea elimina todos los objetos del entorno de trabajo actual en R. ls() devuelve una lista de todos los objetos en el entorno de trabajo, y rm(list = ls()) los elimina. Esto se hace para limpiar el entorno y evitar conflictos con objetos previos.
library(DT):

Carga el paquete DT, que se utiliza para crear tablas interactivas en R. Este paquete es útil para visualizar datos en una forma de tabla en R Markdown o aplicaciones Shiny.
library(readr):

Carga el paquete readr, que proporciona funciones rápidas y eficientes para leer datos en R. Aunque no se usa directamente en el código proporcionado, es común usar readr para leer archivos de datos. url_base = ‘https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data’:

Define una variable url_base que contiene la URL del archivo de datos. Este archivo es un conjunto de datos sobre enfermedades cardíacas disponible en el repositorio de la UCI. dataD <- read.table(url_base, header = TRUE, sep = “,”, quote = ““, fill = TRUE):

Lee el archivo de datos desde la URL y lo almacena en dataD. header = TRUE indica que la primera línea del archivo contiene los nombres de las columnas. sep = “,” especifica que el separador de campos es una coma, por lo que se espera que el archivo sea CSV. quote = “” indica que no hay caracteres de comillas en los datos. fill = TRUE permite que las filas con diferentes longitudes se ajusten al tamaño máximo, rellenando con NA donde sea necesario. datatable(dataD):

Utiliza la función datatable del paquete DT para mostrar los datos en forma de una tabla interactiva. Esto proporciona una vista dinámica de los datos en una interfaz web con opciones de ordenamiento, filtrado, etc. names(dataD) <- c(“age”, “sex”, “cp”, “trestbps”, “chol”, “fbs”, “restecg”, “thalach”, “exang”, “oldpeak”, “slope”, “ca”, “thal”, “num”):

Asigna nombres de columnas más descriptivos a dataD. Esta línea renombra las columnas del dataframe dataD con los nombres especificados en el vector.

Tipos de variables

## Cargando paquete requerido: DiagrammeR

Una variable es cualquier característica cuyo valor puede variar entre diferentes objetos en una población.

Las variables se pueden clasificar según su naturaleza en los siguientes tipos:

Univariantes: Estas variables se refieren a observaciones realizadas en una sola variable dentro de un conjunto de datos. En un análisis univariante, solo se examina una variable a la vez.

Bivariantes: En este caso, se realizan observaciones en dos variables para cada unidad experimental. Los datos bivariantes permiten explorar la relación entre dos variables.

Multivariantes: Surgen cuando se realizan observaciones en más de dos variables. Un análisis multivariante considera múltiples variables simultáneamente (donde el análisis bivariado es un caso especial dentro del multivariado).

Tipos de Datos Clásicos Numéricos: Los datos que se expresan en una escala numérica. Se dividen en:

Continuos: Datos que pueden tomar cualquier valor dentro de un intervalo. Por ejemplo, la altura o el peso. Discretos: Datos que solo pueden tomar valores enteros, como el número de hijos o el número de visitas a una página web. Categóricos: Datos que pueden tomar solo un conjunto específico y finito de valores que representan categorías. Se dividen en:

Binario: Un tipo especial de datos categóricos con solo dos posibles valores, como 0/1 o verdadero/falso. También se conoce como dicotómico, lógico, indicador o booleano. Ordinal: Datos categóricos que tienen un ordenamiento explícito. Por ejemplo, clasificaciones como “bajo”, “medio” y “alto”. También se llama factor ordenado.

#codebook#### Las siguientes son las variables que cargamos de la data Heart Diseas

“age”, “sex”, “cp”, “trestbps”, “chol”,“fbs”, “restecg”,“thalach”,“exang”, “oldpeak”,“slope”, “ca”, “thal”, “num”
age: edad del paciente
sex: Sexo del paciente
cp: Tipo de dolor en el pecho
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
chol: Colesterol sérico en mg /dl
fbs: azúcar en sangre en ayunas > 120 mg/dl
restecg: Resultados electrocardiográficos en reposo
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 hipertrofía ventricular izquierda probable o definitiva según los criterios de Estes.
thalach: Frecuencia cardiaca máxima alcanzada
exang: Angina inducida por el ejercicio
oldpeak: Depresión del ST inducida por el ejercicio en relación con el descanso
slope: La pendiente del segmento ST de ejercicio pico
Valor 1: ascenso
Valor 2: plano
Valor 3: descenso
ca: Numero de vasos principales (0-3) coloreados por fluoroscopia
thal: El estado del corazón según la prueba de Thallium
N = normal;
DF = defecto fijo
DR = defecto reversible
num : Presencia de enfermedad cardíaca (estado de enfermedad angiográfica)
0: Saludable
1: Diagnosticado como etapa 1
2: Diagnosticado como etapa 2
3: Diagnosticado como etapa 3
4: Diagnosticado como etapa 4

#### Ejercicio 1. Clasifique cada una de estas variables y transforme todas las que sean necesarias con los métodos descritos en el documento.

str(data)
## 'data.frame':    302 obs. of  14 variables:
##  $ age     : num  67 67 37 41 56 62 57 63 53 57 ...
##  $ sex     : num  1 1 1 0 1 0 0 1 1 1 ...
##  $ cp      : num  4 4 3 2 2 4 4 4 4 4 ...
##  $ trestbps: num  160 120 130 130 120 140 120 130 140 140 ...
##  $ chol    : num  286 229 250 204 236 268 354 254 203 192 ...
##  $ fbs     : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : num  2 2 0 2 0 2 0 2 2 0 ...
##  $ thalach : num  108 129 187 172 178 160 163 147 155 148 ...
##  $ exang   : num  1 1 0 0 0 0 1 0 1 0 ...
##  $ oldpeak : num  1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 0.4 ...
##  $ slope   : num  2 2 3 1 1 3 1 2 3 2 ...
##  $ ca      : chr  "3.0" "2.0" "0.0" "0.0" ...
##  $ thal    : chr  "3.0" "7.0" "3.0" "3.0" ...
##  $ num     : int  2 1 0 0 0 3 0 2 1 0 ...
data$sex[data$sex==1]<- "Masculino" #asigna Masculino a el valor 1 en la columna sex
data$sex[data$sex==0]<- "Femenino"  #asigna femenino a el valor 0 en la columna sex
str(data)
## 'data.frame':    302 obs. of  14 variables:
##  $ age     : num  67 67 37 41 56 62 57 63 53 57 ...
##  $ sex     : chr  "Masculino" "Masculino" "Masculino" "Femenino" ...
##  $ cp      : num  4 4 3 2 2 4 4 4 4 4 ...
##  $ trestbps: num  160 120 130 130 120 140 120 130 140 140 ...
##  $ chol    : num  286 229 250 204 236 268 354 254 203 192 ...
##  $ fbs     : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : num  2 2 0 2 0 2 0 2 2 0 ...
##  $ thalach : num  108 129 187 172 178 160 163 147 155 148 ...
##  $ exang   : num  1 1 0 0 0 0 1 0 1 0 ...
##  $ oldpeak : num  1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 0.4 ...
##  $ slope   : num  2 2 3 1 1 3 1 2 3 2 ...
##  $ ca      : chr  "3.0" "2.0" "0.0" "0.0" ...
##  $ thal    : chr  "3.0" "7.0" "3.0" "3.0" ...
##  $ num     : int  2 1 0 0 0 3 0 2 1 0 ...
data$ca <- as.integer(data$ca)
## Warning: NAs introducidos por coerción
str(data)
## 'data.frame':    302 obs. of  14 variables:
##  $ age     : num  67 67 37 41 56 62 57 63 53 57 ...
##  $ sex     : chr  "Masculino" "Masculino" "Masculino" "Femenino" ...
##  $ cp      : num  4 4 3 2 2 4 4 4 4 4 ...
##  $ trestbps: num  160 120 130 130 120 140 120 130 140 140 ...
##  $ chol    : num  286 229 250 204 236 268 354 254 203 192 ...
##  $ fbs     : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : num  2 2 0 2 0 2 0 2 2 0 ...
##  $ thalach : num  108 129 187 172 178 160 163 147 155 148 ...
##  $ exang   : num  1 1 0 0 0 0 1 0 1 0 ...
##  $ oldpeak : num  1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 0.4 ...
##  $ slope   : num  2 2 3 1 1 3 1 2 3 2 ...
##  $ ca      : int  3 2 0 0 0 2 0 1 0 0 ...
##  $ thal    : chr  "3.0" "7.0" "3.0" "3.0" ...
##  $ num     : int  2 1 0 0 0 3 0 2 1 0 ...
data$cp[data$cp==1]<- "Angina Tipica" #asigna Angina Tipica a el valor 1 en la columna cp
data$cp[data$cp==2]<- "Angina atipica"  #asigna Angina atipica a el valor 2 en la columna cp
data$cp[data$cp==3]<- "Dolor no anginal" #asigna Dolor no anginal a el valor 3 en la columna cp
data$cp[data$cp==4]<- "Asintomatico"  #asigna Asintomatico a el valor 4 en la columna cp

data$sex <- as.factor(data$sex)

str(data)
## 'data.frame':    302 obs. of  14 variables:
##  $ age     : num  67 67 37 41 56 62 57 63 53 57 ...
##  $ sex     : Factor w/ 2 levels "Femenino","Masculino": 2 2 2 1 2 1 1 2 2 2 ...
##  $ cp      : chr  "Asintomatico" "Asintomatico" "Dolor no anginal" "Angina atipica" ...
##  $ trestbps: num  160 120 130 130 120 140 120 130 140 140 ...
##  $ chol    : num  286 229 250 204 236 268 354 254 203 192 ...
##  $ fbs     : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : num  2 2 0 2 0 2 0 2 2 0 ...
##  $ thalach : num  108 129 187 172 178 160 163 147 155 148 ...
##  $ exang   : num  1 1 0 0 0 0 1 0 1 0 ...
##  $ oldpeak : num  1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 0.4 ...
##  $ slope   : num  2 2 3 1 1 3 1 2 3 2 ...
##  $ ca      : int  3 2 0 0 0 2 0 1 0 0 ...
##  $ thal    : chr  "3.0" "7.0" "3.0" "3.0" ...
##  $ num     : int  2 1 0 0 0 3 0 2 1 0 ...
data$restecg[data$restecg==0]<- "Normal" #asigna Normal a el valor 0 en la columna restecg
data$restecg[data$restecg==1]<- "Anormalidad de onda ST"  #asigna Anormalidad de onda ST a el valor 1 en la columna restecg
data$restecg[data$restecg==2]<- "Hipertrofia ventricular izquierda probable" #Hipertrofia ventricular izquierda probable a el valor 2 en la columna restecg

data$ca <- as.character(data$ca) 

str(data)
## 'data.frame':    302 obs. of  14 variables:
##  $ age     : num  67 67 37 41 56 62 57 63 53 57 ...
##  $ sex     : Factor w/ 2 levels "Femenino","Masculino": 2 2 2 1 2 1 1 2 2 2 ...
##  $ cp      : chr  "Asintomatico" "Asintomatico" "Dolor no anginal" "Angina atipica" ...
##  $ trestbps: num  160 120 130 130 120 140 120 130 140 140 ...
##  $ chol    : num  286 229 250 204 236 268 354 254 203 192 ...
##  $ fbs     : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : chr  "Hipertrofia ventricular izquierda probable" "Hipertrofia ventricular izquierda probable" "Normal" "Hipertrofia ventricular izquierda probable" ...
##  $ thalach : num  108 129 187 172 178 160 163 147 155 148 ...
##  $ exang   : num  1 1 0 0 0 0 1 0 1 0 ...
##  $ oldpeak : num  1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 0.4 ...
##  $ slope   : num  2 2 3 1 1 3 1 2 3 2 ...
##  $ ca      : chr  "3" "2" "0" "0" ...
##  $ thal    : chr  "3.0" "7.0" "3.0" "3.0" ...
##  $ num     : int  2 1 0 0 0 3 0 2 1 0 ...
data$num[data$num==0]<- "Saludable" #asigna Saludable a el valor 0 en la columna num
data$num[data$num==1]<- "Diagnosticado como etapa 1"  #asigna Diagnosticado como etapa 1 a el valor 1 en la columna num
data$num[data$num==2]<- "Diagnosticado como etapa 2" #asigna Diagnosticado como etapa 2 a el valor 2 en la columna num
data$num[data$num==3]<- "Diagnosticado como etapa 3"  #asigna Diagnosticado como etapa 3 a el valor 3 en la columna num
data$num[data$num==4]<- "Diagnosticado como etapa 4"  #asigna Diagnosticado como etapa 4 a el valor 4 en la columna num

data$ca <- as.character(data$ca) 

str(data)
## 'data.frame':    302 obs. of  14 variables:
##  $ age     : num  67 67 37 41 56 62 57 63 53 57 ...
##  $ sex     : Factor w/ 2 levels "Femenino","Masculino": 2 2 2 1 2 1 1 2 2 2 ...
##  $ cp      : chr  "Asintomatico" "Asintomatico" "Dolor no anginal" "Angina atipica" ...
##  $ trestbps: num  160 120 130 130 120 140 120 130 140 140 ...
##  $ chol    : num  286 229 250 204 236 268 354 254 203 192 ...
##  $ fbs     : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : chr  "Hipertrofia ventricular izquierda probable" "Hipertrofia ventricular izquierda probable" "Normal" "Hipertrofia ventricular izquierda probable" ...
##  $ thalach : num  108 129 187 172 178 160 163 147 155 148 ...
##  $ exang   : num  1 1 0 0 0 0 1 0 1 0 ...
##  $ oldpeak : num  1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 0.4 ...
##  $ slope   : num  2 2 3 1 1 3 1 2 3 2 ...
##  $ ca      : chr  "3" "2" "0" "0" ...
##  $ thal    : chr  "3.0" "7.0" "3.0" "3.0" ...
##  $ num     : chr  "Diagnosticado como etapa 2" "Diagnosticado como etapa 1" "Saludable" "Saludable" ...
data$slope[data$slope==1]<- "Ascenso" #asigna Ascenso a el valor 1 en la columna slope
data$slope[data$slope==2]<- "Plano"  #asigna Plano a el valor 2 en la columna slope
data$slope[data$slope==3]<- "Descenso" #asigna Descenso a el valor 3 en la columna slope

data$ca <- as.character(data$ca)
str(data)
## 'data.frame':    302 obs. of  14 variables:
##  $ age     : num  67 67 37 41 56 62 57 63 53 57 ...
##  $ sex     : Factor w/ 2 levels "Femenino","Masculino": 2 2 2 1 2 1 1 2 2 2 ...
##  $ cp      : chr  "Asintomatico" "Asintomatico" "Dolor no anginal" "Angina atipica" ...
##  $ trestbps: num  160 120 130 130 120 140 120 130 140 140 ...
##  $ chol    : num  286 229 250 204 236 268 354 254 203 192 ...
##  $ fbs     : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : chr  "Hipertrofia ventricular izquierda probable" "Hipertrofia ventricular izquierda probable" "Normal" "Hipertrofia ventricular izquierda probable" ...
##  $ thalach : num  108 129 187 172 178 160 163 147 155 148 ...
##  $ exang   : num  1 1 0 0 0 0 1 0 1 0 ...
##  $ oldpeak : num  1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 0.4 ...
##  $ slope   : chr  "Plano" "Plano" "Descenso" "Ascenso" ...
##  $ ca      : chr  "3" "2" "0" "0" ...
##  $ thal    : chr  "3.0" "7.0" "3.0" "3.0" ...
##  $ num     : chr  "Diagnosticado como etapa 2" "Diagnosticado como etapa 1" "Saludable" "Saludable" ...
data$exang[data$exang==0]<- "No angina inducida por el ejercicio" #No angina inducida por el ejercicio a el valor 0 en la columna exang
data$exang[data$exang==1]<- "Angina inducida por el ejercicio"  #Angina inducida por el ejercicio a el valor 1 en la columna  exang

data$ca <- as.character(data$ca)
str(data)
## 'data.frame':    302 obs. of  14 variables:
##  $ age     : num  67 67 37 41 56 62 57 63 53 57 ...
##  $ sex     : Factor w/ 2 levels "Femenino","Masculino": 2 2 2 1 2 1 1 2 2 2 ...
##  $ cp      : chr  "Asintomatico" "Asintomatico" "Dolor no anginal" "Angina atipica" ...
##  $ trestbps: num  160 120 130 130 120 140 120 130 140 140 ...
##  $ chol    : num  286 229 250 204 236 268 354 254 203 192 ...
##  $ fbs     : num  0 0 0 0 0 0 0 0 1 0 ...
##  $ restecg : chr  "Hipertrofia ventricular izquierda probable" "Hipertrofia ventricular izquierda probable" "Normal" "Hipertrofia ventricular izquierda probable" ...
##  $ thalach : num  108 129 187 172 178 160 163 147 155 148 ...
##  $ exang   : chr  "Angina inducida por el ejercicio" "Angina inducida por el ejercicio" "No angina inducida por el ejercicio" "No angina inducida por el ejercicio" ...
##  $ oldpeak : num  1.5 2.6 3.5 1.4 0.8 3.6 0.6 1.4 3.1 0.4 ...
##  $ slope   : chr  "Plano" "Plano" "Descenso" "Ascenso" ...
##  $ ca      : chr  "3" "2" "0" "0" ...
##  $ thal    : chr  "3.0" "7.0" "3.0" "3.0" ...
##  $ num     : chr  "Diagnosticado como etapa 2" "Diagnosticado como etapa 1" "Saludable" "Saludable" ...

str(dataD) muestra la estructura del dataframe dataD, incluyendo el nombre de las columnas y su tipo de datos.

La siguiente línea de código nos permite resumir las variables contenidas en los datos.

summary(data)
##       age               sex           cp               trestbps    
##  Min.   :29.00   Femenino : 97   Length:302         Min.   : 94.0  
##  1st Qu.:48.00   Masculino:205   Class :character   1st Qu.:120.0  
##  Median :55.50                   Mode  :character   Median :130.0  
##  Mean   :54.41                                      Mean   :131.6  
##  3rd Qu.:61.00                                      3rd Qu.:140.0  
##  Max.   :77.00                                      Max.   :200.0  
##       chol            fbs           restecg             thalach     
##  Min.   :126.0   Min.   :0.0000   Length:302         Min.   : 71.0  
##  1st Qu.:211.0   1st Qu.:0.0000   Class :character   1st Qu.:133.2  
##  Median :241.5   Median :0.0000   Mode  :character   Median :153.0  
##  Mean   :246.7   Mean   :0.1457                      Mean   :149.6  
##  3rd Qu.:275.0   3rd Qu.:0.0000                      3rd Qu.:166.0  
##  Max.   :564.0   Max.   :1.0000                      Max.   :202.0  
##     exang              oldpeak         slope                ca           
##  Length:302         Min.   :0.000   Length:302         Length:302        
##  Class :character   1st Qu.:0.000   Class :character   Class :character  
##  Mode  :character   Median :0.800   Mode  :character   Mode  :character  
##                     Mean   :1.035                                        
##                     3rd Qu.:1.600                                        
##                     Max.   :6.200                                        
##      thal               num           
##  Length:302         Length:302        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 

Medidas de Dispersión

Mientras que la tendencia central proporciona una idea de la ubicación típica de los datos, la dispersión ofrece una perspectiva sobre cómo se distribuyen estos datos alrededor de esa ubicación central. Medir la dispersión es fundamental en estadística, ya que ayuda a entender la variabilidad de los datos, identificar diferencias entre datos, y tomar decisiones basadas en la variabilidad observada.

Palabras Claves

Desviaciones: Las diferencias entre los valores observados y la estimación central de los datos.

Varianza: Calculada como la suma de las desviaciones al cuadrado respecto a la media, dividida por \(n-1\), donde \(n\) es el número de observaciones. (también conocida como “mean squared error”)

Desviación Estándar: Es la raíz cuadrada de la varianza, proporcionando una medida de dispersión en las mismas unidades que los datos originales.

Desviación Media Absoluta (MAD): Es el promedio de las desviaciones absolutas respecto a la media, representando una medida robusta de variabilidad. (también conocida como la norma L1 o norma de Manhattan)

Rango: La diferencia entre el valor máximo y el valor mínimo en el conjunto de datos.

Estadística de Orden: Métricas que se basan en la posición relativa de los datos, ordenados de menor a mayor.

Percentil \(p\): El valor que divide los datos de tal manera que el \(p\%\) de los datos son menores o iguales a este valor, y el \((100-p)\%\) restante son mayores o iguales a él.

Rango Intercuartil (IQR): La diferencia entre el percentil 75 y el percentil 25, proporcionando una medida de dispersión que no se ve afectada por los valores extremos.

Desviación Estándar y Medidas Relacionadas

Para evaluar la dispersión, se utilizan a menudo medidas basadas en las desviaciones entre los datos y el valor central estimado. Estas desviaciones indican el grado de variabilidad alrededor de la media.

Desviación Media Absoluta (MAD)

Una forma de evaluar la dispersión es calculando un valor representativo para las desviaciones absolutas. A diferencia de la suma simple de las desviaciones, que se cancela, se utiliza el promedio de las desviaciones absolutas para obtener una medida significativa de variabilidad:

\[\text{MAD} = \frac{\sum_{i=1}^{n} |x_i - \bar{x}|}{n}\]

Ejercicio 2.

Con este resumen de los datos, describe cada una de las variables en cuanto a su comportamiento y el sentido de estos valores.

Con respecto a los valores faltantes o no existentes, la función summary() también proporciona un resumen que incluye la cantidad de valores NA por columna. Además, lo podemos hacer de la siguiente manera:

apply(is.na(data), 2, sum)
##      age      sex       cp trestbps     chol      fbs  restecg  thalach 
##        0        0        0        0        0        0        0        0 
##    exang  oldpeak    slope       ca     thal      num 
##        0        0        0        4        0        0
summary(data)
##       age               sex           cp               trestbps    
##  Min.   :29.00   Femenino : 97   Length:302         Min.   : 94.0  
##  1st Qu.:48.00   Masculino:205   Class :character   1st Qu.:120.0  
##  Median :55.50                   Mode  :character   Median :130.0  
##  Mean   :54.41                                      Mean   :131.6  
##  3rd Qu.:61.00                                      3rd Qu.:140.0  
##  Max.   :77.00                                      Max.   :200.0  
##       chol            fbs           restecg             thalach     
##  Min.   :126.0   Min.   :0.0000   Length:302         Min.   : 71.0  
##  1st Qu.:211.0   1st Qu.:0.0000   Class :character   1st Qu.:133.2  
##  Median :241.5   Median :0.0000   Mode  :character   Median :153.0  
##  Mean   :246.7   Mean   :0.1457                      Mean   :149.6  
##  3rd Qu.:275.0   3rd Qu.:0.0000                      3rd Qu.:166.0  
##  Max.   :564.0   Max.   :1.0000                      Max.   :202.0  
##     exang              oldpeak         slope                ca           
##  Length:302         Min.   :0.000   Length:302         Length:302        
##  Class :character   1st Qu.:0.000   Class :character   Class :character  
##  Mode  :character   Median :0.800   Mode  :character   Mode  :character  
##                     Mean   :1.035                                        
##                     3rd Qu.:1.600                                        
##                     Max.   :6.200                                        
##      thal               num           
##  Length:302         Length:302        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 

###Tablas de Frecuencia e Histogramas ##Histograma

Un histograma es una herramienta visual que representa una tabla de frecuencias. En este gráfico, los intervalos de datos se colocan en el eje \(x\), mientras que el recuento de datos se muestra en el eje \(y\).

Gráficas y Estimaciones de Densidad Relacionada con el histograma, la gráfica de densidad muestra la distribución de los valores de los datos como una línea continua. Este tipo de gráfico se puede considerar una versión suavizada del histograma y se calcula generalmente a partir de los datos usando una estimación de la densidad del núcleo.

Palabras Claves:

Histograma: Representa los recuentos de frecuencia en el eje \(y\) y los valores de las variables en el eje \(x\), ofreciendo una visión general de la distribución de los datos de manera rápida.

Tabla de Frecuencia: Es una representación tabular de los recuentos de frecuencia que se encuentran en un histograma.

Box-plot: Proporciona una visión rápida de la distribución de los datos y se utiliza frecuentemente en comparaciones de distribuciones cuando se muestran varios box-plots lado a lado.

Gráfico de Densidad: Ofrece una versión suavizada del histograma y requiere una función para estimar la densidad del gráfico basada en los datos. Existen múltiples métodos de estimación posibles.

Exploración de datos EDA.

Haremos algunas indicaciones sobre gráficos de barras:

  1. Los diagramas (o gráficos) de barras se utilizan para variables cualitativas (categóricas) o para variables cuantitativas discretas.

  2. Los niveles de cada factor o categoría van en el eje \(x\).

  3. Las frecuencias en el eje \(y\). (o proporciones)

# Cargar las librerías necesarias
library(ggplot2)
#Modificacion de la data
#data$sex[data$sex==1]<- "Masculino" asigna Masculino a el valor 1 en la columna sex
#data$sex[data$sex==0]<- "Femenino"  asigna femenino a el valor 0 en la columna sex
# Crear gráfico de barras para el sexo
ggplot(data, aes(x=factor(sex))) +
  geom_bar(color= "blue") +
  labs(title="Distribucion por Sexo", x="Sexo", y="Numero de Personas")

# +
  #scale_x_discrete(labels=c("0"="Hombre", "1"="Mujer")) + # Ajustar etiquetas según sea necesario
#Modificacion de la data
#data$sex[data$sex==1]<- "Masculino"
#data$sex[data$sex==0]<- "Femenino"
# Crear gráfico de barras para el sexo


ggplot(data, aes(x=factor(sex))) +
  geom_bar(fill="lightcoral", color="black") +
  labs(title="Distribución por Sexo", x="Sexo", y="Número de Personas") +
  scale_x_discrete(labels=c("0"="Hombre", "1"="Mujer")) + # Ajustar etiquetas según sea necesario
  theme_minimal()

# Crear gráfico de barras para el sexo con colores diferentes para cada categoría
ggplot(data, aes(x=factor(sex), fill=factor(sex))) +
  geom_bar(color="black") +  # Color del borde de las barras
  scale_fill_manual(values=c("0"="lightblue", "1"="lightcoral")) +  # Especificar colores para cada categoría
  labs(title="Distribucion por Sexo", x="Sexo", y="# de Personas") +
  theme_minimal()
## Warning: No shared levels found between `names(values)` of the manual scale and the
## data's fill values.
## No shared levels found between `names(values)` of the manual scale and the
## data's fill values.

La siguiente es otra forma de crear gráficos de barras mediante el agrupamiento por una variable adicional. El código crea una nueva columna llamada age_group en el dataframe, la cual agrupa los valores de la columna age en intervalos específicos utilizando la función cut().

# Cargar las librerías necesarias

# Crear intervalos de edad
data$age_group <- cut(data$age, breaks=seq(20, 80, by=5), include.lowest=TRUE)

# Crear gráfico de barras para la edad
ggplot(data, aes(x=age_group)) +
  geom_bar(fill="skyblue", color="black") +
  labs(title="Distribucion de la Edad", x="Grupo de Edad", y="Numero de Personas") +
  theme_minimal()

data$age_group:

Esta parte crea una nueva columna en el dataframe data llamada age_group. Los valores que se generen a partir de la función cut() se almacenarán en esta nueva columna.
cut(data$age, …):

La función cut() convierte los valores continuos de data$age en intervalos o “bins” categorizados. En este caso, agrupa los valores de la columna age en distintos rangos de edad.
breaks=seq(20, 80, by=5):

breaks especifica los límites de los intervalos. Aquí se utiliza la función seq() para generar una secuencia de números que comienza en 20, termina en 80, y aumenta de 5 en 5.
Por ejemplo, los intervalos serían [20, 25), [25, 30), [30, 35), etc., hasta el intervalo final [75, 80]. Esto agrupa las edades en segmentos de 5 años.
include.lowest=TRUE:

Este argumento asegura que el valor más bajo (en este caso, 20) sea incluido en el primer intervalo. De lo contrario, podría ser excluido dependiendo de la forma en que los intervalos son definido

Ejercicio 3.

Transforme la variable “num” en sus categóricas y describa como puede interpretar el siguiente gráfico.

ggplot(data, aes(x=factor(age), fill=factor(num))) +
  geom_bar(color="black") +
  labs(title="num", x="Sexo", y="Número de Personas") +
  scale_fill_brewer(palette="Set1") +  # Aplicar una paleta de colores de RColorBrewer
  theme_minimal()

#num : Presencia de enfermedad cardíaca (estado de enfermedad angiográfica)   
#  0: Saludable  
#  1: Diagnosticado como etapa 1  
#  2: Diagnosticado como etapa 2  
#  3: Diagnosticado como etapa 3  
#  4: Diagnosticado como etapa 4  

La gráfica anterior muestra barras agrupadas por rangos de edades, y en cada barra se representa el estado de la enfermedad angiográfica.

boxplot(data$age, xlab = "Edades",col = "lightblue",bg = 'transparent',horizontal = T)

que interpretación le puede dar a la anterior grafica con respecto a los datos.

El gráfico muestra que la edad mínima de los pacientes es de 29 años, mientras que la edad máxima es de 77 años. El promedio de edad es de 54 años, con una mediana de 56 años, lo que indica una ligera asimetría negativa en la distribución de la edad, ya que la mediana es mayor que la media. Esta asimetría se puede apreciar en el histograma, donde la línea roja marca la media y la línea negra la mediana. La desviación estándar de las edades es de 9.03 años, lo que sugiere una variación moderada respecto a la media. Además, se observa una mayor concentración de pacientes entre los 50 y 60 años. En el diagrama de cajas, se puede ver que el 25% de los pacientes tienen menos de 48 años, el 50% menos de 56 años, y el 75% menos de 61 años.

La siguiente gráfica permite evidenciar la dispersión de los datos en cuanto a la edad y la presión en reposo, junto con una asignación por colores de las categorías para la variable thal (el estado del corazón según la prueba de Thallium).

¿Tiene algún sentido el valor “N” en la gráfica?

responda:

# Suponiendo que las variables a graficar son thal, age y trestbps (presión sanguínea en reposo)
ggplot(data, aes(x=age, y=trestbps, color=factor(thal))) +
  geom_point(size=3) +
  labs(title="Relación entre Edad, Presión en Reposo y Thal",
       x="Edad", y="Presión Sanguínea en Reposo", color="Thal") +
  theme_minimal()

Ejercicio 4.

Complete todo el análisis descriptivo de cada una de las variables junto con la interpretación de las gráficas correspondientes. Para esto, utilice diferentes gráficos y las medidas de variabilidad.

# Grafica Sexo 
ggplot(data, aes(x=factor(sex))) +
  geom_bar(color="black") +
  labs(title="num", x="Sexo", y="Número de Personas") +
  scale_fill_brewer(palette="Set1") +  # Aplicar una paleta de colores de RColorBrewer
  theme_minimal()

# Grafica edad

ggplot(data, aes(x=age)) +
  geom_boxplot (color="black") +
  labs(title="num", x="Variable Age", y="Número de Personas") +
  scale_fill_brewer(palette="Set1") +  # Aplicar una paleta de colores de RColorBrewer
  theme_minimal()

summary(data$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   29.00   48.00   55.50   54.41   61.00   77.00

Nota la Grafica Sexo muestar un predominio de poblacion mayoritariamente masculina.

Para el caso de la grafica de edad el promedio esta en los 56 años con edades extremas de 28 y 77 años.

# Grafica tipo de dolor en el pecho.

ggplot(data, aes(x=factor(cp))) +
  geom_bar(color="black") +
  labs(title="num", x="Tipo de dolor", y="Número de Personas") +
  scale_fill_brewer(palette="Set1") +  # Aplicar una paleta de colores de RColorBrewer
  theme_minimal()

La grafica expresa que es significativamente mayor el numero de personas que son asintomaticas. Solo 23 de ellas tienen una angina tipica.

# Resultados electrocardiograficos en reposo


ggplot(data, aes(x=factor(restecg))) +
  geom_bar(color="black") +
  labs(title="num", x="resultados del EKG", y="Número de Personas") +
  scale_fill_brewer(palette="Set1") +  # Aplicar una paleta de colores de RColorBrewer
  theme_minimal()

install.packages("ggplot2")
## Warning: package 'ggplot2' is in use and will not be installed

Nota: la grafica muestra una significativa proporcion de estadio 2 del resultado EKG en reposo. Una sola persona presenta estadio uno.

# Grafica que expresa relacion entre la edad, el sexo y la tension arterial en reposo

ggplot(data, aes(x=age, y=trestbps, color=factor(sex))) +
  geom_point(size=3) +
  labs(title="Relación entre Edad, Presión en Reposo y sex",
       x="Edad", y="Presión Sanguínea en Reposo", color="sex") +
  theme_minimal()

Nota: la grafia expresa que el pico de presion sanguinea mas elevada corresponde al genero genenino en el rango de edad entre los 55 y 60 años. Para el caso del sexo masculino la situacion se presenta antes de los 55 años.

# Grafica que expresa relacion entre la edad, el sexo y electrocardiograma en reposo

ggplot(data, aes(x=factor(restecg), fill=factor(sex))) +
  geom_bar(position="fill") +
  facet_wrap(~cut(age, breaks=c(20, 40, 60, 80)), labeller=label_both) +
  labs(title="Proporción de Electrocardiograma en Reposo por Sexo y Grupo de Edad",
       x="Electrocardiograma en Reposo", y="Proporción", fill="Sexo") +
  theme_minimal()

Nota: la grafica agrupa los grupos de edad y sexo dependiento los resultados del electrocardiograma en reposo. Para el primer grupo el nivel 2 es absoluto en los hombres. para el segundo grupo el nivel cero y dos tambien tiene predominio mastulino y el uno femenino. en el tercer grupo el nivel 1 es absoluto para el sexo femenino.

Ejercicio 5.

Redacte al menos 5 conclusiones.

Respuesta: 1. Es posbile redefinir las variables utilizando los comandos correctos. 2. Se pueden establecer posibles asociaciones entre variables. 3. R facilita el calculo de las medidas de tendencia centralpor medio del comando summary. 4. las graficas son la representaciòn visual de los calculos realizados con cada una de las variables. 5.Durante el ejercicio se evidenciò que lasmvariables definidas como character no muestran los valores minimos, maximos, rangos interquartilicos a menos que se conviertan a factor por medio del codigo as.factor.