En este análisis de ingeniería de petróleos, evaluamos la relación lineal entre la Profundidad Vertical Verdadera (TVD) y la Profundidad Total (TD) de los pozos. Se utiliza una muestra aleatoria para validar la consistencia del modelo y realizar estimaciones puntuales de profundidad.
Se implementa una búsqueda automática del archivo para asegurar la conexión con el dataset
##
## Attaching package: '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)
# === BUSCADOR AUTOMÁTICO DE RUTA ===
posibles_rutas <- c(
"Petroleo_Ontaro.csv",
"datos/Petroleo_Ontaro.csv",
"/cloud/project/Petroleo_Ontaro.csv",
"/cloud/project/datos/Petroleo_Ontaro.csv"
)
ruta_valida <- ""
for (ruta in posibles_rutas) {
if (file.exists(ruta)) {
ruta_valida <- ruta
break
}
}
if (ruta_valida == "") {
stop("ERROR: No se encontró el archivo CSV. Verifica que esté en la carpeta 'datos' o en la raíz del proyecto.")
}
datos_raw <- read.csv(ruta_valida, header = TRUE, sep = ";", dec = ".", fill = TRUE)Definimos la función para procesar la muestra, calcular el modelo e imprimir la ecuación matemática.
regresion_lineal_simple <- function(datos, x_var, y_var, n_muestra = 350, valor_estimacion = 500) {
# 1. Limpieza y Conversión
df_local <- datos
df_local[[x_var]] <- as.numeric(gsub(",", ".", as.character(df_local[[x_var]])))
df_local[[y_var]] <- as.numeric(gsub(",", ".", as.character(df_local[[y_var]])))
# 2. Selección de Muestra Aleatoria
df_filtrado <- df_local %>%
filter(!is.na(.data[[x_var]]), !is.na(.data[[y_var]]),
.data[[x_var]] > 0, .data[[y_var]] > 0)
n_final <- min(n_muestra, nrow(df_filtrado))
datos_muestra <- df_filtrado %>% sample_n(n_final) %>%
dplyr::select(X = .data[[x_var]], Y = .data[[y_var]])
# 3. Modelo Matemático
modelo <- lm(Y ~ X, data = datos_muestra)
intercepto <- coef(modelo)[1]
pendiente <- coef(modelo)[2]
r2_val <- summary(modelo)$r.squared
# 4. Construcción de la Ecuación
# Formato: Y = a + bX
ecuacion_txt <- paste0("Y = ", round(intercepto, 2), " + ", round(pendiente, 4), " * X")
# 5. Estimación Puntual
estimacion_resultado <- intercepto + (pendiente * valor_estimacion)
# 6. Reporte de Resultados
cat("\n==================================================\n")
cat(" REPORTE DE REGRESIÓN (n =", n_final, ")\n")
cat("==================================================\n")
cat("Ecuación:", ecuacion_txt, "\n")
cat("Determinación (R²):", round(r2_val, 4), "\n")
cat("--------------------------------------------------\n")
cat("Si X =", valor_estimacion, "→ Y estimado =", round(estimacion_resultado, 2), "\n")
# 7. Gráfico con Ecuación Visual
ggplot(datos_muestra, aes(X, Y)) +
geom_point(color = "dodgerblue4", size = 2.5, alpha = 0.5) +
geom_smooth(method = "lm", color = "red", linewidth = 1.2, se = FALSE) +
# Anotación de la Ecuación
annotate("text", x = min(datos_muestra$X), y = max(datos_muestra$Y),
label = ecuacion_txt, hjust = 0, vjust = 1, size = 5, fontface = "bold", color = "black") +
# Punto de Estimación
annotate("point", x = valor_estimacion, y = estimacion_resultado, color = "darkgreen", size = 4) +
annotate("text", x = valor_estimacion, y = estimacion_resultado,
label = paste("Estimación:", round(estimacion_resultado, 1)), vjust = -1.5, color = "darkgreen") +
labs(
title = "Regresión Lineal Simple: TD vs TVD",
subtitle = paste("Modelo ajustado | R² =", round(r2_val, 3)),
x = x_var,
y = y_var
) +
theme_minimal()
}Ejecutamos el análisis para las variables de profundidad vertical y profundidad total.
regresion_lineal_simple(
datos_raw,
"TRUE_VERTICAL_DEPTH",
"TOTAL_DEPTH",
n_muestra = 300,
valor_estimacion = 500
)## Warning: Use of .data in tidyselect expressions was deprecated in tidyselect 1.2.0.
## ℹ Please use `all_of(var)` (or `any_of(var)`) instead of `.data[[var]]`
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
##
## ==================================================
## REPORTE DE REGRESIÓN (n = 300 )
## ==================================================
## Ecuación: Y = -13.74 + 1.0618 * X
## Determinación (R²): 0.8134
## --------------------------------------------------
## Si X = 500 → Y estimado = 517.18
## `geom_smooth()` using formula = 'y ~ x'
El modelo lineal permite establecer una relación directa entre las variables de profundidad. La ecuación obtenida es fundamental para operaciones de perforación, permitiendo predecir la profundidad total requerida basándose en la trayectoria vertical diseñada