---
title: "Análisis y Visualización de Datos de Salud Cardíaca"
author: "Vicente Nevarez"
date: "2024-05-10"
output: html_document
---

# Introducción
Este informe aborda el análisis de un conjunto de datos relacionados con la salud cardíaca, utilizando técnicas de aprendizaje automático y visualizaciones para explorar patrones y relaciones. Incluye la construcción de un modelo de red neuronal para predecir la presencia de enfermedad cardíaca, y varias visualizaciones para comprender la distribución de variables clave.

# Carga de Datos y Preparación

```r
# Librerías necesarias
library(caret)
## Warning: package 'caret' was built under R version 4.1.3
## Loading required package: ggplot2
## Loading required package: lattice
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(neuralnet)
## Warning: package 'neuralnet' was built under R version 4.1.3
## 
## Attaching package: 'neuralnet'
## The following object is masked from 'package:dplyr':
## 
##     compute
library(ggplot2)
library(GGally)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
# Leer datos desde un archivo CSV
data <- read.csv("C:/R/heart.csv")

# Vista previa de los datos
View(data)

# Normalizar datos
normalize <- function(x) {
  return ((x - min(x)) / (max(x) - min(x)))
}

# Normalizar todas las columnas excepto la variable de salida ("output")
data_normalized <- data %>%
  mutate(across(-output, normalize))

# División del conjunto de datos en entrenamiento y prueba
set.seed(123)
trainIndex <- createDataPartition(data_normalized$output, p = .8, 
                                  list = FALSE, 
                                  times = 1)

trainData <- data_normalized[trainIndex,]
testData <- data_normalized[-trainIndex,]

En este bloque, cargamos las librerías necesarias y leemos los datos del archivo CSV. Definimos una función para normalizar datos y aplicamos esta función para estandarizar todas las columnas, excepto la variable de salida. Dividimos el conjunto de datos en un conjunto de entrenamiento y un conjunto de prueba para entrenar y evaluar el modelo de red neuronal.

Entrenamiento del Modelo de Red Neuronal

# Definir la fórmula del modelo
formula <- as.formula("output ~ age + sex + cp + trtbps + chol + fbs + restecg + thalachh + exng + oldpeak + slp + caa + thall")

# Entrenar el modelo de red neuronal
nn_model <- neuralnet(
  formula,
  data = trainData,
  hidden = c(6, 10, 4),  # Capas ocultas con 10 y 4 neuronas
  linear.output = FALSE,
  stepmax = 100000  # Número máximo de pasos de entrenamiento
)


# Hacer predicciones en el conjunto de prueba
predicted <- compute(nn_model, testData[, -which(names(testData) == "output")])

# Convertir resultados a valores binarios
predicted_classes <- ifelse(predicted$net.result > 0.5, 1, 0)

# Calcular precisión
accuracy <- sum(predicted_classes == testData$output) / length(testData$output)

cat("Precisión del modelo:", accuracy, "\n")
## Precisión del modelo: 0.85

Aquí definimos una fórmula para el modelo de red neuronal y entrenamos el modelo utilizando el conjunto de entrenamiento. Luego, realizamos predicciones en el conjunto de prueba y convertimos los resultados a valores binarios para evaluar la precisión del modelo. Finalmente, calculamos la precisión para determinar el rendimiento del modelo en la tarea de predicción.

Análisis y Visualización

# Boxplot del colesterol por género
ggplot(data, aes(x = as.factor(sex), y = chol, fill = as.factor(sex))) +
  geom_boxplot() +
  labs(title = "Distribución del colesterol por género",
       x = "Género",
       y = "Colesterol",
       fill = "Género")

# Gráfico de barras del tipo de dolor de pecho por nivel de azúcar en sangre, diferenciado por género
ggplot(data, aes(x = as.factor(cp), y = fbs, fill = as.factor(cp))) +
  geom_bar(stat = "identity") +
  facet_grid(~ sex) +
  labs(title = "Tipo de dolor de pecho por nivel de azúcar en sangre, diferenciado por género",
       x = "Tipo de dolor de pecho",
       y = "Nivel de azúcar en sangre",
       fill = "Tipo de dolor de pecho") +
  scale_x_discrete(labels = c("0" = "Angina típica",
                              "1" = "Angina atípica",
                              "2" = "Dolor no anginoso",
                              "3" = "Asintomático"))

# GGPairs para mostrar relaciones entre variables
ggpairs(data, columns = c("age", "chol", "thalachh", "trtbps"),
        aes(color = as.factor(output))) +
  labs(title = "Relaciones entre múltiples variables")

# Violin plot para mostrar la distribución de colesterol por nivel de azúcar en sangre y riesgo de infarto
ggplot(data, aes(x = as.factor(fbs), y = chol, fill = as.factor(output))) +
  geom_violin(position = position_dodge(width = 0.8), trim = FALSE) +
  labs(
    title = "Distribución de colesterol por nivel de azúcar en sangre y riesgo de infarto",
    x = "Nivel de azúcar en sangre (0 = Normal, 1 = Alto)",
    y = "Colesterol",
    fill = "Sufrió infarto (0 = No, 1 = Sí)"
  ) +
  theme_minimal()  # Cambia el tema para un estilo más limpio

# Dispersión entre colesterol y frecuencia cardíaca máxima
ggplot(data, aes(x = chol, y = thalachh, color = as.factor(output))) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, color = "green") +  # Línea de regresión para tendencia
  labs(
    title = "Relación entre colesterol y frecuencia cardíaca máxima",
    x = "Colesterol",
    y = "Frecuencia Cardíaca Máxima"
  ) +
  scale_color_manual(labels = c("Sin infarto", "Con infarto"), values = c("lightblue", "orange")) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

En este bloque, realizamos varias visualizaciones para analizar la relación entre diferentes variables en el conjunto de datos de salud cardíaca. Utilizamos ggplot2 para crear gráficos de caja, gráficos de barras, violin plots, y gráficos de dispersión para explorar las distribuciones y relaciones entre variables clave.

Conclusión

En este reporte, utilizamos una combinación de técnicas de preprocesamiento, modelado, y visualización para analizar datos de salud cardíaca. Entrenamos un modelo de red neuronal para predecir la presencia de enfermedad cardíaca y evaluamos su precisión. También creamos diversas visualizaciones para explorar patrones y relaciones entre variables clave, proporcionando información útil para la investigación y el análisis médico. ```