Se cargan las librerías necesarias para el análisis de la variable Unit Type del dataset Global Oil and Gas Extraction Tracker (GOGET).
library(readxl)
library(dplyr)
library(gt)
library(ggplot2)
library(scales)
library(forcats)
library(tidyr)Se carga el dataset y se filtran los registros con valores válidos en la variable de interés.
datos <- read_excel("dataset_mundial_petro.xlsx") %>%
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
Se extrae la variable Unit Type (Tipo de Unidad). Es una variable de escala nominal: sus categorías no tienen orden jerárquico intrínseco.
## Variable analizada: Unit Type
## Total de observaciones (n): 8334
## Categorías presentes: field, block, project, complex, concession, basin, sub-basin, area, pool, phase, asset
Se calcula la frecuencia absoluta (nᵢ), la frecuencia relativa en proporción (hᵢ) y en porcentaje (hᵢ %) para cada categoría, ordenadas de mayor a menor.
tabla_freq <- datos %>%
count(`Unit type`, name = "ni") %>%
arrange(desc(ni)) %>%
rename(TipoUnidad = `Unit type`) %>%
mutate(TipoUnidad = recode(TipoUnidad,
"field" = "Campo",
"asset" = "Activo",
"pool" = "Yacimiento",
"project" = "Proyecto",
"block" = "Bloque",
"complex" = "Complejo",
"concession" = "Concesión",
"area" = "Área",
"phase" = "Fase",
"basin" = "Cuenca",
"sub-basin" = "Subcuenca"
)) %>%
mutate(
hi_prop = ni / n,
hi_pct = hi_prop * 100,
i = row_number()
) %>%
select(i, TipoUnidad, ni, hi_pct, hi_prop)
k <- nrow(tabla_freq)
cat("Número de categorías (k):", k, "\n")## Número de categorías (k): 11
## Categoría más frecuente : Campo — 4336 registros
## Categoría menos frecuente: Subcuenca — 2 registro(s)
## Verificación — Σnᵢ: 8334 (debe ser 8334 )
## Verificación — Σhᵢ%: 100 (debe ser 100)
tabla_freq %>%
gt() %>%
tab_header(
title = md("**Tabla N. 1**"),
subtitle = md("Distribución de frecuencias por tipo de unidad — yacimientos de petróleo y gas")
) %>%
cols_label(
i = md("**N°**"),
TipoUnidad = md("**Tipo de unidad**"),
ni = md("**nᵢ**"),
hi_pct = md("**(%)** "),
hi_prop = md("**(proporción)**")
) %>%
tab_spanner(label = md("**hᵢ**"), columns = c(hi_pct, hi_prop)) %>%
fmt_number(columns = ni, decimals = 0, use_seps = TRUE) %>%
fmt_number(columns = hi_pct, decimals = 2) %>%
fmt_number(columns = hi_prop, decimals = 4) %>%
grand_summary_rows(
columns = c(ni, hi_pct, hi_prop),
fns = list(label = "Total", fn = "sum"),
fmt = list(
~ fmt_number(., columns = ni, decimals = 0, use_seps = TRUE),
~ fmt_number(., columns = hi_pct, decimals = 2),
~ fmt_number(., columns = hi_prop, decimals = 4)
)
) %>%
tab_source_note("Autor: Grupo 5") %>%
tab_options(
table.width = pct(75),
table.font.size = px(13),
table.font.names = "Arial",
heading.title.font.size = px(15),
heading.subtitle.font.size = px(12),
heading.align = "center",
heading.background.color = "#AAAAAA",
column_labels.font.weight = "bold",
column_labels.background.color = "#FFFFFF",
column_labels.border.top.color = "#AAAAAA",
column_labels.border.bottom.color = "#AAAAAA",
table.border.top.color = "#AAAAAA",
table.border.bottom.color = "#AAAAAA"
) %>%
tab_style(
style = cell_text(color = "white", weight = "bold"),
locations = cells_title(groups = c("title", "subtitle"))
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = list(cells_column_labels(), cells_column_spanners(), cells_grand_summary())
)| Tabla N. 1 | |||||
| Distribución de frecuencias por tipo de unidad — yacimientos de petróleo y gas | |||||
| N° | Tipo de unidad | nᵢ |
hᵢ
|
||
|---|---|---|---|---|---|
| (%) | (proporción) | ||||
| 1 | Campo | 4,336 | 52.03 | 0.5203 | |
| 2 | Activo | 3,124 | 37.49 | 0.3749 | |
| 3 | Yacimiento | 461 | 5.53 | 0.0553 | |
| 4 | Proyecto | 183 | 2.20 | 0.0220 | |
| 5 | Bloque | 111 | 1.33 | 0.0133 | |
| 6 | Complejo | 73 | 0.88 | 0.0088 | |
| 7 | Concesión | 16 | 0.19 | 0.0019 | |
| 8 | Área | 14 | 0.17 | 0.0017 | |
| 9 | Fase | 11 | 0.13 | 0.0013 | |
| 10 | Cuenca | 3 | 0.04 | 0.0004 | |
| 11 | Subcuenca | 2 | 0.02 | 0.0002 | |
| Total | — | — | 8,334 | 100.00 | 1.0000 |
| Autor: Grupo 5 | |||||
unit_graf <- tabla_freq %>%
mutate(TipoUnidad = fct_reorder(TipoUnidad, ni))
colores <- c(
"Campo" = "#AED6F1",
"Activo" = "#5DADE2",
"Yacimiento" = "#2E86C1",
"Proyecto" = "#1A5276",
"Bloque" = "#154360",
"Complejo" = "#85C1E9",
"Concesión" = "#3498DB",
"Área" = "#21618C",
"Fase" = "#7FB3D3",
"Cuenca" = "#2471A3",
"Subcuenca" = "#1F618D"
)
tema_base <- theme_minimal(base_size = 12) +
theme(
legend.position = "none",
plot.title = element_text(face = "bold", size = 13),
plot.caption = element_text(color = "#888888", size = 9, hjust = 0),
axis.title = element_text(face = "bold", size = 11),
axis.text.x = element_text(face = "bold", angle = 15, hjust = 1),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(color = "#EEEEEE"),
panel.grid.minor = element_blank(),
plot.background = element_rect(fill = "white", color = NA)
)
pie_label <- paste0("n = ", format(n, big.mark = ","),
" | Fuente: Global Energy Monitor — GOGET 2023")
p_hat <- tabla_freq$hi_prop[1] # proporción muestral de "field"
m <- 20 # ensayos del modelo BinomialDiagrama de barras y diagrama circular que muestran la distribución real de los registros según el tipo de unidad.
# Diagrama de barras — Frecuencia Absoluta
ggplot(unit_graf, aes(x = TipoUnidad, y = ni, fill = TipoUnidad)) +
geom_col(width = 0.55, color = "white") +
geom_text(aes(label = format(ni, big.mark = ",")),
vjust = -0.4, size = 3.5, fontface = "bold") +
scale_fill_manual(values = colores) +
scale_y_continuous(labels = label_comma(),
expand = expansion(mult = c(0, 0.12))) +
labs(title = "Gráfica N. 1: Distribución de yacimientos por tipo de unidad",
x = "Tipo de unidad", y = "Frecuencia Absoluta (nᵢ)",
caption = pie_label) +
tema_baseSe toma la categoría modal field como “éxito” (p̂ = proporción muestral) y se ajusta un modelo Binomial con m = 20 ensayos, modelando la probabilidad de obtener exactamente x unidades de tipo field.
x_vals <- 0:(k-1)
prob_binom <- dbinom(x_vals, size = k-1, prob = p_hat)
df_binom <- data.frame(
TipoUnidad = tabla_freq$TipoUnidad,
x_Index = x_vals,
Media = round(p_hat, 4),
Prob_Binomial = round(prob_binom, 4)
)
print(df_binom)## TipoUnidad x_Index Media Prob_Binomial
## 1 Campo 0 0.5203 0.0006
## 2 Activo 1 0.5203 0.0070
## 3 Yacimiento 2 0.5203 0.0342
## 4 Proyecto 3 0.5203 0.0988
## 5 Bloque 4 0.5203 0.1875
## 6 Complejo 5 0.5203 0.2441
## 7 Concesión 6 0.5203 0.2206
## 8 Área 7 0.5203 0.1367
## 9 Fase 8 0.5203 0.0556
## 10 Cuenca 9 0.5203 0.0134
## 11 Subcuenca 10 0.5203 0.0015
Se compara la proporción de field observada en el dataset con la esperada bajo el modelo Binomial, y se visualiza la función de distribución acumulada (FDA) teórica frente a la proporción empírica acumulada.
df_comparacion <- data.frame(
TipoUnidad = rep(tabla_freq$TipoUnidad, 2),
Tipo = rep(c("Modelo Binomial", "Realidad"), each = k),
Probabilidad = c(round(prob_binom, 4), round(tabla_freq$hi_prop, 4))
)
ggplot(df_comparacion, aes(x = TipoUnidad, y = Probabilidad, fill = Tipo)) +
geom_col(position = "dodge", color = "white", width = 0.65) +
scale_fill_manual(values = c("Modelo Binomial" = "#1A5276", "Realidad" = "#AED6F1")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
labs(title = "Gráfica No 2: Relación entre el modelo binomial y la realidad",
x = "Tipo de Unidad",
y = "Probabilidad",
fill = NULL,
caption = pie_label) +
tema_base +
theme(
legend.position = "top",
axis.text.x = element_text(angle = 45, hjust = 1)
)Se contrasta si las categorías de Tipo de Unidad se distribuyen de forma uniforme en la población.
obs <- tabla_freq$ni
prueba_chi <- chisq.test(obs, p = rep(1/k, k))
# Correlación de Pearson entre observado y esperado
cor_pearson <- cor(obs, prueba_chi$expected)
# Valor crítico
vc <- qchisq(0.95, df = k - 1)
# Estado del modelo
estado <- ifelse(prueba_chi$statistic < vc, "ESTADO DEL MODELO: APRUEBA",
"ESTADO DEL MODELO: RECHAZA")
data.frame(
"Métrica de Evaluación" = c("Correlación de Pearson (%)",
"Chi-Cuadrado Calculado (X²)",
"Valor Crítico en Tabla (vc)",
"Resultado de Validación"),
"Resultado Obtenido" = c(paste0(round(cor_pearson * 100, 2), " %"),
round(prueba_chi$statistic, 4),
round(vc, 5),
estado),
check.names = FALSE
) %>%
gt() %>%
tab_header(
title = md("**CUADRO N°2**"),
subtitle = md("Indicadores de Ajuste Estadístico de la Prueba de Bondad")
) %>%
tab_source_note("Autor: Grupo 5") %>%
tab_style(
style = cell_fill(color = "#D5F5E3"),
locations = cells_body(rows = 4)
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(rows = 4)
) %>%
tab_options(
table.width = pct(75),
table.font.size = px(13),
table.font.names = "Arial",
heading.align = "center",
heading.title.font.size = px(15),
heading.subtitle.font.size = px(12),
heading.background.color = "#AAAAAA",
column_labels.font.weight = "bold",
column_labels.background.color = "#CCCCCC",
column_labels.border.top.color = "#AAAAAA",
column_labels.border.bottom.color = "#AAAAAA",
table.border.top.color = "#AAAAAA",
table.border.bottom.color = "#AAAAAA"
) %>%
tab_style(
style = cell_text(color = "white", weight = "bold"),
locations = cells_title(groups = c("title", "subtitle"))
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
)| CUADRO N°2 | |
| Indicadores de Ajuste Estadístico de la Prueba de Bondad | |
| Métrica de Evaluación | Resultado Obtenido |
|---|---|
| Correlación de Pearson (%) | NA % |
| Chi-Cuadrado Calculado (X²) | 29711.3201 |
| Valor Crítico en Tabla (vc) | 18.30704 |
| Resultado de Validación | ESTADO DEL MODELO: RECHAZA |
| Autor: Grupo 5 | |