1. Introducción

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.

2. Carga y Procesamiento de Datos

Se implementa una búsqueda automática del archivo para asegurar la conexión con el dataset

library(dplyr)
## 
## 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)

3. Función de Regresión Lineal con Ecuación

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()
}

4. Aplicación del Modelo

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'

5. Conclusiones

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