Asignatura: Estadística Aplicada con Python y R
Tema: Predicción de la Resistencia del Concreto con Regresión Lineal Múltiple
Como ingenieros, constantemente buscamos optimizar mezclas y predecir el rendimiento de los materiales. En este ejercicio, actuarás como un ingeniero de control de calidad para una empresa constructora. Tu objetivo es construir un modelo de regresión lineal múltiple para predecir la resistencia a la compresión del concreto basándose en sus componentes y su tiempo de curado.
Este modelo permitirá a la empresa estimar la calidad del producto final antes de realizar costosas pruebas de laboratorio, optimizando recursos y tiempo.
Antes de empezar con el análisis, asegúrate de tener tu entorno de trabajo listo.
Crear Repositorio en GitHub:
proyecto-regresion-concreto
.README.md
y un
.gitignore
(selecciona la plantilla R
).Clonar en Posit Cloud:
Configurar Git (si es la primera vez en este proyecto):
gitcreds::gitcreds_set()
, tal como se describe en la
guía.install.packages("usethis")
install.packages("gitcreds")
library(usethis)
use_git_config(
user.name = "justorfc",
user.email = "justorfc@gmail.com"
)
library(gitcreds)
gitcreds_set()
# Te pedirá el usuario y la contraseña, cuando te pida la contraseña copia y pega el Token
1. Crear la Carpeta de Datos:
New Folder
) llamada
data
.2. Crear el Archivo de Datos:
data
.New File
>
Text File
) llamado datos_concreto.csv
.Cemento_kg,Agua_kg,Arena_kg,Edad_dias,Resistencia_MPa
250,150,900,7,22.5
250,165,850,28,35.1
300,160,880,7,28.9
300,175,820,28,40.2
350,170,850,7,33.4
350,185,800,28,45.8
400,180,820,7,39.1
400,195,780,28,52.3
450,190,790,7,44.6
450,205,750,28,58.0
280,155,890,14,33.7
320,165,860,14,38.5
380,175,830,14,44.9
420,185,800,14,50.1
3. Crear el Documento R Markdown:
New File
>
R Markdown...
).analisis_regresion.Rmd
. Borra
todo el contenido de ejemplo que aparece después de la cabecera (YAML
header).Ahora, dentro de tu archivo analisis_regresion.Rmd
,
empezarás a escribir el código y texto para el análisis.
Crea un chunk de código de R (atajo: Ctrl+Alt+I
) y carga
las librerías necesarias y los datos.
# Cargar las librerías para manipulación de datos y visualización
library(tidyverse)
library(GGally) # Para gráficos exploratorios avanzados
# Cargar el dataset desde la carpeta 'data'
datos <- read_csv("data/datos_concreto.csv")
## Rows: 14 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (5): Cemento_kg, Agua_kg, Arena_kg, Edad_dias, Resistencia_MPa
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Ver las primeras filas para asegurar que se cargó correctamente
head(datos)
Antes de modelar, debemos entender nuestros datos. ¿Cómo se relacionan las variables?
En esta sección, exploramos las relaciones entre los componentes del concreto y la resistencia final.
# Resumen estadístico de todas las variables
summary(datos)
## Cemento_kg Agua_kg Arena_kg Edad_dias Resistencia_MPa
## Min. :250 Min. :150.0 Min. :750.0 Min. : 7.0 Min. :22.50
## 1st Qu.:300 1st Qu.:165.0 1st Qu.:800.0 1st Qu.: 7.0 1st Qu.:34.05
## Median :350 Median :175.0 Median :825.0 Median :14.0 Median :39.65
## Mean :350 Mean :175.4 Mean :830.0 Mean :16.5 Mean :40.51
## 3rd Qu.:400 3rd Qu.:185.0 3rd Qu.:857.5 3rd Qu.:28.0 3rd Qu.:45.58
## Max. :450 Max. :205.0 Max. :900.0 Max. :28.0 Max. :58.00
# Matriz de correlación y gráficos de dispersión
# ggpairs nos da:
# - Histogramas en la diagonal para ver la distribución de cada variable.
# - Gráficos de dispersión en la parte inferior para ver la relación entre pares.
# - Coeficientes de correlación en la parte superior.
ggpairs(datos) +
labs(title = "Matriz de Correlación y Dispersión de Variables")
Interpretación Preliminar: Observa la última fila de gráficos.
¿Qué variables parecen tener una relación lineal fuerte y positiva
con Resistencia_MPa
?
La correlación entre Cemento_kg
y
Resistencia_MPa
, y entre Edad_dias
y
Resistencia_MPa
parece ser alta.
La relación con Agua_kg
parece ser más débil o incluso
negativa.
### **3.3 Construcción del Modelo de Regresión Lineal Múltiple 🏗️**
Ahora, construiremos el modelo usando la función `lm()` (linear model).
Vamos a crear un modelo donde la resistencia es la variable dependiente (Y) y los demás componentes son las variables independientes (X).
La fórmula es: $Resistencia = \beta_0 + \beta_1 \cdot Cemento + \beta_2 \cdot Agua + \beta_3 \cdot Arena + \beta_4 \cdot Edad$
``` r
# Construir el modelo de regresión lineal
modelo <- lm(Resistencia_MPa ~ Cemento_kg + Agua_kg + Arena_kg + Edad_dias, data = datos)
# Mostrar el resumen completo del modelo
summary(modelo)
```
```
##
## Call:
## lm(formula = Resistencia_MPa ~ Cemento_kg + Agua_kg + Arena_kg +
## Edad_dias, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.80793 -0.47950 -0.08593 0.22506 1.36346
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 29.18617 69.49910 0.420 0.68437
## Cemento_kg 0.25908 0.01888 13.724 2.44e-07 ***
## Agua_kg -0.66549 0.16948 -3.927 0.00348 **
## Arena_kg 0.02265 0.05276 0.429 0.67779
## Edad_dias 1.12367 0.07628 14.730 1.32e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7904 on 9 degrees of freedom
## Multiple R-squared: 0.9953, Adjusted R-squared: 0.9932
## F-statistic: 474.8 on 4 and 9 DF, p-value: 1.861e-10
```
Esta es la parte más importante. ¿Qué nos dicen todos esos números?
1. Coeficientes (Coefficients):
Intercept (\beta_0
): Es el valor
teórico de la resistencia si todos los predictores fueran cero. En este
contexto, no tiene una interpretación práctica.
Cemento_kg (\beta_1
): Por cada kg
adicional de cemento, manteniendo el resto constante, la resistencia
aumenta en [valor del coeficiente]
MPa. El p-valor
(Pr(>|t|)
) es muy bajo, lo que indica que esta variable
es muy significativa.
Agua_kg (\beta_2
): Por cada kg
adicional de agua, la resistencia cambia en
[valor del coeficiente]
. Observa si el efecto es positivo o
negativo. Evalúa su p-valor para ver si es significativo.
Arena_kg (\beta_3
): Analiza su
efecto y significancia de la misma manera.
Edad_dias (\beta_4
): Por cada día
adicional de curado, la resistencia aumenta significativamente. Es,
junto con el cemento, una de las variables más influyentes.
2. Medidas de Ajuste del Modelo:
Adjusted R-squared (R^2
ajustado):
Este valor es [valor de R^2 ajustado]
. Esto significa que
nuestro modelo explica aproximadamente el
[porcentaje]
% de la variabilidad en la
resistencia del concreto. Un valor por encima del 80-90% se considera
muy bueno.
F-statistic (Prueba F): El p-valor general del
modelo (p-value
de la última línea) es extremadamente
pequeño. Esto nos permite rechazar la hipótesis nula de que todos los
coeficientes son cero. En otras palabras, nuestro modelo es
estadísticamente significativo y útil para la
predicción.
Un buen análisis verifica si se cumplen los supuestos del modelo de regresión.
# Generar los gráficos de diagnóstico
par(mfrow = c(2, 2))
plot(modelo)
par(mfrow = c(1, 1))
Qué buscar: 1. Residuals vs. Fitted: Los puntos deben dispersarse aleatoriamente alrededor de la línea horizontal en 0, sin patrones evidentes (como una curva o un embudo). Esto verifica la linealidad. 2. Normal Q-Q: Los puntos deben seguir de cerca la línea diagonal. Esto verifica que los residuos siguen una distribución normal.
1. Generar el Reporte:
2. Sincronizar con GitHub ✅:
.Rmd
,
.html
, la carpeta data
, etc.).Finaliza análisis de regresión para resistencia del concreto
.¡Felicitaciones! Has completado un proyecto de análisis de datos de principio a fin, combinando buenas prácticas de estadística, programación en R y control de versiones con Git.