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 = -13.74 + 1.0618 * X 
## Determinación (R²): 0.8134 
## --------------------------------------------------
## Si X = 500 → Y estimado = 517.18
## `geom_smooth()` using formula = 'y ~ x'

5. Conclusiones

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