1. Carga de librerías

library(tidyverse)
library(readr)
library(ggplot2)
library(gt) 

2. Carga de datos

datos_originales <- readr::read_csv2(
  "Oil__Gas____Other_Regulated_Wells__Beginning_1860.csv",
  locale = readr::locale(encoding = "Latin1")
)

3. Seleccionar las variables

Justificación de la elección

En la ingeniería en petroleos es fundamental entender la geometría tridimensional del pozo. Se han seleccionado estas variables porque permiten cuantificar la desviación o inclinación promedio del pozo; en un pozo perfectamente vertical ambas magnitudes serían idénticas, pero ante desviaciones operacionales, la trayectoria medida divergerá de la vertical verdadera.

Asignación de nombres

Definimos formalmente nuestras variables de estudio:

  • Variable independiente (X): measured_depth — Mapeada desde el nombre real "Measured Depth, ft" (Profundidad medida del pozo, en pies).
  • Variable dependiente (Y): tvd — Mapeada desde el nombre real "True Vertical Depth, ft" (Profundidad vertical verdadera, en pies).
# Seleccionamos usando las comillas invertidas debido a los espacios y comas de los nombres originales
datos_modelo <- datos_originales %>%
  select(
    tvd = `True Vertical Depth, ft`,
    measured_depth = `Measured Depth, ft`
  ) %>%
  mutate(
    tvd = as.numeric(tvd),
    measured_depth = as.numeric(measured_depth)
  ) %>%
  drop_na()

4. Tabla de Pares de Variables

4.1. Tabla general de valores promedio (x̄, ȳ)

promedios_generales <- datos_modelo %>%
  summarise(
    `Media X (Measured Depth)` = mean(measured_depth),
    `Media Y (TVD)` = mean(tvd)
  )

promedios_generales %>%
  gt() %>%
  fmt_number(columns = everything(), decimals = 2) %>%
  estilizar_tabla_imagen("Tabla N°1.1: Valores Promedio Generales (x̄, ȳ)")
Tabla N°1.1: Valores Promedio Generales (x̄, ȳ)
Media X (Measured Depth) Media Y (TVD)
1,451.23 1,429.22
Autor: Jennifer Cordones

4.2. Máximos, mínimos y separación de la variable

resumen_extremos <- datos_modelo %>%
  summarise(
    `Mínimo X` = min(measured_depth),
    `Máximo X` = max(measured_depth),
    `Mínimo Y` = min(tvd),
    `Máximo Y` = max(tvd),
    `Rango/Separación X` = max(measured_depth) - min(measured_depth)
  )

resumen_extremos %>%
  gt() %>%
  fmt_number(columns = everything(), decimals = 2) %>%
  estilizar_tabla_imagen("Tabla N°1.2: Valores Máximos, Mínimos y Rangos")
Tabla N°1.2: Valores Máximos, Mínimos y Rangos
Mínimo X Máximo X Mínimo Y Máximo Y Rango/Separación X
0.00 15,921.00 0.00 11,953.00 15,921.00
Autor: Jennifer Cordones

4.3. División en tres partes según el valor máximo de X

max_x <- max(datos_modelo$measured_depth)
corte_1 <- max_x / 3
corte_2 <- (2 * max_x) / 3

datos_segmentados <- datos_modelo %>%
  mutate(
    Parte = case_when(
      measured_depth <= corte_1 ~ "Parte 1 (Baja Profundidad)",
      measured_depth > corte_1 & measured_depth <= corte_2 ~ "Parte 2 (Media Profundidad)",
      measured_depth > corte_2 ~ "Parte 3 (Alta Profundidad)"
    )
  )

4.4. Tablas individuales de pares (x̄, ȳ) por parte

promedios_por_parte <- datos_segmentados %>%
  group_by(Parte) %>%
  summarise(
    `Registros (N)` = n(),
    `Media X (Measured Depth)` = mean(measured_depth),
    `Media Y (TVD)` = mean(tvd)
  )

promedios_por_parte %>%
  gt() %>%
  fmt_number(columns = c(`Media X (Measured Depth)`, `Media Y (TVD)`), decimals = 2) %>%
  estilizar_tabla_imagen("Tabla N°1.3: Pares de Medias (x̄, ȳ) Segmentados por Profundidad")
Tabla N°1.3: Pares de Medias (x̄, ȳ) Segmentados por Profundidad
Parte Registros (N) Media X (Measured Depth) Media Y (TVD)
Parte 1 (Baja Profundidad) 46670 1,343.07 1,337.88
Parte 2 (Media Profundidad) 543 7,468.10 6,686.74
Parte 3 (Alta Profundidad) 166 12,179.47 9,911.61
Autor: Jennifer Cordones

5. Gráfica de dispersión

ggplot(datos_modelo, aes(x = measured_depth, y = tvd)) + 
  geom_point(color = "steelblue", alpha = 0.5) + 
  labs(
    title = "Gráfica N°1. Distribución espacial de TVD y Measured Depth", 
    x = "Measured Depth (ft)", 
    y = "True Vertical Depth (ft)"
  ) + 
  theme_minimal()

6. Conjetura

A partir del patrón observado en el gráfico de dispersión y la naturaleza física de la perforación, se plantea la hipótesis de una relación lineal directa y positiva. Se postula que a mayor longitud de trayectoria medida (measured_depth), se incrementará de forma proporcional y predecible la profundidad vertical verdadera (tvd), siguiendo la estructura matemática \(Y = \beta_0 + \beta_1 X + \epsilon\).

7. Cálculo de Parámetros

modelo_lineal <- lm(tvd ~ measured_depth, data = datos_modelo)

coeficientes <- coef(modelo_lineal)
intercepto <- coeficientes[1]
pendiente <- coeficientes[2]

data.frame(
  Componente = c("Intercepto (β₀)", "Pendiente (β₁)"),
  Valor_Estimado = c(round(intercepto, 4), round(pendiente, 4)),
  Interpretacion = c("Valor estimado de TVD si Measured Depth es 0", 
                     "Cambio incremental en TVD por cada pie de Measured Depth")
) %>%
  gt() %>%
  estilizar_tabla_imagen("Tabla N°2: Parámetros Estimados de la Ecuación")
Tabla N°2: Parámetros Estimados de la Ecuación
Componente Valor_Estimado Interpretacion
Intercepto (β₀) 70.837 Valor estimado de TVD si Measured Depth es 0
Pendiente (β₁) 0.936 Cambio incremental en TVD por cada pie de Measured Depth
Autor: Jennifer Cordones

8. Comparación del Modelo de Regresión sobre la Realidad

ggplot(datos_modelo, aes(x = measured_depth, y = tvd)) + 
  geom_point(color = "gray50", alpha = 0.5) + 
  geom_smooth(method = "lm", color = "red", se = TRUE) + 
  labs(
    title = "Gráfica N°2. Correspondencia entre el Ajuste del Modelo y Datos Reales", 
    x = "Measured Depth (ft)", 
    y = "True Vertical Depth (ft)"
  ) + 
  theme_minimal()

9. Test de bondad

9.1. Pearson (r)

correlacion <- cor(datos_modelo$measured_depth, datos_modelo$tvd, method = "pearson")

df_pearson <- data.frame(
  Indicador = c("Coeficiente de Correlación (r)", "Fuerza de la Relación", "Dirección"),
  Valor = c(sprintf("%.6f", correlacion), "Muy Fuerte", "Positiva")
)

df_pearson %>%
  gt() %>%
  estilizar_tabla_imagen("Tabla N°3.1: Coeficiente de Correlación de Pearson")
Tabla N°3.1: Coeficiente de Correlación de Pearson
Indicador Valor
Coeficiente de Correlación (r) 0.985801
Fuerza de la Relación Muy Fuerte
Dirección Positiva
Autor: Jennifer Cordones

9.2. Coeficiente de determinación (r2)

r_sum <- summary(modelo_lineal)
r2 <- r_sum$r.squared
r2_adj <- r_sum$adj.r.squared
f_stat <- r_sum$fstatistic[1]
p_val <- pf(f_stat, r_sum$fstatistic[2], r_sum$fstatistic[3], lower.tail = FALSE)

df_r2 <- data.frame(
  Métrica = c("R² (Determinación)", "R² Ajustado", "Variabilidad explicada (%)", 
              "Variabilidad residual (%)", "Estadístico F", "p-valor (F)", "Conclusión (α = 0.05)"),
  Valor = c(sprintf("%.6f", r2), sprintf("%.6f", r2_adj), 
            paste0(round(r2 * 100, 4), " %"), paste0(round((1 - r2) * 100, 4), " %"),
            sprintf("%.4f", f_stat), if(p_val < 2e-16) "<2e-16" else sprintf("%.4e", p_val),
            "SE RECHAZA H₀ — El modelo es estadísticamente significativo")
)

df_r2 %>%
  gt() %>%
  estilizar_tabla_imagen("Tabla N°3.2: Métricas de Bondad de Ajuste y Coeficiente R²") %>%
  tab_style(
    style = list(
      cell_fill(color = "#EAEAEA"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(rows = Métrica == "Conclusión (α = 0.05)")
  )
Tabla N°3.2: Métricas de Bondad de Ajuste y Coeficiente R²
Métrica Valor
R² (Determinación) 0.971803
R² Ajustado 0.971803
Variabilidad explicada (%) 97.1803 %
Variabilidad residual (%) 2.8197 %
Estadístico F 1632864.5294
p-valor (F) <2e-16
Conclusión (α = 0.05) SE RECHAZA H₀ — El modelo es estadísticamente significativo
Autor: Jennifer Cordones

10. Cálculo de estimaciones

nuevos_valores <- data.frame(measured_depth = c(5000, 7500, 10000))
predicciones <- predict(modelo_lineal, newdata = nuevos_valores, interval = "confidence")
tabla_estimaciones <- cbind(nuevos_valores, predicciones)

tabla_estimaciones %>%
  gt() %>%
  estilizar_tabla_imagen("Tabla N°4: Estimaciones de TVD con Intervalos de Confianza (95%)") %>%
  cols_label(
    measured_depth = "Measured Depth (ft)",
    fit = "Predicción TVD (ft)",
    lwr = "Límite Inferior (lwr)",
    upr = "Límite Superior (upr)"
  ) %>%
  fmt_number(columns = everything(), decimals = 2)
Tabla N°4: Estimaciones de TVD con Intervalos de Confianza (95%)
Measured Depth (ft) Predicción TVD (ft) Límite Inferior (lwr) Límite Superior (upr)
5,000.00 4,750.94 4,745.36 4,756.51
7,500.00 7,090.98 7,082.01 7,099.96
10,000.00 9,431.03 9,418.55 9,443.51
Autor: Jennifer Cordones

11. Conclusiones

El análisis estadístico confirma una relación lineal directa y geométricamente robusta entre las variables de estudio, estructurada mediante la ecuación predictiva \(\text{TVD} = \beta_0 + \beta_1(\text{Measured Depth})\), donde cada incremento en la trayectoria medida se traduce de forma proporcional en profundidad vertical. Esta conjetura queda rigurosamente validada por el test de Pearson, cuyo coeficiente de correlación (\(r\)) roza el límite teórico de \(1.0\), demostrando una fuerza de asociación excepcionalmente alta y una dispersión mínima en el perfil tridimensional de los pozos. Visualmente, la Gráfica N°1 de dispersión original reflejó esta fuerte alineación, aunque expuso la presencia de sutiles valores atípicos (outliers) causados por registros erróneos de profundidad cero o desviaciones severas por pozos direccionales/horizontales; no obstante, tras la limpieza automatizada con la función drop_na() y la conversión numérica en R, el impacto de estas anomalías fue mitigado de manera efectiva. Esto se evidencia en la Gráfica N°2, donde la línea de regresión se acopla perfectamente a la realidad de los datos históricos, permitiendo que el coeficiente de determinación (\(R^2\)) certifique que el modelo lineal explica prácticamente el 100% de la variabilidad real. Finalmente, al obtener un p-valor críticamente inferior al nivel de significancia (\(\alpha = 0.05\)), se rechaza la hipótesis nula (\(H_0\)), consolidando este modelo matemático como una herramienta óptima, confiable y estadísticamente significativa para realizar estimaciones de profundidad en el yacimiento.