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

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.

1 Librerias

La adecuación del entorno de trabajo es el primer paso metodológico. Se requiere la activación de dplyr para la manipulación y recodificación eficiente de los datos, así como gt para la estructuración y presentación formal de las tablas resultantes.

library(dplyr)
library(gt)

2 Carga de datos

Se procede a la lectura e importación de la base de datos matriz. Este paso asegura que los registros originales conserven su estructura y codificación especial, permitiendo un análisis preciso de la información operativa antes de la modelación inferencial.

3 Extrae la variable

Para focalizar el análisis, se aísla específicamente la variable RECLASSIFICACAO. Esta extracción permite contabilizar la frecuencia absoluta inicial de cada categoría registrada antes de someterla a procesos de síntesis y ajuste probabilístico.

subclasif_pozo  <- Datos$RECLASSIFICACAO
TDFTipoPozo <- as.data.frame(table(subclasif_pozo ))
TDFTipoPozo

4 Conteo

Dada la gran cantidad de subcategorías originales, se ejecuta una recodificación para consolidarlas en cuatro grupos operacionales mutuamente excluyentes. Posteriormente, se transforman en una variable de tipo factor ordenado (jerarquizando desde el estado más productivo al de abandono) para estructurar el análisis cualitativo y prepararlo para la parametrización geométrica.

library(dplyr)

TDFTipoPozo$Grupo <- case_when(
  TDFTipoPozo$subclasif_pozo  %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$subclasif_pozo %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$subclasif_pozo %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 Tabla de frecuencia

Las frecuencias absolutas y relativas se compilan en una tabla de distribución empírica. La integración de los totales (\(n_i\), \(h_i\), \(f_i\)) establece la línea base sobre la cual se contrastarán las frecuencias teóricas arrojadas por el modelo estocástico.

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)

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
gt(TDFReclasificación1.1) %>%
  tab_header( 
    title = md("**Tabla N°1: DISTRIBUCIÓN DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL**"), 
    subtitle = "Reclasificación de pozos petroleros en Brasil") %>%  
    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
Reclasificación de pozos petroleros en Brasil
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

6 Gráficas

En esta sección se despliega el análisis visual descriptivo contrastado contra la parametrización teórica inferencial.

6.1 Diagrama de Barras

Este gráfico muestra la cantidad observada de pozos pertenecientes a cada grupo, evidenciando empíricamente la asimetría de la distribución operativa.

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: Distribución de pozos por reclasificación",
        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)

6.2 Conjetura de Modelo Geométrico

Se estima el parámetro de éxito (\(p\)) mediante el método de los momentos y se proyectan las probabilidades de un modelo geométrico (\(X \sim Geo(p)\)) para comparar visualmente el comportamiento empírico (Realidad) versus la distribución probabilística esperada (Modelo).

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

7 Indicadores Estadísticos: Test de Bondad de Ajuste

Para dotar de validez científica a la conjetura estocástica, se aplican pruebas de hipótesis formales que cuantifican la discrepancia entre las frecuencias observadas (\(F_o\)) y las frecuencias esperadas teóricas (\(F_e\)).

7.1 Test de Pearson

Se diagrama la dispersión y se evalúa el coeficiente de correlación lineal \(r\) para determinar la fuerza de la asociación entre las probabilidades de la muestra real y el modelo propuesto.

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 %

7.2 Test Chi-Cuadrado

Se ejecuta la prueba no paramétrica Chi-Cuadrado para evaluar estadísticamente el nivel de ajuste. Si el estadístico de prueba calculado (\(\chi^2\)) es menor que el valor crítico de la distribución de rechazo, no existe evidencia suficiente para rechazar el modelo planteado.

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

7.3 Tabla Resumen del Test

Síntesis de los estadísticos inferenciales aplicados para validar la eficacia del ajuste del modelo geométrico a los datos de la ANP. .

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

8 Cálculo de Probabilidades

Una vez caracterizada la variable, se determinan probabilidades específicas y esperanzas matemáticas asociadas a la ocurrencia de eventos en la muestra.

¿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

Modelando la extracción como un proceso binomial bajo las probabilidades previas, se espera matemáticamente hallar \(127\) pozos productivos en una muestra de 200. Este valor esperado \(\mathbb{E}(X)\) confirma numéricamente el sesgo productivo del sector extractivo en el universo de datos provisto.