Se cargan las librerías necesarias y el dataset Global Oil and Gas Extraction Tracker (GOGET), que contiene registros de unidades de extracción de petróleo y gas a nivel mundial.
library(readxl)
library(dplyr)
library(gt)
library(ggplot2)
library(scales)
library(tibble)
Datos <- read_excel(file.choose()) %>%
filter(!is.na(Status), Status != "NA")
cat("Registros válidos:", nrow(Datos), "\n")## Registros válidos: 8068
## Variables: 23
Se realizó la extracción de la variable Status (Estado de la Unidad) del dataset GOGET. Esta variable clasifica cada registro según su situación operativa actual: en operación (operating), cerrado temporalmente (shut in), descubierto (discovered), en desarrollo (in development), descomisionado (decommissioned), abandonado (abandoned), almacenamiento subterráneo de gas (UGS), cancelado (cancelled) y en exploración (exploration). Es una variable cualitativa nominal con 9 categorías distintas.
tabla_STATUS <- Datos %>%
select(Status) %>%
mutate(Status = trimws(Status))
TDF_status <- table(tabla_STATUS$Status)
cat("Categorías encontradas:", length(TDF_status), "\n")## Categorías encontradas: 9
## Total registros: 8068
Tabla <- as.data.frame(TDF_status)
colnames(Tabla) <- c("Status", "ni")
Tabla$Status <- as.character(Tabla$Status)
orden_cronologico <- c(
"exploration",
"discovered",
"in development",
"operating",
"shut in",
"UGS",
"decommissioned",
"abandoned",
"cancelled"
)
Tabla$Status <- factor(
Tabla$Status,
levels = orden_cronologico,
ordered = TRUE
)
Tabla <- Tabla %>%
arrange(Status)
N <- sum(Tabla$ni)
Tabla$`hi (%)` <- round((Tabla$ni / N) * 100, 2)
fila_total <- tibble(
Status = "TOTAL",
ni = sum(Tabla$ni),
`hi (%)` = sum(Tabla$`hi (%)`)
)
tabla_Final <- bind_rows(Tabla, fila_total)
tabla_Final %>%
gt() %>%
tab_header(
title = md("**Tabla N°1 de Distribución de Frecuencias por Estado de la Unidad**")
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_label(
Status = "Estado",
ni = "Frecuencia (ni)",
`hi (%)` = "Porcentaje (hi%)"
) %>%
cols_align(align = "center", columns = everything()) %>%
fmt_number(columns = `hi (%)`, decimals = 2) %>%
tab_style(
style = cell_fill(color = "#F5F5F5"),
locations = cells_body(rows = nrow(Tabla) + 1)
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(rows = nrow(Tabla) + 1)
) %>%
tab_options(
heading.title.font.size = px(14),
column_labels.background.color = "#F0F0F0"
)| Tabla N°1 de Distribución de Frecuencias por Estado de la Unidad | ||
| Estado | Frecuencia (ni) | Porcentaje (hi%) |
|---|---|---|
| exploration | 1 | 0.01 |
| discovered | 396 | 4.91 |
| in development | 233 | 2.89 |
| operating | 6351 | 78.72 |
| shut in | 990 | 12.27 |
| UGS | 11 | 0.14 |
| decommissioned | 71 | 0.88 |
| abandoned | 13 | 0.16 |
| cancelled | 2 | 0.02 |
| TOTAL | 8068 | 100.00 |
| Autor: Grupo 5 | ||
Tabla_Grafica <- tabla_Final %>% filter(Status != "TOTAL")
par(mar = c(9, 5, 5, 2))
barplot(Tabla_Grafica$ni,
names.arg = Tabla_Grafica$Status,
main = "",
xlab = "",
ylab = "Cantidad",
col = "#2E86C1",
las = 2,
cex.names = 0.85,
ylim = c(0, max(Tabla_Grafica$ni) * 1.2))
mtext("Estado de la Unidad", side = 1, line = 7, cex = 0.9)
mtext("Gráfica N°1: Distribución de Cantidad de Yacimientos por Estado",
side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2)Mediante el diagrama de barras de cantidad, se identificó una distribución sumamente asimétrica con una dominancia abrumadora de la categoría operating, seguida a distancia por shut in y discovered. Esta observación justifica la división del análisis en dos agrupaciones: Estados Activos (operating, shut in, discovered), que concentran la actividad sustancial del sector, y Estados de Transición/Cierre (in development, decommissioned, abandoned, UGS, cancelled, exploration), para aplicar modelos de probabilidad que describan el comportamiento de cada segmento.
Se mapean los estados con mayor representación operativa directa: operating, shut in y discovered. Se aplica un Modelo Geométrico bajo la premisa de que la probabilidad de encontrar una unidad de alta frecuencia disminuye conforme se avanza en la secuencia, concentrando la mayor frecuencia en operating como nodo principal del estado operativo mundial.
niveles_activos <- c("operating", "shut in", "discovered")
Datos_Activos <- tabla_STATUS %>%
filter(Status %in% niveles_activos)
Datos_Activos$Status <- factor(Datos_Activos$Status,
levels = niveles_activos,
ordered = TRUE)
TDF_G1_St <- as.data.frame(table(Datos_Activos$Status))
colnames(TDF_G1_St) <- c("Status", "ni")
TDF_G1_St$X <- 0:(nrow(TDF_G1_St) - 1)
TDF_G1_St$hi <- TDF_G1_St$ni / sum(TDF_G1_St$ni)
TDF_G1_St %>%
select(Status, X, ni, hi) %>%
gt() %>%
tab_header(
title = md("**Tabla N°2 de Distribución de Frecuencias del Estado — Mapeado**"),
subtitle = "Segmento: Estados Activos (Operación Directa)"
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_label(
Status = "Estado",
X = "Valor Asignado",
ni = "Frecuencia (ni)",
hi = "Porcentaje (hi%)"
) %>%
cols_align(align = "center", columns = everything()) %>%
fmt_number(columns = hi, decimals = 4) %>%
tab_options(
heading.title.font.size = px(14),
column_labels.background.color = "#F0F0F0"
)| Tabla N°2 de Distribución de Frecuencias del Estado — Mapeado | |||
| Segmento: Estados Activos (Operación Directa) | |||
| Estado | Valor Asignado | Frecuencia (ni) | Porcentaje (hi%) |
|---|---|---|---|
| operating | 0 | 6351 | 0.8209 |
| shut in | 1 | 990 | 0.1280 |
| discovered | 2 | 396 | 0.0512 |
| Autor: Grupo 5 | |||
n_total_act <- sum(TDF_G1_St$ni)
media_obs_act <- sum(TDF_G1_St$X * TDF_G1_St$ni) / n_total_act
prob_geom_act <- 1 / (media_obs_act + 1)
P_Geom_St <- dgeom(TDF_G1_St$X, prob = prob_geom_act)
P_Geom_St <- P_Geom_St / sum(P_Geom_St)
par(mar = c(8, 5, 5, 2))
barplot(rbind(TDF_G1_St$hi, P_Geom_St),
beside = TRUE,
main = "",
ylab = "Porcentaje (%)",
names.arg = TDF_G1_St$Status,
col = c("#2E86C1", "#1A5276"),
legend.text = c("Observado", "Esperado"),
args.legend = list(x = "topright", bty = "n"),
las = 2,
cex.names = 0.85,
cex.main = 0.8)
mtext("Estado", side = 1, line = 6, cex = 0.9)
mtext("Gráfica N°2: Comparado de lo Observado frente a lo Esperado (Estados Activos)",
side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)Fo_Act <- TDF_G1_St$hi
Fe_Act <- P_Geom_St
plot(Fo_Act, Fe_Act,
main = "",
xlab = "Frecuencia Observada",
ylab = "Frecuencia Esperada",
pch = 19,
col = "#2E86C1",
cex.main = 0.8)
abline(lm(Fe_Act ~ Fo_Act), col = "red", lwd = 2)
mtext("Gráfica N°3: Correlación del Modelo Observado y Esperado — Estados Activos",
side = 3, line = 1, adj = 0.5, cex = 0.8, font = 2)Correlacion_Act <- cor(Fo_Act, Fe_Act) * 100
cat("Correlación de Pearson (%):", round(Correlacion_Act, 2), "\n")## Correlación de Pearson (%): 99.84
x2_Act <- sum(((Fo_Act - Fe_Act)^2) / Fe_Act)
gl_Act <- length(Fo_Act) - 1
vc_Act <- qchisq(0.95, gl_Act)
cat("Chi-cuadrado calculado:", round(x2_Act, 4), "\n")## Chi-cuadrado calculado: 0.0218
## Valor crítico (vc) : 5.9915
## ¿Se acepta el modelo? : TRUE
tabla_resumen_Act <- data.frame(
Variable = "Estados Activos",
Modelo = "Geométrico",
Pearson = round(Correlacion_Act, 2),
Chi2 = round(x2_Act, 4),
Umbral = round(vc_Act, 2),
Resultado = x2_Act < vc_Act
)
tabla_resumen_Act %>%
gt() %>%
cols_label(
Variable = "Variable",
Modelo = "Modelo",
Pearson = "Test Pearson (%)",
Chi2 = "Chi Cuadrado",
Umbral = "Umbral de Aceptación",
Resultado = "Resultado"
) %>%
tab_header(
title = md("**Tabla N°3 Resumen del Test de Bondad al Modelo de Probabilidad**")
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_align(align = "center", columns = everything()) %>%
tab_options(
heading.title.font.size = px(14),
column_labels.background.color = "#F0F0F0"
)| Tabla N°3 Resumen del Test de Bondad al Modelo de Probabilidad | |||||
| Variable | Modelo | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación | Resultado |
|---|---|---|---|---|---|
| Estados Activos | Geométrico | 99.84 | 0.0218 | 5.99 | TRUE |
| Autor: Grupo 5 | |||||
¿Cuál es la probabilidad de que una unidad seleccionada aleatoriamente dentro del bloque de Estados Activos sea específicamente del tipo operating?
prob_operating_geom <- dgeom(0, prob = prob_geom_act)
paste0("La probabilidad estimada para 'operating' es de: ",
round(prob_operating_geom * 100, 2), "%")## [1] "La probabilidad estimada para 'operating' es de: 81.28%"
Se asignan valores numéricos a las categorías de menor frecuencia que representan situaciones de transición, planificación o cierre de las unidades: in development, decommissioned, abandoned, UGS, cancelled y exploration. Se aplica un Modelo de Poisson, ideal para modelar eventos con baja tasa de ocurrencia en un contexto donde los estados de cierre o transición son comparativamente raros frente a la operación activa.
niveles_transicion <- c("in development", "decommissioned", "abandoned",
"UGS", "cancelled", "exploration")
Datos_Transicion <- tabla_STATUS %>%
filter(Status %in% niveles_transicion)
TDF_G2_St <- as.data.frame(table(Datos_Transicion$Status))
colnames(TDF_G2_St) <- c("Status", "ni")
TDF_G2_St <- TDF_G2_St %>% arrange(desc(ni))
TDF_G2_St$X <- 0:(nrow(TDF_G2_St) - 1)
TDF_G2_St$hi <- TDF_G2_St$ni / sum(TDF_G2_St$ni)
TDF_G2_St %>%
select(Status, X, ni, hi) %>%
gt() %>%
tab_header(
title = md("**Tabla N°4 de Distribución de Frecuencias del Estado — Mapeado**"),
subtitle = "Segmento: Estados de Transición y Cierre"
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_label(
Status = "Estado",
X = "Valor Asignado",
ni = "Frecuencia (ni)",
hi = "Porcentaje (hi%)"
) %>%
cols_align(align = "center", columns = everything()) %>%
fmt_number(columns = hi, decimals = 4) %>%
tab_options(
heading.title.font.size = px(16),
heading.subtitle.font.size = px(12),
column_labels.background.color = "#F0F0F0"
)| Tabla N°4 de Distribución de Frecuencias del Estado — Mapeado | |||
| Segmento: Estados de Transición y Cierre | |||
| Estado | Valor Asignado | Frecuencia (ni) | Porcentaje (hi%) |
|---|---|---|---|
| in development | 0 | 233 | 0.7039 |
| decommissioned | 1 | 71 | 0.2145 |
| abandoned | 2 | 13 | 0.0393 |
| UGS | 3 | 11 | 0.0332 |
| cancelled | 4 | 2 | 0.0060 |
| exploration | 5 | 1 | 0.0030 |
| Autor: Grupo 5 | |||
n_total_tra <- sum(TDF_G2_St$ni)
lambda_tra <- sum(TDF_G2_St$X * TDF_G2_St$ni) / n_total_tra
P_Pois_St <- dpois(TDF_G2_St$X, lambda = lambda_tra)
P_Pois_St <- P_Pois_St / sum(P_Pois_St)
par(mar = c(9, 5, 5, 2))
barplot(rbind(TDF_G2_St$hi, P_Pois_St),
beside = TRUE,
main = "",
ylab = "Porcentaje (%)",
names.arg = TDF_G2_St$Status,
col = c("#2E86C1", "#1A5276"),
legend.text = c("Observado", "Esperado"),
args.legend = list(x = "topright", bty = "n"),
las = 2,
cex.names = 0.75,
cex.main = 0.8)
mtext("Estado", side = 1, line = 7.5, cex = 0.9)
mtext("Gráfica N°4: Comparado de lo Observado frente a lo Esperado (Poisson)",
side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)Fo_Tra <- TDF_G2_St$hi
Fe_Tra <- P_Pois_St
plot(Fo_Tra, Fe_Tra,
main = "",
xlab = "Frecuencia Observada",
ylab = "Frecuencia Esperada",
pch = 19,
col = "#1B4F72",
cex.main = 0.8)
abline(lm(Fe_Tra ~ Fo_Tra), col = "red", lwd = 2)
mtext("Gráfica N°5: Correlación del Modelo (Poisson) en Estados de Transición",
side = 3, line = 1, adj = 0.5, cex = 0.8, font = 2)Correlacion_Tra <- cor(Fo_Tra, Fe_Tra) * 100
cat("Correlación de Pearson (%):", round(Correlacion_Tra, 2), "\n")## Correlación de Pearson (%): 98.98
x2_Tra <- sum(((Fo_Tra - Fe_Tra)^2) / Fe_Tra)
gl_Tra <- length(Fo_Tra) - 1
vc_Tra <- qchisq(0.95, gl_Tra)
cat("Chi-cuadrado calculado:", round(x2_Tra, 4), "\n")## Chi-cuadrado calculado: 0.2302
## Valor crítico (vc) : 11.0705
## ¿Se acepta el modelo? : TRUE
tabla_resumen_Tra <- data.frame(
Variable = "Estados de Transición y Cierre",
Modelo = "Poisson",
Pearson = round(Correlacion_Tra, 2),
Chi2 = round(x2_Tra, 4),
Umbral = round(vc_Tra, 2),
Resultado = x2_Tra < vc_Tra
)
tabla_resumen_Tra %>%
gt() %>%
cols_label(
Variable = "Variable",
Modelo = "Modelo",
Pearson = "Test Pearson (%)",
Chi2 = "Chi Cuadrado",
Umbral = "Umbral de Aceptación",
Resultado = "Resultado"
) %>%
tab_header(
title = md("**Tabla N°5 Resumen del Test de Bondad (Modelo Poisson)**")
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_align(align = "center", columns = everything()) %>%
tab_options(
heading.title.font.size = px(14),
column_labels.background.color = "#F0F0F0"
)| Tabla N°5 Resumen del Test de Bondad (Modelo Poisson) | |||||
| Variable | Modelo | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación | Resultado |
|---|---|---|---|---|---|
| Estados de Transición y Cierre | Poisson | 98.98 | 0.2302 | 11.07 | TRUE |
| Autor: Grupo 5 | |||||
¿Cuál es la probabilidad de que una nueva unidad registrada se localice específicamente en la categoría in development (Valor 0) bajo la tasa de ocurrencia de Poisson?
prob_indev_pois <- dpois(0, lambda = lambda_tra)
paste0("La probabilidad estimada para 'in development' es de: ",
round(prob_indev_pois * 100, 2), "%")## [1] "La probabilidad estimada para 'in development' es de: 64.92%"
El análisis probabilístico permitió modelar la distribución del estado operativo de las unidades de extracción a nivel mundial mediante un modelo geométrico para los Estados Activos (operating, shut in, discovered) y un modelo de Poisson para los Estados de Transición y Cierre (in development, decommissioned, abandoned, UGS, cancelled, exploration). Los resultados muestran una clara dominancia de operating en el segmento activo, reflejando que casi 4 de cada 5 unidades del dataset se encuentran actualmente en producción, mientras que en el segmento de transición, in development se posiciona como el estado con mayor frecuencia, evidenciando que la mayoría de los proyectos no operativos están en fase de desarrollo más que en cierre definitivo.
Las pruebas de bondad de ajuste confirman, con distinto grado de precisión, que ambos modelos representan razonablemente los datos observados por estado de la unidad. Esto evidencia una descripción estadística coherente de la estructura operativa del sector petrolero global, validando la diferencia entre la concentración en estados de operación activa y la dispersión, mucho menor en volumen, de los estados de transición o cierre del ciclo de vida de las unidades de extracción.