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

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.

1 Librerias

La preparación del entorno analítico y la correcta ejecución del modelo requieren la habilitación de paquetes especializados en R. Se emplea dplyr para la limpieza, manipulación y recodificación eficiente de las bases de datos; tidyr para la reestructuración de los datos que permite el contraste de variables; ggplot2 para la construcción avanzada de las gráficas probabilísticas comparativas; y finalmente gt, que garantiza que la presentación de las matrices y tablas estadísticas cumpla con los más altos estándares de formato académico.

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

2 Cargar Datos

El proceso inicia con la lectura de la base de datos matriz. Esta etapa garantiza la correcta importación de los registros originales, preservando la codificación y estructura necesarias para el posterior modelado del estado operativo de los pozos.

3 Extrae la variable

Para enfocar el estudio estadístico, se aísla la variable referente a la situación o estado actual del pozo (SITUACAO). Esto permite generar una extracción directa de los registros operativos para su evaluación inferencial.

Status <- Datos$SITUACAO
TDFSituación <- as.data.frame(table(Status))
TDFSituación
View(TDFSituación)

4 Conteo

En esta fase se procesan las categorías originales. Se imputan los valores vacíos indicándolos como “Sin registro”, se traducen las descripciones del portugués al español, y se realiza una agrupación estratégica en macro-categorías que simplifican el análisis y preparan la variable ordinal para el ajuste al modelo geométrico.

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

# Agrupación 

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 frecuencia

La información procesada se sintetiza en una tabla empírica de frecuencias. Este cuadro consolida el conteo absoluto (\(n_i\)) y relativo (\(h_i\), \(f_i\)), estableciendo la distribución de probabilidad observada que servirá de contraste para el modelo teórico.

TDFSituación$Freq <- as.numeric(as.character(TDFSituación$Freq))

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)

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
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 Gráficas

Esta sección visualiza la distribución empírica de los estados operativos y la superpone con la parametrización de un modelo geométrico probabilístico.

6.1 Diagrama de Barras

Expone gráficamente la magnitud porcentual de cada condición operativa, destacando empíricamente la categoría modal de la distribución.

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 en Cantidad de las condiciones de los pozos petroliferos en Brasil",
        ylab = "Cantidad",
        col = "#2E4053", 
        xaxt = "n", 
        cex.axis = 0.8, cex.main = 0.9)

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

6.2 Conjetura de Modelo Geométrico

Se propone un modelo estocástico geométrico ordenando jerárquicamente las condiciones. El parámetro de éxito se ajusta mediante estimación puntual por el método de los momentos, permitiendo contrastar la expectativa del modelo probabilístico frente al comportamiento de la realidad de los datos.

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 Indicadores Estadísticos

Se ejecutan contrastes de hipótesis para validar cuantitativamente si las predicciones del modelo geométrico son estadísticamente consistentes con la distribución empírica.

7.1 Test de Pearson

Se calcula y grafica el coeficiente de correlación lineal \(r\), midiendo la intensidad de la asociación entre las probabilidades de la muestra real y el vector paramétrico esperado.

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

Debido al amplio tamaño muestral (lo que puede generar hipersensibilidad en el estadístico de prueba), se normaliza el test empleando las frecuencias relativas para evaluar la bondad de ajuste del modelo sobre una escala porcentual con \(N=100\).

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

Matriz consolidada de los indicadores estadísticos utilizados para evaluar el desempeño inferencial del ajuste geométrico.

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.