1 Introducción y Metodología

El presente informe estadístico analiza la variable Mesa Rotativa (en metros) de pozos petroleros de Brasil, aplicando técnicas descriptivas e inferenciales avanzadas de bondad de ajuste.

2 Tabla de Distribución de Frecuencia

Dado que los valores de la mesa rotativa representan la altura estructural de la plataforma y se concentran principalmente en magnitudes bajas, agrupamos los datos en intervalos de 50 metros para visualizar de manera óptima la tendencia y facilitar el cálculo de probabilidades en los modelos continuos.

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"
)

Datos <- Datos_Brutos %>%
  clean_names() %>% 
  mutate(mesa_rotativa = abs(as.numeric(as.character(mesa_rotativa)))) %>%
  filter(!is.na(mesa_rotativa) & mesa_rotativa > 0 & mesa_rotativa <= 500)

X <- Datos$mesa_rotativa

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

TDF_General <- data.frame(
  Rango = paste(head(breaks_mesa, -1), tail(breaks_mesa, -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: **Mesa Rotativa (m)**")
  ) %>%
  tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
  cols_label(
    Rango = "Mesa Rotativa (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: Mesa Rotativa (m)
Mesa Rotativa (m) Frecuencia Absoluta (ni) Frecuencia Relativa (hi%)
0-50 18063 62.95
50-100 6183 21.55
100-150 3000 10.45
150-200 902 3.14
200-250 361 1.26
250-300 60 0.21
300-350 39 0.14
350-400 56 0.20
400-450 18 0.06
450-500 14 0.05
TOTAL 28696 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 Mesa Rotativa de Pozos Petroleros de 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.9)
title(xlab = "Intervalos de Mesa Rotativa (m)", line = 4)
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 variable Mesa Rotativa posee una distribución concentrada en magnitudes bajas debido a la estandarización operacional:

  • Fase Base o Convencional (0–50 m): Reúne la mayor concentración de pozos con alturas de mesa de rotación mínimas y estándar sobre el nivel base.

  • Fase de Estructuras Elevadas (50–500 m): Una distribución asimétrica continua que decae rápidamente hacia la derecha, representando taladros con requerimientos de elevación estructural superior.

Por lo tanto, segmentamos fijando el umbral de transición en los 50 metros para aislar las estructuras convencionales y analizar de manera óptima el comportamiento inferencial.

4 Agrupación 1 (0–50 m)

En este bloque analizamos si los valores de mesa rotativa menores o iguales a 50 metros siguen un comportamiento ajustado a la Distribución Gamma, la cual permite modelar variables con un crecimiento inicial antes de iniciar su decaimiento asimétrico.

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

if(length(X1) > 0) {

hist(
    X1,
    breaks = seq(0, 50, by = 10),
    col    = col_barras,
    border = "white",
    main   = "Histograma Sección 1 (0–50 m)",
    xlab   = "Mesa Rotativa (m)",
    ylab   = "Frecuencia"
  )
  
} else {
  print("¡Cuidado! No hay datos en el rango de 0 a 50 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 tasa (rate) de la distribución Gamma. Esto nos permitirá generar una curva teórica que reconozca el pico intermedio observado en los datos reales de la mesa rotativa.

if(length(X1) > 1) {
  fit_gamma1 <- suppressWarnings(fitdistr(X1, "gamma"))
  shape_g1   <- fit_gamma1$estimate["shape"]
  rate_g1    <- fit_gamma1$estimate["rate"]
  
  h1  <- hist(X1, breaks = seq(0, 50, by = 10), plot = FALSE)
  Fo1 <- h1$counts / sum(h1$counts)
  Fe1 <- diff(pgamma(seq(0, 50, by = 10), shape = shape_g1, rate = rate_g1))
  Fe1 <- Fe1 / sum(Fe1)
  
  barplot(
    rbind(Fo1, Fe1),
    beside    = TRUE,
    col       = c(col_barras, "#F2F3F4"),
    border    = "black",
    names.arg = paste0(head(seq(0, 50, by = 10), -1), "-", tail(seq(0, 50, by = 10), -1)),
    main      = "Gráfica N°2: Modelo de Probabilidad Gamma (0–50 m)",
    cex.main  = 0.85,
    ylab      = "Probabilidad",
    xlab      = "Rangos (m)"
  )
  legend("topright", legend = c("Real", "Modelo Gamma"),
          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 midiendo la correlación lineal entre las frecuencias empíricas observadas y las frecuencias esperadas teóricamente por la distribución Gamma.

plot(
  Fo1, Fe1,
  main = "Gráfica N°3: Correlación de Pearson — Sección 1 (Gamma)",
  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] 84.81735

4.3 Test de Chi-Cuadrado

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

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

4.4 Tabla Resumen de Test

tabla_1 <- data.frame(
  Modelo       = "Gamma",
  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 (Gamma)**")) %>%
  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 (Gamma)
Modelo Pearson Chi_Cuadrado Umbral Decision
Gamma 84.82 0.0889 9.4877 Modelo aceptado
Autor: Leonardo Ruiz

4.5 Cálculo de Probabilidades

¿Cuál fue la probabilidad calculada de que un pozo tenga una altura de mesa rotativa menor a 25 metros en este primer tramo usando el modelo Gamma?

p_25 <- pgamma(25, shape = shape_g1, rate = rate_g1)
p_25
## [1] 0.6460511

La probabilidad es del 64.61%.

5 Agrupación 2 (50–500 m)

Analizamos la segunda etapa probando un ajuste a la Distribución Log-Normal para evaluar el comportamiento de los taladros con mayor elevación base.

X2 <- X[X > 50 & X <= 500]
X2 <- X2[!is.na(X2)]

breaks_seccion2 <- seq(50, 500, by = 50)

hist(
  X2,
  breaks = breaks_seccion2,
  col    = col_barras,
  border = "white",
  main   = "Histograma Sección 2 (50–500 m)",
  xlab   = "Mesa Rotativa (m)",
  ylab   = "Frecuencia"
)

5.1 Conjetura del Modelo (Log-Normal)

Estimamos los parámetros (meanlog, sdlog) mediante máxima verosimilitud para el tramo elevado de la variable.

fit_ln <- fitdistr(X2, "lognormal")
m_log  <- fit_ln$estimate["meanlog"]
s_log  <- fit_ln$estimate["sdlog"]

h2  <- hist(X2, breaks = breaks_seccion2, plot = FALSE)
Fo2 <- h2$counts / sum(h2$counts)
Fe2 <- diff(plnorm(breaks_seccion2, meanlog = m_log, sdlog = s_log))
Fe2 <- Fe2 / sum(Fe2) 

etiquetas_mesa <- 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_mesa,
  main      = "Gráfica N°5: Modelo Log-Normal de Mesa Rotativa (50–500 m)",
  cex.main  = 0.85,
  ylab      = "Probabilidad",
  las       = 2,
  cex.names = 0.7
)
legend("topright", legend = c("Real", "Modelo Log-Normal"),
       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 Log-Normal.

plot(
  Fo2, Fe2,
  main = "Gráfica N°6: Correlación de Pearson — Sección 2 (Log-Normal)",
  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] 98.77886

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.1079384
vc2  <- qchisq(0.95, length(Fo2) - 1)
vc2
## [1] 15.50731

5.4 Tabla Resumen de Test

tabla_2 <- data.frame(
  Modelo       = "Log-Normal",
  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**")) %>%
  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
Modelo Pearson Chi_Cuadrado Umbral Decision
Log-Normal 98.78 0.1079 15.5073 Modelo aceptado
Autor: Leonardo Ruiz

5.5 Cálculo de Probabilidades

De cada 1,000 pozos analizados en este tramo de elevación estructural superior (50–500 m), ¿cuántos se estimó matemáticamente que se encuentran en el intervalo crítico superior de 150 a 300 metros?

p_critica <- plnorm(300, meanlog = m_log, sdlog = s_log) - plnorm(150, meanlog = m_log, sdlog = s_log)
p_critica
## [1] 0.1332902
cantidad_estimada <- round(p_critica * 1000, 0)

El modelo Log-Normal estimó que, por cada 1,000 pozos de este periodo, aproximadamente 133 pertenecieron al intervalo de altura estructural de 150 a 300 metros.

6 Conclusiones

El análisis segmentado e inferencial de la variable Mesa Rotativa nos permite concluir lo siguiente:

  • Tramo 0–50 m: La marcada concentración inicial de pozos en alturas base bajas genera un decrecimiento drástico e inmediato de las frecuencias absolutas. Este comportamiento se modeló de manera óptima bajo la distribución Exponencial, demostrando que la probabilidad disminuye de forma constante a medida que se incrementa la altura de la mesa en los diseños convencionales estándar.

  • Tramo 50–500 m: Para describir la transición hacia las estructuras de taladros con requerimientos de elevación estructural superiores, el modelo Log-Normal resultó ser el idóneo. Al asimilar el sesgo positivo natural de los datos en este rango de control, el modelo representó fielmente la distribución física real de las alturas operativas de la mesa rotativa, superando las validaciones de las pruebas estadísticas de Chi-Cuadrado y el coeficiente de Pearson.