# ==========================================================
# 1. CARGA DE LIBRERIAS Y DATOS 
# ==========================================================
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(knitr)
library(gt)

# Configuracion de directorio y carga de archivo
setwd("C:/Users/HP/Documents/PROYECTO ESTADISTICA/RStudio")
datos <- read.csv("tablap.csv", header = TRUE, sep = ";", dec = ",")

# ==========================================================
# 2. TABLA PARES DE VALORES
# ==========================================================
# Extraer variables y asegurar formato numerico
pendiente <- as.numeric(datos$Slope)
volumen   <- as.numeric(datos$Volume.excavated.soil..slope)

# Crear TPV y limpiar datos (NA)
TPV <- data.frame(pendiente = pendiente, volumen = volumen)
TPV <- na.omit(TPV)

# --- RESETEAR NUMERACION DE FILAS ---
row.names(TPV) <- NULL

# --- MOSTRAR TABLA (Primeros 20 registros) ---
cat("TABLA DE PARES DE VALORES (Vista previa):\n")
## TABLA DE PARES DE VALORES (Vista previa):
print(head(TPV, 20))
##    pendiente volumen
## 1          0     885
## 2          0      31
## 3          0     237
## 4          0     362
## 5          1    7838
## 6          0     165
## 7          0     245
## 8          4   24829
## 9          0     193
## 10         0     417
## 11         1    8340
## 12         3   20965
## 13         0     169
## 14         0     486
## 15         6   25959
## 16         0    2290
## 17         0    1048
## 18         0     370
## 19         0      99
## 20         0    1173
x <- TPV$pendiente # Variable Independiente
y <- TPV$volumen   # Variable Dependiente

# Seleccion aleatoria del 50% solo para representacion visual
set.seed(123)
indice_visual <- sample(1:nrow(TPV), nrow(TPV) / 10)

# ==========================================================
# 3. DIAGRAMA DE DISPERSION (GRAFICA N1)
# ==========================================================
plot(x[indice_visual], y[indice_visual], 
     pch = 16, 
     col = rgb(0, 0, 0.8), 
     main = "Grafica Nº1: Diagrama de dispersion entre la Pendiente \n y el Volumen de suelo excavado",
     xlab = "Pendiente (Slope)", 
     ylab = "Volumen de suelo (m3)")

# ==========================================================
# 4. CONJETURA DEL MODELO (POLINOMICO GRADO 4)
# ==========================================================
# Crear potencias para el modelo
xcuad <- x^2
xcub  <- x^3

# Calculo de parametros (Ajustado a Grado 3)
regresion_polinomica <- lm(y ~ x + xcuad + xcub)

a <- coef(regresion_polinomica)[1]
b <- coef(regresion_polinomica)[2]
c <- coef(regresion_polinomica)[3]
d <- coef(regresion_polinomica)[4]

# Graficar comparacion realidad vs modelo (GRAFICA N2)
plot(x[indice_visual], y[indice_visual], 
     pch = 16, col = rgb(0, 0, 0.8),
     main = "Grafica Nº2: Comparacion de la realidad con el \n modelo polinomico",
     xlab = "Pendiente", ylab = "Volumen de suelo")

curve(a + b*x + c*x^2 + d*x^3, 
      from = min(x), to = max(x), add = TRUE, col = "red", lwd = 3)

# Mostrar Ecuacion en pantalla (GRAFICA N3)
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
eq <- paste0("Ecuacion polinomica (grado 3)\n",
             "Y = a + bX + cX^2 + dX^3\n\n",
             "Y = ", round(a, 3), " + ", round(b, 3), "X + ", 
             round(c, 3), "X^2 + ", round(d, 3), "X^3")
text(1, 1, labels = eq, cex = 1.1, col = "blue", font = 2)

# ==========================================================
# 5. TEST DE APROBACION Y RESTRICCIONES
# ==========================================================
# Test de Correlacion
r <- cor(y, x + xcuad + xcub)
cat("\nTest de Pearson (r*100):", round(r * 100, 2), "%\n")
## 
## Test de Pearson (r*100): 31.97 %
# Restricciones
cat("\nRESTRICCIONES:\n")
## 
## RESTRICCIONES:
cat("El modelo solo es confiable dentro del rango observado de la pendiente. 
La extrapolacion puede generar valores inconsistentes en modelos de grado superior.")
## El modelo solo es confiable dentro del rango observado de la pendiente. 
## La extrapolacion puede generar valores inconsistentes en modelos de grado superior.
# ==========================================================
# 6. CALCULO DE PRONOSTICOS (GRAFICA N4)
# ==========================================================
x0 <- 15 # Valor de prueba para la pendiente
vol_esp <- a + b*x0 + c*x0^2 + d*x0^3

plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(1, 1,
     labels = paste0("Grafica Nº4: Pronostico\n\n",
                     "Cual seria el volumen de suelo esperado\n",
                     "si la pendiente es de ", x0, "?\n\n",
                     "R = ", round(vol_esp, 2), " m3"),
     cex = 1.5, col = "blue", font = 2)

# ==========================================================
# 7. CONCLUSION
# ==========================================================
cat("\n--- CONCLUSION ---\n")
## 
## --- CONCLUSION ---
cat(paste0("Entre la pendiente y el volumen de suelo excavado se observa una relacion polinomial "))
## Entre la pendiente y el volumen de suelo excavado se observa una relacion polinomial
cat(paste0("de tercer grado, representada por el modelo f(x) = ", round(a, 3), " + ", round(b, 3), 
           "X + ", round(c, 3), "X^2 + ", round(d, 3), "X^3. "))
## de tercer grado, representada por el modelo f(x) = 1441.85 + 8503.828X + -589.999X^2 + 11.878X^3.
cat(paste0("Ejemplo: Cuando la pendiente es de ", x0, ", el modelo predice un volumen de ", 
           round(vol_esp, 2), " m3."))
## Ejemplo: Cuando la pendiente es de 15, el modelo predice un volumen de 36337.91 m3.