1 Configuración y Carga de Datos

library(readxl)
library(dplyr)
library(stringr)
library(gt)
library(e1071)
library(lubridate)
library(MASS)
library(knitr)
library(plotly)

setwd("C:/Users/majke/Downloads/Proyecto Estadistica/RMARKDOWN")

tryCatch({
  Datos_Brutos <- read_excel("tabela_de_pocos_janeiro_2018.xlsx")
}, error = function(e) {
  stop("Error al leer el archivo Excel. Verifica la ruta y el nombre.")
})

2 Extracción y Depuración de Variables

El diseño de este modelo responde a una lógica física de “Suma de Distancias” para pozos terrestres. Se busca explicar la longitud total del pozo como la consecuencia obligatoria de dos factores geométricos:

  • Variable Dependiente (Y): Profundidad de Perforación (m). Se eligió como la variable de respuesta porque representa el esfuerzo total de ingeniería (metros perforados y tubería utilizada). Es el resultado final de la operación, el cual no se elige arbitrariamente, sino que es consecuencia de la ubicación del yacimiento y del equipo.

  • Variable Independiente 1 (X1): Profundidad Vertical (m). Representa la necesidad geológica. Es la distancia vertical desde el nivel de referencia (Datum/Nivel del Mar) hasta el yacimiento objetivo. Es la variable principal porque dicta la profundidad neta a alcanzar bajo tierra.

  • Variable Independiente 2 (X2): Cota Altimétrica (m). Representa el obstáculo topográfico. Al estar en tierra, el equipo suele estar sobre una elevación positiva (montaña o meseta). Esta variable cuantifica los metros “extra” que se deben perforar desde la superficie solo para llegar al nivel de referencia (Datum).

Lógica del Modelo: La longitud del pozo (Y) es, esencialmente, la suma de atravesar la elevación del terreno (X2) más la profundidad para llegar al yacimiento (X1).

# Limpieza 
datos_model <- Datos_Brutos %>%
  select(PROFUNDIDADE_SONDADOR_M, PROFUNDIDADE_VERTICAL_M, COTA_ALTIMETRICA_M) %>%
  mutate(
    y = abs(as.numeric(str_replace(as.character(PROFUNDIDADE_SONDADOR_M), ",", "."))),
    x1 = abs(as.numeric(str_replace(as.character(PROFUNDIDADE_VERTICAL_M), ",", "."))),
    x2 = abs(as.numeric(str_replace(as.character(COTA_ALTIMETRICA_M), ",", ".")))
  ) %>%
  filter(!is.na(x1) & !is.na(x2) & !is.na(y)) %>%
  
  # Filtros 
  filter(x1 > 0 & x1 < 10000 & x2 >= 0 & x2 <= 500 & y > 0 & y < 12000) 

# Asignación de variables
y <- datos_model$y
x1 <- datos_model$x1
x2 <- datos_model$x2

3 Análisis Gráfico (3D )

Aquí puedes rotar el gráfico con el ratón y hacer zoom para explorar la distribución de los pozos.

# Gráfico 3D 
plot_ly(x = ~x1, y = ~x2, z = ~y,
        type = "scatter3d", 
        mode = "markers",
        marker = list(
            size = 5,
            color = ~y,
            colorscale = "Viridis",
            opacity = 0.75
        ),      
        name = "Pozos") %>%
  layout(
    title = "Gráfica N°1: Topografía Profundidad (3D)",
    scene = list(
      xaxis = list(title = "Prof. Vertical (m) [X1]"),
      yaxis = list(title = "Cota Altimétrica (m) [X2]"),
      zaxis = list(title = "Prof. Perforación (m) [Y]"),
      camera = list(eye = list(x = 1.5, y = 1.5, z = 1.5)) 
    )
  )

4 Modelo de Regresión Múltiple

Se plantea la ecuación del plano: Y=β0+β1⋅X1+β2⋅X2

modelo <- lm(y ~ x1 + x2)

summary_modelo <- summary(modelo)

coefs <- coef(modelo)
b0 <- coefs[1]
b1 <- coefs[2]
b2 <- coefs[3]

r2 <- summary_modelo$r.squared
r2_adj <- summary_modelo$adj.r.squared

ecuacion_latex <- paste0(
"Y = ",round(b0,2),
ifelse(b1>=0," + "," - "),abs(round(b1,4)),"X1",
ifelse(b2>=0," + "," - "),abs(round(b2,4)),"X2"
)

summary(modelo)
## 
## Call:
## lm(formula = y ~ x1 + x2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6987.5  -201.0  -130.9   -11.2  5432.0 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 206.395146  13.039215  15.829  < 2e-16 ***
## x1            1.030431   0.004576 225.190  < 2e-16 ***
## x2           -1.025694   0.148935  -6.887 6.35e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 501.2 on 5425 degrees of freedom
## Multiple R-squared:  0.9117, Adjusted R-squared:  0.9117 
## F-statistic: 2.8e+04 on 2 and 5425 DF,  p-value: < 2.2e-16

5 Visualización del Plano Ajustado (Interactivo)

Se visualiza el plano matemático resultante sobre los datos reales.

grid_x1 <- seq(min(x1), max(x1), length.out = 50) 
grid_x2 <- seq(min(x2), max(x2), length.out = 50)


z_plano <- t(outer(grid_x1, grid_x2, function(x1_val, x2_val) {
  b0 + (b1 * x1_val) + (b2 * x2_val)
}))

# Generación del Gráfico 
plot_ly() %>%

  add_surface(
    x = grid_x1,
    y = grid_x2,
    z = z_plano,
    colorscale = "Viridis",
    opacity = 0.75,
    showscale = TRUE,
    name = "Plano Ajustado"
  ) %>%

  add_trace(
    data = datos_model,
    x = ~x1,
    y = ~x2,
    z = ~y,
    type = "scatter3d",
    mode = "markers",
    marker = list(
      size = 5,
      color = ~y,
      colorscale = "Viridis",
      opacity = 0.8
    ),
    name = "Datos Reales"
  ) %>%

  layout(
    title = "Gráfica N°2: Plano de Regresión y Datos (Interactivo)",
    scene = list(
      xaxis = list(title = "Prof. Vertical (m) [X1]"),
      yaxis = list(title = "Cota Altimétrica (m) [X2]"),
      zaxis = list(title = "Prof. Perforación (m) [Y]"),
      camera = list(
        eye = list(x = 1.8, y = 1.8, z = 1)
      )
    )
  )

6 Resultados y Ecuación

6.1 Bondad de Ajuste

cat(paste0("**Coeficiente de Determinación ($R^2$):** ", round(r2, 4), " (", round(r2*100, 2), "%)<br>"))
## **Coeficiente de Determinación ($R^2$):** 0.9117 (91.17%)<br>
cat(paste0("**$R^2$ Ajustado:** ", round(r2_adj, 4), " (", round(r2_adj*100, 2), "%)"))
## **$R^2$ Ajustado:** 0.9117 (91.17%)

6.2 Ecuación Matemática

cat(paste0("La ecuación resultante es: ", ecuacion_latex))
## La ecuación resultante es: Y = 206.4 + 1.0304X1 - 1.0257X2

7 Tabla Resumen del Modelo

# Tabla
tabla <- data.frame(
  Parametro = c("Intercepto (b0)", "Coef. Vertical (b1)", "Coef. Cota (b2)"),
  Valor = c(sprintf("%.2f", b0), sprintf("%.4f", b1), sprintf("%.4f", b2)),
 
  R2_Adj = c(paste0(round(r2_adj*100,2), "%"), "", ""),
  R2 = c(paste0(round(r2*100,2), "%"), "", ""),
  Interpretacion = c("Valor Base", "Impacto Objetivo Geológico", "Impacto Topografía")
)

tabla %>%
  gt() %>%
  tab_header(
    title = md("**RESUMEN DEL MODELO MÚLTIPLE**"),
    subtitle = "Parámetros y Bondad de Ajuste"
  ) %>%
  tab_source_note(source_note = "Fuente: Grupo 3") %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#2C3E50"), cell_text(color = "white", weight = "bold")),
    locations = cells_title()
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#ECF0F1"), cell_text(weight = "bold", color = "#2C3E50")),
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.border.top.color = "#2C3E50",
    table.border.bottom.color = "#2C3E50",
    data_row.padding = px(8)
  )
RESUMEN DEL MODELO MÚLTIPLE
Parámetros y Bondad de Ajuste
Parametro Valor R2_Adj R2 Interpretacion
Intercepto (b0) 206.40 91.17% 91.17% Valor Base
Coef. Vertical (b1) 1.0304 Impacto Objetivo Geológico
Coef. Cota (b2) -1.0257 Impacto Topografía
Fuente: Grupo 3

8 Conclusiones

Se ha desarrollado un modelo de regresión lineal múltiple para estimar la Profundidad de Perforaciónr (Y) en función de la Profundidad Vertical (X1) y la Cota Altimétrica (X2).

El modelo presenta un coeficiente de determinación (R2 ) del 91.17%, lo que confirma la fuerte relación física existente: la longitud total perforada equivale, casi exactamente, a la suma del objetivo geológico más la elevación topográfica del terreno.

Por ejemplo, si tenemos un objetivo a 1750 m y una elevación de 39 m, el modelo estima una profundidad total de 1969.65 m.