Introduccion:

Este informe presenta un análisis exploratorio de datos (EDA) sobre la resistencia a la compresión del concreto, utilizando R y el paquete Tidyverse.

Se inició con la carga y limpieza del dataset, asegurando la correcta organización de las variables y la ausencia de valores faltantes. Posteriormente, se realizó un análisis univariado para describir la distribución de la resistencia y detectar posibles valores atípicos.

Luego, se desarrolló un análisis bivariado, evaluando la influencia del agua, el cemento y la edad de curado en la resistencia. Finalmente, se aplicó un análisis multivariado mediante una matriz de correlación, con el fin de identificar los componentes más influyentes en el desempeño del concreto.

Este proceso permitió comprender mejor el comportamiento del material y extraer conclusiones útiles para el diseño y control de mezclas en ingeniería civil.

Cuestionario base

¿Cómo se distribuye la resistencia a la compresión en las diferentes mezclas?

¿Qué relación existe entre la cantidad de agua (Water) y la resistencia del concreto?

¿Cómo influye el contenido de cemento (Cement) en la resistencia?

¿De qué manera la edad de curado (Age) impacta la resistencia a la compresión?

¿Cuáles son los componentes más influyentes en la resistencia según la correlación entre variables?

Carga de librerias

#carga de librerias
library(tidyverse) 
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(ggplot2)
library(GGally)

Descripcion del dataset

# carga del dataset
concrete_data <- read_excel("Concrete_Data.xls")

# mostrar nombre de las variables 
colnames(concrete_data)
## [1] "Cement (component 1)(kg in a m^3 mixture)"            
## [2] "Blast Furnace Slag (component 2)(kg in a m^3 mixture)"
## [3] "Fly Ash (component 3)(kg in a m^3 mixture)"           
## [4] "Water  (component 4)(kg in a m^3 mixture)"            
## [5] "Superplasticizer (component 5)(kg in a m^3 mixture)"  
## [6] "Coarse Aggregate  (component 6)(kg in a m^3 mixture)" 
## [7] "Fine Aggregate (component 7)(kg in a m^3 mixture)"    
## [8] "Age (day)"                                            
## [9] "Concrete compressive strength(MPa, megapascals)"
# renombrar columnas para que sean más fáciles de usar
colnames(concrete_data) <- c(
  "Cement",
  "Slag",
  "FlyAsh",
  "Water",
  "Superplasticizer",
  "CoarseAgg",
  "FineAgg",
  "Age",
  "Strength"
)
# muestra las tres primeras lineas del dataset
head(concrete_data)
# muestras las tres ultimas lineas del datase
tail(concrete_data)
# resumen estadistico 
summary(concrete_data)
##      Cement           Slag           FlyAsh           Water      
##  Min.   :102.0   Min.   :  0.0   Min.   :  0.00   Min.   :121.8  
##  1st Qu.:192.4   1st Qu.:  0.0   1st Qu.:  0.00   1st Qu.:164.9  
##  Median :272.9   Median : 22.0   Median :  0.00   Median :185.0  
##  Mean   :281.2   Mean   : 73.9   Mean   : 54.19   Mean   :181.6  
##  3rd Qu.:350.0   3rd Qu.:142.9   3rd Qu.:118.27   3rd Qu.:192.0  
##  Max.   :540.0   Max.   :359.4   Max.   :200.10   Max.   :247.0  
##  Superplasticizer   CoarseAgg         FineAgg           Age        
##  Min.   : 0.000   Min.   : 801.0   Min.   :594.0   Min.   :  1.00  
##  1st Qu.: 0.000   1st Qu.: 932.0   1st Qu.:731.0   1st Qu.:  7.00  
##  Median : 6.350   Median : 968.0   Median :779.5   Median : 28.00  
##  Mean   : 6.203   Mean   : 972.9   Mean   :773.6   Mean   : 45.66  
##  3rd Qu.:10.160   3rd Qu.:1029.4   3rd Qu.:824.0   3rd Qu.: 56.00  
##  Max.   :32.200   Max.   :1145.0   Max.   :992.6   Max.   :365.00  
##     Strength     
##  Min.   : 2.332  
##  1st Qu.:23.707  
##  Median :34.443  
##  Mean   :35.818  
##  3rd Qu.:46.136  
##  Max.   :82.599
# estructura de los datos 
glimpse(concrete_data)
## Rows: 1,030
## Columns: 9
## $ Cement           <dbl> 540.0, 540.0, 332.5, 332.5, 198.6, 266.0, 380.0, 380.…
## $ Slag             <dbl> 0.0, 0.0, 142.5, 142.5, 132.4, 114.0, 95.0, 95.0, 114…
## $ FlyAsh           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ Water            <dbl> 162, 162, 228, 228, 192, 228, 228, 228, 228, 228, 192…
## $ Superplasticizer <dbl> 2.5, 2.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0…
## $ CoarseAgg        <dbl> 1040.0, 1055.0, 932.0, 932.0, 978.4, 932.0, 932.0, 93…
## $ FineAgg          <dbl> 676.0, 676.0, 594.0, 594.0, 825.5, 670.0, 594.0, 594.…
## $ Age              <dbl> 28, 28, 270, 365, 360, 90, 365, 28, 28, 28, 90, 28, 2…
## $ Strength         <dbl> 79.986111, 61.887366, 40.269535, 41.052780, 44.296075…

Limpiza de datos

# comprobar valores faltantes 
colSums(is.na(concrete_data))
##           Cement             Slag           FlyAsh            Water 
##                0                0                0                0 
## Superplasticizer        CoarseAgg          FineAgg              Age 
##                0                0                0                0 
##         Strength 
##                0
# crear dataset limpio 
concrete_data_limpio <- na.omit(concrete_data)

Analisis explicatorio de datos(EDA):

Analisis univariado

# Histograma de resistencia a la compresión

ggplot(concrete_data_limpio, aes(x = Strength)) +
  geom_histogram(bins = 30, fill = "steelblue", color = "white") +
  labs(
    title = "Distribución de la resistencia a la compresión",
    x = "Resistencia (MPa)",
    y = "Frecuencia"
  )

# Boxplot de resistencia a la compresión

ggplot(concrete_data_limpio, aes(y = Strength)) +
  geom_boxplot(fill = "orange") +
  labs(
    title = "Boxplot de la resistencia a la compresión",
    y = "Resistencia (MPa)"
  )

Analisis divariado:

# Peso de agua vs resistencia

ggplot(concrete_data_limpio, aes(x = Water, y = Strength)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(
    title = "Relación entre Agua y Resistencia",
    x = "Cantidad de Agua (kg/m^3)",
    y = "Resistencia (MPa)"
  )
## `geom_smooth()` using formula = 'y ~ x'

# Cemento vs Resistencia

ggplot(concrete_data_limpio, aes(x = Cement, y = Strength)) +
  geom_point(alpha = 0.6, color = "yellow") +
  geom_smooth(method = "lm", se = FALSE, color = "darkgreen") +
  labs(
    title = "Relación entre Cemento y Resistencia",
    x = "Cemento (kg/m³)",
    y = "Resistencia (MPa)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Edad vs Resistencia

ggplot(concrete_data_limpio, aes(x = Age, y = Strength)) +
  geom_point(alpha = 0.6, color = "blue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(
    title = "Relación entre Edad y Resistencia",
    x = "Edad (días)",
    y = "Resistencia (MPa)"
  ) +
  theme_minimal() +
  scale_x_continuous(trans = "log10") # Escala logarítmica para mejor visualización
## `geom_smooth()` using formula = 'y ~ x'

# Resumen estadístico después del renombrado
summary(concrete_data_limpio)
##      Cement           Slag           FlyAsh           Water      
##  Min.   :102.0   Min.   :  0.0   Min.   :  0.00   Min.   :121.8  
##  1st Qu.:192.4   1st Qu.:  0.0   1st Qu.:  0.00   1st Qu.:164.9  
##  Median :272.9   Median : 22.0   Median :  0.00   Median :185.0  
##  Mean   :281.2   Mean   : 73.9   Mean   : 54.19   Mean   :181.6  
##  3rd Qu.:350.0   3rd Qu.:142.9   3rd Qu.:118.27   3rd Qu.:192.0  
##  Max.   :540.0   Max.   :359.4   Max.   :200.10   Max.   :247.0  
##  Superplasticizer   CoarseAgg         FineAgg           Age        
##  Min.   : 0.000   Min.   : 801.0   Min.   :594.0   Min.   :  1.00  
##  1st Qu.: 0.000   1st Qu.: 932.0   1st Qu.:731.0   1st Qu.:  7.00  
##  Median : 6.350   Median : 968.0   Median :779.5   Median : 28.00  
##  Mean   : 6.203   Mean   : 972.9   Mean   :773.6   Mean   : 45.66  
##  3rd Qu.:10.160   3rd Qu.:1029.4   3rd Qu.:824.0   3rd Qu.: 56.00  
##  Max.   :32.200   Max.   :1145.0   Max.   :992.6   Max.   :365.00  
##     Strength     
##  Min.   : 2.332  
##  1st Qu.:23.707  
##  Median :34.443  
##  Mean   :35.818  
##  3rd Qu.:46.136  
##  Max.   :82.599

Matriz de correlacion:

# Matriz de correlación con etiquetas separadas
ggcorr(concrete_data_limpio, 
       label = TRUE, 
       label_round = 2,
       label_size = 3,           # Tamaño de la letra
       hjust = 0.85,             # Ajuste horizontal (0=izquierda, 1=derecha)
       vjust = 0.5,              # Ajuste vertical (0=abajo, 1=arriba)
       layout.exp = 1,           # Expansión del layout
       color = "grey50") +       # Color de las etiquetas
  ggtitle("Matriz de Correlación") +
  theme(plot.title = element_text(hjust = 0.5))

Resultados y analisis

A partir del análisis exploratorio de datos realizado sobre el dataset de resistencia del concreto, se obtuvieron los siguientes hallazgos principales:

Distribución de la resistencia a la compresión:

Los histogramas y boxplots muestran que la resistencia presenta una distribución amplia, con valores desde muy bajos hasta resistencias superiores a 70 MPa. También se identifican algunos valores atípicos que podrían corresponder a mezclas poco convencionales o errores de registro. Esto indica que el dataset contiene tanto concretos de baja como de alta resistencia, lo cual resulta útil para un análisis integral.

Relación entre la cantidad de agua y la resistencia:

El diagrama de dispersión muestra una tendencia negativa: a mayor cantidad de agua en la mezcla, menor es la resistencia a la compresión. Este resultado coincide con la teoría de la relación agua/cemento, donde un exceso de agua genera mayor porosidad y, por lo tanto, una reducción de la resistencia del concreto.

Influencia del contenido de cemento en la resistencia:

Se observa una relación positiva entre la cantidad de cemento y la resistencia a la compresión. A medida que aumenta el contenido de cemento (kg/m³), el concreto logra resistencias más altas. Sin embargo, esta relación no es lineal en todo el rango, lo que sugiere que, más allá de cierto punto, el aumento de cemento no garantiza incrementos proporcionales de resistencia y puede implicar costos adicionales innecesarios.

Efecto de la edad de curado en la resistencia:

Los gráficos muestran que la resistencia del concreto aumenta con la edad, especialmente en los primeros 28 días, que corresponden al período crítico de ganancia de resistencia. Posteriormente, el crecimiento es más lento, pero se mantiene una tendencia ascendente. Este comportamiento es consistente con la hidratación progresiva del cemento y la práctica estándar de tomar 28 días como referencia para evaluar la resistencia.

Factores más influyentes según la matriz de correlación:

El análisis multivariado mediante la matriz de correlación revela que el cemento y el superplastificante tienen correlaciones positivas fuertes con la resistencia, mientras que el agua muestra correlación negativa. Los agregados (finos y gruesos) presentan correlaciones débiles, lo que sugiere que su influencia en la resistencia es menor en comparación con los aglomerantes y aditivos.

Conclusión general

El análisis confirma que la resistencia del concreto depende fuertemente de la relación agua/cemento, el contenido de cemento y la edad de curado. Estos factores son los que más inciden en el desempeño del material, mientras que otros componentes como los agregados cumplen una función secundaria. Los resultados respaldan la teoría de diseño de mezclas en ingeniería civil y refuerzan la importancia de controlar la dosificación y el tiempo de curado para garantizar concretos de alta calidad y durabilidad.