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(tidyr)
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 != "")

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

2 Extracción de Variable Aleatoria

Se extrae la variable País (Country) y se agrupa geográficamente por continente, ya que el número de países individuales es demasiado alto para un análisis de frecuencias manejable. 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): 49212
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

3 Tabla de Distribución de Frecuencias

conteo <- datos %>%
  count(Continente, name = "ni") %>%
  arrange(desc(ni)) %>%
  mutate(
    hi     = ni / n,
    hi_pct = round(hi * 100, 2),
    hi     = round(hi, 4)
  )

k <- nrow(conteo)

cat("Número de categorías (k)    :", k, "\n")
## Número de categorías (k)    : 8
cat("Continente más frecuente    :", conteo$Continente[1], "—", conteo$ni[1], "registros\n")
## Continente más frecuente    : América del Norte — 27191 registros
cat("Continente menos frecuente  :", conteo$Continente[k], "—", conteo$ni[k], "registro(s)\n")
## Continente menos frecuente  : Otro/No especificado — 141 registro(s)
fila_total <- tibble(
  Continente = "TOTAL",
  ni         = sum(conteo$ni),
  hi         = sum(conteo$hi),
  hi_pct     = sum(conteo$hi_pct)
)

bind_rows(conteo, fila_total) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N° 1**"),
    subtitle = md("Distribución de yacimientos por continente")
  ) %>%
  cols_label(
    Continente = "Continente",
    ni         = "Frecuencia (ni)",
    hi         = "Proporción (hi)",
    hi_pct     = "Porcentaje (hi%)"
  ) %>%
  fmt_number(columns = hi,     decimals = 4) %>%
  fmt_number(columns = hi_pct, decimals = 2) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  tab_options(
    table.border.top.color            = "black",
    table.border.bottom.color         = "black",
    column_labels.font.weight         = "bold",
    column_labels.border.top.color    = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    table_body.hlines.color           = "grey",
    table_body.border.bottom.color    = "black"
  )
Tabla N° 1
Distribución de yacimientos por continente
Continente Frecuencia (ni) Proporción (hi) Porcentaje (hi%)
América del Norte 27191 0.5525 55.25
Europa y Rusia 9253 0.1880 18.80
América del Sur y Caribe 6292 0.1279 12.79
Asia Pacífico y Oceanía 2316 0.0471 4.71
África 2182 0.0443 4.43
Oriente Medio 1392 0.0283 2.83
Asia Central y Cáucaso 445 0.0090 0.90
Otro/No especificado 141 0.0029 0.29
TOTAL 49212 1.0000 100.00
Autor: Grupo 5

4 Análisis Gráfico

colores <- colorRampPalette(c("#154360", "#AED6F1"))(k)

tema_base <- theme_minimal(base_size = 12) +
  theme(
    legend.position = "none",
    plot.title      = element_text(face = "bold"),
    axis.title      = element_text(face = "bold"),
    axis.text.x     = element_text(angle = 40, hjust = 1),
    plot.background = element_rect(fill = "white", color = NA)
  )

cont_graf <- conteo %>% mutate(Continente = fct_reorder(Continente, ni, .desc = TRUE))

4.1 Diagrama de Barras — Frecuencia Absoluta

ggplot(cont_graf, aes(x = Continente, y = ni, fill = Continente)) +
  geom_col(width = 0.6, color = "white") +
  geom_text(aes(label = ni), vjust = -0.4, size = 3.2, fontface = "bold") +
  scale_fill_manual(values = colores) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(
    title   = "Gráfica N°1: Frecuencia Absoluta por Continente",
    x = "Continente", y = "Frecuencia (ni)",
    caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
  ) +
  tema_base

4.2 Diagrama de Barras — Frecuencia Relativa (hi)

ggplot(cont_graf, aes(x = Continente, y = hi_pct, fill = Continente)) +
  geom_col(width = 0.6, color = "white") +
  geom_text(aes(label = paste0(hi_pct, "%")), vjust = -0.4, size = 3.2, fontface = "bold") +
  scale_fill_manual(values = colores) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(
    title   = "Gráfica N°2: Frecuencia Relativa (hi) por Continente",
    x = "Continente", y = "Frecuencia Relativa (%)",
    caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
  ) +
  tema_base

La gráfica muestra un descenso marcado y progresivo desde el continente más frecuente hacia el menos frecuente, lo que sugiere que un modelo Geométrico es adecuado para describir esta distribución.


5 Conjetura del Modelo Geométrico

Se ordenan las categorías de mayor a menor frecuencia y se les asigna un rango i = 1, 2, …, k. Se estima el parámetro p por método de momentos, usando la media observada de los rangos ponderada por hi.

conteo_modelo <- conteo %>% arrange(desc(ni))
conteo_modelo$ID <- 1:nrow(conteo_modelo)

media_observada <- sum(conteo_modelo$ID * conteo_modelo$hi)
p_estimado <- 1 / media_observada
cat("Media observada de rangos =", round(media_observada, 4), "\n")
## Media observada de rangos = 1.9781
cat("Parámetro estimado p =", round(p_estimado, 4), "\n")
## Parámetro estimado p = 0.5055
prob_geom <- p_estimado * (1 - p_estimado)^(conteo_modelo$ID - 1)
prob_geom <- prob_geom / sum(prob_geom)

conteo_modelo$hi_modelo     <- round(prob_geom, 4)
conteo_modelo$hi_modelo_pct <- round(prob_geom * 100, 2)
conteo_modelo$ni_modelo     <- round(prob_geom * n, 0)

print(conteo_modelo %>% select(Continente, ID, ni, hi, hi_modelo))
## # A tibble: 8 × 5
##   Continente                  ID    ni     hi hi_modelo
##   <chr>                    <int> <int>  <dbl>     <dbl>
## 1 América del Norte            1 27191 0.552     0.507 
## 2 Europa y Rusia               2  9253 0.188     0.251 
## 3 América del Sur y Caribe     3  6292 0.128     0.124 
## 4 Asia Pacífico y Oceanía      4  2316 0.0471    0.0613
## 5 África                       5  2182 0.0443    0.0303
## 6 Oriente Medio                6  1392 0.0283    0.015 
## 7 Asia Central y Cáucaso       7   445 0.009     0.0074
## 8 Otro/No especificado         8   141 0.0029    0.0037

5.1 Gráfica comparativa observado vs modelo

df_comparativo <- conteo_modelo %>%
  select(Continente, hi_pct, hi_modelo_pct) %>%
  pivot_longer(cols = c(hi_pct, hi_modelo_pct), names_to = "Origen", values_to = "Valor") %>%
  mutate(Origen = ifelse(Origen == "hi_pct", "Realidad", "Modelo"))

df_comparativo$Continente <- factor(df_comparativo$Continente, levels = conteo_modelo$Continente)

ggplot(df_comparativo, aes(x = Continente, y = Valor, fill = Origen)) +
  geom_bar(stat = "identity", position = "dodge", color = "white") +
  scale_fill_manual(values = c("Modelo" = "skyblue", "Realidad" = "#154360")) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
  labs(
    title    = "Gráfica N°3: Modelo Geométrico comparado con la Realidad — Continente",
    subtitle = paste0("p estimado = ", round(p_estimado, 4)),
    x = "Continente (orden por frecuencia)", y = "Probabilidad (%)", fill = "Origen"
  ) +
  tema_base +
  theme(legend.position = "top", axis.text.x = element_text(angle = 40, hjust = 1))


6 Test de Bondad de Ajuste

6.1 Test de Pearson

Fo <- conteo_modelo$hi
Fe <- conteo_modelo$hi_modelo

r_pearson <- cor(Fo, Fe) * 100
cat("Correlación de Pearson (%):", round(r_pearson, 4), "\n")
## Correlación de Pearson (%): 98.6536
plot(Fo, Fe,
     main = "Gráfica N°4: Correlación Modelo Observado y Esperado",
     xlab = "Frecuencia Observada (hi)", ylab = "Frecuencia Esperada (hi modelo)",
     pch = 19, col = "#154360")
abline(lm(Fe ~ 0 + Fo), col = "red", lwd = 2)
legend("topleft", legend = paste0("r = ", round(r_pearson, 2), "%"), bty = "n")

6.2 Test Chi-Cuadrado

chi2_calc <- sum(((Fo - Fe)^2) / Fe)
gl        <- length(Fo) - 2
chi2_crit <- qchisq(0.95, gl)

cat("Chi-Cuadrado calculado:", round(chi2_calc, 4), "\n")
## Chi-Cuadrado calculado: 0.042
cat("Valor crítico (α=0.05, gl=", gl, "):", round(chi2_crit, 4), "\n")
## Valor crítico (α=0.05, gl= 6 ): 12.5916
cat("¿El modelo geométrico es aceptado?:", chi2_calc < chi2_crit, "\n")
## ¿El modelo geométrico es aceptado?: TRUE

6.2.1 Tabla resumen del test

tabla_test <- data.frame(
  Variable               = "Continente (País)",
  `Test Pearson (%)`     = round(r_pearson, 2),
  `Chi Cuadrado`         = round(chi2_calc, 4),
  `Umbral de Aceptación` = round(chi2_crit, 4),
  Resultado              = ifelse(chi2_calc < chi2_crit, "Modelo Aceptado", "Modelo Rechazado"),
  check.names = FALSE
)

tabla_test %>%
  gt() %>%
  tab_header(title = md("**Tabla N°2: Resumen del Test de Bondad al Modelo Geométrico**")) %>%
  tab_source_note(source_note = "Autor: Grupo 5") %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(
    table.border.top.color            = "black",
    table.border.bottom.color         = "black",
    column_labels.border.top.color    = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    table_body.border.bottom.color    = "black"
  )
Tabla N°2: Resumen del Test de Bondad al Modelo Geométrico
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Continente (País) 98.65 0.042 12.5916 Modelo Aceptado
Autor: Grupo 5

7 Cálculo de Probabilidades

Al haber sido estimado el parámetro p directamente desde las frecuencias observadas, la probabilidad del modelo (hi_modelo) resulta prácticamente igual a la proporción observada (hi) de cada continente.

cat(sprintf("P(Continente = '%s') según el modelo = %.2f%% (observado = %.2f%%)\n",
            conteo_modelo$Continente[1], conteo_modelo$hi_modelo_pct[1], conteo_modelo$hi_pct[1]))
## P(Continente = 'América del Norte') según el modelo = 50.73% (observado = 55.25%)
top2_modelo <- sum(conteo_modelo$hi_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 = 75.82%

8 Intervalo de Confianza

Se calcula el intervalo de confianza al 95% para la proporción del continente más frecuente, usando la aproximación normal para proporciones.

p_hat <- conteo$hi[1]
continente_frecuente <- conteo$Continente[1]

z      <- qnorm(0.975)
margen <- z * sqrt(p_hat * (1 - p_hat) / n)

ic_inf <- p_hat - margen
ic_sup <- p_hat + margen

cat("Continente más frecuente:", continente_frecuente, "\n")
## Continente más frecuente: América del Norte
cat("Intervalo de confianza al 95%: (",
    round(ic_inf * 100, 2), "% ,", round(ic_sup * 100, 2), "% )\n")
## Intervalo de confianza al 95%: ( 54.81 % , 55.69 % )

9 Conclusión

Tras agrupar la variable País por continente, la categoría América del Norte concentra el 55.25% de los yacimientos registrados. Al ajustar un modelo Geométrico (con parámetro 0.5055 estimado por método de momentos), se obtuvo un Chi-cuadrado de 0.042 frente a un valor crítico de 12.5916, por lo que el modelo es aceptado, con una correlación de Pearson del 98.65%. El intervalo de confianza al 95% para la categoría más frecuente (América del Norte) se ubica entre 54.81% y 55.69%.