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(`Unit type`), `Unit type` != "NA",
!is.na(`Fuel type`), `Fuel type` != "NA")
cat("Registros válidos:", nrow(Datos), "\n")## Registros válidos: 8334
## Variables: 32
## tibble [8,334 × 32] (S3: tbl_df/tbl/data.frame)
## $ Unit ID : chr [1:8334] "OG0000001" "OG0000002" "OG0000006" "OG0000007" ...
## $ Unit Name : chr [1:8334] "Matzen" "Abalone" "Aguilhada" "Agulha" ...
## $ Unit name local script : chr [1:8334] NA "Abalone" "Aguilhada" "Agulha" ...
## $ Fuel type : chr [1:8334] "oil and gas" "oil and gas" "oil and gas" "oil and gas" ...
## $ Unit type : chr [1:8334] "field" "field" "field" "field" ...
## $ Country : chr [1:8334] "Austria" "Brazil" "Brazil" "Brazil" ...
## $ Subnational unit (province, state): chr [1:8334] NA "Espírito Santo" "Sergipe" "Rio Grande do Norte" ...
## $ Latitude : num [1:8334] 48.4 -21.4 -10.7 -4.9 -22.1 ...
## $ Longitude : num [1:8334] 16.7 -39.6 -36.9 -36.3 -40 ...
## $ Location accuracy : chr [1:8334] "approximate" "exact" "exact" "exact" ...
## $ Status : chr [1:8334] "operating" "operating" "operating" "operating" ...
## $ Status year : num [1:8334] 2023 2022 2022 2022 2022 ...
## $ Discovery year : num [1:8334] 1949 2001 1966 1975 1984 ...
## $ FID Year : chr [1:8334] NA NA NA NA ...
## $ Production start year : chr [1:8334] "1951" "2009" "1969" "1979" ...
## $ Operator : chr [1:8334] "OMV" "Shell Brasil Petróleo Ltda." NA NA ...
## $ Owner : chr [1:8334] "OMV (100%)" "Shell Brasil (50%);ONGC Campos (27%);Qatarenergy (23%)" "Petrobras (100%)" "Petrobras (100%)" ...
## $ Parent : chr [1:8334] "OMV Aktiengesellschaft (100%)" "Shell plc (50%);Oil and Natural Gas Corporation (ONGC) (27%)" "Petróleo Brasileiro S.A. (100%)" "Petróleo Brasileiro S.A. (100%)" ...
## $ Basin : chr [1:8334] NA NA NA NA ...
## $ Concession / block : chr [1:8334] NA NA NA NA ...
## $ Project or complex : chr [1:8334] "Matzen" NA NA NA ...
## $ Government unit ID : chr [1:8334] NA NA NA NA ...
## $ Wiki URL : chr [1:8334] "https://www.gem.wiki/Matzen_Oil_and_Gas_Field_(Austria)" "https://www.gem.wiki/Abalone_Oil_and_Gas_Field_%28Esp%C3%ADrito_Santo%2C_Brazil%29" "https://www.gem.wiki/Aguilhada_Oil_and_Gas_Field_%28Sergipe%2C_Brazil%29" "https://www.gem.wiki/Agulha_Oil_and_Gas_Field_%28Rio_Grande_do_Norte%2C_Brazil%29" ...
## $ Unit name2 : logi [1:8334] NA NA NA NA NA NA ...
## $ Production/reserves : logi [1:8334] NA NA NA NA NA NA ...
## $ Fuel description : logi [1:8334] NA NA NA NA NA NA ...
## $ Reserves classification (original): logi [1:8334] NA NA NA NA NA NA ...
## $ Quantity (original) : logi [1:8334] NA NA NA NA NA NA ...
## $ Units (original) : logi [1:8334] NA NA NA NA NA NA ...
## $ Data year : logi [1:8334] NA NA NA NA NA NA ...
## $ Quantity (converted) : logi [1:8334] NA NA NA NA NA NA ...
## $ Units (converted) : logi [1:8334] NA NA NA NA NA NA ...
Se realizó la extracción de la variable Unit type (Tipo de Unidad) del dataset GOGET. Esta variable clasifica cada registro según el tipo de estructura geológica o administrativa que representa: campo (field), activo (asset), yacimiento (pool), proyecto (project), bloque (block), complejo (complex), concesión (concession), área (area), fase (phase), cuenca (basin) y sub-cuenca (sub-basin). Es una variable cualitativa nominal con 11 categorías distintas.
tabla_UNIT <- Datos %>%
select(TipoUnidad = `Unit type`)
# Correcciones de codificación si existieran
tabla_UNIT <- tabla_UNIT %>%
mutate(TipoUnidad = trimws(TipoUnidad))
TDF_unidad <- table(tabla_UNIT$TipoUnidad)
cat("Categorías encontradas:", length(TDF_unidad), "\n")## Categorías encontradas: 11
## Total registros: 8334
Se calculó la distribución de frecuencias absolutas (nᵢ) y relativas (hᵢ). Los resultados muestran que la categoría field (campo petrolero) predomina con la mayor participación, seguida de asset (activo), lo que evidencia una fuerte concentración del dataset en unidades operativas de extracción directa.
Tabla <- as.data.frame(TDF_unidad)
colnames(Tabla) <- c("TipoUnidad", "ni")
Tabla$TipoUnidad <- as.character(Tabla$TipoUnidad)
Tabla <- Tabla %>% arrange(desc(ni))
N <- sum(Tabla$ni)
Tabla$`hi (%)` <- round((Tabla$ni / N) * 100, 2)
fila_total <- tibble(
TipoUnidad = "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 Tipo de Unidad Petrolera**")
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_label(
TipoUnidad = "Tipo de Unidad",
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 Tipo de Unidad Petrolera | ||
| Tipo de Unidad | Frecuencia (ni) | Porcentaje (hi%) |
|---|---|---|
| field | 4336 | 52.03 |
| asset | 3124 | 37.49 |
| pool | 461 | 5.53 |
| project | 183 | 2.20 |
| block | 111 | 1.33 |
| complex | 73 | 0.88 |
| concession | 16 | 0.19 |
| area | 14 | 0.17 |
| phase | 11 | 0.13 |
| basin | 3 | 0.04 |
| sub-basin | 2 | 0.02 |
| TOTAL | 8334 | 100.01 |
| Autor: Grupo 5 | ||
Mediante el diagrama de barras de cantidad, se identificó una distribución asimétrica con una dominancia clara de las categorías field y asset sobre las demás. Esta observación justifica la división del análisis en dos agrupaciones: Unidades Operativas (field, asset, pool) y Unidades Administrativas (project, block, complex, concession, area, phase, basin, sub-basin), para aplicar modelos de probabilidad que describan el comportamiento de cada segmento.
Tabla_Grafica <- tabla_Final %>% filter(TipoUnidad != "TOTAL")
par(mar = c(9, 5, 5, 2))
barplot(Tabla_Grafica$ni,
names.arg = Tabla_Grafica$TipoUnidad,
main = "",
xlab = "",
ylab = "Cantidad",
col = "#2E86C1",
las = 2,
cex.names = 0.85,
ylim = c(0, max(Tabla_Grafica$ni) * 1.2))
mtext("Tipo de Unidad", side = 1, line = 7, cex = 0.9)
mtext("Gráfica N°1: Distribución de Cantidad de Yacimientos por Tipo de Unidad",
side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2)Se mapean los tipos de unidades con mayor actividad extractiva directa: field, asset y pool. 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 field como nodo principal de extracción.
niveles_operativas <- c("field", "asset", "pool")
Datos_Operativas <- tabla_UNIT %>%
filter(TipoUnidad %in% niveles_operativas)
Datos_Operativas$TipoUnidad <- factor(Datos_Operativas$TipoUnidad,
levels = niveles_operativas,
ordered = TRUE)
TDF_G1_Op <- as.data.frame(table(Datos_Operativas$TipoUnidad))
colnames(TDF_G1_Op) <- c("TipoUnidad", "ni")
TDF_G1_Op$X <- 0:(nrow(TDF_G1_Op) - 1)
TDF_G1_Op$hi <- TDF_G1_Op$ni / sum(TDF_G1_Op$ni)
TDF_G1_Op %>%
select(TipoUnidad, X, ni, hi) %>%
gt() %>%
tab_header(
title = md("**Tabla N°2 de Distribución de Frecuencias del Tipo de Unidad — Mapeado**"),
subtitle = "Segmento: Unidades Operativas (Extracción Directa)"
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_label(
TipoUnidad = "Tipo de Unidad",
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 Tipo de Unidad — Mapeado | |||
| Segmento: Unidades Operativas (Extracción Directa) | |||
| Tipo de Unidad | Valor Asignado | Frecuencia (ni) | Porcentaje (hi%) |
|---|---|---|---|
| field | 0 | 4336 | 0.5474 |
| asset | 1 | 3124 | 0.3944 |
| pool | 2 | 461 | 0.0582 |
| Autor: Grupo 5 | |||
Se seleccionan field, asset y pool para analizar el comportamiento de las unidades operativas líderes. Se aplica un Modelo Geométrico bajo la premisa de que la probabilidad de encontrar una unidad de alta capacidad disminuye conforme el mercado se vuelve más específico, concentrando la mayor frecuencia en field como el principal nodo de extracción global.
n_total_op <- sum(TDF_G1_Op$ni)
media_obs_op <- sum(TDF_G1_Op$X * TDF_G1_Op$ni) / n_total_op
prob_geom_op <- 1 / (media_obs_op + 1)
P_Geom_Op <- dgeom(TDF_G1_Op$X, prob = prob_geom_op)
P_Geom_Op <- P_Geom_Op / sum(P_Geom_Op)
par(mar = c(8, 5, 5, 2))
barplot(rbind(TDF_G1_Op$hi, P_Geom_Op),
beside = TRUE,
main = "",
ylab = "Porcentaje (%)",
names.arg = TDF_G1_Op$TipoUnidad,
col = c("#2E86C1", "#1A5276"),
legend.text = c("Observado", "Esperado"),
args.legend = list(x = "topright", bty = "n", cex = 0.8),
las = 2,
cex.names = 0.85,
cex.main = 0.8)
mtext("Tipo de Unidad", side = 1, line = 6, cex = 0.9)
mtext("Gráfica N°2: Comparado de lo Observado frente a lo Esperado (Unidades Operativas)",
side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)Fo_Op <- TDF_G1_Op$hi
Fe_Op <- P_Geom_Op
plot(Fo_Op, Fe_Op,
main = "",
xlab = "Frecuencia Observada",
ylab = "Frecuencia Esperada",
pch = 19,
col = "#2E86C1",
cex.main = 0.8)
abline(lm(Fe_Op ~ Fo_Op), col = "red", lwd = 2)
mtext("Gráfica N°3: Correlación del Modelo Observado y Esperado — Unidades Operativas",
side = 3, line = 1, adj = 0.5, cex = 0.8, font = 2)Correlacion_Op <- cor(Fo_Op, Fe_Op) * 100
cat("Correlación de Pearson (%):", round(Correlacion_Op, 2), "\n")## Correlación de Pearson (%): 88.18
x2_Op <- sum(((Fo_Op - Fe_Op)^2) / Fe_Op)
gl_Op <- length(Fo_Op) - 1
vc_Op <- qchisq(0.95, gl_Op)
cat("Chi-cuadrado calculado:", round(x2_Op, 4), "\n")## Chi-cuadrado calculado: 0.1465
## Valor crítico (vc) : 5.9915
## ¿Se acepta el modelo? : TRUE
tabla_resumen_Op <- data.frame(
Variable = "Unidades Operativas",
Modelo = "Geométrico",
Pearson = round(Correlacion_Op, 2),
Chi2 = round(x2_Op, 4),
Umbral = round(vc_Op, 2),
Resultado = x2_Op < vc_Op
)
tabla_resumen_Op %>%
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 |
|---|---|---|---|---|---|
| Unidades Operativas | Geométrico | 88.18 | 0.1465 | 5.99 | TRUE |
| Autor: Grupo 5 | |||||
¿Cuál es la probabilidad de que una unidad seleccionada aleatoriamente dentro del bloque de unidades operativas sea específicamente del tipo field?
prob_field_geom <- dgeom(0, prob = prob_geom_op)
paste0("La probabilidad estimada para 'field' es de: ",
round(prob_field_geom * 100, 2), "%")## [1] "La probabilidad estimada para 'field' es de: 66.19%"
Se asignan valores numéricos a las categorías de menor frecuencia que representan estructuras de gestión y planificación: project, block, complex, concession, area, phase, basin y sub-basin. Se aplica un Modelo de Poisson, ideal para modelar eventos con baja tasa de ocurrencia en regiones con densidades variables.
niveles_admin <- c("project", "block", "complex",
"concession", "area", "phase", "basin", "sub-basin")
Datos_Admin <- tabla_UNIT %>%
filter(TipoUnidad %in% niveles_admin)
TDF_G2_Adm <- as.data.frame(table(Datos_Admin$TipoUnidad))
colnames(TDF_G2_Adm) <- c("TipoUnidad", "ni")
TDF_G2_Adm <- TDF_G2_Adm %>% arrange(desc(ni))
TDF_G2_Adm$X <- 0:(nrow(TDF_G2_Adm) - 1)
TDF_G2_Adm$hi <- TDF_G2_Adm$ni / sum(TDF_G2_Adm$ni)
TDF_G2_Adm %>%
select(TipoUnidad, X, ni, hi) %>%
gt() %>%
tab_header(
title = md("**Tabla N°4 de Distribución de Frecuencias del Tipo de Unidad — Mapeado**"),
subtitle = "Segmento: Unidades Administrativas"
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_label(
TipoUnidad = "Tipo de Unidad",
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 Tipo de Unidad — Mapeado | |||
| Segmento: Unidades Administrativas | |||
| Tipo de Unidad | Valor Asignado | Frecuencia (ni) | Porcentaje (hi%) |
|---|---|---|---|
| project | 0 | 183 | 0.4431 |
| block | 1 | 111 | 0.2688 |
| complex | 2 | 73 | 0.1768 |
| concession | 3 | 16 | 0.0387 |
| area | 4 | 14 | 0.0339 |
| phase | 5 | 11 | 0.0266 |
| basin | 6 | 3 | 0.0073 |
| sub-basin | 7 | 2 | 0.0048 |
| Autor: Grupo 5 | |||
Esta agrupación comprende las unidades de planificación y administración del sector. Se propone un Modelo de Poisson para representar este segmento, ya que es el más robusto para modelar eventos independientes que ocurren con una tasa constante en un área geográfica. A diferencia de otros modelos, Poisson captura mejor la dispersión de unidades en contextos donde la infraestructura aún no es uniforme.
n_total_adm <- sum(TDF_G2_Adm$ni)
lambda_adm <- sum(TDF_G2_Adm$X * TDF_G2_Adm$ni) / n_total_adm
P_Pois_Adm <- dpois(TDF_G2_Adm$X, lambda = lambda_adm)
P_Pois_Adm <- P_Pois_Adm / sum(P_Pois_Adm)
par(mar = c(9, 5, 5, 2))
barplot(rbind(TDF_G2_Adm$hi, P_Pois_Adm),
beside = TRUE,
main = "",
ylab = "Porcentaje (%)",
names.arg = TDF_G2_Adm$TipoUnidad,
col = c("#2E86C1", "#1A5276"),
legend.text = c("Observado", "Esperado"),
args.legend = list(x = "topright", bty = "n", cex = 0.7),
las = 2,
cex.names = 0.75,
cex.main = 0.8)
mtext("Tipo de Unidad", 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_E <- TDF_G2_Adm$hi
Fe_E <- P_Pois_Adm
plot(Fo_E, Fe_E,
main = "",
xlab = "Frecuencia Observada",
ylab = "Frecuencia Esperada",
pch = 19,
col = "#1B4F72",
cex.main = 0.8)
abline(lm(Fe_E ~ Fo_E), col = "red", lwd = 2)
mtext("Gráfica N°5: Correlación del Modelo (Poisson) en Unidades Administrativas",
side = 3, line = 1, adj = 0.5, cex = 0.8, font = 2)Correlacion_E <- cor(Fo_E, Fe_E) * 100
cat("Correlación de Pearson (%):", round(Correlacion_E, 2), "\n")## Correlación de Pearson (%): 93.41
x2_E <- sum(((Fo_E - Fe_E)^2) / Fe_E)
gl_E <- length(Fo_E) - 1
vc_E <- qchisq(0.95, gl_E)
cat("Chi-cuadrado calculado:", round(x2_E, 4), "\n")## Chi-cuadrado calculado: 0.4494
## Valor crítico (vc) : 14.0671
## ¿Se acepta el modelo? : TRUE
tabla_resumen_E <- data.frame(
Variable = "Unidades Administrativas",
Modelo = "Poisson",
Pearson = round(Correlacion_E, 2),
Chi2 = round(x2_E, 4),
Umbral = round(vc_E, 2),
Resultado = x2_E < vc_E
)
tabla_resumen_E %>%
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 |
|---|---|---|---|---|---|
| Unidades Administrativas | Poisson | 93.41 | 0.4494 | 14.07 | TRUE |
| Autor: Grupo 5 | |||||
¿Cuál es la probabilidad de que una nueva unidad registrada se localice específicamente en la categoría project (Valor 0) bajo la tasa de ocurrencia de Poisson?
prob_project_pois <- dpois(0, lambda = lambda_adm)
paste0("La probabilidad estimada para 'project' es de: ",
round(prob_project_pois * 100, 2), "%")## [1] "La probabilidad estimada para 'project' es de: 33.8%"
El análisis probabilístico permitió modelar la distribución del tipo de unidad petrolera a nivel mundial mediante un modelo geométrico para las unidades operativas y un modelo de Poisson para las unidades administrativas. Los resultados muestran una clara dominancia de field y asset en el liderazgo operativo, mientras que en el segmento administrativo, project se posiciona como el tipo con mayor tasa de aparición de nuevas estructuras.
Las pruebas de bondad de ajuste, con coeficientes de Pearson del 88.18% y 93.41% respectivamente, confirman que ambos modelos representan adecuadamente los datos observados por tipo de unidad. Esto evidencia una descripción estadística precisa de la estructura operativa del sector petrolero global, validando la diferencia entre la concentración en unidades de extracción directa y la dispersión de estructuras administrativas.