1 Introducción y Metodología

El presente informe estadístico analiza la variable Profundidad Vertical (profundidade_vertical_m) de pozos petroleros de Brasil, aplicando técnicas descriptivas e inferenciales avanzadas de bondad de ajuste. Esta variable es crítica en la ingeniería de petróleos, ya que determina la presión y temperatura de fondo de pozo, influyendo directamente en el diseño mecánico y de completación.

2 Tabla de Distribución de Frecuencia

Dado que los pozos petroleros se perforan con objetivos comerciales ubicados a miles de metros bajo el suelo o el lecho marino, los datos reflejan magnitudes elevadas. Agrupamos los datos en intervalos de 500 metros para capturar de manera óptima la distribución global de los horizontes productores de la cuenca.

library(tidyverse)
library(gt)
library(MASS)
if(!require(janitor)) install.packages("janitor", quiet = TRUE)
library(janitor)

# 1. Carga de datos
Datos_Brutos <- read.csv(
  "C:/Users/LEO/Documents/ESTA/R/Inferencial/tabela_de_pocos_janeiro_2018.csv",
  header       = TRUE,
  sep          = ",",
  dec          = ".", 
  fileEncoding = "UTF-8"
)

# Limpieza: Filtramos el rango real de la profundidad vertical (hasta 6,000 metros de control operativo)
Datos <- Datos_Brutos %>%
  clean_names() %>% 
  mutate(profundidade_vertical_m = abs(as.numeric(as.character(profundidade_vertical_m)))) %>%
  filter(!is.na(profundidade_vertical_m) & profundidade_vertical_m > 0 & profundidade_vertical_m <= 6000)

X <- Datos$profundidade_vertical_m

# TABLA DE FRECUENCIAS GENERAL
breaks_prof <- seq(0, 6000, by = 500)
h_total     <- hist(X, breaks = breaks_prof, plot = FALSE)

TDF_General <- data.frame(
  Rango = paste(head(breaks_prof, -1), tail(breaks_prof, -1), sep = "-"),
  ni    = h_total$counts,
  hi    = round((h_total$counts / sum(h_total$counts)) * 100, 2)
)

totales_simplificados <- data.frame(
  Rango = "TOTAL",
  ni    = sum(TDF_General$ni),
  hi    = 100.00
)

TDF_Show_Simple <- rbind(TDF_General, totales_simplificados)

TDF_Show_Simple %>%
  gt() %>%
  tab_header(
    title    = md("TABLA DE FRECUENCIAS: INFERENCIA ESTADÍSTICA"),
    subtitle = md("Variable: **Profundidad Vertical Total (m)**")
  ) %>%
  tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
  cols_label(
    Rango = "Profundidad Vertical (m)",
    ni    = "Frecuencia Absoluta (ni)",
    hi    = "Frecuencia Relativa (hi%)"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
    locations = cells_title(groups = c("title", "subtitle"))
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  )
TABLA DE FRECUENCIAS: INFERENCIA ESTADÍSTICA
Variable: Profundidad Vertical Total (m)
Profundidad Vertical (m) Frecuencia Absoluta (ni) Frecuencia Relativa (hi%)
0-500 1456 23.52
500-1000 1521 24.57
1000-1500 635 10.26
1500-2000 406 6.56
2000-2500 460 7.43
2500-3000 657 10.61
3000-3500 373 6.02
3500-4000 114 1.84
4000-4500 111 1.79
4500-5000 155 2.50
5000-5500 188 3.04
5500-6000 115 1.86
TOTAL 6191 100.00
Fuente: Tabela de Poços 2018

3 Gráficas

3.1 Diagrama de Barras (Escala Local)

A continuación, presentamos el histograma de frecuencias.

col_barras <- "#5D6D7E"
col_ejes   <- "#2E4053"

par(mar = c(6, 5, 4, 2))

vals_x   <- TDF_General$Rango
vals_y   <- TDF_General$ni
ylim_max <- max(vals_y) * 1.1

bp <- barplot(
  vals_y,
  main      = "Gráfica N°1: Distribución de Profundidad Vertical de Pozos en Brasil",
  cex.main  = 0.9,
  ylab      = "Cantidad de Pozos",
  col       = col_barras, border = "white",
  axes      = FALSE, ylim = c(0, ylim_max), axisnames = FALSE
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = bp, labels = vals_x, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Intervalos de Profundidad Vertical (m)", line = 5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)

Al observar la Gráfica N°1, se evidencia que la profundidad vertical cuenta con una distribución bimodal o desplazada, reflejando dos grandes metodologías de explotación de la industria:

  • Fase Somera/Intermedia (0–2,500 m): Concentra pozos de menor complejidad técnica dirigidos a formaciones someras continentales o de aguas someras.

  • Fase Profunda/Ultraprofunda (2,500–6,000 m): Representa un volumen masivo de pozos perforados con alta tecnología para alcanzar yacimientos profundos marinos.

Fijamos el límite de segmentación operacional en los 2,500 metros para aislar ambos comportamientos industriales.

4 Agrupación 1 (0–2,500 m)

En este bloque analizamos si las profundidades menores o iguales a 2,500 metros siguen un comportamiento ajustado a la Distribución Weibull. Este modelo es altamente flexible y adecuado para variables de ingeniería mecánica y geológica que registran un crecimiento gradual tras un umbral inicial nulo.

X1 <- X[!is.na(X) & X <= 2500]

if(length(X1) > 0) {

hist(
    X1,
    breaks = seq(0, 2500, by = 250),
    col    = col_barras,
    border = "white",
    main   = "Histograma Sección 1 (0–2,500 m)",
    xlab   = "Profundidad Vertical (m)",
    ylab   = "Frecuencia"
  )
  
} else {
  print("¡Cuidado! No hay datos en el rango seleccionado después de la limpieza.")
}

4.1 Conjetura del Modelo

Utilizamos la estimación por máxima verosimilitud para calibrar los parámetros de forma (shape) y escala (scale) del modelo Weibull, silenciando los avisos numéricos secundarios del optimizador.

if(length(X1) > 1) {
  fit_weibull1 <- suppressWarnings(fitdistr(X1, "weibull"))
  shape_w1     <- fit_weibull1$estimate["shape"]
  scale_w1     <- fit_weibull1$estimate["scale"]
  
  breaks_s1 <- seq(0, 2500, by = 250)
  h1  <- hist(X1, breaks = breaks_s1, plot = FALSE)
  Fo1 <- h1$counts / sum(h1$counts)
  Fe1 <- diff(pweibull(breaks_s1, shape = shape_w1, scale = scale_w1))
  Fe1 <- Fe1 / sum(Fe1)
  
  barplot(
    rbind(Fo1, Fe1),
    beside    = TRUE,
    col       = c(col_barras, "#F2F3F4"),
    border    = "black",
    names.arg = paste0(head(breaks_s1, -1), "-", tail(breaks_s1, -1)),
    main      = "Gráfica N°2: Modelo de Probabilidad Weibull (0–2,500 m)",
    cex.main  = 1.2,
    ylab      = "Probabilidad",
    xlab      = "Rangos de Profundidad (m)",
    las       = 2,
    cex.names = 0.55
  )
  legend("topright", legend = c("Real", "Modelo Weibull"),
          fill = c(col_barras, "#F2F3F4"), border = "white", bty = "n")
  
} else {
  message("No hay datos suficientes en el Tramo 1 para calcular el modelo.")
}

4.2 Test de Pearson

Evaluamos el ajuste calculando el coeficiente de correlación lineal entre las proporciones de frecuencia empíricas observadas y las esperadas analíticamente por el modelo Weibull calibrado.

plot(
  Fo1, Fe1,
  main = "Gráfica N°3: Correlación de Pearson — Sección 1 (Weibull)",
  xlab = "Frecuencia Observada",
  ylab = "Frecuencia Esperada",
  pch  = 19, col = col_barras,
  xlim = c(0, max(Fo1) * 1.05),
  ylim = c(0, max(Fe1) * 1.05)
)
abline(lm(Fe1 ~ Fo1 + 0), col = "red", lwd = 2)

cor1 <- cor(Fo1, Fe1) * 100
cor1
## [1] 90.31033

4.3 Test de Chi-Cuadrado

Aplicamos la prueba de bondad de ajuste de Chi-Cuadrado (χ²) para comprobar la validez estadística del modelo Weibull adaptado a este tramo.

x2_1 <- sum((Fo1 - Fe1)^2 / Fe1)
x2_1
## [1] 0.1631023
vc1  <- qchisq(0.95, length(Fo1) - 1)
vc1
## [1] 16.91898

4.4 Tabla Resumen de Test

tabla_1 <- data.frame(
  Modelo       = "Weibull",
  Pearson      = round(cor1, 2),
  Chi_Cuadrado = round(x2_1, 4),
  Umbral       = round(vc1, 4),
  Decision     = ifelse(x2_1 < vc1, "Modelo aceptado", "Modelo rechazado")
)

gt(tabla_1) %>%
  tab_header(title = md("**Tabla N°2: Resumen Bondad de Ajuste Sección 1 (Weibull)**")) %>%
  tab_source_note(source_note = "Autor: Leonardo Ruiz") %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
    locations = cells_title()
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.border.top.color = "#2E4053",
    table.border.bottom.color = "#2E4053",
    column_labels.border.bottom.color = "#2E4053",
    data_row.padding = px(6))
Tabla N°2: Resumen Bondad de Ajuste Sección 1 (Weibull)
Modelo Pearson Chi_Cuadrado Umbral Decision
Weibull 90.31 0.1631 16.919 Modelo aceptado
Autor: Leonardo Ruiz

4.5 Cálculo de Probabilidades

¿Cuál es la probabilidad matemática estimada de que un pozo de esta sección intermedia cuente con una profundidad vertical menor a 1,500 metros?

p_1500 <- pweibull(1500, shape = shape_w1, scale = scale_w1)
p_1500
## [1] 0.8321347

La probabilidad es del 83.21%.

5 Agrupación 2 (2,500–6,000 m)

Analizamos la segunda etapa estructural aplicando un ajuste a la Distribución Beta. Debido a que el histograma presenta un comportamiento no monotónico (un fuerte decaimiento seguido de un repunte en profundidades mayores), se requiere la alta flexibilidad de la distribución Beta, aplicada mediante la normalización del intervalo [2500, 6000], para modelar con precisión esta tendencia bimodal latente.

X2 <- X[X > 2500 & X <= 6000]
X2 <- X2[!is.na(X2)]

breaks_seccion2 <- seq(2500, 6000, by = 500)

hist(
  X2,
  breaks = breaks_seccion2,
  col    = col_barras,
  border = "white",
  main   = "Histograma Sección 2 (2,500–6,000 m)",
  xlab   = "Profundidad Vertical (m)",
  ylab   = "Frecuencia"
)

5.1 Conjetura del Modelo

Normalizamos los datos al rango [0,1] para estimar los parámetros de forma (shape1, shape2) de la distribución Beta mediante máxima verosimilitud, permitiendo capturar las fluctuaciones del tramo profundo.

# Escalamos los datos al rango estricto (0, 1) para evitar problemas en los límites con la distribución Beta
X2_norm <- (X2 - 2500) / (6000 - 2500)
X2_norm <- pmax(pmin(X2_norm, 0.999), 0.001)

fit_beta2 <- suppressWarnings(fitdistr(X2_norm, "beta", start = list(shape1 = 1, shape2 = 1)))
s1_b2     <- fit_beta2$estimate["shape1"]
s2_b2     <- fit_beta2$estimate["shape2"]

h2  <- hist(X2, breaks = breaks_seccion2, plot = FALSE)
Fo2 <- h2$counts / sum(h2$counts)

# Calculamos las probabilidades teóricas usando los límites normalizados
breaks_norm <- (breaks_seccion2 - 2500) / (6000 - 2500)
Fe2         <- diff(pbeta(breaks_norm, shape1 = s1_b2, shape2 = s2_b2))
Fe2         <- Fe2 / sum(Fe2) 

etiquetas_prof2 <- paste0(head(breaks_seccion2, -1), "-", tail(breaks_seccion2, -1))

barplot(
  rbind(Fo2, Fe2),
  beside    = TRUE,
  col       = c(col_barras, "#F2F3F4"),
  border    = "black",
  names.arg = etiquetas_prof2,
  main      = "Gráfica N°5: Modelo Beta de Profundidad Vertical (2,500–6,000 m)",
  cex.main  = 0.85,
  ylab      = "Probabilidad",
  las       = 2,
  cex.names = 0.7
)
legend("topright", legend = c("Real", "Modelo Beta"),
       fill = c(col_barras, "#F2F3F4"), border = "white", bty = "n")

5.2 Test de Pearson

Evaluamos la Correlación de Pearson para cuantificar la relación lineal entre las frecuencias observadas y las probabilidades teóricas generadas por la distribución Beta.

plot(
  Fo2, Fe2,
  main = "Gráfica N°6: Correlación de Pearson — Sección 2 (Beta)",
  xlab = "Frecuencia Observada",
  ylab = "Frecuencia Esperada",
  pch  = 19, col = col_barras,
  xlim = c(0, max(Fo2) * 1.05),
  ylim = c(0, max(Fe2) * 1.05)
)
abline(lm(Fe2 ~ Fo2 + 0), col = "red", lwd = 2)

cor2 <- cor(Fo2, Fe2) * 100
cor2
## [1] 92.35169

5.3 Test de Chi-Cuadrado

Aplicamos la prueba de bondad de ajuste Chi-Cuadrado (χ²) para validar estadísticamente el modelo con un 95% de confianza.

x2_2 <- sum((Fo2 - Fe2)^2 / Fe2)
x2_2
## [1] 0.1039482
vc2  <- qchisq(0.95, length(Fo2) - 1)
vc2
## [1] 12.59159

5.4 Tabla Resumen de Test

tabla_2 <- data.frame(
  Modelo       = "Beta",
  Pearson      = round(cor2, 2),
  Chi_Cuadrado = round(x2_2, 4),
  Umbral       = round(vc2, 4),
  Decision     = ifelse(x2_2 < vc2, "Modelo aceptado", "Modelo rechazado")
)

gt(tabla_2) %>%
  tab_header(title = md("**Tabla N°3: Resumen Bondad de Ajuste Sección 2 (Beta)**")) %>%
  tab_source_note(source_note = "Autor: Leonardo Ruiz") %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
    locations = cells_title()
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.border.top.color = "#2E4053",
    table.border.bottom.color = "#2E4053",
    column_labels.border.bottom.color = "#2E4053",
    data_row.padding = px(6))
Tabla N°3: Resumen Bondad de Ajuste Sección 2 (Beta)
Modelo Pearson Chi_Cuadrado Umbral Decision
Beta 92.35 0.1039 12.5916 Modelo aceptado
Autor: Leonardo Ruiz

5.5 Cálculo de Probabilidades

De cada 1,000 pozos profundos analizados en este segundo tramo estructural (2,500–6,000 m), ¿cuántos se estimó matemáticamente que pertenecen al intervalo entre los 4,000 y 5,000 metros de profundidad vertical?

lim_inf_norm <- (4000 - 2500) / (6000 - 2500)
lim_sup_norm <- (5000 - 2500) / (6000 - 2500)

p_critica <- pbeta(lim_sup_norm, shape1 = s1_b2, shape2 = s2_b2) - pbeta(lim_inf_norm, shape1 = s1_b2, shape2 = s2_b2)
p_critica
## [1] 0.2246839
cantidad_estimada <- round(p_critica * 1000, 0)

El modelo Beta estimó que, por cada 1,000 pozos profundos, aproximadamente 225 se encuentran en el intervalo entre 4,000 y 5,000 metros.

6 Conclusiones

El análisis segmentado e inferencial de la variable Profundidad Vertical de pozos petroleros nos permite concluir lo siguiente:

  • Tramo 0–2,500 m: La escasez de pozos terminados en cotas sumamente someras y su incremento progresivo se modeló de forma satisfactoria mediante la distribución Weibull.

  • Tramo 2,500–6,000 m: Para describir la muestra orientada a yacimientos profundos, la distribución Beta (aplicada mediante normalización de rango) demostró ser el modelo idóneo. Al poseer una estructura matemática flexible, asimiló la naturaleza no monótona de las frecuencias operativas caracterizada por un fuerte descenso intermedio y un posterior repunte de objetivos profundos, optimizando sustancialmente el coeficiente de Pearson y la validez del ajuste estadístico.