Introducción:

El presente documento se basa en un conjunto de datos que recoge información detallada sobre la composición y propiedades de diferentes mezclas de concreto. Este tipo de información es fundamental en el ámbito de la ingeniería civil y la construcción, ya que permite analizar la influencia de diversos materiales y condiciones de curado sobre la resistencia final del concreto. La base de datos incluye variables como la cantidad de cemento, escoria, ceniza volante, agua, superplastificante, agregados finos y gruesos, así como la edad del concreto al momento de medir su resistencia a la compresión.

El objetivo de este análisis es estudiar la relación entre estos componentes y la resistencia final del concreto, lo cual puede facilitar la optimización de mezclas para obtener un mejor desempeño estructural, eficiencia en costos, y sostenibilidad en proyectos constructivos.

Comprensión de los datos:

# Cargar paquetes necesarios
library(readxl)
library(dplyr)
library(tidyr)
library(tibble)
library(knitr)
library(kableExtra)

# Cargar los datos
data <- read_excel("~/Documents/concrete+compressive+strength/Concrete_Data.xls")

# Renombrar columnas con nombres más cortos y claros
colnames(data) <- c(
  "Cement",
  "Slag",
  "FlyAsh",
  "Water",
  "Superplasticizer",
  "CoarseAgg",
  "FineAgg",
  "Age",
  "Strength"
)

# Calcular estadísticas resumidas
resumen <- data %>%
  summarise(
    across(everything(), list(
      Media = ~mean(.),
      Mediana = ~median(.),
      Mínimo = ~min(.),
      Máximo = ~max(.),
      Desviación = ~sd(.)
    ), .names = "{.fn}_{.col}")
  ) %>%
  pivot_longer(everything(), names_to = c("Medida", "Variable"), names_sep = "_") %>%
  pivot_wider(names_from = Variable, values_from = value)

# Mostrar tabla formateada
resumen %>%
  kable(caption = "Resumen Estadístico de las Variables (Nombres Simplificados)", digits = 2) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = TRUE, position = "left")
Resumen Estadístico de las Variables (Nombres Simplificados)
Medida Cement Slag FlyAsh Water Superplasticizer CoarseAgg FineAgg Age Strength
Media 281.17 73.90 54.19 181.57 6.20 972.92 773.58 45.66 35.82
Mediana 272.90 22.00 0.00 185.00 6.35 968.00 779.51 28.00 34.44
Mínimo 102.00 0.00 0.00 121.75 0.00 801.00 594.00 1.00 2.33
Máximo 540.00 359.40 200.10 247.00 32.20 1145.00 992.60 365.00 82.60
Desviación 104.51 86.28 64.00 21.36 5.97 77.75 80.18 63.17 16.71
# Cargar paquete necesario
library(dplyr)
library(knitr)
library(kableExtra)

# Definir la tabla de variables del conjunto de datos del concreto
def_variables_concreto <- data.frame(
  Variable = c("Cement", "Slag", "FlyAsh", "Water", "Superplasticizer", 
               "CoarseAgg", "FineAgg", "Age", "Strength"),
  Descripción = c("Cantidad de cemento (kg/m³)",
                  "Cantidad de escoria de alto horno (kg/m³)",
                  "Cantidad de ceniza volante (kg/m³)",
                  "Cantidad de agua (kg/m³)",
                  "Cantidad de superplastificante (kg/m³)",
                  "Cantidad de agregado grueso (kg/m³)",
                  "Cantidad de agregado fino (kg/m³)",
                  "Edad del concreto en días",
                  "Resistencia a la compresión del concreto (MPa)"),
  Tipo = c("Numérica continua", "Numérica continua", "Numérica continua", 
           "Numérica continua", "Numérica continua", "Numérica continua", 
           "Numérica continua", "Numérica continua", "Numérica continua")
)

# Mostrar tabla formateada
def_variables_concreto %>%
  kable(caption = "Descripción de las Variables del Conjunto de Datos del Concreto") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Descripción de las Variables del Conjunto de Datos del Concreto
Variable Descripción Tipo
Cement Cantidad de cemento (kg/m³) Numérica continua
Slag Cantidad de escoria de alto horno (kg/m³) Numérica continua
FlyAsh Cantidad de ceniza volante (kg/m³) Numérica continua
Water Cantidad de agua (kg/m³) Numérica continua
Superplasticizer Cantidad de superplastificante (kg/m³) Numérica continua
CoarseAgg Cantidad de agregado grueso (kg/m³) Numérica continua
FineAgg Cantidad de agregado fino (kg/m³) Numérica continua
Age Edad del concreto en días Numérica continua
Strength Resistencia a la compresión del concreto (MPa) Numérica continua

Modelado:

# Instalar y cargar la librería readxl si es necesario
if (!require(readxl)) {
  install.packages("readxl")
  library(readxl)
} else {
  library(readxl)
}

# Cargar los datos desde el archivo Excel
concrete_data <- read_excel("~/Documents/concrete+compressive+strength/Concrete_Data.xls", sheet = 1)

# Renombrar columnas con nombres más simples
colnames(concrete_data) <- c(
  "Cement", 
  "BlastFurnaceSlag", 
  "FlyAsh", 
  "Water", 
  "Superplasticizer", 
  "CoarseAggregate", 
  "FineAggregate", 
  "Age", 
  "CompressiveStrength"
)

# Ajustar el modelo de regresión lineal usando todas las variables como predictores
modelo <- lm(CompressiveStrength ~ ., data = concrete_data)

# Mostrar resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = CompressiveStrength ~ ., data = concrete_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -28.653  -6.303   0.704   6.562  34.446 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      -23.163756  26.588421  -0.871 0.383851    
## Cement             0.119785   0.008489  14.110  < 2e-16 ***
## BlastFurnaceSlag   0.103847   0.010136  10.245  < 2e-16 ***
## FlyAsh             0.087943   0.012585   6.988 5.03e-12 ***
## Water             -0.150298   0.040179  -3.741 0.000194 ***
## Superplasticizer   0.290687   0.093460   3.110 0.001921 ** 
## CoarseAggregate    0.018030   0.009394   1.919 0.055227 .  
## FineAggregate      0.020154   0.010703   1.883 0.059968 .  
## Age                0.114226   0.005427  21.046  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 10.4 on 1021 degrees of freedom
## Multiple R-squared:  0.6155, Adjusted R-squared:  0.6125 
## F-statistic: 204.3 on 8 and 1021 DF,  p-value: < 2.2e-16

Evaluacion:

# Cargar librerías necesarias
library(tidyverse)
library(kableExtra)
library(broom)

# Ajustar modelo de regresión lineal
modelo <- lm(CompressiveStrength ~ ., data = concrete_data)

# Extraer coeficientes y estadísticos del modelo
tabla_coef <- tidy(modelo)

# Agregar columna de significancia
tabla_coef <- tabla_coef %>%
  mutate(Significancia = case_when(
    p.value < 0.001 ~ "***",
    p.value < 0.01  ~ "**",
    p.value < 0.05  ~ "*",
    p.value < 0.1   ~ ".",
    TRUE            ~ ""
  ))

# Agregar interpretaciones simples
tabla_coef <- tabla_coef %>%
  mutate(Interpretación = case_when(
    term == "(Intercept)" ~ "Valor base sin predictores.",
    estimate > 0 & p.value < 0.05 ~ "Aumento de esta variable incrementa la resistencia.",
    estimate < 0 & p.value < 0.05 ~ "Aumento de esta variable reduce la resistencia.",
    TRUE ~ "Efecto no estadísticamente significativo."
  ))

# Renombrar columnas para mayor claridad
tabla_coef <- tabla_coef %>%
  select(Variable = term,
         Coeficiente = estimate,
         `Error Estándar` = std.error,
         `Valor t` = statistic,
         `Valor p` = p.value,
         Significancia,
         Interpretación)

# Mostrar tabla en formato bonito
tabla_coef %>%
  kable(digits = 4, caption = "Coeficientes del Modelo de Regresión Lineal") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Coeficientes del Modelo de Regresión Lineal
Variable Coeficiente Error Estándar Valor t Valor p Significancia Interpretación
(Intercept) -23.1638 26.5884 -0.8712 0.3839 Valor base sin predictores.
Cement 0.1198 0.0085 14.1100 0.0000 *** Aumento de esta variable incrementa la resistencia.
BlastFurnaceSlag 0.1038 0.0101 10.2452 0.0000 *** Aumento de esta variable incrementa la resistencia.
FlyAsh 0.0879 0.0126 6.9879 0.0000 *** Aumento de esta variable incrementa la resistencia.
Water -0.1503 0.0402 -3.7407 0.0002 *** Aumento de esta variable reduce la resistencia.
Superplasticizer 0.2907 0.0935 3.1103 0.0019 ** Aumento de esta variable incrementa la resistencia.
CoarseAggregate 0.0180 0.0094 1.9193 0.0552 . Efecto no estadísticamente significativo.
FineAggregate 0.0202 0.0107 1.8831 0.0600 . Efecto no estadísticamente significativo.
Age 0.1142 0.0054 21.0457 0.0000 *** Aumento de esta variable incrementa la resistencia.
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
library(tibble)
library(knitr)
library(kableExtra)

# Ajustar modelo de regresión lineal
mod4 <- train(CompressiveStrength ~ Cement + BlastFurnaceSlag + FlyAsh + Water + Superplasticizer + CoarseAggregate + FineAggregate + Age,
              data = concrete_data,
              method = "lm")

# Mostrar modelo final
print(mod4$finalModel)
## 
## Call:
## lm(formula = .outcome ~ ., data = dat)
## 
## Coefficients:
##      (Intercept)            Cement  BlastFurnaceSlag            FlyAsh  
##        -23.16376           0.11979           0.10385           0.08794  
##            Water  Superplasticizer   CoarseAggregate     FineAggregate  
##         -0.15030           0.29069           0.01803           0.02015  
##              Age  
##          0.11423
# Predecir con el modelo
predicciones <- predict(mod4, newdata = concrete_data)

# Calcular métricas
MAPE <- mean(abs((concrete_data$CompressiveStrength - predicciones) / concrete_data$CompressiveStrength)) * 100
MAE <- mean(abs(concrete_data$CompressiveStrength - predicciones))
R2 <- cor(concrete_data$CompressiveStrength, predicciones)^2

# Crear tabla con las métricas
metricas <- tibble(
  Métrica = c("MAPE (%)", "MAE", "R-squared"),
  Valor = c(round(MAPE, 3), round(MAE, 3), round(R2, 3))
)

# Mostrar tabla organizada
metricas %>%
  kable(caption = "Métricas de Evaluación del Modelo") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Métricas de Evaluación del Modelo
Métrica Valor
MAPE (%) 31.310
MAE 8.215
R-squared 0.615

MAPE:

  • Mide el error porcentual promedio entre los valores reales y las predicciones del modelo.

  • Interpretación:

    • El modelo tiene un error promedio del 31.31% al predecir la resistencia a la compresión. Por ejemplo, si la resistencia real es 50 MPa, la predicción podría estar entre 34.3 MPa y 65.7 MPa (aproximadamente).

MAE:

  • Qué mide: El error absoluto promedio en las unidades originales (MPa).

  • Interpretación:

    • El modelo se equivoca en promedio por ±8.2 MPa respecto al valor real.

    • Ejemplo: Si la resistencia real es 40 MPa, las predicciones suelen estar entre 31.8 MPa y 48.2 MPa.

R^2:

  • Qué mide: La proporción de la variabilidad en la resistencia que es explicada por el modelo (de 0 a 1).

  • Interpretación:

    • El 61.5% de la variación en la resistencia a la compresión se explica por las variables predictoras usadas (ej. cemento, agua, edad).

    • Contexto en concreto:

      • Un R² de 0.615 es moderado. Indica que el modelo captura parte importante de la relación, pero hay factores no considerados (ej. calidad de los agregados, humedad, temperatura de curado).

      • En ingeniería, valores de R² > 0.7 suelen buscarse para modelos confiables.