1 Carga de Datos y Librerías

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(`Fuel type` = trimws(`Fuel type`)) %>%
  filter(!is.na(`Fuel type`), `Fuel type` != "NA", `Fuel type` != "",
         !is.na(`Unit type`), `Unit type` != "NA")

cat("Registros válidos:", nrow(datos), "\n")
## Registros válidos: 8334
cat("Variables:", ncol(datos), "\n")
## Variables: 32

2 Extracción de Variable Aleatoria

Se extrae la variable Tipo de Combustible (Fuel type). La variable es cualitativa nominal, con cuatro categorías definidas en el dataset. El análisis inferencial se basa en modelos de probabilidad discreta aplicados a las frecuencias relativas de cada tipo de combustible.

n <- nrow(datos)

cat("Variable analizada: Tipo de Combustible (Fuel type)\n")
## Variable analizada: Tipo de Combustible (Fuel type)
cat("Total de observaciones (n):", n, "\n")
## Total de observaciones (n): 8334
cat("Categorías identificadas:",
    paste(sort(unique(datos$`Fuel type`)), collapse = ", "), "\n")
## Categorías identificadas: gas, gas and condensate, oil, oil and gas

3 Tabla de Distribución de Frecuencias

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(`Fuel type`, name = "ni") %>%
  arrange(desc(ni)) %>%
  mutate(
    hi_pct  = ni / n * 100,
    Pi      = ni / n,
    i       = row_number()
  ) %>%
  rename(`Tipo de Combustible` = `Fuel type`) %>%
  select(i, `Tipo de Combustible`, ni, hi_pct, Pi)

k <- nrow(tabla_freq)

cat("── Análisis por Tipo de Combustible ──\n")
## ── Análisis por Tipo de Combustible ──
cat("Número de categorías (k)       :", k, "\n")
## Número de categorías (k)       : 4
cat("Tipo más frecuente             :", tabla_freq$`Tipo de Combustible`[1],
    "—", tabla_freq$ni[1], "registros\n")
## Tipo más frecuente             : oil and gas — 5833 registros
cat("Tipo menos frecuente           :", tabla_freq$`Tipo de Combustible`[k],
    "—", tabla_freq$ni[k], "registro(s)\n")
## Tipo menos frecuente           : gas and condensate — 31 registro(s)
cat("Verificación — Σnᵢ             :", sum(tabla_freq$ni), "(debe ser", n, ")\n")
## Verificación — Σnᵢ             : 8334 (debe ser 8334 )
cat("Verificación — ΣPᵢ             :", round(sum(tabla_freq$Pi), 4), "(debe ser 1)\n")
## Verificación — ΣPᵢ             : 1 (debe ser 1)
tabla_freq %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N. 1**"),
    subtitle = md("Distribución de frecuencias por tipo de combustible — yacimientos de petróleo y gas")
  ) %>%
  cols_label(
    i                    = md("**N°**"),
    `Tipo de Combustible` = md("**Tipo de Combustible**"),
    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 tipo de combustible — yacimientos de petróleo y gas
Tipo de Combustible nᵢ hᵢ (%) Pᵢ
1 oil and gas 5,833 69.99 0.6999
2 gas 1,237 14.84 0.1484
3 oil 1,233 14.79 0.1479
4 gas and condensate 31 0.37 0.0037
Total 8,334 100.00 1.0000
Autor: Grupo 5

4 Análisis Gráfico

4.1 Diagrama de Barras — Frecuencia Absoluta

colores_comb <- c(
  "oil and gas"        = "#1A5276",
  "gas"                = "#1E8449",
  "oil"                = "#C0392B",
  "gas and condensate" = "#D68910"
)

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)
  )

comb_graf <- tabla_freq %>%
  mutate(`Tipo de Combustible` = fct_reorder(`Tipo de Combustible`, ni))

ggplot(comb_graf, aes(x = `Tipo de Combustible`, y = ni, fill = `Tipo de Combustible`)) +
  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_comb) +
  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 tipo de combustible",
       x = "Tipo de Combustible", y = "Frecuencia Absoluta (nᵢ)",
       caption = pie_label) +
  tema_base

4.2 Diagrama de Barras — Frecuencia Relativa (Pᵢ)

ggplot(comb_graf, aes(x = `Tipo de Combustible`, y = Pi, fill = `Tipo de Combustible`)) +
  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_comb) +
  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 tipo de combustible",
       x = "Tipo de Combustible", y = "Probabilidad estimada (Pᵢ)",
       caption = pie_label) +
  tema_base


5 Conjetura del Modelo Geométrico

Se seleccionan las tres categorías con mayor concentración de yacimientos (Combustibles Dominantes) para ajustar un Modelo Geométrico. La premisa es que la probabilidad de encontrar un yacimiento del tipo más explotado disminuye conforme la diversificación energética avanza, concentrando la mayor frecuencia en la primera categoría.

# ── Agrupación: Combustibles Dominantes (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 — Combustibles Dominantes ──\n")
## ── Modelo Geométrico — Combustibles Dominantes ──
cat("Parámetro estimado p  :", round(p_geo, 4), "\n")
## Parámetro estimado p  : 0.6999
print(top3 %>% select(`Tipo de Combustible`, valor, ni, Pi, Pi_esp))
## # A tibble: 3 × 5
##   `Tipo de Combustible` valor    ni    Pi Pi_esp
##   <chr>                 <dbl> <int> <dbl>  <dbl>
## 1 oil and gas               0  5833 0.700 0.719 
## 2 gas                       1  1237 0.148 0.216 
## 3 oil                       2  1233 0.148 0.0648

5.1 Test de Pearson

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.9756
cat("Correlación (%)       :", r_geo_pct, "%\n")
## Correlación (%)       : 97.56 %
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(Combustibles Dominantes — 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))

5.2 Test de Chi-cuadrado

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: 1073.65
cat("Umbral de aceptación (α=0.05, gl=", gl_geo, "):", round(umbral_geo, 4), "\n")
## Umbral de aceptación (α=0.05, gl= 1 ): 3.8415
cat("Resultado (Chi ≤ Umbral):", resultado_geo, "\n")
## Resultado (Chi ≤ Umbral): FALSE

5.3 Tabla Resumen del Test

data.frame(
  Variable              = "Combustibles Dominantes",
  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
Combustibles Dominantes Geométrico 97.56 1073.65 3.8415 FALSE
Autor: Grupo 5

5.4 Comparado de lo Observado frente a lo Esperado

top3_long <- rbind(
  data.frame(`Tipo de Combustible` = top3$`Tipo de Combustible`, Tipo = "Observado", Proporcion = top3$Pi,     check.names = FALSE),
  data.frame(`Tipo de Combustible` = top3$`Tipo de Combustible`, Tipo = "Esperado",  Proporcion = top3$Pi_esp, check.names = FALSE)
)

ggplot(top3_long, aes(x = `Tipo de Combustible`, 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       = "Tipo de Combustible",
    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)
  )

5.5 Cálculo de Probabilidades

# ¿Cuál es la probabilidad de que un yacimiento seleccionado al azar pertenezca
# al tipo de combustible más frecuente dentro del bloque de Combustibles Dominantes?
prob_geo <- top3$Pi_esp[1]
cat(sprintf("La probabilidad estimada para el tipo '%s' es de: %.2f%%\n",
            top3$`Tipo de Combustible`[1], prob_geo * 100))
## La probabilidad estimada para el tipo 'oil and gas' es de: 71.93%

6 Conjetura del Modelo Binomial

Se seleccionan las tres categorías con menor frecuencia (Combustibles Emergentes) para ajustar un Modelo Binomial. Se define como “éxito” que un yacimiento pertenezca al tipo de combustible menos frecuente dentro del grupo, y se modela el número de éxitos en n ensayos independientes.

Nota: dado que el dataset solo contiene 4 categorías en total, el bloque de Combustibles Emergentes agrupa las 3 categorías de menor frecuencia, solapándose parcialmente con el bloque anterior. Esto es coherente con el análisis cuando el número de categorías es reducido.

# ── Agrupación: Combustibles Emergentes (últimas 3 categorías) ───────────────
bottom3 <- tabla_freq %>%
  arrange(ni) %>%
  slice(1:3) %>%
  arrange(desc(ni)) %>%
  mutate(valor = row_number() - 1)

# Parámetro p del modelo binomial: probabilidad de "éxito" (tipo base)
p_bin <- bottom3$Pi[nrow(bottom3)]   # Pi del menos frecuente
n_bin <- nrow(bottom3)               # 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)
bottom3 <- bottom3 %>%
  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 — Combustibles Emergentes ──\n")
## ── Modelo Binomial — Combustibles Emergentes ──
cat("Parámetro estimado p  :", round(p_bin, 4), "\n")
## Parámetro estimado p  : 0.0037
cat("Tamaño n de ensayos   :", n_bin, "\n")
## Tamaño n de ensayos   : 3
print(bottom3 %>% select(`Tipo de Combustible`, valor, ni, Pi, Pi_esp))
## # A tibble: 3 × 5
##   `Tipo de Combustible` valor    ni      Pi    Pi_esp
##   <chr>                 <dbl> <int>   <dbl>     <dbl>
## 1 gas                       0  1237 0.148   0.989    
## 2 oil                       1  1233 0.148   0.0111   
## 3 gas and condensate        2    31 0.00372 0.0000414

6.1 Test de Pearson

r_bin     <- cor(bottom3$Pi, bottom3$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.5109
cat("Correlación (%)       :", r_bin_pct, "%\n")
## Correlación (%)       : 51.09 %
ggplot(bottom3, 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(Combustibles 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))

6.2 Test de Chi-cuadrado

chi_bin    <- sum((bottom3$ni - bottom3$ni_esp)^2 / bottom3$ni_esp)
gl_bin     <- nrow(bottom3) - 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: 62290.03
cat("Umbral de aceptación (α=0.05, gl=", gl_bin, "):", round(umbral_bin, 4), "\n")
## Umbral de aceptación (α=0.05, gl= 1 ): 3.8415
cat("Resultado (Chi ≤ Umbral):", resultado_bin, "\n")
## Resultado (Chi ≤ Umbral): FALSE

6.3 Tabla Resumen del Test

data.frame(
  Variable              = "Combustibles 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
Combustibles Emergentes Binomial 51.09 62290.03 3.8415 FALSE
Autor: Grupo 5

6.4 Comparado de lo Observado frente a lo Esperado

bottom3_long <- rbind(
  data.frame(`Tipo de Combustible` = bottom3$`Tipo de Combustible`, Tipo = "Observado", Proporcion = bottom3$Pi,     check.names = FALSE),
  data.frame(`Tipo de Combustible` = bottom3$`Tipo de Combustible`, Tipo = "Esperado",  Proporcion = bottom3$Pi_esp, check.names = FALSE)
)

ggplot(bottom3_long, aes(x = `Tipo de Combustible`, 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       = "Tipo de Combustible",
    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)
  )

6.5 Cálculo de Probabilidades

# ¿Cuál es la probabilidad de que un nuevo yacimiento pertenezca
# al tipo de combustible base (menos frecuente) dentro del bloque de Combustibles Emergentes?
prob_bin <- bottom3$Pi_esp[nrow(bottom3)]
cat(sprintf("La probabilidad estimada para el tipo '%s' es de: %.2f%%\n",
            bottom3$`Tipo de Combustible`[nrow(bottom3)], prob_bin * 100))
## La probabilidad estimada para el tipo 'gas and condensate' es de: 0.00%