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(forcats)
library(stringr)
setwd("C:/Users/ronny/Downloads/Dataset")
datos <- read_excel("dataset_mundial_petro.xlsx") %>%
mutate(Country = trimws(Country)) %>%
filter(!is.na(Country), Country != "NA", Country != "",
!is.na(`Unit type`), `Unit type` != "NA")
cat("Registros válidos:", nrow(datos), "\n")## Registros válidos: 8334
## Variables: 32
Se extrae la variable País (Country) y se realiza la agrupación geográfica mediante una función de asignación continental. La variable resulta ser cualitativa nominal, por lo que el análisis inferencial se basa en modelos de probabilidad discreta aplicados a las frecuencias relativas por continente.
asignar_continente <- function(pais) {
case_when(
pais %in% c("United States", "Canada", "Mexico", "Greenland") ~
"América del Norte",
pais %in% c("Venezuela", "Brazil", "Colombia", "Argentina", "Ecuador",
"Peru", "Bolivia", "Trinidad and Tobago", "Guyana", "Suriname",
"Chile", "Cuba", "Paraguay", "Uruguay", "Panama", "Costa Rica",
"Honduras", "Guatemala", "Nicaragua", "El Salvador",
"Barbados", "Haiti", "Dominican Republic", "Jamaica",
"Belize", "Bahamas") ~
"América del Sur y Caribe",
pais %in% c("Norway", "United Kingdom", "Denmark", "Netherlands", "Germany",
"Poland", "Romania", "Albania", "Serbia", "Croatia", "Hungary",
"Czech Republic", "Austria", "Italy", "France", "Spain", "Greece",
"Bulgaria", "Slovakia", "Ukraine", "Belarus", "Moldova",
"Latvia", "Lithuania", "Estonia", "Finland", "Sweden",
"Switzerland", "Belgium", "Portugal", "Ireland",
"Bosnia and Herzegovina", "North Macedonia", "Montenegro",
"Slovenia", "Kosovo", "Cyprus", "Russia") ~
"Europa y Rusia",
pais %in% c("Kazakhstan", "Azerbaijan", "Turkmenistan", "Uzbekistan",
"Kyrgyzstan", "Tajikistan", "Georgia", "Armenia") ~
"Asia Central y Cáucaso",
pais %in% c("Saudi Arabia", "Iraq", "Iran", "Kuwait",
"United Arab Emirates", "Qatar", "Bahrain", "Oman",
"Yemen", "Syria", "Jordan", "Israel", "Lebanon", "Turkey") ~
"Oriente Medio",
pais %in% c("Nigeria", "Angola", "Libya", "Algeria", "Egypt", "Tunisia",
"Gabon", "Republic of the Congo",
"Democratic Republic of the Congo", "Congo", "Cameroon",
"Sudan", "South Sudan", "Chad", "Equatorial Guinea",
"Mozambique", "Tanzania", "Cote d'Ivoire", "Ivory Coast",
"Ghana", "Niger", "Somalia", "Morocco", "Namibia",
"Madagascar", "Senegal", "Mauritania", "Uganda", "Kenya",
"Ethiopia", "South Africa", "Zambia", "Zimbabwe") ~
"África",
pais %in% c("China", "India", "Indonesia", "Malaysia", "Vietnam",
"Thailand", "Myanmar", "Bangladesh", "Pakistan", "Brunei",
"Philippines", "Japan", "South Korea", "North Korea",
"Taiwan", "Mongolia", "Papua New Guinea", "Timor-Leste",
"East Timor", "Cambodia", "Laos", "Sri Lanka",
"Afghanistan", "Nepal", "Australia", "New Zealand") ~
"Asia Pacífico y Oceanía",
TRUE ~ "Otro/No especificado"
)
}
datos <- datos %>%
mutate(Continente = asignar_continente(Country))
n <- nrow(datos)
cat("Variable analizada: País (Country) — agrupada por Continente\n")## Variable analizada: País (Country) — agrupada por Continente
## Total de observaciones (n): 8334
## Número de países únicos: 104
## Continentes identificados: África, América del Norte, América del Sur y Caribe, Asia Central y Cáucaso, Asia Pacífico y Oceanía, Europa y Rusia, Oriente Medio, Otro/No especificado
Se calcula la distribución de frecuencias absolutas (nᵢ), relativas porcentuales (hᵢ%) y la probabilidad estimada (Pᵢ), equivalente a la frecuencia relativa en proporción. Esta columna Pᵢ sirve como base para el ajuste de modelos de probabilidad.
tabla_freq <- datos %>%
count(Continente, name = "ni") %>%
arrange(desc(ni)) %>%
mutate(
hi_pct = ni / n * 100,
Pi = ni / n,
i = row_number()
) %>%
select(i, Continente, ni, hi_pct, Pi)
k <- nrow(tabla_freq)
cat("── Análisis por Continente ──\n")## ── Análisis por Continente ──
## Número de categorías (k) : 8
## Continente más frecuente : América del Norte — 4468 registros
cat("Continente menos frecuente :", tabla_freq$Continente[k],
"—", tabla_freq$ni[k], "registro(s)\n")## Continente menos frecuente : Otro/No especificado — 35 registro(s)
## Verificación — Σnᵢ : 8334 (debe ser 8334 )
## Verificación — ΣPᵢ : 1 (debe ser 1)
tabla_freq %>%
gt() %>%
tab_header(
title = md("**Tabla N. 1**"),
subtitle = md("Distribución de frecuencias por continente — yacimientos de petróleo y gas")
) %>%
cols_label(
i = md("**N°**"),
Continente = md("**Continente**"),
ni = md("**nᵢ**"),
hi_pct = md("**hᵢ (%)**"),
Pi = md("**Pᵢ**")
) %>%
fmt_number(columns = ni, decimals = 0, use_seps = TRUE) %>%
fmt_number(columns = hi_pct, decimals = 2) %>%
fmt_number(columns = Pi, decimals = 4) %>%
grand_summary_rows(
columns = c(ni, hi_pct, Pi),
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 = Pi, 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_grand_summary())
)| Tabla N. 1 | |||||
| Distribución de frecuencias por continente — yacimientos de petróleo y gas | |||||
| N° | Continente | nᵢ | hᵢ (%) | Pᵢ | |
|---|---|---|---|---|---|
| 1 | América del Norte | 4,468 | 53.61 | 0.5361 | |
| 2 | Europa y Rusia | 1,207 | 14.48 | 0.1448 | |
| 3 | América del Sur y Caribe | 926 | 11.11 | 0.1111 | |
| 4 | Asia Pacífico y Oceanía | 645 | 7.74 | 0.0774 | |
| 5 | África | 630 | 7.56 | 0.0756 | |
| 6 | Oriente Medio | 331 | 3.97 | 0.0397 | |
| 7 | Asia Central y Cáucaso | 92 | 1.10 | 0.0110 | |
| 8 | Otro/No especificado | 35 | 0.42 | 0.0042 | |
| Total | — | — | 8,334 | 100.00 | 1.0000 |
| Autor: Grupo 5 | |||||
colores_cont <- c(
"América del Norte" = "#1A5276",
"América del Sur y Caribe" = "#1E8449",
"Europa y Rusia" = "#C0392B",
"Asia Central y Cáucaso" = "#7D3C98",
"Oriente Medio" = "#D68910",
"África" = "#D4AC0D",
"Asia Pacífico y Oceanía" = "#148F77",
"Otro/No especificado" = "#AAB7B8"
)
pie_label <- paste0("n = ", format(n, big.mark = ","),
" | Fuente: Global Energy Monitor — GOGET 2023")
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 = 20, 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)
)
cont_graf <- tabla_freq %>%
mutate(Continente = fct_reorder(Continente, ni))
ggplot(cont_graf, aes(x = Continente, y = ni, fill = Continente)) +
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_cont) +
scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
scale_y_continuous(labels = label_comma(),
expand = expansion(mult = c(0, 0.12))) +
labs(title = "Gráfica N. 1: Distribución de yacimientos por continente",
x = "Continente", y = "Frecuencia Absoluta (nᵢ)",
caption = pie_label) +
tema_baseggplot(cont_graf, aes(x = Continente, y = Pi, fill = Continente)) +
geom_col(width = 0.55, color = "white") +
geom_text(aes(label = paste0(round(Pi * 100, 2), "%")),
vjust = -0.4, size = 3.5, fontface = "bold") +
scale_fill_manual(values = colores_cont) +
scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
scale_y_continuous(labels = percent_format(accuracy = 0.1),
expand = expansion(mult = c(0, 0.12))) +
labs(title = "Gráfica N. 2: Distribución de probabilidad (Pᵢ) por continente",
x = "Continente", y = "Probabilidad estimada (Pᵢ)",
caption = pie_label) +
tema_baseSe seleccionan las tres regiones con mayor concentración de yacimientos (Mercados Consolidados) para ajustar un Modelo Geométrico. La premisa es que la probabilidad de encontrar un yacimiento de alta densidad disminuye conforme el mercado se satura, concentrando la mayor frecuencia en la primera categoría.
# ── Agrupación: Mercados Consolidados (top 3 por frecuencia) ──────────────────
top3 <- tabla_freq %>%
slice(1:3) %>%
mutate(valor = row_number() - 1) # X = 0, 1, 2 (Geométrica corrida a 0)
# Parámetro p del modelo geométrico: P(X=0) = p => p = Pi del más frecuente
p_geo <- top3$Pi[1]
# Frecuencias esperadas bajo modelo Geométrico: P(X=k) = p*(1-p)^k normalizado
top3 <- top3 %>%
mutate(
Pi_esp = p_geo * (1 - p_geo)^valor,
# Renormalizar sobre las 3 categorías
Pi_esp = Pi_esp / sum(Pi_esp),
ni_esp = Pi_esp * sum(ni)
)
cat("── Modelo Geométrico — Mercados Consolidados ──\n")## ── Modelo Geométrico — Mercados Consolidados ──
## Parámetro estimado p : 0.5361
## # A tibble: 3 × 5
## Continente valor ni Pi Pi_esp
## <chr> <dbl> <int> <dbl> <dbl>
## 1 América del Norte 0 4468 0.536 0.596
## 2 Europa y Rusia 1 1207 0.145 0.276
## 3 América del Sur y Caribe 2 926 0.111 0.128
# Correlación entre frecuencias observadas y esperadas
r_geo <- cor(top3$Pi, top3$Pi_esp)
r_geo_pct <- round(r_geo * 100, 2)
cat("Test de Pearson (r) :", round(r_geo, 4), "\n")## Test de Pearson (r) : 0.9704
## Correlación (%) : 97.04 %
ggplot(top3, aes(x = Pi, y = Pi_esp)) +
geom_point(color = "#1A5276", size = 4) +
geom_smooth(method = "lm", se = FALSE, color = "red", linewidth = 0.8) +
labs(
title = "Gráfica N. 3: Correlación del Modelo Observado y Esperado\n(Mercados Consolidados — Geométrico)",
x = "Frecuencia Observada",
y = "Frecuencia Esperada",
caption = pie_label
) +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
plot.background = element_rect(fill = "white", color = NA))# Chi-cuadrado de bondad de ajuste
chi_geo <- sum((top3$ni - top3$ni_esp)^2 / top3$ni_esp)
gl_geo <- nrow(top3) - 1 - 1 # k - 1 - parámetros estimados
umbral_geo <- qchisq(0.95, df = gl_geo)
resultado_geo <- chi_geo <= umbral_geo
cat("Chi-cuadrado calculado:", round(chi_geo, 4), "\n")## Chi-cuadrado calculado: 289.3603
## Umbral de aceptación (α=0.05, gl= 1 ): 3.8415
## Resultado (Chi ≤ Umbral): FALSE
data.frame(
Variable = "Mercados Consolidados",
Modelo = "Geométrico",
`Test Pearson (%)` = r_geo_pct,
`Chi Cuadrado` = round(chi_geo, 4),
`Umbral Aceptación` = round(umbral_geo, 4),
Resultado = resultado_geo,
check.names = FALSE
) %>%
gt() %>%
tab_header(
title = md("**Tabla N. 2 — Resumen del Test de Bondad al Modelo Geométrico**")
) %>%
tab_source_note("Autor: Grupo 5") %>%
tab_options(
table.width = pct(85),
table.font.size = px(13),
table.font.names = "Arial",
heading.align = "center",
heading.title.font.size = px(14),
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 = "title")
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
)| Tabla N. 2 — Resumen del Test de Bondad al Modelo Geométrico | |||||
| Variable | Modelo | Test Pearson (%) | Chi Cuadrado | Umbral Aceptación | Resultado |
|---|---|---|---|---|---|
| Mercados Consolidados | Geométrico | 97.04 | 289.3603 | 3.8415 | FALSE |
| Autor: Grupo 5 | |||||
top3_long <- rbind(
data.frame(Continente = top3$Continente, Tipo = "Observado", Proporcion = top3$Pi),
data.frame(Continente = top3$Continente, Tipo = "Esperado", Proporcion = top3$Pi_esp)
)
ggplot(top3_long, aes(x = Continente, y = Proporcion, fill = Tipo)) +
geom_col(position = "dodge", width = 0.6, color = "white") +
geom_text(aes(label = round(Proporcion, 3)),
position = position_dodge(width = 0.6),
vjust = -0.4, size = 3.2, fontface = "bold") +
scale_fill_manual(values = c("Observado" = "#AED6F1", "Esperado" = "#1A5276")) +
scale_x_discrete(labels = function(x) str_wrap(x, width = 14)) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N. 4: Comparado de lo Observado frente a lo Esperado (Geométrico)",
x = "Mercado Geoeconómico",
y = "Porcentaje (%)",
fill = NULL,
caption = pie_label
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
legend.position = "top",
plot.background = element_rect(fill = "white", color = NA)
)# ¿Cuál es la probabilidad de que un yacimiento seleccionado al azar pertenezca
# al continente más frecuente dentro del bloque de Mercados Consolidados?
prob_geo <- top3$Pi_esp[1]
cat(sprintf("La probabilidad estimada para el mercado de '%s' es de: %.2f%%\n",
top3$Continente[1], prob_geo * 100))## La probabilidad estimada para el mercado de 'América del Norte' es de: 59.56%
Se seleccionan las cuatro regiones con menor frecuencia (Mercados Emergentes) para ajustar un Modelo Binomial. Se define como “éxito” que un yacimiento pertenezca al continente menos frecuente dentro del grupo, y se modela el número de éxitos en n ensayos independientes.
# ── Agrupación: Mercados Emergentes (últimas 4 categorías) ───────────────────
bottom4 <- tabla_freq %>%
arrange(ni) %>%
slice(1:4) %>%
arrange(desc(ni)) %>%
mutate(valor = row_number() - 1)
# Parámetro p del modelo binomial: probabilidad de "éxito" (continente base)
p_bin <- bottom4$Pi[nrow(bottom4)] # pi del menos frecuente
n_bin <- nrow(bottom4) # número de categorías como tamaño n
# Frecuencias esperadas bajo Binomial: P(X=k) = C(n,k)*p^k*(1-p)^(n-k)
bottom4 <- bottom4 %>%
mutate(
Pi_esp = choose(n_bin, valor) * p_bin^valor * (1 - p_bin)^(n_bin - valor),
Pi_esp = Pi_esp / sum(Pi_esp),
ni_esp = Pi_esp * sum(ni)
)
cat("── Modelo Binomial — Mercados Emergentes ──\n")## ── Modelo Binomial — Mercados Emergentes ──
## Parámetro estimado p : 0.0042
## Tamaño n de ensayos : 4
## # A tibble: 4 × 5
## Continente valor ni Pi Pi_esp
## <chr> <dbl> <int> <dbl> <dbl>
## 1 África 0 630 0.0756 0.983
## 2 Oriente Medio 1 331 0.0397 0.0166
## 3 Asia Central y Cáucaso 2 92 0.0110 0.000105
## 4 Otro/No especificado 3 35 0.00420 0.000000295
r_bin <- cor(bottom4$Pi, bottom4$Pi_esp)
r_bin_pct <- round(r_bin * 100, 2)
cat("Test de Pearson (r) :", round(r_bin, 4), "\n")## Test de Pearson (r) : 0.8882
## Correlación (%) : 88.82 %
ggplot(bottom4, aes(x = Pi, y = Pi_esp)) +
geom_point(color = "#1E8449", size = 4) +
geom_smooth(method = "lm", se = FALSE, color = "red", linewidth = 0.8) +
labs(
title = "Gráfica N. 5: Correlación del Modelo Observado y Esperado\n(Mercados Emergentes — Binomial)",
x = "Frecuencia Observada",
y = "Frecuencia Esperada",
caption = pie_label
) +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
plot.background = element_rect(fill = "white", color = NA))chi_bin <- sum((bottom4$ni - bottom4$ni_esp)^2 / bottom4$ni_esp)
gl_bin <- nrow(bottom4) - 1 - 1
umbral_bin <- qchisq(0.95, df = gl_bin)
resultado_bin <- chi_bin <= umbral_bin
cat("Chi-cuadrado calculado:", round(chi_bin, 4), "\n")## Chi-cuadrado calculado: 3895690
## Umbral de aceptación (α=0.05, gl= 2 ): 5.9915
## Resultado (Chi ≤ Umbral): FALSE
data.frame(
Variable = "Mercados Emergentes",
Modelo = "Binomial",
`Test Pearson (%)` = r_bin_pct,
`Chi Cuadrado` = round(chi_bin, 4),
`Umbral Aceptación` = round(umbral_bin, 4),
Resultado = resultado_bin,
check.names = FALSE
) %>%
gt() %>%
tab_header(
title = md("**Tabla N. 3 — Resumen del Test de Bondad al Modelo Binomial**")
) %>%
tab_source_note("Autor: Grupo 5") %>%
tab_options(
table.width = pct(85),
table.font.size = px(13),
table.font.names = "Arial",
heading.align = "center",
heading.title.font.size = px(14),
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 = "title")
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
)| Tabla N. 3 — Resumen del Test de Bondad al Modelo Binomial | |||||
| Variable | Modelo | Test Pearson (%) | Chi Cuadrado | Umbral Aceptación | Resultado |
|---|---|---|---|---|---|
| Mercados Emergentes | Binomial | 88.82 | 3895690 | 5.9915 | FALSE |
| Autor: Grupo 5 | |||||
bottom4_long <- rbind(
data.frame(Continente = bottom4$Continente, Tipo = "Observado", Proporcion = bottom4$Pi),
data.frame(Continente = bottom4$Continente, Tipo = "Esperado", Proporcion = bottom4$Pi_esp)
)
ggplot(bottom4_long, aes(x = Continente, y = Proporcion, fill = Tipo)) +
geom_col(position = "dodge", width = 0.6, color = "white") +
geom_text(aes(label = round(Proporcion, 3)),
position = position_dodge(width = 0.6),
vjust = -0.4, size = 3.2, fontface = "bold") +
scale_fill_manual(values = c("Observado" = "#A9DFBF", "Esperado" = "#1E8449")) +
scale_x_discrete(labels = function(x) str_wrap(x, width = 14)) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N. 6: Comparado de lo Observado frente a lo Esperado (Binomial)",
x = "Mercado Geoeconómico",
y = "Porcentaje (%)",
fill = NULL,
caption = pie_label
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 12, hjust = 0.5),
legend.position = "top",
plot.background = element_rect(fill = "white", color = NA)
)# ¿Cuál es la probabilidad de que un nuevo yacimiento pertenezca
# al continente base (menos frecuente) dentro del bloque de Mercados Emergentes?
prob_bin <- bottom4$Pi_esp[nrow(bottom4)]
cat(sprintf("La probabilidad estimada para el mercado de '%s' es de: %.2f%%\n",
bottom4$Continente[nrow(bottom4)], prob_bin * 100))## La probabilidad estimada para el mercado de 'Otro/No especificado' es de: 0.00%
```