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).
datos_base <- Datos_Brutos %>%
filter(TERRA_MAR == "T") %>% # Filtro estricto para pozos terrestres
dplyr::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), ",", ".")))
) %>%
# Filtros físicos de viabilidad
filter(!is.na(x1) & !is.na(x2) & !is.na(y)) %>%
filter(x1 > 0 & x1 < 10000 & x2 >= 0 & x2 <= 500 & y > 0 & y < 12000)El tamaño muestral operativo es de 3871 pozos terrestres.
kable(head(datos_base %>% dplyr::select(x1, x2, y), 5),
col.names = c("Prof. Vertical (X1)", "Cota Altimétrica (X2)", "Prof. Perforación (Y)"))| Prof. Vertical (X1) | Cota Altimétrica (X2) | Prof. Perforación (Y) |
|---|---|---|
| 2686.47 | 135.22 | 2844 |
| 2994.51 | 97.77 | 3117 |
| 2364.00 | 50.90 | 2421 |
| 1679.70 | 3.50 | 1690 |
| 536.00 | 134.50 | 705 |
Se plantea la ecuación del plano: Y=β0+β1⋅X1+β2⋅X2
plot_ly(data = datos_base, x = ~x1, y = ~x2, z = ~y,
type = "scatter3d",
mode = "markers",
marker = list(
size = 4,
color = ~y,
colorscale = "Viridis",
opacity = 0.75
),
name = "Pozos Originales") %>%
layout(
title = "Gráfica N°1: Dispersión Espacial (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))
)
)Para garantizar la fiabilidad del plano de regresión sin alterar la naturaleza de los datos tridimensionales, se ajusta un modelo preliminar y se aplica el filtro del Rango Intercuartílico (IQR) sobre los residuos. Esto descarta aquellos pozos cuya longitud de perforación sea físicamente anómala respecto a la suma de su topografía y objetivo geológico.
# Ajuste preliminar del plano
modelo_preliminar <- lm(y ~ x1 + x2, data = datos_base)
datos_base$residuo <- resid(modelo_preliminar)
# Filtro estadístico IQR
filtrar_outliers <- function(residuos) {
Q1 <- quantile(residuos, 0.25, na.rm = TRUE)
Q3 <- quantile(residuos, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
k <- 1.5
residuos >= (Q1 - k * IQR) & residuos <= (Q3 + k * IQR)
}
datos_estrictos <- datos_base %>% filter(filtrar_outliers(residuo))
x1_final <- datos_estrictos$x1
x2_final <- datos_estrictos$x2
y_final <- datos_estrictos$yEl tamaño muestral depurado es de 3248 observaciones limpias.
La distribución espacial de los puntos sugiere una fuerte relación aditiva lineal. Se espera que la Profundidad de Perforación crezca de manera proporcional tanto al incremento de la Profundidad Vertical como al de la Cota Altimétrica, justificando el ajuste de un plano de regresión múltiple.
Modelo de regresión lineal múltiple (Plano):
\[Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2\]
Ajuste del modelo:
Parámetros:
## [1] 5.482063
## [1] 1.006929
## [1] 1.001392
grid_x1 <- seq(min(x1_final), max(x1_final), length.out = 30)
grid_x2 <- seq(min(x2_final), max(x2_final), length.out = 30)
z_plano <- t(outer(grid_x1, grid_x2, function(val_x1, val_x2) {
b0_est + (b1_est * val_x1) + (b2_est * val_x2)
}))
plot_ly() %>%
add_surface(
x = grid_x1,
y = grid_x2,
z = z_plano,
colorscale = "Viridis",
opacity = 0.6,
showscale = FALSE,
name = "Plano Ajustado"
) %>%
add_trace(
data = datos_estrictos,
x = ~x1_final,
y = ~x2_final,
z = ~y_final,
type = "scatter3d",
mode = "markers",
marker = list(
size = 4,
color = ~y_final,
colorscale = "Viridis",
opacity = 0.9
),
name = "Datos Depurados"
) %>%
layout(
title = "Gráfica N°2: Plano de Regresión vs Datos Reales",
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.6, y = 1.6, z = 0.8))
)
)resumen <- summary(modelo_mult)
r2 <- resumen$r.squared
r2_adj <- resumen$adj.r.squared
r <- sqrt(r2) # Correlación múltiple (R)ecuacion_txt_simple <- paste0("Y = ", round(b0_est, 4),
ifelse(b1_est >= 0, " + ", " - "), abs(round(b1_est, 4)), "X1",
ifelse(b2_est >= 0, " + ", " - "), abs(round(b2_est, 4)), "X2")
tabla_resumen <- data.frame(
Parametro = c(
"Tipo de Regresión",
"Ecuación del Plano",
"Correlación Múltiple (R)",
"Coeficiente de Determinación (R²)",
"R² Ajustado",
"Intercepto (b0)",
"Coef. Prof. Vertical (b1)",
"Coef. Cota Altimétrica (b2)"
),
Valor = c(
"Lineal Múltiple",
ecuacion_txt_simple,
paste0(round(r * 100, 2), " %"),
paste0(round(r2 * 100, 2), " %"),
paste0(round(r2_adj * 100, 2), " %"),
sprintf("%.4f", b0_est),
sprintf("%.4f", b1_est),
sprintf("%.4f", b2_est)
)
)
tabla_resumen %>%
gt() %>%
tab_header(
title = md("**RESUMEN DEL MODELO MÚLTIPLE**"),
subtitle = md("**Parámetros y Bondad de Ajuste**")
) %>%
tab_source_note(source_note = "Autor: Anahi Macias") %>%
cols_label(
Parametro = md("**Parámetro**"),
Valor = md("**Valor**")
) %>%
cols_align(align = "left", columns = Parametro) %>%
cols_align(align = "center", columns = Valor) %>%
tab_style(
style = list(cell_fill(color = "#2C3E50"), cell_text(color = "white", weight = "bold")),
locations = cells_title(groups = "title")
) %>%
tab_style(
style = list(cell_fill(color = "#2C3E50"), cell_text(color = "white", weight = "bold", size = "small")),
locations = cells_title(groups = "subtitle")
) %>%
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",
column_labels.border.bottom.color = "#2C3E50",
data_row.padding = px(8)
)| RESUMEN DEL MODELO MÚLTIPLE | |
| Parámetros y Bondad de Ajuste | |
| Parámetro | Valor |
|---|---|
| Tipo de Regresión | Lineal Múltiple |
| Ecuación del Plano | Y = 5.4821 + 1.0069X1 + 1.0014X2 |
| Correlación Múltiple (R) | 99.95 % |
| Coeficiente de Determinación (R²) | 99.9 % |
| R² Ajustado | 99.9 % |
| Intercepto (b0) | 5.4821 |
| Coef. Prof. Vertical (b1) | 1.0069 |
| Coef. Cota Altimétrica (b2) | 1.0014 |
| Autor: Anahi Macias | |
Dominios:
\[ D_{X_1}=\{x_1\in\mathbb{R}:x_1\ge0\} \]
\[ D_{X_2}=\{x_2\in\mathbb{R}:x_2\ge0\} \]
\[ D_Y=\{y\in\mathbb{R}:y\ge0\} \]
¿Existe una combinación de \(X_1\) y \(X_2\) que reemplazados en el plano genere un valor fuera del dominio de Y?
No hay restricciones. Dado que \(X_1\) y \(X_2\) son variables de distancias físicas, no pueden tomar valores negativos. Analizando los parámetros del modelo, tanto el intercepto (\(5.48\)) como los coeficientes aditivos (\(b_1\) y \(b_2\)) son positivos. Por lo tanto, cualquier combinación de Profundidad Vertical y Cota Altimétrica positiva siempre generará una Profundidad de Perforación (\(Y\)) estrictamente positiva, manteniéndose siempre dentro de su dominio físico.
# Pregunta de cantidad
x1_cantidad <- 1750
x2_cantidad <- 39
y_cantidad <- b0_est + (b1_est * x1_cantidad) + (b2_est * x2_cantidad)par(mar = c(1, 1, 1, 1))
plot(0, 0,
type = "n",
xlim = c(0, 1),
ylim = c(0, 1),
axes = FALSE,
xlab = "",
ylab = "")
text(
x = 0.5,
y = 0.48,
labels = paste(
"Pregunta de cantidad\n\n",
"¿Qué Profundidad de Perforación se espera al tener una Prof. Vertical\n",
"de ", x1_cantidad, " m y una Cota Altimétrica de ", x2_cantidad, " m?\n\n",
"Resultado: ", round(y_cantidad, 2), " m\n\n",
sep = ""
),
cex = 1.1,
col = "#1f384c",
font = 2
)Entre la Profundidad de Perforación (Y), la Profundidad Vertical (X₁) y la Cota Altimétrica (X₂) (medidas en metros) existe una relación de tipo lineal múltiple definida por la ecuación del plano \(Y=5.4821+1.0069X_1+1.0014X_2\), donde la Profundidad de Perforación está explicada en un 99.90% por la acción conjunta de la Profundidad Vertical y la Cota Altimétrica, mientras que el 0.10% restante se debe a factores externos no incluidos en el modelo. El modelo no presenta restricciones dentro del dominio físico de las variables.