Análisis de las Condiciones Operativas de los Pozos Petrolíferos en Brasil

1 Introducción

El presente análisis estudia la distribución de los estados operativos de los pozos petrolíferos en Brasil. A partir de los datos disponibles, se clasifican los pozos en categorías generales con el fin de analizar su frecuencia y representación porcentual. Posteriormente se utilizan tablas y gráficos para visualizar la estructura de la actividad petrolera según la condición operativa de cada pozo.

2 Carga e inspección de los datos

Importación del conjunto de datos y verificación de su estructura.

3 Obtención de la frecuencia de estados operativos

Obtención de la frecuencia de los estados operativos registrados.

Status <- Datos$SITUACAO
TDFSituación <- as.data.frame(table(Status))
TDFSituación
##                                                                                 Status
## 1                                                                                     
## 2                                ABANDONADO AGUARDANDO ABANDONO DEFINITIVO/ARRASAMENTO
## 3                                         ABANDONADO AGUARDANDO REINÍCIO DE PERFURAÇÃO
## 4                                                           ABANDONADO DEFINITIVAMENTE
## 5                                                ABANDONADO POR LOGÍSTICA EXPLORATÓRIA
## 6  ABANDONADO/PARADO AGUARDANDO INTERVENÇÃO PARA AVALIAÇÃO, COMPLETAÇÃO OU RESTAURAÇÃO
## 7                                                                             ARRASADO
## 8                                                         CEDIDO PARA PRODUÇÃO DE ÁGUA
## 9                                                                          DE DESCARTE
## 10                                                                           DEVOLVIDO
## 11                                                                         EM ABANDONO
## 12                           EM INTERVENÇÃO PARA AVALIAÇÃO, COMPLETAÇÃO OU RESTAURAÇÃO
## 13                                                                       EM PERFURAÇÃO
## 14                                               EQUIPADO AGUARDANDO INÍCIO DE INJEÇÃO
## 15                                              EQUIPADO AGUARDANDO INÍCIO DE PRODUÇÃO
## 16                                                                             INJETOR
## 17                                                                               OUTRO
## 18                                                       PRODUÇÃO DE AGUA PARA INJEÇÃO
## 19                                                                            PRODUTOR
##    Freq
## 1   824
## 2  3120
## 3     2
## 4  5074
## 5   719
## 6   253
## 7  2193
## 8   262
## 9    40
## 10 1446
## 11    8
## 12 2711
## 13    6
## 14    9
## 15   60
## 16 2653
## 17   96
## 18  187
## 19 9912
View(TDFSituación)

4 Estandarización y traducción de categorías

Traducción y estandarización de las categorías originales.

library(dplyr)
TDFSituación$Status[TDFSituación$Status == ""] <- "Sin registro"

TDFSituación$Status <- recode(TDFSituación$Status, 
"ABANDONADO AGUARDANDO ABANDONO DEFINITIVO/ARRASAMENTO" = "En proceso de cierre definitivo",
"ABANDONADO AGUARDANDO REINÍCIO DE PERFURAÇÃO" = "En espera de reinicio de perforación",
"ABANDONADO DEFINITIVAMENTE" = "Abandonado definitivamente", 
"ABANDONADO POR LOGÍSTICA EXPLORATÓRIA" = "Abandonado por logística",
"ABANDONADO/PARADO AGUARDANDO INTERVENÇÃO PARA AVALIAÇÃO, COMPLETAÇÃO OU RESTAURAÇÃO" = "Suspendido en espera de intervención",
"ARRASADO" = "Desmantelado",
"CEDIDO PARA PRODUÇÃO DE ÁGUA" = "Cedido para producción de agua",
"DE DESCARTE" = "Descartado",
"DEVOLVIDO" = "Devuelto",
"EM ABANDONO" = "En proceso de abandono", 
"EM INTERVENÇÃO PARA AVALIAÇÃO, COMPLETAÇÃO OU RESTAURAÇÃO" = "En intervención activa", 
"EM PERFURAÇÃO" = "En perforación", 
"EQUIPADO AGUARDANDO INÍCIO DE INJEÇÃO" = "Equipado esperando inyección", 
"EQUIPADO AGUARDANDO INÍCIO DE PRODUÇÃO" = "Equipado esperando producción", 
"INJETOR" = "Pozo inyector", 
"PRODUÇÃO DE AGUA PARA INJEÇÃO" = "Producción de agua para inyección",
"PRODUTOR" = "Pozo productor") 

4.1 Clasificación en condiciones operativas generales

En este bloque se recodifican los valores originales en grupos operativos más generales.

library(dplyr)

TDFSituación <- TDFSituación %>%
  mutate(Condición = case_when(
    Status %in% c("En perforación", "Equipado esperando producción", "Equipado esperando inyección", "Pozo productor", "Pozo inyector", "Producción de agua para inyección") ~ "Activos y en Desarrollo",
    
    Status %in% c("En intervención activa", "Suspendido en espera de intervención", "En espera de reinicio de perforación", "Cedido para producción de agua", "Devuelto") ~ "Suspendidos o Inactivos",
    
    Status %in% c("En proceso de abandono", "En proceso de cierre definitivo", "Abandonado por logística") ~ "En Proceso de Abandono",
    
    Status %in% c("Abandonado definitivamente", "Desmantelado", "Descartado") ~ "Clausura Definitiva", TRUE ~ "Sin registro"
  ))

head(TDFSituación$Status)
## [1] <NA>                                 En proceso de cierre definitivo     
## [3] En espera de reinicio de perforación Abandonado definitivamente          
## [5] Abandonado por logística             Suspendido en espera de intervención
## 19 Levels:  ... Pozo productor
TDFSituación$Condición <- factor(TDFSituación$Condición, 
                                 levels = c("Activos y en Desarrollo", 
                                            "Suspendidos o Inactivos", 
                                            "En Proceso de Abandono", 
                                            "Clausura Definitiva", 
                                            "Sin registro"), 
                                 ordered = TRUE)

5 Tabla de Distribución de Frecuencias

Se calculan las frecuencias absolutas (ni) y relativas (hi) para cada condición operativa de los pozos petrolíferos.

TDFSituación$Freq <- as.numeric(as.character(TDFSituación$Freq))
library(dplyr)
TDFSituación1 <- Datos$TDFSituación
TDFSituación1 <- TDFSituación %>%
  group_by(Condición) %>%
  summarise( 
    ni = sum(Freq),
    hi = round(sum(Freq) / sum(TDFSituación$Freq)*100, 2))

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

5.1 Construcción de la tabla de distribución

Se agrega la fila acumulada y se forma la tabla final.

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

TDFSituación1 <- TDFSituación1 [, c("Condición", "ni", "hi", "fi")]

total_ni <- sum(TDFSituación1$ni) 
total_hi <- sum(TDFSituación1$hi)
total_fi <- sum(TDFSituación1$fi)
TDFSituacióncompleta <- rbind(TDFSituación1, data.frame( Condición = "Total",
                                                          ni = total_ni,
                                                          hi = total_hi,
                                                          fi = total_fi))
print(TDFSituacióncompleta)
##                 Condición    ni     hi         fi
## 1 Activos y en Desarrollo 12827  43.37 0.43371090
## 2 Suspendidos o Inactivos  4674  15.80 0.15803888
## 3  En Proceso de Abandono  3847  13.01 0.13007608
## 4     Clausura Definitiva  7307  24.71 0.24706678
## 5            Sin registro   920   3.11 0.03110735
## 6                   Total 29575 100.00 1.00000000

5.2 Presentación del cuadro estadístico

Se genera un cuadro formal utilizando gt.

library(gt)
gt(TDFSituacióncompleta) %>%
  tab_header( 
    title = md("**Cuadro No.1**"), 
    subtitle = "Situación de los pozos petrolíferos 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(TDFSituacióncompleta))
  ) %>%
  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)
  )
Cuadro No.1
Situación de los pozos petrolíferos en Brasil
Condición ni
Frecuencia Relativa
Porcentual (%) Fracción
Activos y en Desarrollo 12827 43.37 0.4337
Suspendidos o Inactivos 4674 15.80 0.1580
En Proceso de Abandono 3847 13.01 0.1301
Clausura Definitiva 7307 24.71 0.2471
Sin registro 920 3.11 0.0311
Total 29575 100.00 1.0000

6 Diagrama de Barras

Este gráfico muestra la cantidad de pozos por categoría, sin incluir el total.

TDFSituaciónfinal <- TDFSituacióncompleta[TDFSituacióncompleta$Condición != "Total", ]
par(mar = c(9, 4, 4, 2))
bp <- barplot(TDFSituaciónfinal$hi,
        main = "Gráfica N°1: Distribución Porcentual de la Clasificación General",
        ylab = "Porcentaje",
        col = "#2E4053", 
        xaxt = "n", 
        cex.axis = 0.8, cex.main = 0.9)

text(x = bp, y = -1500, 
     labels = TDFSituaciónfinal$Condición,
     srt = 45, adj = 1, xpd = TRUE, cex = 0.8)
mtext("Condición", side = 1, line = 6, cex = 1)

7 Conjetura de Modelo Geométrico

Se propone un modelo geométrico ordenando las condiciones por frecuencia descendente.

library(tidyr)
library(ggplot2)
library(dplyr)

TDFSituaciónfinal <- TDFSituacióncompleta[TDFSituacióncompleta$Condición != "Total", ]
TDFSituaciónfinal$ni <- as.numeric(TDFSituaciónfinal$ni)
TDFSituaciónfinal$hi <- as.numeric(TDFSituaciónfinal$hi)

TDFSituaciónfinal <- TDFSituaciónfinal %>%
  arrange(desc(ni))
TDFSituaciónfinal$ID <- 1:nrow(TDFSituaciónfinal)

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

# Probabilidades del modelo geométrico
prob_geom <- p_estimado * (1 - p_estimado)^(TDFSituaciónfinal$ID - 1)

prob_geom <- prob_geom / sum(prob_geom)
TDFSituaciónfinal$hi_modelo <- prob_geom * 100

# Gráfico comparativo observado vs modelo
df_comparativo <- pivot_longer(
  TDFSituaciónfinal,
  cols = c("hi", "hi_modelo"),
  names_to = "Origen",
  values_to = "Valor"
)
df_comparativo$Origen <- ifelse(df_comparativo$Origen == "hi", "Realidad", "Modelo")

ggplot(df_comparativo, aes(x = Condición, 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 de la Situación de Pozos",
    subtitle = paste("p estimado =", round(p_estimado, 4)),
    x     = "Condición Operativa",
    y     = "Probabilidad (%)",
    fill  = "Origen"
  )

7.1 Test de Pearson

Se calcula la correlación de Pearson entre las frecuencias observadas y las estimadas.

Fo_Geo <- TDFSituaciónfinal$hi
Fe_Geo <- TDFSituaciónfinal$hi_modelo

plot(Fo_Geo, Fe_Geo,
     main = "Gráfica N°3: Correlación del Modelo Observado y Esperado\nde la Situación Operativa de los Pozos Petrolíferos",
     cex.main = 0.78,
     xlab = "Frecuencia Observada (hi)",
     ylab = "Frecuencia Esperada (hi modelo)",
     pch = 19, col = "#2E4053")
abline(lm(Fe_Geo ~ 0 + Fo_Geo), col = "red", lwd = 2)

Correlacion_Geo_S <- cor(Fo_Geo, Fe_Geo) * 100
Correlacion_Geo_S
## [1] 98.49423

7.2 Test Chi-Cuadrado

Se normaliza a N=100 con frecuencias relativas para evitar hipersensibilidad por el gran tamaño muestral.

Fo_Norm <- TDFSituaciónfinal$hi
Fe_Norm <- TDFSituaciónfinal$hi_modelo

x2_Norm_S  <- sum(((Fo_Norm - Fe_Norm)^2) / Fe_Norm)
gl_Norm_S  <- length(Fo_Norm) - 2
vc_Norm_S  <- qchisq(0.95, gl_Norm_S)

cat("Chi-Cuadrado Normalizado:", round(x2_Norm_S, 4), "\n")
## Chi-Cuadrado Normalizado: 6.6299
cat("Valor Crítico:", round(vc_Norm_S, 4), "\n")
## Valor Crítico: 7.8147
cat("¿El modelo geométrico es aceptado?:", x2_Norm_S < vc_Norm_S, "\n")
## ¿El modelo geométrico es aceptado?: TRUE

7.3 Tabla Resumen del Test

tabla_resumen_S <- data.frame(
  Variable  = "Situación Operativa",
  Pearson   = round(Correlacion_Geo_S, 2),
  Chi2      = round(x2_Norm_S, 2),
  Umbral    = round(vc_Norm_S, 2),
  Resultado = x2_Norm_S < vc_Norm_S
)

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°X: Resumen del Test de Bondad al Modelo de Probabilidad**")
  ) %>%
  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°X: Resumen del Test de Bondad al Modelo de Probabilidad
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Situación Operativa 98.49 6.63 7.81 TRUE
Autor: Anahi Macias

8 Cálculo de Probabilidades

¿Cuál es la probabilidad de que un pozo seleccionado al azar se encuentre en condición “Activos y en Desarrollo”?

prob_activos <- TDFSituaciónfinal$hi[TDFSituaciónfinal$Condición == "Activos y en Desarrollo"]
prob_activos
## [1] 43.37

La probabilidad estimada indica que aproximadamente 43.37% de los pozos se encuentran en condición Activos y en Desarrollo, siendo la categoría operativa más frecuente.

¿Cuántos pozos se encuentran en proceso de abandono o clausura definitiva?

pozos_abandono <- sum(TDFSituaciónfinal$ni[
  TDFSituaciónfinal$Condición %in% c("En Proceso de Abandono", "Clausura Definitiva")
])
pozos_abandono
## [1] 11154

En la base de datos analizada, aproximadamente 11154 pozos se encuentran entre las condiciones de abandono progresivo y clausura definitiva, lo que representa una porción relevante del inventario total.

9 Conclusión

La mayoría de los pozos se concentra en “Activos y en Desarrollo” (≈43.37%), lo que refleja una actividad petrolera significativa. No obstante, existe un número importante de pozos en abandono o clausura, evidenciando el avance del ciclo productivo.