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.
# 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")| 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)| 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 |
# 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
# 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)| 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. |
## 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é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:
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.