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)
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
##
##
##
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.
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.
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}\]
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.
Haremos algunas indicaciones sobre gráficos de barras:
Los diagramas (o gráficos) de barras se utilizan para variables cualitativas (categóricas) o para variables cuantitativas discretas.
Los niveles de cada factor o categoría van en el eje \(x\).
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
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()
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.
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.