Contexto de los datos

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.

datos_1: 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: 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

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.

Objetivo

Implementar y evaluar modelos de regresión lineal simple (RLS).

Descripción

Cargar librerías

library(psych)
library(tidyverse)
library(ggplot2)
library(tidyverse)
library(ggplot2)

# Tablas compatibles con Word
library(flextable)
library(officer)

Cargar funciones

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

Cargar datos

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")

Visualizar datos_1

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

Visualizar datos_2

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

Describir datos_1

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.

Describir datos_2

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 ...

Desarrollo

Particonar los datos

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.

Datos con ruido datos_1

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

Modelo de regresión lineal simple datos_1

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.

  • actividad_min es la variable independiente o regresora
  • presion_sistolica es la variable dependiente u objetivo.

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

Diagrama de dispersión y linea de tendencia datos_1

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'

Evaluación del modelo datos_1

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

Datos académicos sin ruido datos_2

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

Modelo de regresión lineal simple datos_2

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

Diagrama de dispersión y linea de tendencia datos_2

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'

Evaluación del modelo datos_2

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

Interpretación del caso

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.