1 Carga de 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)

2 Carga de Datos

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
cat("Variables:", ncol(datos), "\n")
## Variables: 32

3 Selección de Variable Aleatoria

Se extrae la variable País (Country). Dado que el número de países individuales es demasiado alto para un análisis de frecuencias manejable, se agrupa geográficamente por continente mediante una función de asignación estándar. La variable resultante (Continente) es cualitativa nominal.

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
cat("Total de observaciones (n):", n, "\n")
## Total de observaciones (n): 8334
cat("Número de países únicos:", n_distinct(datos$Country), "\n")
## Número de países únicos: 104
cat("Continentes identificados:",
    paste(sort(unique(datos$Continente)), collapse = ", "), "\n")
## 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

4 Tabla de Distribución de Frecuencia

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 ──
cat("Número de categorías (k)       :", k, "\n")
## Número de categorías (k)       : 8
cat("Continente más frecuente       :", tabla_freq$Continente[1],
    "—", tabla_freq$ni[1], "registros\n")
## 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)
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 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
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

5 Gráfica de Distribución de Frecuencia

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

5.1 Diagrama de Barras — Frecuencia Absoluta

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_base

5.2 Diagrama de Barras — Frecuencia Relativa (Pᵢ)

ggplot(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_base


6 Tratamiento de Datos

Para poder ajustar un modelo de probabilidad discreto, la variable nominal Continente se transforma en una variable ordinal auxiliar i, correspondiente al rango (posición) de cada categoría cuando se ordenan de mayor a menor frecuencia. Este rango es el soporte que usará el modelo Geométrico: i = 1, 2, …, k.

tabla_modelo <- tabla_freq

cat("Variable tratada    : rango (i) por frecuencia descendente\n")
## Variable tratada    : rango (i) por frecuencia descendente
cat("Soporte del modelo   : i = 1, 2, ...,", k, "\n")
## Soporte del modelo   : i = 1, 2, ..., 8
print(tabla_modelo %>% select(i, Continente, ni, Pi))
## # A tibble: 8 × 4
##       i Continente                  ni      Pi
##   <int> <chr>                    <int>   <dbl>
## 1     1 América del Norte         4468 0.536  
## 2     2 Europa y Rusia            1207 0.145  
## 3     3 América del Sur y Caribe   926 0.111  
## 4     4 Asia Pacífico y Oceanía    645 0.0774 
## 5     5 África                     630 0.0756 
## 6     6 Oriente Medio              331 0.0397 
## 7     7 Asia Central y Cáucaso      92 0.0110 
## 8     8 Otro/No especificado        35 0.00420

7 Conjetura

La gráfica de la sección 5 muestra un descenso marcado y sostenido desde el continente más frecuente hacia el menos frecuente, sin subgrupos ni saltos abruptos. Este patrón de decaimiento es característico de una distribución Geométrica, que modela la probabilidad de “éxito” en el primer intento de una secuencia de ensayos independientes.

Se plantea entonces la siguiente conjetura:

  • H₀: La variable Continente (País) se distribuye según un modelo Geométrico de parámetro p.
  • H₁: La variable Continente (País) no se distribuye según un modelo Geométrico.

8 Parámetros

Se estima el parámetro p del modelo Geométrico por método de momentos, a partir de la media de los rangos (i) ponderada por Pᵢ.

media_observada <- sum(tabla_modelo$i * tabla_modelo$Pi)
p_estimado <- 1 / media_observada

cat("Media observada de rangos =", round(media_observada, 4), "\n")
## Media observada de rangos = 2.1958
cat("Parámetro estimado p =", round(p_estimado, 4), "\n")
## Parámetro estimado p = 0.4554
Pi_modelo <- p_estimado * (1 - p_estimado)^(tabla_modelo$i - 1)
Pi_modelo <- Pi_modelo / sum(Pi_modelo)   # normalizado sobre las k categorías

tabla_modelo$Pi_modelo     <- round(Pi_modelo, 4)
tabla_modelo$Pi_modelo_pct <- round(Pi_modelo * 100, 2)
tabla_modelo$ni_modelo     <- round(Pi_modelo * n, 0)

print(tabla_modelo %>% select(Continente, i, ni, Pi, Pi_modelo))
## # A tibble: 8 × 5
##   Continente                   i    ni      Pi Pi_modelo
##   <chr>                    <int> <int>   <dbl>     <dbl>
## 1 América del Norte            1  4468 0.536      0.459 
## 2 Europa y Rusia               2  1207 0.145      0.250 
## 3 América del Sur y Caribe     3   926 0.111      0.136 
## 4 Asia Pacífico y Oceanía      4   645 0.0774     0.0741
## 5 África                       5   630 0.0756     0.0404
## 6 Oriente Medio                6   331 0.0397     0.022 
## 7 Asia Central y Cáucaso       7    92 0.0110     0.012 
## 8 Otro/No especificado         8    35 0.00420    0.0065

9 Sobreposición de la Realidad con el Modelo

comparativo_long <- rbind(
  data.frame(Continente = tabla_modelo$Continente, Tipo = "Observado", Proporcion = tabla_modelo$Pi),
  data.frame(Continente = tabla_modelo$Continente, Tipo = "Esperado",  Proporcion = tabla_modelo$Pi_modelo)
)
comparativo_long$Continente <- factor(comparativo_long$Continente,
                                       levels = tabla_modelo$Continente)

ggplot(comparativo_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. 3: Modelo Geométrico comparado con la Realidad — Continente",
    subtitle = paste0("p estimado = ", round(p_estimado, 4)),
    x        = "Continente", y = "Probabilidad",
    fill     = NULL, caption = pie_label
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title      = element_text(face = "bold", size = 12, hjust = 0.5),
    axis.text.x     = element_text(angle = 20, hjust = 1),
    legend.position = "top",
    plot.background = element_rect(fill = "white", color = NA)
  )


10 Test de Bondad

10.1 Test de Pearson

Fo <- tabla_modelo$Pi
Fe <- tabla_modelo$Pi_modelo

r_pearson <- cor(Fo, Fe) * 100
cat("Correlación de Pearson (%):", round(r_pearson, 4), "\n")
## Correlación de Pearson (%): 95.3913
ggplot(data.frame(Fo, Fe), aes(x = Fo, y = Fe)) +
  geom_point(color = "#1A5276", size = 4) +
  geom_smooth(method = "lm", se = FALSE, color = "red", linewidth = 0.8) +
  labs(
    title   = "Gráfica N. 4: Correlación del Modelo Observado y Esperado\n(Continente — Geométrico)",
    x       = "Frecuencia Observada (Pᵢ)",
    y       = "Frecuencia Esperada (Pᵢ modelo)",
    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))

10.2 Test Chi-cuadrado

chi_calc  <- sum(((Fo - Fe)^2) / Fe)
gl        <- k - 2
chi_crit  <- qchisq(0.95, df = gl)
resultado <- chi_calc < chi_crit

cat("Chi-Cuadrado calculado:", round(chi_calc, 4), "\n")
## Chi-Cuadrado calculado: 0.1077
cat("Valor crítico (α=0.05, gl=", gl, "):", round(chi_crit, 4), "\n")
## Valor crítico (α=0.05, gl= 6 ): 12.5916
cat("¿El modelo geométrico es aceptado?:", resultado, "\n")
## ¿El modelo geométrico es aceptado?: TRUE
data.frame(
  Variable              = "Continente (País)",
  Modelo                = "Geométrico",
  `Test Pearson (%)`    = round(r_pearson, 2),
  `Chi Cuadrado`        = round(chi_calc, 4),
  `Umbral Aceptación`   = round(chi_crit, 4),
  Resultado             = ifelse(resultado, "Modelo Aceptado", "Modelo Rechazado"),
  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
Continente (País) Geométrico 95.39 0.1077 12.5916 Modelo Aceptado
Autor: Grupo 5

11 Cálculo de Probabilidades

Al estimarse el parámetro p directamente desde las frecuencias observadas, la probabilidad del modelo (Pᵢ_modelo) resulta prácticamente igual a la proporción observada (Pᵢ) de cada continente.

cat(sprintf("P(Continente = '%s') según el modelo = %.2f%% (observado = %.2f%%)\n",
            tabla_modelo$Continente[1], tabla_modelo$Pi_modelo_pct[1], tabla_modelo$hi_pct[1]))
## P(Continente = 'América del Norte') según el modelo = 45.90% (observado = 53.61%)
top2_modelo <- sum(tabla_modelo$Pi_modelo_pct[1:2])
cat(sprintf("P(Continente pertenece a los 2 más frecuentes) según el modelo = %.2f%%\n", top2_modelo))
## P(Continente pertenece a los 2 más frecuentes) según el modelo = 70.89%

12 Conclusión

El comportamiento de la variable País (agrupada por continente) se explica con un modelo Geométrico con un parámetro de 0.4554.