Modelo de Probabilidad Geométrico para la Clasificación Operativa de los Pozos Petrolíferos en Brasil

1 Introducción

El presente estudio aplica un modelo de probabilidad geométrico para caracterizar la clasificación operativa de los pozos petrolíferos en Brasil, con base en datos oficiales de la ANP. A partir de las frecuencias observadas, se estima el parámetro del modelo, se evalúa su bondad de ajuste mediante los tests de Pearson y Chi-Cuadrado, y se calculan probabilidades de ocurrencia para cada tipo de pozo registrado.

2 Carga de datos

Se importa el conjunto de datos de pozos petroleros de Brasil y se verifica su estructura, tipos de variables y codificación.

3 Obtención de la frecuencia

Se extrae la variable de clasificación operativa y se contabiliza la frecuencia absoluta de cada categoría registrada.

TipoPozo  <- Datos$RECLASSIFICACAO
TDFTipoPozo <- as.data.frame(table(TipoPozo ))
TDFTipoPozo
##                                                         TipoPozo  Freq
## 1                                                                 1603
## 2                               ABANDONADO POR ACIDENTE MECÂNICO   794
## 3                                         ABANDONADO POR ERUPÇÃO     4
## 4                    ABANDONADO POR IMPOSSIBILIDADE DE AVALIAÇÃO    14
## 5                       ABANDONADO POR OBJETIVO FORA DE PREVISÃO    43
## 6                      ABANDONADO POR OBJETIVO/ALVO NÃO ATINGIDO    75
## 7                                   ABANDONADO POR OUTRAS RAZÕES   697
## 8                                ABANDONADO POR PERDA CIRCULAÇÃO    19
## 9                                            CONTROLE DE ERUPÇÃO     1
## 10                                              DESCARTE DE ÁGUA     9
## 11                          DESCOBRIDOR DE CAMPO COM GÁS NATURAL    84
## 12             DESCOBRIDOR DE CAMPO COM GÁS NATURAL E CONDENSADO    18
## 13                             DESCOBRIDOR DE CAMPO COM PETRÓLEO   352
## 14               DESCOBRIDOR DE CAMPO COM PETRÓLEO E GÁS NATURAL    48
## 15   DESCOBRIDOR DE CAMPO COM PETRÓLEO, GÁS NATURAL E CONDENSADO     9
## 16                        DESCOBRIDOR DE NOVA JAZIDA GÁS NATURAL    57
## 17           DESCOBRIDOR DE NOVA JAZIDA GÁS NATURAL E CONDENSADO    13
## 18                           DESCOBRIDOR DE NOVA JAZIDA PETRÓLEO   301
## 19             DESCOBRIDOR DE NOVA JAZIDA PETRÓLEO E GÁS NATURAL    46
## 20 DESCOBRIDOR DE NOVA JAZIDA PETRÓLEO, GÁS NATURAL E CONDENSADO     7
## 21                                                  EXPERIMENTAL     6
## 22                                     EXTENSÃO PARA GÁS NATURAL    70
## 23                        EXTENSÃO PARA GÁS NATURAL E CONDENSADO    22
## 24                                        EXTENSÃO PARA PETRÓLEO   630
## 25                          EXTENSÃO PARA PETRÓLEO E GÁS NATURAL    59
## 26              EXTENSÃO PARA PETRÓLEO, GÁS NATURAL E CONDENSADO    29
## 27                                                    INDEFINIDO   358
## 28                                               INJEÇÃO DE ÁGUA  1309
## 29                                     INJEÇÃO DE ÁGUA ADITIVADA     8
## 30                                                INJEÇÃO DE CO2     1
## 31                                        INJEÇÃO DE GÁS NATURAL    29
## 32                              INJEÇÃO DE QUALQUER OUTRO FLUIDO     4
## 33                                              INJEÇÃO DE VAPOR    96
## 34                                                    OBSERVAÇÃO   766
## 35                                            OUTRAS FINALIDADES    89
## 36                                              PESQUISA MINERAL     4
## 37                                       PORTADOR DE GÁS NATURAL   133
## 38                          PORTADOR DE GÁS NATURAL E CONDENSADO    10
## 39                                          PORTADOR DE PETRÓLEO   490
## 40                            PORTADOR DE PETRÓLEO E GÁS NATURAL    71
## 41                PORTADOR DE PETRÓLEO, GÁS NATURAL E CONDENSADO     9
## 42                                              PRODUÇÃO DE ÁGUA    26
## 43                             PRODUTOR COMERCIAL DE GÁS NATURAL   358
## 44                PRODUTOR COMERCIAL DE GÁS NATURAL E CONDENSADO    42
## 45                                PRODUTOR COMERCIAL DE PETRÓLEO 14506
## 46                  PRODUTOR COMERCIAL DE PETRÓLEO E GÁS NATURAL   373
## 47      PRODUTOR COMERCIAL DE PETRÓLEO, GÁS NATURAL E CONDENSADO    89
## 48                          PRODUTOR SUBCOMERCIAL DE GÁS NATURAL   154
## 49             PRODUTOR SUBCOMERCIAL DE GÁS NATURAL E CONDENSADO    29
## 50                             PRODUTOR SUBCOMERCIAL DE PETRÓLEO   744
## 51               PRODUTOR SUBCOMERCIAL DE PETRÓLEO E GÁS NATURAL    49
## 52   PRODUTOR SUBCOMERCIAL DE PETRÓLEO, GÁS NATURAL E CONDENSADO     1
## 53                 SECO COM INDÍCIOS DE GÁS NATURAL E CONDENSADO    10
## 54                                 SECO COM INDÍCIOS DE PETRÓLEO   790
## 55                   SECO COM INDÍCIOS DE PETRÓLEO E GÁS NATURAL   143
## 56                                 SECO COM INDÍCIOS GÁS NATURAL   252
## 57                                             SECO SEM INDÍCIOS  3621
## 58                                                   TREINAMENTO     1

4 Agrupación

library(dplyr)

TDFTipoPozo$Grupo <- case_when(
  TDFTipoPozo$TipoPozo  %in% c(
    "PRODUTOR COMERCIAL DE GÁS NATURAL", "PRODUTOR COMERCIAL DE GÁS NATURAL E CONDENSADO",
    "PRODUTOR COMERCIAL DE PETRÓLEO", "PRODUTOR COMERCIAL DE PETRÓLEO E GÁS NATURAL",
    "PRODUTOR COMERCIAL DE PETRÓLEO, GÁS NATURAL E CONDENSADO",
    "PRODUTOR SUBCOMERCIAL DE GÁS NATURAL", "PRODUTOR SUBCOMERCIAL DE GÁS NATURAL E CONDENSADO",
    "PRODUTOR SUBCOMERCIAL DE PETRÓLEO", "PRODUTOR SUBCOMERCIAL DE PETRÓLEO E GÁS NATURAL",
    "PRODUTOR SUBCOMERCIAL DE PETRÓLEO, GÁS NATURAL E CONDENSADO",
    "DESCOBRIDOR DE CAMPO COM GÁS NATURAL", "DESCOBRIDOR DE CAMPO COM GÁS NATURAL E CONDENSADO",
    "DESCOBRIDOR DE CAMPO COM PETRÓLEO", "DESCOBRIDOR DE CAMPO COM PETRÓLEO E GÁS NATURAL",
    "DESCOBRIDOR DE CAMPO COM PETRÓLEO, GÁS NATURAL E CONDENSADO",
    "DESCOBRIDOR DE NOVA JAZIDA GÁS NATURAL", "DESCOBRIDOR DE NOVA JAZIDA GÁS NATURAL E CONDENSADO",
    "DESCOBRIDOR DE NOVA JAZIDA PETRÓLEO", "DESCOBRIDOR DE NOVA JAZIDA PETRÓLEO E GÁS NATURAL",
    "DESCOBRIDOR DE NOVA JAZIDA PETRÓLEO, GÁS NATURAL E CONDENSADO",
    "EXTENSÃO PARA GÁS NATURAL", "EXTENSÃO PARA GÁS NATURAL E CONDENSADO",
    "EXTENSÃO PARA PETRÓLEO", "EXTENSÃO PARA PETRÓLEO E GÁS NATURAL",
    "EXTENSÃO PARA PETRÓLEO, GÁS NATURAL E CONDENSADO",
    "PORTADOR DE GÁS NATURAL", "PORTADOR DE GÁS NATURAL E CONDENSADO",
    "PORTADOR DE PETRÓLEO", "PORTADOR DE PETRÓLEO E GÁS NATURAL",
    "PORTADOR DE PETRÓLEO, GÁS NATURAL E CONDENSADO"
  ) ~ "Pozos productivos",

  TDFTipoPozo$TipoPozo %in% c(
    "INJEÇÃO DE ÁGUA", "INJEÇÃO DE ÁGUA ADITIVADA", "INJEÇÃO DE CO2",
    "INJEÇÃO DE GÁS NATURAL", "INJEÇÃO DE QUALQUER OUTRO FLUIDO", "INJEÇÃO DE VAPOR"
  ) ~ "Inyección/Soporte",

  TDFTipoPozo$TipoPozo %in% c(
    "SECO COM INDÍCIOS DE GÁS NATURAL E CONDENSADO", "SECO COM INDÍCIOS DE PETRÓLEO",
    "SECO COM INDÍCIOS DE PETRÓLEO E GÁS NATURAL", "SECO COM INDÍCIOS GÁS NATURAL",
    "SECO SEM INDÍCIOS"
  ) ~ "Pozos secos",

  .default = "Pozos abandonados"
)

# Factor ordenado (del más favorable al menos)
niveles_ordinales <- c("Pozos productivos", "Inyección/Soporte",
                       "Pozos secos", "Pozos abandonados")

TDFTipoPozo$Grupo <- factor(TDFTipoPozo$Grupo,
                                   levels = niveles_ordinales, ordered = TRUE)

TDFTipoPozo <- TDFTipoPozo[order(TDFTipoPozo$Grupo), ]

5 Cálculo de frecuencias absolutas y relativas

Se calculan las frecuencias absolutas (ni) y relativas porcentuales (hi) por grupo operacional.

TDFTipoPozo$Freq <- as.numeric(as.character(TDFTipoPozo$Freq))

library(dplyr)

TDFReclasificación1 <- Datos$TDFTipoPozo
TDFReclasificación1 <- TDFTipoPozo %>%
  group_by(Grupo) %>%
  summarise( 
    ni = sum(Freq),

    hi = round(sum(Freq) / sum(TDFTipoPozo$Freq)*100, 5))

TDFReclasificación1 <- data.frame(TDFReclasificación1)

6 Construcción de la tabla de distribución

Se integran las frecuencias en una tabla con totales para verificar la coherencia del conjunto de datos.

TDFReclasificación1$fi <- TDFReclasificación1$ni / sum(TDFReclasificación1$ni)

TDFReclasificación1 <- TDFReclasificación1 [, c("Grupo", "ni", "hi", "fi")]

total_ni <- sum(TDFReclasificación1$ni) 
total_hi <- sum(TDFReclasificación1$hi)
total_fi <- sum(TDFReclasificación1$fi)


TDFReclasificación1.1 <- rbind(TDFReclasificación1, data.frame( Grupo = "Total",
                                                          ni = total_ni,
                                                          hi = total_hi,
                                                          fi = total_fi))
print(TDFReclasificación1.1)
##               Grupo    ni        hi         fi
## 1 Pozos productivos 18803  63.57735 0.63577346
## 2 Inyección/Soporte  1447   4.89265 0.04892646
## 3       Pozos secos  4816  16.28402 0.16284024
## 4 Pozos abandonados  4509  15.24598 0.15245985
## 5             Total 29575 100.00000 1.00000000

7 Presentación del cuadro estadístico

La tabla se formatea con gt para su presentación en el informe final.

library(gt)
gt(TDFReclasificación1.1) %>%
  tab_header( 
    title = md("**Tabla N°1: DISTRIBUCIÓN DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL**"), 
    subtitle = "Frecuencias observadas para la estimación del modelo geométrico") %>%  
    tab_spanner(
    label   = md("**Frecuencia Relativa**"),
    columns = c(hi, fi)
  ) %>%
    cols_label(
    ni = md("**ni**"),
    hi = md("Porcentual (%)"),
    fi = md("Fracción")
  ) %>%
  fmt_number(columns = hi, decimals = 2) %>%
  fmt_number(columns = fi, decimals = 4) %>%
  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_style(
    style     = list(cell_fill(color = "#2E4053"),
                     cell_text(color = "white", weight = "bold")),
    locations = cells_column_spanners()
  ) %>%
  tab_style(
    style     = list(cell_fill(color = "#D5D8DC"),
                     cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_body(rows = nrow(TDFReclasificación1.1))
  ) %>%
  tab_options(
    table.border.top.color          = "#2E4053",
    table.border.bottom.color       = "#2E4053",
    column_labels.border.bottom.color = "#2E4053",
    data_row.padding                = px(6),
    table.font.size                 = px(13)
  )
Tabla N°1: DISTRIBUCIÓN DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL
Frecuencias observadas para la estimación del modelo geométrico
Grupo ni
Frecuencia Relativa
Porcentual (%) Fracción
Pozos productivos 18803 63.58 0.6358
Inyección/Soporte 1447 4.89 0.0489
Pozos secos 4816 16.28 0.1628
Pozos abandonados 4509 15.25 0.1525
Total 29575 100.00 1.0000

8 Gráficas

8.1 Histograma de frecuencia absoluta local

Muestran la cantidad de pozos por grupo con escala ajustada.

TDFReclasificación2 <- TDFReclasificación1.1[TDFReclasificación1.1$Grupo != "Total", ]
par(mar = c(9, 4, 4, 2))
bp <- barplot(TDFReclasificación2$ni,
        main = "Gráfica N°1: Frecuencia Observada por Tipo de Pozo",
        ylab = "Cantidad",
        col = "#2E4053", 
        xaxt = "n", 
        cex.axis = 0.8, cex.main = 0.9)

     text(x = bp, y = -3, 
     labels = TDFReclasificación2$Grupo,
     srt = 45, adj = 1.2, xpd = TRUE, cex = 0.8)
        mtext("Reclasificación", side = 1, line = 6, adj = 0.8)

9 Conjetura de Modelo Geométrico

Se estima un modelo geométrico para representar el comportamiento probabilístico de la clasificación operativa de los pozos.

TDFTipoPozo2 <- TDFReclasificación1  

TDFTipoPozo2$ni <- as.numeric(TDFTipoPozo2$ni)
TDFTipoPozo2$hi <- as.numeric(TDFTipoPozo2$hi)

TDFTipoPozo2 <- TDFTipoPozo2 %>%
  arrange(desc(ni))
TDFTipoPozo2$ID <- 1:nrow(TDFTipoPozo2)

# Estimación del parámetro p por método de momentos
media_observada <- sum(TDFTipoPozo2$ID * TDFTipoPozo2$ni) / sum(TDFTipoPozo2$ni)
p_estimado <- 1 / media_observada

# Probabilidades del modelo geométrico
prob_geom <- p_estimado * (1 - p_estimado)^(TDFTipoPozo2$ID - 1)
prob_geom <- prob_geom / sum(prob_geom)
TDFTipoPozo2$hi_modelo <- prob_geom * 100

# Gráfico comparativo
library(tidyr)
library(ggplot2)

df_comp <- pivot_longer(TDFTipoPozo2, cols = c("hi", "hi_modelo"),
                        names_to = "Origen", values_to = "Valor")
df_comp$Origen <- ifelse(df_comp$Origen == "hi", "Realidad", "Modelo")

ggplot(df_comp, aes(x = Grupo, y = Valor, fill = Origen)) +
  geom_bar(stat = "identity", position = "dodge", color = "black") +
  scale_fill_manual(values = c("Modelo" = "skyblue", "Realidad" = "#2E4053")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(
    title    = "Gráfica N°2: Modelo de Probabilidad Geométrico - Tipo de Pozo",
    subtitle = paste("p estimado =", round(p_estimado, 4)),
    x = "Tipo de Pozo", y = "Probabilidad (%)", fill = "Origen"
  )

9.1 Test de Pearson

Se evalúa la correlación entre las frecuencias observadas y las estimadas por el modelo geométrico.

Fo <- TDFTipoPozo2$hi
Fe <- TDFTipoPozo2$hi_modelo

plot(Fo, Fe,
     main = "Gráfica N°3: Correlación Observado vs Esperado\nTipo de Pozo Petrolífero",
     cex.main = 0.78,
     xlab = "Frecuencia Observada (hi)",
     ylab = "Frecuencia Esperada (hi modelo)",
     pch = 19, col = "#2E4053")
abline(lm(Fe ~ 0 + Fo), col = "red", lwd = 2)

Correlacion_Geo <- cor(Fo, Fe) * 100
cat("Correlación de Pearson:", round(Correlacion_Geo, 2), "%\n")
## Correlación de Pearson: 97.68 %

9.2 Test Chi-Cuadrado

Se verifica la bondad de ajuste del modelo mediante la comparación entre valores observados y esperados.

x2 <- sum(((Fo - Fe)^2) / Fe)
gl <- length(Fo) - 2
vc <- qchisq(0.99, gl)
cat("Chi-Cuadrado:", round(x2, 4), "\n")
## Chi-Cuadrado: 7.1242
cat("Valor Crítico:", round(vc, 4), "\n")
## Valor Crítico: 9.2103
cat("¿Modelo aceptado?:", x2 < vc, "\n")
## ¿Modelo aceptado?: TRUE

9.3 Tabla Resumen del Test

Se presentan los indicadores estadísticos utilizados para validar el ajuste del modelo geométrico.

tabla_resumen_S <- data.frame(
  Variable  = "Tipo de Pozo (Reclasificación)",
  Pearson   = round(Correlacion_Geo, 2),
  Chi2      = round(x2, 2),
  Umbral    = round(vc, 2),
  Resultado = x2 < vc
)

tabla_resumen_S %>%
  gt() %>%
  cols_label(
    Variable  = "Variable",
    Pearson   = "Test Pearson (%)",
    Chi2      = "Chi Cuadrado",
    Umbral    = "Umbral de Aceptación",
    Resultado = "Resultado"
  ) %>%
  tab_header(
    title = md("**Tabla N°2: Bondad de Ajuste del Modelo Geométrico**")
  ) %>%
  tab_source_note(source_note = "Autor: Anahi Macias") %>%
  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: Bondad de Ajuste del Modelo Geométrico
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Tipo de Pozo (Reclasificación) 97.68 7.12 9.21 TRUE
Autor: Anahi Macias

10 Cálculo de Probabilidades

Se determinan probabilidades asociadas a la ocurrencia de cada tipo de pozo petrolero.

¿Cuál es la probabilidad de que un pozo seleccionado al azar sea productivo? ¿Y de que sea abandonado?

prob_tabla <- TDFReclasificación1
prob_tabla$P <- prob_tabla$ni / sum(prob_tabla$ni)

print(prob_tabla[, c("Grupo", "ni", "P")])
##               Grupo    ni          P
## 1 Pozos productivos 18803 0.63577346
## 2 Inyección/Soporte  1447 0.04892646
## 3       Pozos secos  4816 0.16284024
## 4 Pozos abandonados  4509 0.15245985
P_productivo <- prob_tabla$P[prob_tabla$Grupo == "Pozos productivos"]
cat("P(pozo productivo) =", round(P_productivo, 4), "\n")
## P(pozo productivo) = 0.6358
P_abandonado <- prob_tabla$P[prob_tabla$Grupo == "Pozos abandonados"]
cat("P(pozo abandonado) =", round(P_abandonado, 4), "\n")
## P(pozo abandonado) = 0.1525
cat("P(no productivo)   =", round(1 - P_productivo, 4), "\n")
## P(no productivo)   = 0.3642

Los resultados muestran que la mayor probabilidad corresponde a los pozos productivos, lo que evidencia un predominio de operaciones económicamente activas dentro del conjunto analizado. En contraste, la probabilidad de encontrar pozos abandonados es considerablemente menor, indicando una menor presencia de instalaciones fuera de operación permanente.

¿Cuántos pozos productivos se esperan en una muestra de 200 pozos?

n <- 200
p <- prob_tabla$P[prob_tabla$Grupo == "Pozos productivos"]

E_x  <- n * p
SD_x <- sqrt(n * p * (1 - p))

cat("Esperanza E(X) =", round(E_x, 2), "pozos productivos\n")
## Esperanza E(X) = 127.15 pozos productivos
cat("Desv. estándar =", round(SD_x, 2), "\n")
## Desv. estándar = 6.81

Con base en la probabilidad estimada, se espera que aproximadamente 127 pozos de una muestra de 200 sean productivos. Este resultado refleja una alta proporción de pozos operativos y confirma la tendencia observada en la distribución original de los datos.