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

La gráfica muestra un descenso marcado desde el tipo de combustible más frecuente hacia el menos frecuente, lo que sugiere que un modelo Geométrico es adecuado para describir esta distribución, sin necesidad de fraccionar la variable en subgrupos.


5 Conjetura del Modelo Geométrico

A diferencia de un ajuste por subgrupos (top/bottom), aquí se ajusta el modelo Geométrico sobre las k = 4 categorías completas de la variable. Se usa el orden por frecuencia descendente ya presente en tabla_freq (columna i) y se estima el parámetro p por método de momentos, a partir de la media de los rangos ponderada por Pᵢ.

tabla_modelo <- tabla_freq

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 = 1.4555
cat("Parámetro estimado p =", round(p_estimado, 4), "\n")
## Parámetro estimado p = 0.6871
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(`Tipo de Combustible`, i, ni, Pi, Pi_modelo))
## # A tibble: 4 × 5
##   `Tipo de Combustible`     i    ni      Pi Pi_modelo
##   <chr>                 <int> <int>   <dbl>     <dbl>
## 1 oil and gas               1  5833 0.700      0.694 
## 2 gas                       2  1237 0.148      0.217 
## 3 oil                       3  1233 0.148      0.0679
## 4 gas and condensate        4    31 0.00372    0.0213

5.1 Gráfica comparativa observado vs modelo

comparativo_long <- rbind(
  data.frame(`Tipo de Combustible` = tabla_modelo$`Tipo de Combustible`, Tipo = "Observado", Proporcion = tabla_modelo$Pi,        check.names = FALSE),
  data.frame(`Tipo de Combustible` = tabla_modelo$`Tipo de Combustible`, Tipo = "Esperado",  Proporcion = tabla_modelo$Pi_modelo, check.names = FALSE)
)
comparativo_long$`Tipo de Combustible` <- factor(comparativo_long$`Tipo de Combustible`,
                                                   levels = tabla_modelo$`Tipo de Combustible`)

ggplot(comparativo_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. 3: Modelo Geométrico comparado con la Realidad — Tipo de Combustible",
    subtitle = paste0("p estimado = ", round(p_estimado, 4)),
    x        = "Tipo de Combustible", y = "Probabilidad",
    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 Test de Bondad de Ajuste

6.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 (%): 97.9777
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(Tipo de Combustible — 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))

6.2 Test de 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.1307
cat("Valor crítico (α=0.05, gl=", gl, "):", round(chi_crit, 4), "\n")
## Valor crítico (α=0.05, gl= 2 ): 5.9915
cat("¿El modelo geométrico es aceptado?:", resultado, "\n")
## ¿El modelo geométrico es aceptado?: TRUE

6.2.1 Tabla Resumen del Test

data.frame(
  Variable              = "Tipo de Combustible",
  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
Tipo de Combustible Geométrico 97.98 0.1307 5.9915 Modelo Aceptado
Autor: Grupo 5

7 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 tipo de combustible.

cat(sprintf("P(Tipo de Combustible = '%s') según el modelo = %.2f%% (observado = %.2f%%)\n",
            tabla_modelo$`Tipo de Combustible`[1], tabla_modelo$Pi_modelo_pct[1], tabla_modelo$hi_pct[1]))
## P(Tipo de Combustible = 'oil and gas') según el modelo = 69.37% (observado = 69.99%)
top2_modelo <- sum(tabla_modelo$Pi_modelo_pct[1:2])
cat(sprintf("P(Tipo de Combustible pertenece a los 2 más frecuentes) según el modelo = %.2f%%\n", top2_modelo))
## P(Tipo de Combustible pertenece a los 2 más frecuentes) según el modelo = 91.08%

8 Intervalo de Confianza

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

p_hat <- tabla_freq$Pi[1]
combustible_frecuente <- tabla_freq$`Tipo de Combustible`[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("Tipo de combustible más frecuente:", combustible_frecuente, "\n")
## Tipo de combustible más frecuente: oil and gas
cat("Intervalo de confianza al 95%: (",
    round(ic_inf * 100, 2), "% ,", round(ic_sup * 100, 2), "% )\n")
## Intervalo de confianza al 95%: ( 69.01 % , 70.97 % )

9 Conclusión

En la variable Tipo de Combustible, la categoría oil and gas concentra el 69.99% de los yacimientos registrados. Al ajustar un modelo Geométrico sobre las 4 categorías completas (con parámetro 0.6871 estimado por método de momentos), se obtuvo un Chi-cuadrado de 0.1307 frente a un valor crítico de 5.9915, por lo que el modelo es aceptado, con una correlación de Pearson del 97.98%. El intervalo de confianza al 95% para la categoría más frecuente (oil and gas) se ubica entre 69.01% y 70.97%.