#########################################################
# 1. CARGA DE LIBRERÍAS Y DATOS
#########################################################

library(readxl)
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(ggplot2)
library(gridExtra)
## 
## Adjuntando el paquete: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(gt)

suppressWarnings(
  datos_raw <- read_excel(
    "produccin-de-pozos-de-gas-y-petrleo-no-convencional.xlsx"
  )
)

# Cambiamos los nombres a minúsculas usando R nativo
names(datos_raw) <- tolower(names(datos_raw))

# Convertimos las columnas a numéricas usando R Base
datos <- datos_raw
datos$prod_pet    <- as.numeric(datos$prod_pet)
## Warning: NAs introducidos por coerción
datos$prod_gas    <- as.numeric(datos$prod_gas)
## Warning: NAs introducidos por coerción
datos$prod_agua   <- as.numeric(datos$prod_agua)
datos$iny_agua    <- as.numeric(datos$iny_agua)
datos$vida_util   <- as.numeric(datos$vida_util)
datos$profundidad <- as.numeric(datos$profundidad)


#########################################################
# 4. MODELO 1: REGRESIÓN LINEAL
#########################################################

df_model_lin <- datos |> 
  filter(!is.na(prod_pet), !is.na(vida_util), prod_pet > 0, vida_util > 0) |> 
  mutate(X = vida_util, Y = prod_pet)

m_lin  <- lm(Y ~ X, data = df_model_lin)
r_lin  <- cor(df_model_lin$X, df_model_lin$Y)
R2_lin <- summary(m_lin)$r.squared * 100
a_lin  <- coef(m_lin)[1]
b_lin  <- coef(m_lin)[2]

x_test_lin <- mean(df_model_lin$X)
y_pred_lin <- predict(m_lin, data.frame(X = x_test_lin))

x_seq_lin <- seq(min(df_model_lin$X), max(df_model_lin$X), length.out = 200)
y_seq_lin <- predict(m_lin, data.frame(X = x_seq_lin))
df_line_lin <- data.frame(X = x_seq_lin, Y = y_seq_lin)

g1 <- ggplot(df_model_lin, aes(X, Y)) +
  geom_point(alpha = 0.4, color = "gray30") + 
  geom_line(data = df_line_lin, aes(X, Y), color = "blue", linewidth = 1.5) +
  annotate("label", x = -Inf, y = Inf, hjust = 0, vjust = 1, fill = "white", alpha = 0.9, size = 3.5,
           label = paste0("MODELO: LINEAL DECRECIENTE\n", "------------------------------\n",
                          "Ecuación: Y = ", round(a_lin, 2), " + (", round(b_lin, 4), ") * X\n",
                          "R²: ", round(R2_lin, 2), "%  |  Pearson (r): ", round(r_lin, 4))) +
  labs(title = "Análisis de Regresión: Modelo Lineal", x = "Vida Útil del Pozo", y = "Producción de Petróleo") +
  theme_minimal()
print(g1)

### 4.1 Predicción del modelo (Lineal)
predecir_lin <- function(valor_x) {
  predict(m_lin, newdata = data.frame(X = valor_x))
}
escenarios_lin <- c(10, 30, 60, 90, 120)

### 4.2 TABLA DE PREDICCIONES (Lineal)
rmse_lin <- sqrt(mean(residuals(m_lin)^2))
tabla_lin <- data.frame(
  Escenario = paste("Caso", 1:length(escenarios_lin)),
  Variable_X = escenarios_lin,
  Prediccion = round(predecir_lin(escenarios_lin), 2)
)
tabla_lin$Rango_Min <- round(pmax(0, tabla_lin$Prediccion - rmse_lin), 2)
tabla_lin$Rango_Max <- round(tabla_lin$Prediccion + rmse_lin, 2)

print(tabla_lin |> kbl(caption = "Tabla 1: Pronóstico con Modelo Lineal", align = "c") |>
        kable_styling(bootstrap_options = c("striped", "hover"), full_width = F, position = "center"))
## <table class="table table-striped table-hover" style="width: auto !important; margin-left: auto; margin-right: auto;">
## <caption>Tabla 1: Pronóstico con Modelo Lineal</caption>
##  <thead>
##   <tr>
##    <th style="text-align:center;"> Escenario </th>
##    <th style="text-align:center;"> Variable_X </th>
##    <th style="text-align:center;"> Prediccion </th>
##    <th style="text-align:center;"> Rango_Min </th>
##    <th style="text-align:center;"> Rango_Max </th>
##   </tr>
##  </thead>
## <tbody>
##   <tr>
##    <td style="text-align:center;"> Caso 1 </td>
##    <td style="text-align:center;"> 10 </td>
##    <td style="text-align:center;"> 22.12 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 45.87 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 2 </td>
##    <td style="text-align:center;"> 30 </td>
##    <td style="text-align:center;"> 22.20 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 45.95 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 3 </td>
##    <td style="text-align:center;"> 60 </td>
##    <td style="text-align:center;"> 22.32 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 46.07 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 4 </td>
##    <td style="text-align:center;"> 90 </td>
##    <td style="text-align:center;"> 22.44 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 46.19 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 5 </td>
##    <td style="text-align:center;"> 120 </td>
##    <td style="text-align:center;"> 22.56 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 46.31 </td>
##   </tr>
## </tbody>
## </table>
### 4.3 Gráfica de predicciones (Lineal)
g1_final <- ggplot(df_model_lin, aes(X, Y)) +
  geom_smooth(method = "lm", fill = "blue", alpha = 0.15, color = "blue") +
  geom_point(alpha = 0.3, color = "gray30") +
  geom_point(data = tabla_lin, aes(x = Variable_X, y = Prediccion), color = "#d9534f", size = 4, shape = 18) +
  labs(title = "Predicciones con Intervalo - Lineal", x = "Vida Útil", y = "Petróleo") + theme_minimal()
print(g1_final)
## `geom_smooth()` using formula = 'y ~ x'

### 4.4 Conclusión (Lineal)
cat("El modelo lineal muestra una tasa de decaimiento constante basada en la vida útil. Explica el", round(R2_lin, 2), "% de la dispersión.\n\n")
## El modelo lineal muestra una tasa de decaimiento constante basada en la vida útil. Explica el 15.31 % de la dispersión.
#########################################################
# 5. MODELO 2: REGRESIÓN POTENCIAL
#########################################################

df_model_pot <- datos |> 
  filter(!is.na(prod_gas), !is.na(vida_util), prod_gas > 0, vida_util > 0) |> 
  mutate(X = vida_util, Y = prod_gas)

m_pot <- lm(log(Y) ~ log(X), data = df_model_pot)
a_pot <- exp(coef(m_pot)[1])
b_pot <- coef(m_pot)[2]
R2_pot <- summary(m_pot)$r.squared * 100

x_seq_pot <- seq(min(df_model_pot$X), max(df_model_pot$X), length.out = 200)
y_seq_pot <- a_pot * (x_seq_pot ^ b_pot)
df_line_pot <- data.frame(X = x_seq_pot, Y = y_seq_pot)

g2 <- ggplot(df_model_pot, aes(X, Y)) +
  geom_point(alpha = 0.4, color = "gray30") +
  geom_line(data = df_line_pot, aes(X, Y), color = "darkgreen", linewidth = 1.5) +
  annotate("label", x = Inf, y = Inf, hjust = 1, vjust = 1, fill = "white", alpha = 0.9,
           label = paste0("MODELO: POTENCIAL DECRECIENTE\n", "Ecuación: Y = ", round(a_pot, 2), " * X^(", round(b_pot, 4), ")\n", "R²: ", round(R2_pot, 2), "%")) +
  labs(title = "Análisis de Regresión: Modelo Potencial", x = "Vida Útil", y = "Producción de Gas") + theme_minimal()
print(g2)

### 4.1 Predicción del modelo (Potencial)
predecir_pot <- function(valor_x) {
  a_pot * (valor_x ^ b_pot)
}
escenarios_pot <- c(5, 15, 30, 60, 100)

### 4.2 TABLA DE PREDICCIONES (Potencial)
pred_totales_pot <- a_pot * (df_model_pot$X ^ b_pot)
rmse_pot <- sqrt(mean((df_model_pot$Y - pred_totales_pot)^2))

# CORREGIDO: Cambiado scenarios_pot por escenarios_pot
tabla_pot <- data.frame(
  Escenario = paste("Caso", 1:length(escenarios_pot)), 
  Variable_X = escenarios_pot, 
  Prediccion = round(predecir_pot(escenarios_pot), 2)
)

tabla_pot$Rango_Min <- round(pmax(0, tabla_pot$Prediccion - rmse_pot), 2)
tabla_pot$Rango_Max <- round(tabla_pot$Prediccion + rmse_pot, 2)

print(tabla_pot |> kbl(caption = "Tabla 2: Pronóstico con Modelo Potencial", align = "c") |>
        kable_styling(bootstrap_options = c("striped", "hover"), full_width = F, position = "center"))
## <table class="table table-striped table-hover" style="width: auto !important; margin-left: auto; margin-right: auto;">
## <caption>Tabla 2: Pronóstico con Modelo Potencial</caption>
##  <thead>
##   <tr>
##    <th style="text-align:center;"> Escenario </th>
##    <th style="text-align:center;"> Variable_X </th>
##    <th style="text-align:center;"> Prediccion </th>
##    <th style="text-align:center;"> Rango_Min </th>
##    <th style="text-align:center;"> Rango_Max </th>
##   </tr>
##  </thead>
## <tbody>
##   <tr>
##    <td style="text-align:center;"> Caso 1 </td>
##    <td style="text-align:center;"> 5 </td>
##    <td style="text-align:center;"> 10106.75 </td>
##    <td style="text-align:center;"> 9394.14 </td>
##    <td style="text-align:center;"> 10819.36 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 2 </td>
##    <td style="text-align:center;"> 15 </td>
##    <td style="text-align:center;"> 5385.92 </td>
##    <td style="text-align:center;"> 4673.31 </td>
##    <td style="text-align:center;"> 6098.53 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 3 </td>
##    <td style="text-align:center;"> 30 </td>
##    <td style="text-align:center;"> 3620.71 </td>
##    <td style="text-align:center;"> 2908.10 </td>
##    <td style="text-align:center;"> 4333.32 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 4 </td>
##    <td style="text-align:center;"> 60 </td>
##    <td style="text-align:center;"> 2434.04 </td>
##    <td style="text-align:center;"> 1721.43 </td>
##    <td style="text-align:center;"> 3146.65 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 5 </td>
##    <td style="text-align:center;"> 100 </td>
##    <td style="text-align:center;"> 1816.46 </td>
##    <td style="text-align:center;"> 1103.85 </td>
##    <td style="text-align:center;"> 2529.07 </td>
##   </tr>
## </tbody>
## </table>
### 4.3 Gráfica de predicciones (Potencial)
g2_final <- ggplot(df_model_pot, aes(X, Y)) +
  geom_point(alpha = 0.3, color = "gray30") +
  geom_line(data = df_line_pot, aes(X, Y), color = "darkgreen", linewidth = 1.2) +
  geom_point(data = tabla_pot, aes(x = Variable_X, y = Prediccion), color = "red", size = 4, shape = 18) +
  labs(title = "Predicciones con Intervalo - Potencial", x = "Vida Útil", y = "Gas") + theme_minimal()
print(g2_final)

### 4.4 Conclusión (Potencial)
cat("El modelo potencial modela eficientemente pérdidas masivas de energía de flujo inicial disminuyendo drásticamente.\n\n")
## El modelo potencial modela eficientemente pérdidas masivas de energía de flujo inicial disminuyendo drásticamente.
#########################################################
# 6. MODELO 3: REGRESIÓN EXPONENCIAL DECRECIENTE (REAL)
#########################################################

# Filtramos para asegurarnos de que no haya ceros que destruyan el logaritmo
df_model_exp <- datos |> 
  filter(!is.na(prod_pet), !is.na(vida_util), prod_pet > 1, vida_util > 0) |> 
  mutate(X = vida_util, Y = prod_pet)

# Usamos nls (mínimos cuadrados no lineales) para FORZAR la forma decreciente: e^(-b*X)
# Le damos valores iniciales lógicos (start) para que pueda converger
tryCatch({
  m_exp <- nls(Y ~ a * exp(-b * X), data = df_model_exp, 
               start = list(a = max(df_model_exp$Y), b = 0.001))
  
  a_exp <- coef(m_exp)["a"]
  b_exp <- coef(m_exp)["b"]
  
  # Cálculo aproximado del R2 para NLS
  rss <- sum(residuals(m_exp)^2)
  tss <- sum((df_model_exp$Y - mean(df_model_exp$Y))^2)
  R2_exp <- (1 - (rss/tss)) * 100
  
  # Etiqueta de la ecuación corregida con el signo MENOS explícito
  texto_ecuacion <- paste0("MODELO: EXPONENCIAL DECRECIENTE\n", 
                           "Ecuación: Y = ", round(a_exp, 2), " * e^(-", round(b_exp, 5), " * X)\n", 
                           "R²: ", round(R2_exp, 2), "%")
  
  # Generamos la curva decreciente limpia
  x_seq_exp <- seq(min(df_model_exp$X), max(df_model_exp$X), length.out = 200)
  y_seq_exp <- a_exp * exp(-b_exp * x_seq_exp)
  df_line_exp <- data.frame(X = x_seq_exp, Y = y_seq_exp)
  
}, error = function(e) {
  # Si falla nls por la dispersión, usamos una alternativa logarítmica linealizada inversa
  m_exp <<- lm(log(Y) ~ I(1/X), data = df_model_exp)
  ...
})

# Gráfica corregida
g3 <- ggplot(df_model_exp, aes(X, Y)) +
  geom_point(alpha = 0.2, color = "gray30") +
  geom_line(data = df_line_exp, aes(X, Y), color = "purple", linewidth = 1.5) +
  annotate("label", x = Inf, y = Inf, hjust = 1, vjust = 1, fill = "white", alpha = 0.9, size = 3.5,
           label = texto_ecuacion) +
  labs(title = "Análisis de Regresión: Modelo Exponencial Corregido", 
       x = "Vida Útil del Pozo", y = "Producción de Petróleo") + 
  theme_minimal()

print(g3)

#########################################################
# 7. MODELO 4: REGRESIÓN LOGARÍTMICA (CORREGIDO)
#########################################################

# Variables: Vida Útil (X) vs Producción de Agua (Y)
df_model_log <- datos |> 
  filter(!is.na(prod_agua), !is.na(vida_util), prod_agua > 0, vida_util > 0) |> 
  mutate(X = vida_util, Y = prod_agua)

m_log <- lm(Y ~ log(X), data = df_model_log)
a_log <- coef(m_log)[1]
b_log <- coef(m_log)[2]
R2_log <- summary(m_log)$r.squared * 100

x_seq_log <- seq(min(df_model_log$X), max(df_model_log$X), length.out = 200)
y_seq_log <- a_log + b_log * log(x_seq_log)
df_line_log <- data.frame(X = x_seq_log, Y = pmax(0, y_seq_log))

g4 <- ggplot(df_model_log, aes(X, Y)) +
  geom_point(alpha = 0.4, color = "gray30") +
  geom_line(data = df_line_log, aes(X, Y), color = "orange", linewidth = 1.5) +
  annotate("label", x = Inf, y = -Inf, hjust = 1, vjust = 0, fill = "white", alpha = 0.9,
           label = paste0("MODELO: LOGARÍTMICO\n", "Ecuación: Y = ", round(a_log, 2), " + (", round(b_log, 2), ") * log(X)\n", "R²: ", round(R2_log, 2), "%")) +
  labs(title = "Análisis de Regresión: Modelo Logarítmico", x = "Vida Útil del Pozo", y = "Producción de Agua") + 
  theme_minimal()
print(g4)

### 7.1 Predicción del modelo (Logarítmico)
predecir_log <- function(valor_x) {
  a_log + b_log * log(valor_x)
}
escenarios_log <- c(10, 30, 60, 90, 120)

### 7.2 TABLA DE PREDICCIONES (Logarítmico)
rmse_log <- sqrt(mean(residuals(m_log)^2))

tabla_log <- data.frame(
  Escenario = paste("Caso", 1:length(escenarios_log)), 
  Variable_X = escenarios_log, 
  Prediccion = round(predecir_log(escenarios_log), 2)
)
tabla_log$Rango_Min <- round(pmax(0, tabla_log$Prediccion - rmse_log), 2)
tabla_log$Rango_Max <- round(tabla_log$Prediccion + rmse_log, 2)

print(tabla_log |> kbl(caption = "Tabla 4: Pronóstico con Modelo Logarítmico", align = "c") |>
        kable_styling(bootstrap_options = c("striped", "hover"), full_width = F, position = "center"))
## <table class="table table-striped table-hover" style="width: auto !important; margin-left: auto; margin-right: auto;">
## <caption>Tabla 4: Pronóstico con Modelo Logarítmico</caption>
##  <thead>
##   <tr>
##    <th style="text-align:center;"> Escenario </th>
##    <th style="text-align:center;"> Variable_X </th>
##    <th style="text-align:center;"> Prediccion </th>
##    <th style="text-align:center;"> Rango_Min </th>
##    <th style="text-align:center;"> Rango_Max </th>
##   </tr>
##  </thead>
## <tbody>
##   <tr>
##    <td style="text-align:center;"> Caso 1 </td>
##    <td style="text-align:center;"> 10 </td>
##    <td style="text-align:center;"> 94.85 </td>
##    <td style="text-align:center;"> 25.95 </td>
##    <td style="text-align:center;"> 163.75 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 2 </td>
##    <td style="text-align:center;"> 30 </td>
##    <td style="text-align:center;"> 79.63 </td>
##    <td style="text-align:center;"> 10.73 </td>
##    <td style="text-align:center;"> 148.53 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 3 </td>
##    <td style="text-align:center;"> 60 </td>
##    <td style="text-align:center;"> 70.03 </td>
##    <td style="text-align:center;"> 1.13 </td>
##    <td style="text-align:center;"> 138.93 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 4 </td>
##    <td style="text-align:center;"> 90 </td>
##    <td style="text-align:center;"> 64.42 </td>
##    <td style="text-align:center;"> 0.00 </td>
##    <td style="text-align:center;"> 133.32 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 5 </td>
##    <td style="text-align:center;"> 120 </td>
##    <td style="text-align:center;"> 60.44 </td>
##    <td style="text-align:center;"> 0.00 </td>
##    <td style="text-align:center;"> 129.34 </td>
##   </tr>
## </tbody>
## </table>
### 7.3 Gráfica de predicciones (Logarítmico)
g4_final <- ggplot(df_model_log, aes(X, Y)) +
  geom_point(alpha = 0.3, color = "gray30") +
  geom_line(data = df_line_log, aes(X, Y), color = "orange", linewidth = 1.2) +
  geom_point(data = tabla_log, aes(x = Variable_X, y = Prediccion), color = "red", size = 4, shape = 18) +
  labs(title = "Predicciones con Intervalo - Logarítmico", x = "Vida Útil del Pozo", y = "Producción de Agua") + 
  theme_minimal()
print(g4_final)

### 7.4 Conclusión (Logarítmico)
cat("La curva logarítmica demuestra la tendencia de estabilización en la producción de agua (water cut) conforme el pozo llega a su madurez.\n\n")
## La curva logarítmica demuestra la tendencia de estabilización en la producción de agua (water cut) conforme el pozo llega a su madurez.
#########################################################
# 8. MODELO 5: REGRESIÓN POLINÓMICA (CORREGIDO Y ORDENADO)
#########################################################

# 1. Filtramos y limpiamos la Nube de Puntos
df_model_poly <- datos |> 
  filter(!is.na(prod_agua), !is.na(vida_util), prod_agua >= 0, vida_util > 0) |> 
  mutate(X = vida_util, Y = prod_agua)

# 2. Ajustamos el modelo cuadrático (Parábola: Y = b0 + b1*X + b2*X²)
m_poly <- lm(Y ~ poly(X, 2, raw = TRUE), data = df_model_poly)

# Extraemos coeficientes reales para la etiqueta
a_poly  <- coef(m_poly)[1] # Intercepto (b0)
b1_poly <- coef(m_poly)[2] # Coeficiente lineal (b1)
b2_poly <- coef(m_poly)[3] # Coeficiente cuadrático (b2)
R2_poly <- summary(m_poly)$r.squared * 100

# 3. CRÍTICO: Creamos una secuencia limpia y ORDENADA para que la curva no se cruce
x_seq_poly <- seq(min(df_model_poly$X), max(df_model_poly$X), length.out = 300)
y_seq_poly <- predict(m_poly, data.frame(X = x_seq_poly))

# Agrupamos en un dataframe de diseño de curva y evitamos valores negativos imposibles
df_line_poly <- data.frame(X = x_seq_poly, Y = pmax(0, y_seq_poly))

# 4. Gráfica de Tendencia Polinómica
g5 <- ggplot(df_model_poly, aes(X, Y)) +
  geom_point(alpha = 0.2, color = "gray30") + # Puntos suavizados para ver la densidad
  geom_line(data = df_line_poly, aes(X, Y), color = "red", linewidth = 1.5) + # Curva perfecta
  annotate("label", x = -Inf, y = Inf, hjust = 0, vjust = 1, fill = "white", alpha = 0.9, size = 3.5,
           label = paste0("MODELO: POLINÓMICO GRADO 2\n", 
                          "Ecuación: Y = ", round(a_poly, 2), " + (", round(b1_poly, 4), ")*X + (", round(b2_poly, 6), ")*X²\n", 
                          "R²: ", round(R2_poly, 2), "%")) +
  labs(title = "Análisis de Regresión: Modelo Polinómico Corregido", 
       x = "Vida Útil del Pozo (Meses/Días)", 
       y = "Producción de Agua") + 
  theme_minimal()
print(g5)

### 5.1 Función matemática de predicción
predecir_poly <- function(valor_x) {
  pmax(0, predict(m_poly, newdata = data.frame(X = valor_x)))
}
escenarios_poly <- c(10, 30, 60, 90, 120)

### 5.2 TABLA DE PREDICCIONES (Corregida sin variables en inglés)
rmse_poly <- sqrt(mean(residuals(m_poly)^2))

tabla_poly <- data.frame(
  Escenario = paste("Caso", 1:length(escenarios_poly)), 
  Variable_X = escenarios_poly, 
  Prediccion = round(predecir_poly(escenarios_poly), 2)
)
tabla_poly$Rango_Min <- round(pmax(0, tabla_poly$Prediccion - rmse_poly), 2)
tabla_poly$Rango_Max <- round(tabla_poly$Prediccion + rmse_poly, 2)

print(tabla_poly |> kbl(caption = "Tabla 5: Pronóstico con Modelo Polinómico", align = "c") |>
        kable_styling(bootstrap_options = c("striped", "hover"), full_width = F, position = "center"))
## <table class="table table-striped table-hover" style="width: auto !important; margin-left: auto; margin-right: auto;">
## <caption>Tabla 5: Pronóstico con Modelo Polinómico</caption>
##  <thead>
##   <tr>
##    <th style="text-align:center;"> Escenario </th>
##    <th style="text-align:center;"> Variable_X </th>
##    <th style="text-align:center;"> Prediccion </th>
##    <th style="text-align:center;"> Rango_Min </th>
##    <th style="text-align:center;"> Rango_Max </th>
##   </tr>
##  </thead>
## <tbody>
##   <tr>
##    <td style="text-align:center;"> Caso 1 </td>
##    <td style="text-align:center;"> 10 </td>
##    <td style="text-align:center;"> 39.62 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 101.67 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 2 </td>
##    <td style="text-align:center;"> 30 </td>
##    <td style="text-align:center;"> 39.33 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 101.38 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 3 </td>
##    <td style="text-align:center;"> 60 </td>
##    <td style="text-align:center;"> 38.90 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 100.95 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 4 </td>
##    <td style="text-align:center;"> 90 </td>
##    <td style="text-align:center;"> 38.48 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 100.53 </td>
##   </tr>
##   <tr>
##    <td style="text-align:center;"> Caso 5 </td>
##    <td style="text-align:center;"> 120 </td>
##    <td style="text-align:center;"> 38.05 </td>
##    <td style="text-align:center;"> 0 </td>
##    <td style="text-align:center;"> 100.10 </td>
##   </tr>
## </tbody>
## </table>
### 5.3 Gráfica Final con Puntos de Pronóstico
g5_final <- ggplot(df_model_poly, aes(X, Y)) +
  geom_point(alpha = 0.15, color = "gray40") +
  geom_line(data = df_line_poly, aes(X, Y), color = "red", linewidth = 1.2) +
  geom_point(data = tabla_poly, aes(x = Variable_X, y = Prediccion), color = "blue", size = 4, shape = 18) +
  labs(title = "Predicciones con Intervalo - Polinómico", x = "Vida Útil del Pozo", y = "Producción de Agua") + 
  theme_minimal()
print(g5_final)

### 5.4 Conclusión Técnica Dinámica
cat("El modelo polinómico cuadrático permite identificar si el comportamiento del agua tiene un incremento acelerado (parábola cóncava hacia arriba) o si tiende a estabilizarse en fases maduras del bloque explotado.\n")
## El modelo polinómico cuadrático permite identificar si el comportamiento del agua tiene un incremento acelerado (parábola cóncava hacia arriba) o si tiende a estabilizarse en fases maduras del bloque explotado.