El conjunto de datos que se analiza es estructurado y se relaciona con un estudio simulado de los ejercicio o caminata de una persona durante y la presión sistólica recopilada para fines de salud.
El ejercicio será medido en minutos y es un valor numérico continuo que identifica cuanto camina una persona durante una semana.
Conceptualmente, la presión sistólica es el valor numérico del bombeo del corazón que envía sangre hacia el resto del cuerpo a través de las arterias. Es el valor más alto que aparece en una medición de presión arterial.
En las siguientes direcciones url, se identifican dos conjuntos de datos uno con una recopilación de datos de minutos y presión muy aleatorio llamado datos con ruido ya que al ser muy aleatorio la simulación los datos tiene a ser muy dispersos; luego otro conjunto de datos con valores mas pedagógicos y para fines académicos.
Las variables son: * actividad_min representa la actividad de ejercicio de una persona valorada en minutos a la semana. * presion_sistolica significa el valor recopilado de la presión de la persona.
Implementar y evaluar modelos de regresión lineal simple (RLS).
library(psych)
library(tidyverse)
library(ggplot2)
library(tidyverse)
library(ggplot2)
# Tablas compatibles con Word
library(flextable)
library(officer)
Se manda llamar las funciones previaemnte preparas que se encuentran en el enlace: https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20RLS.R y que contiene las funciones que se utilizan para este caso.
# source ("C:/Users/ruben/Documents/2025/Libro. Aprendizaje automático casos de estudio con R y Python/funciones/funciones para RLS.r") # Funcione guardadas en ruta local
source ("https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20RLS.R") # Funciones almacenadas en url de autor
Se cargan datos ejecutando la función f_cargar_datos() de donde: * los datos_1 representan los datos con ruido o con mucha dispersión y * los datos_2 son datos preparados más didáctico y propósito académico.
datos_1 <- f_cargar_datos("https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_ejercicio_presion_ruido_3000.csv")
datos_2 <- f_cargar_datos("https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_ejercicio_presion_didactico_3000.csv")
f_visualizar_head_tail_reducido_word(datos_1, 10)
actividad_min | presion_sistolica |
|---|---|
418 | 138 |
172 | 142 |
136 | 150 |
331 | 139 |
432 | 139 |
254 | 140 |
588 | 135 |
411 | 140 |
289 | 142 |
235 | 135 |
... | ... |
136 | 149 |
304 | 139 |
225 | 141 |
302 | 137 |
162 | 141 |
366 | 143 |
373 | 139 |
125 | 148 |
340 | 140 |
267 | 138 |
f_visualizar_head_tail_reducido_word(datos_2)
actividad_min | presion_sistolica |
|---|---|
418 | 135 |
172 | 142 |
136 | 146 |
331 | 140 |
432 | 133 |
254 | 146 |
588 | 136 |
411 | 138 |
289 | 140 |
235 | 146 |
... | ... |
136 | 147 |
304 | 140 |
225 | 145 |
302 | 138 |
162 | 141 |
366 | 139 |
373 | 144 |
125 | 149 |
340 | 140 |
267 | 135 |
Se describen estadísticamente los datos_1 y los datos_2 respectivamente llamando la función f_describir_datos().
resultado <- f_describir_datos(datos_1)
resultado$describe
cat(resultado$structure)
## 'data.frame': 3000 obs. of 2 variables:
## $ actividad_min : num 418 172 136 331 432 254 588 411 289 235 ...
## $ presion_sistolica: num 138 142 150 139 139 140 135 140 142 135 ...
Al observar y explorar los estadísticos de ambos conjuntos de datos, se observa que las medias en ambos casos son similares, sin embargo, la desviación estándar de la variable presion_sistolica es mayor en el primer conjunto de datos con valor 6.25 que hace que sus datos estén más dispersos que en el segundo conjunto de datos que tiene un valor de desviación estándar en la misma variable de 4.86.
resultado <- f_describir_datos(datos_2)
resultado$describe
cat(resultado$structure)
## 'data.frame': 3000 obs. of 2 variables:
## $ actividad_min : num 418 172 136 331 432 254 588 411 289 235 ...
## $ presion_sistolica: num 135 142 146 140 133 146 136 138 140 146 ...
Se generan dos conjuntos de datos de entrenamiento 70% y de validación al 30%; se utiliza la función preparada para este fin; se utiliza el valor de semilla 2026 como constante de aleatoriedad y tener la posibilidad de reproducir las particiones con los mismos valores.
Primero para los datos_1 que corresponden a los datos simulados con ruido o aleatoriedad en ellos.
particion_1 <- f_particionar_datos(datos_1)
datos_entrenamiento_1 <- particion_1$datos_entrenamiento
datos_validacion_1 <- particion_1$datos_validacion
Se presentan los primeros y últimos seis registros de los datos de entrenamiento:
f_visualizar_head_tail_reducido_word(datos_entrenamiento_1, n=6)
actividad_min | presion_sistolica |
|---|---|
147 | 148 |
323 | 135 |
420 | 132 |
459 | 132 |
500 | 142 |
51 | 162 |
... | ... |
37 | 150 |
145 | 157 |
297 | 130 |
221 | 144 |
536 | 148 |
440 | 135 |
Ahora los datos de validación
f_visualizar_head_tail_reducido_word(datos_validacion_1, n=6)
actividad_min | presion_sistolica |
|---|---|
418 | 138 |
172 | 142 |
254 | 140 |
263 | 140 |
239 | 152 |
443 | 139 |
... | ... |
421 | 137 |
118 | 151 |
136 | 149 |
302 | 137 |
366 | 143 |
267 | 138 |
La función lm() de los paquetes bsae de R, se ejecuta para crear el modelo de regresión lineal simple indicando el nombre de la variable independiente y la variable dependiente como argumentos.
El modelo construido se almacena en la variable modelo_RLS_1 para los datos con ruido.
modelo_RLS_1 <- lm(presion_sistolica ~ actividad_min, data = datos_entrenamiento_1)
modelo_RLS_1
##
## Call:
## lm(formula = presion_sistolica ~ actividad_min, data = datos_entrenamiento_1)
##
## Coefficients:
## (Intercept) actividad_min
## 147.19723 -0.02003
summary(modelo_RLS_1)
##
## Call:
## lm(formula = presion_sistolica ~ actividad_min, data = datos_entrenamiento_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.7680 -3.6543 -0.0327 3.4673 17.1833
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.472e+02 2.242e-01 656.62 <2e-16 ***
## actividad_min -2.003e-02 6.484e-04 -30.89 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.175 on 2098 degrees of freedom
## Multiple R-squared: 0.3126, Adjusted R-squared: 0.3123
## F-statistic: 954.2 on 1 and 2098 DF, p-value: < 2.2e-16
Utilizando la función nombre de la funciopn(), se observa el diagrama de dispersión de los datos de entrenamiento además, la linea de tendencia y los estadísticos que ayudan a la interpretación de la relación entre los datos.
f_diagrama_dispersion_tendencia(modelo_RLS_1, datos_entrenamiento_1)
## `geom_smooth()` using formula = 'y ~ x'
Con la función previamente preparada f_evaluar_modelo y con los datos de validación, se tienen elementos estadísticos para evaluar el rendimiento del modelo.
resultado_modelo_1 <- f_evaluar_modelo(modelo_RLS_1, datos_validacion_1, "presion_sistolica")
resultado_modelo_1
Segundo, los datos_2 que corresponden a los datos simulados con para efectos descriptivos y de comparación.
particion_2 <- f_particionar_datos(datos_2)
datos_entrenamiento_2 <- particion_2$datos_entrenamiento
datos_validacion_2 <- particion_2$datos_validacion
Se presentan los primeros y últimos seis registros de los datos de entrenamiento:
f_visualizar_head_tail_reducido_word(datos_entrenamiento_2, n=6)
actividad_min | presion_sistolica |
|---|---|
147 | 146 |
323 | 139 |
420 | 137 |
459 | 137 |
500 | 138 |
51 | 146 |
... | ... |
37 | 148 |
145 | 140 |
297 | 141 |
221 | 134 |
536 | 139 |
440 | 132 |
Ahora los datos de validación
f_visualizar_head_tail_reducido_word(datos_validacion_2, n=6)
actividad_min | presion_sistolica |
|---|---|
418 | 135 |
172 | 142 |
254 | 146 |
263 | 137 |
239 | 143 |
443 | 138 |
... | ... |
421 | 139 |
118 | 141 |
136 | 147 |
302 | 138 |
366 | 139 |
267 | 135 |
El modelo construido se almacena en la variable modelo_RLS_2 y utiliza los datos de comparación sin ruido.
modelo_RLS_2 <- lm(presion_sistolica ~ actividad_min, data = datos_entrenamiento_2)
modelo_RLS_2
##
## Call:
## lm(formula = presion_sistolica ~ actividad_min, data = datos_entrenamiento_2)
##
## Coefficients:
## (Intercept) actividad_min
## 147.20610 -0.02058
summary(modelo_RLS_2)
##
## Call:
## lm(formula = presion_sistolica ~ actividad_min, data = datos_entrenamiento_2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.8714 -2.2325 0.0018 2.2287 11.0701
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.472e+02 1.431e-01 1028.77 <2e-16 ***
## actividad_min -2.058e-02 4.139e-04 -49.74 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.303 on 2098 degrees of freedom
## Multiple R-squared: 0.5411, Adjusted R-squared: 0.5409
## F-statistic: 2474 on 1 and 2098 DF, p-value: < 2.2e-16
Nuevamente con la función f_diagrama_dispersion_tendencia(), se observa el diagrama de dispersión y los estadísticos de los datos de entrenamiento para los segundos datos.
f_diagrama_dispersion_tendencia(modelo_RLS_2, datos_entrenamiento_2)
## `geom_smooth()` using formula = 'y ~ x'
Se ejecuta nuevamente la función previamente preparada f_evaluar_modelo para evaluar el rendimiento del modelo.
resultado_modelo_2 <- f_evaluar_modelo(modelo_RLS_2, datos_validacion_2, "presion_sistolica")
resultado_modelo_2
El caso describe la implementación, construcción y evaluación de un modelo de regresión lineal simple con dos conjuntos de datos diferentes; un primer conjunto con datos aleatorios que contiene cierto ruido, es decir mayor dispersión y menor correlación que un segundo de datos que se utilizó para objeto de comparación y descripción académica. Los dos conjuntos de datos para su descarga se encuentran en los enlaces: raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_ejercicio_presion_ruido_3000.csv y raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_ejercicio_presion_didactico_3000.csv respectivamente. El caso se implementó con programación R y se utilizó para construir el modelo la función lm(); se utilizaron diversas funciones que se pueden ejecutar para la reproducción del caso; estas funciones se encuentran en el enlace https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20RLS.R El segundo modelo resulta más eficiente que el primer modelo por dos cosas: • Primero, El coeficiente de determinación r square del primer modelo es aproximadamente de 0.3126 y del mismo r square en el segundo modelo fue de 0.5411 lo que hace que el segundo modelo con ese segundo conjunto de datos tenga mayor eficiencia con respecto a la variabilidad de la variable dependiente. • Segundo el valor de RMSE que significa que tanto se desvían las predicciones con respecto a los valores reales, el segundo modelo tiene un valor aproximado de 3.30 con respecto al valor de 5.07 del primer modelo; lo que hace que sea las predicciones del modelo entrenando sean mas cercanas a los valores reales. Ambos modelos coinciden en valores de los coeficientes de intersección y la pendiente lo que los hace muy similares. El siguiente caso es aplicar un modelo de regresión lineal simple para los mismos conjuntos de datos solo que creado y construido en programación Python.