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 = -0.8 + 1.0112 * X
## Determinación (R²): 0.9818
## --------------------------------------------------
## Si X = 500 → Y estimado = 504.8
## `geom_smooth()` using formula = 'y ~ x'
Se observa una relación lineal fuerte y positiva entre la Profundidad Vertical Verdadera (TVD) y la Profundidad Total (TD), explicando aproximadamente el 82% de la variabilidad. Esto indica que a medida que aumenta la profundidad vertical, la profundidad total perforada también incrementa de forma proporcional, evidenciando la presencia de trayectorias direccionales en los pozos analizados