ANÁLISIS ESTADÍSTICO

1. CARGA DE LIBRERÍAS Y DATOS

# CARGA DE DATOS
library(dplyr)
library(knitr)
library(gt)
library(scatterplot3d)

setwd("C:/Users/HP/Documents/PROYECTO ESTADISTICA/RStudio")
datos <- read.csv("tablap.csv", header = TRUE, sep = ";", dec = ",")

# Adaptación de variables
# y = Volumen, x1 = Acero, x2 = Concreto
volumen  <- as.numeric(datos$Volume.excavated.soil..slope)
acero    <- as.numeric(datos$Mass.of.steel..pad.)
concreto <- as.numeric(datos$Mass.of.concrete..pad.) 

TPV <- data.frame(y = volumen, x1 = acero, x2 = concreto)
TPV <- na.omit(TPV)

# Solo positivos
TPV <- TPV[TPV$y > 0 & TPV$x1 > 0 & TPV$x2 > 0, ]

2. TABLA PARES DE VALORES

# Filtrar outliers (Mantenemos tu función por seguridad metodológica)
filtro_iqr <- function(v){
  Q1 <- quantile(v, 0.25)
  Q3 <- quantile(v, 0.75)
  IQRv <- Q3 - Q1
  li <- Q1 - 1 * IQRv
  ls <- Q3 + 1 * IQRv
  return(v >= li & v <= ls)
}

# Aplicamos el filtro a los datos
TPV <- TPV[filtro_iqr(TPV$y) & filtro_iqr(TPV$x1) & filtro_iqr(TPV$x2), ]

# --- CAMBIO CRÍTICA: Forzamos a trabajar exactamente con los primeros 1,000 registros ---
TPV <- head(TPV, 1000) 

# Creamos el índice Nro para la visualización de la tabla
tabla_display <- cbind(Nro = 1:nrow(TPV), TPV)

# Mostrar los primeros 20 datos en el reporte con un scroll interactivo 
# (Muestra 20 a la vez pero almacena los 1,000 para no hacer infinito el PDF/HTML)
head(tabla_display, 20) %>% 
  gt() %>%
  cols_label(Nro = "N°", y = "Volumen (y)", x1 = "Masa Acero (x1)", x2 = "Masa Concreto (x2)") %>%
  tab_header(title = md("**Tabla N° 4. Muestra de Pares de Valores (Primeros 20 de 1,000)**")) %>%
  cols_align(align = "center") %>%
  fmt_number(columns = c(y, x1, x2), decimals = 2) %>%
  tab_options(
    table.width = pct(80), 
    column_labels.font.weight = "bold",
    container.height = px(400),
    container.overflow.y = TRUE
  )
Tabla N° 4. Muestra de Pares de Valores (Primeros 20 de 1,000)
Volumen (y) Masa Acero (x1) Masa Concreto (x2)
1 14,931.00 68,874.00 35,882.00
2 18,101.00 88,868.00 80,947.00
3 17,164.00 86,142.00 46,808.00
4 14,274.00 20,179.00 89,471.00
5 15,497.00 32,966.00 94,641.00
6 13,838.00 52,559.00 14,100.00
7 17,655.00 91,265.00 57,529.00
8 17,345.00 61,720.00 90,317.00
9 15,306.00 56,425.00 59,629.00
10 12,841.00 17,702.00 51,095.00
11 14,555.00 15,905.00 96,114.00
12 15,719.00 47,814.00 50,800.00
13 14,572.00 31,756.00 70,981.00
14 16,958.00 80,340.00 61,536.00
15 15,572.00 74,304.00 19,263.00
16 18,026.00 66,122.00 90,983.00
17 12,634.00 22,183.00 32,148.00
18 14,846.00 63,579.00 13,785.00
19 11,990.00 12,778.00 39,513.00
20 15,932.00 45,642.00 90,058.00
# Extraer las variables exactas de los 1,000 datos sincronizados
x1 <- TPV$x1        # Acero
x2 <- TPV$x2        # Concreto
y  <- TPV$y / 1000  # Volumen transformado a miles para mantener la escala del gráfico limpia

# CÁLCULO AUTOMÁTICO DE LÍMITES (Para que el cubo 3D no se rompa con 1,000 datos)
max_x1 <- max(x1, na.rm = TRUE)
max_x2 <- max(x2, na.rm = TRUE)
max_y  <- max(y, na.rm = TRUE)

3. DIAGRAMA DE DISPERSIÓN

# Diagrama de Dispersión (Gráfica N°1) - Renderizado perfecto de los 1,000 puntos
par(mar = c(5, 6, 4, 2)) 
Cobrereg <- scatterplot3d(x1, x2, y, angle = 225, pch = 16, color = "blue",
                          cex.symbols = 0.6, # Reducimos el tamaño del punto para que la nube sea legible
                          main = "Gráfica N°1: Diagrama de dispersión de Volumen, Acero y Concreto (N = 1000)",
                          xlab = "Masa de Acero (x1)",
                          ylab = "Masa de Concreto (x2)",
                          zlab = "Volumen (miles de m3)", 
                          y.margin.add = 0.9,
                          las = 1, 
                          xlim = c(0, max_x1), # Límites automáticos ajustados al dato máximo real
                          ylim = c(0, max_x2),
                          zlim = c(0, max_y + 5))

4. CONJETURA DEL MODELO

par(mar = c(5, 6, 4, 2)) 

Cobrereg <- scatterplot3d(x1, x2, y, angle = 225, pch = 16, color = "blue",
                          cex.symbols = 0.6, # Puntos pequeños para ver la densidad de la nube
                          main = "Gráfica N°2: Comparación de la realidad \n con el modelo multivariable lineal",
                          xlab = "Masa de Acero (x1)",
                          ylab = "Masa de Concreto (x2)",
                          zlab = "Volumen (miles de m3)",
                          y.margin.add = 0.5,
                          las = 1,
                          xlim = c(0, max_x1),
                          ylim = c(0, max_x2),
                          zlim = c(0, max_y + 5))

# CÁLCULO DE PARÁMETROS SOBRE LOS 1,000 DATOS
regresion_multiple <- lm(y ~ x1 + x2)

# El plano se estabilizará cruzando de forma óptima a través de los 1,000 datos
Cobrereg$plane3d(regresion_multiple, col = "red", lwd = 1.5)

a_val <- round(coef(regresion_multiple)[1], 3)
b_val <- round(coef(regresion_multiple)[2], 5) # Usamos 5 decimales por la precisión que otorgan 1,000 datos
c_val <- round(coef(regresion_multiple)[3], 5)

plot.new()
par(mar = c(1, 1, 1, 1))
plot.window(xlim = c(0, 100), ylim = c(0, 100))

rect(5, 15, 95, 85, border = "blue", lwd = 3)

text(50, 70, "Ecuación Múltiple Lineal (N = 1000)", cex = 1.4, font = 2, col = "blue")
text(50, 50, "Y = a + bx1 + cx2", cex = 1.2, font = 1, col = "black")
text(50, 30, paste0("Y = ", a_val, " + (", b_val, ")x1 + (", c_val, ")x2"), cex = 1.1, font = 2, col = "darkgreen")

5. TEST DE APROBACIÓN Y RESTRICCIONES

# TEST DE PEARSON Y DETERMINACIÓN
r2 <- summary(regresion_multiple)$r.squared
r_multiple <- sqrt(r2)

tabla_tests <- data.frame(
  Indicador = c("Coeficiente de Correlación Múltiple (r)", "Coeficiente de Determinación (R2)"),
  Valor = c(paste0(round(r_multiple * 100, 2), " %"), paste0(round(r2 * 100, 2), " %"))
)

# Imprimir la tabla de indicadores
tabla_tests %>% 
  gt() %>%
  tab_header(title = md("**Tests de Aprobación del Modelo Multivariable**")) %>%
  cols_align(align = "center") %>%
  tab_options(table.width = pct(65), column_labels.font.weight = "bold")
Tests de Aprobación del Modelo Multivariable
Indicador Valor
Coeficiente de Correlación Múltiple (r) 96.52 %
Coeficiente de Determinación (R2) 93.16 %
# Generación de la tarjeta gráfica independiente de restricciones
plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))

text(50, 85, "RESTRICCIONES DEL MODELO", cex = 1.4, font = 2, col = "#D9534F")

parrafo_1 <- "La interpretación del modelo se limita estrictamente 
al rango observado de variables.Se deben evitar 
extrapolaciones fuera del dominio analizado de 
Masa de Acero y Concreto."


text(50, 55, parrafo_1, cex = 1.1, font = 3, col = "black")

rect(2, 5, 98, 95, border = "#D9534F", lwd = 3)

6. CÁLCULO DE PRONÓSTICOS

# CÁLCULO DE ESTIMACIONES
x1_test <- 500    # Valor de Acero de ejemplo
x2_test <- 2500   # Valor de Concreto de ejemplo

C_Est <- a_val + (b_val * x1_test) + (c_val * x2_test)

plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 1))

rect(10, 0.4, 90, 0.6, col = "#E5E7E9", border = NA)
text(50, 0.85, "PRONÓSTICO DEL MODELO MULTIVARIABLE", cex = 1.5, font = 2, col = "#2A9D8F")

texto_pregunta <- paste0("¿Qué volumen se espera con acero de ", x1_test, " y concreto de ", x2_test, "?")
text(50, 0.75, texto_pregunta, cex = 1.1, font = 3)

text(50, 0.5, paste0("R = ", round(C_Est, 3), " m3"), cex = 1.6, font = 2, col = "#1F618D")
rect(10, 0.4, 90, 0.6, border = "#2A9D8F", lwd = 2)

7. CONCLUSIÓN

## Entre el volumen y la combinación de Acero y Concreto existe una regresión múltiple lineal. El volumen está influenciado en un 93.16% por la combinación de estas variables. Por ejemplo: Para una masa de acero de 500 y una masa de concreto de 2500, se espera un volumen de 10.16 m3.