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.
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.
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.
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 ))
TDFTipoPozoDada 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), ]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 |
En esta sección se despliega el análisis visual descriptivo contrastado contra la parametrización teórica inferencial.
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)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"
)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\)).
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 %
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.
## Chi-Cuadrado: 7.1242
## Valor Crítico: 9.2103
## ¿Modelo aceptado?: TRUE
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 | ||||
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
## 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
## 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.