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.
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.
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.
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.
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
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 |
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.
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)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"
)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.
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)## [1] 98.49423
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
## Valor Crítico: 7.8147
## ¿El modelo geométrico es aceptado?: TRUE
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 | ||||
¿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.
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.