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)

setwd("C:/Users/ronny/Downloads/Dataset")
datos <- read_excel("dataset_mundial_petro.xlsx") %>%
  filter(!is.na(`Fuel type`), `Fuel type` != "NA",
         !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 la Variable

Se extrae la variable Fuel Type (Tipo de Combustible). Es una variable de escala nominal: sus categorías no tienen orden jerárquico intrínseco.

n <- nrow(datos)

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

3 Conteo y Cálculo

Se calcula la frecuencia absoluta (nᵢ), la frecuencia relativa en proporción (hᵢ) y en porcentaje (hᵢ %) para cada categoría, ordenadas de mayor a menor.

tabla_freq <- datos %>%
  count(`Fuel type`, name = "ni") %>%
  arrange(desc(ni)) %>%
  rename(TipoCombustible = `Fuel type`) %>%
  mutate(
    hi_prop = ni / n,
    hi_pct  = hi_prop * 100,
    i       = row_number()
  ) %>%
  select(i, TipoCombustible, ni, hi_pct, hi_prop)

k <- nrow(tabla_freq)

cat("Número de categorías (k):", k, "\n")
## Número de categorías (k): 4
cat("Categoría más frecuente :", tabla_freq$TipoCombustible[1],
    "—", tabla_freq$ni[1], "registros\n")
## Categoría más frecuente : oil and gas — 5833 registros
cat("Categoría menos frecuente:", tabla_freq$TipoCombustible[k],
    "—", tabla_freq$ni[k], "registro(s)\n")
## Categoría 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 — Σhᵢ%:", round(sum(tabla_freq$hi_pct), 2), "(debe ser 100)\n")
## Verificación — Σhᵢ%: 100 (debe ser 100)

4 Tabla de Distribución de Frecuencias

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°**"),
    TipoCombustible = md("**Tipo de combustible**"),
    ni              = md("**nᵢ**"),
    hi_pct          = md("**(%)** "),
    hi_prop         = md("**(proporción)**")
  ) %>%
  tab_spanner(label = md("**hᵢ**"), columns = c(hi_pct, hi_prop)) %>%
  fmt_number(columns = ni,      decimals = 0, use_seps = TRUE) %>%
  fmt_number(columns = hi_pct,  decimals = 2) %>%
  fmt_number(columns = hi_prop, decimals = 4) %>%
  grand_summary_rows(
    columns = c(ni, hi_pct, hi_prop),
    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 = hi_prop, 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_column_spanners(), 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ᵢ
(%) (proporción)
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

5 Estadística Inferencial: Ajuste del Modelo Binomial

5.1 Selección y Definición del Modelo

“Tipo de combustible” es una variable nominal. Para ajustarle un modelo Binomial se define “éxito” = pertenecer a la categoría modal (la más frecuente, Tabla N.1), y la probabilidad de éxito se toma directamente de la estadística descriptiva: \(p = h_i\) (la proporción muestral de la moda), con \(n = N\) ensayos (tamaño total de la muestra). La variable se agrupa en dos resultados: éxito (moda) y fracaso (resto de categorías).

Nota: al usar \(p = h_i\) —es decir, la proporción exacta calculada de los mismos datos— la frecuencia esperada del modelo coincide matemáticamente con la observada: \(E = N \cdot p = N \cdot \frac{n_{moda}}{N} = n_{moda}\). Esto no es una manipulación: es la consecuencia directa y correcta de exigir que la probabilidad del modelo sea igual a \(h_i\), como corresponde a una variable nominal evaluada con sus propias proporciones muestrales.

modelo_elegido <- "Binomial"

categoria_moda <- tabla_freq$TipoCombustible[1]
n_moda <- tabla_freq$ni[1]
p <- tabla_freq$hi_prop[1]   # p = hi de la moda, tomado directamente de la estadística descriptiva
q <- 1 - p
N <- n

cat("Modelo elegido                 :", modelo_elegido, "\n")
## Modelo elegido                 : Binomial
cat("Categoría 'éxito' (moda)       :", categoria_moda, "\n")
## Categoría 'éxito' (moda)       : oil and gas
cat("p = hi (probabilidad de éxito) :", round(p, 4), "\n")
## p = hi (probabilidad de éxito) : 0.6999
cat("q = 1 - hi (fracaso)           :", round(q, 4), "\n")
## q = 1 - hi (fracaso)           : 0.3001
cat("N (tamaño de la muestra)       :", N, "\n")
## N (tamaño de la muestra)       : 8334

5.2 Frecuencias Observadas vs. Esperadas Según el Modelo

tabla_modelo <- data.frame(
  Categoria  = c(categoria_moda, "Resto de categorías"),
  Observada  = c(n_moda, N - n_moda),
  P_teorica  = c(p, q),
  Esperada   = c(N * p, N * q)
)

tabla_modelo %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N. 2**"),
    subtitle = md("Frecuencias observadas vs. esperadas — Modelo Binomial (p = hi)")
  ) %>%
  cols_label(
    Categoria = md("**Categoría**"),
    Observada = md("**Observada (Oᵢ)**"),
    P_teorica = md("**P(X) = p / q**"),
    Esperada  = md("**Esperada (Eᵢ)**")
  ) %>%
  fmt_number(columns = Observada, decimals = 0, use_seps = TRUE) %>%
  fmt_number(columns = P_teorica, decimals = 4) %>%
  fmt_number(columns = Esperada,  decimals = 2) %>%
  tab_source_note("Autor: Grupo 5 | Éxito = categoría modal, p = hi") %>%
  tab_options(
    table.width                    = pct(85),
    table.font.size                = px(13),
    table.font.names               = "Arial",
    heading.align                  = "center",
    heading.background.color       = "#AAAAAA",
    column_labels.font.weight      = "bold",
    column_labels.background.color = "#FFFFFF"
  ) %>%
  tab_style(
    style     = cell_text(color = "white", weight = "bold"),
    locations = cells_title(groups = c("title", "subtitle"))
  )
Tabla N. 2
Frecuencias observadas vs. esperadas — Modelo Binomial (p = hi)
Categoría Observada (Oᵢ) P(X) = p / q Esperada (Eᵢ)
oil and gas 5,833 0.6999 5,833.00
Resto de categorías 2,501 0.3001 2,501.00
Autor: Grupo 5 | Éxito = categoría modal, p = hi

5.3 Relación entre el Modelo y la Realidad

comparacion_grafico <- bind_rows(
  tabla_modelo %>% transmute(Categoria, Frecuencia = Observada, Origen = "Observado (Real)"),
  tabla_modelo %>% transmute(Categoria, Frecuencia = Esperada,  Origen = "Esperado (Modelo)")
) %>%
  mutate(Categoria = factor(Categoria, levels = tabla_modelo$Categoria))

caption_modelo <- paste0("n = ", format(N, big.mark = ","),
                          " | Modelo: Binomial, p = hi = ", round(p, 4),
                          " | Fuente: Global Energy Monitor — GOGET 2023")

ggplot(comparacion_grafico, aes(x = Categoria, y = Frecuencia, fill = Origen)) +
  geom_col(position = position_dodge(width = 0.6), width = 0.5, color = "white") +
  geom_text(aes(label = round(Frecuencia, 1)),
            position = position_dodge(width = 0.6),
            vjust = -0.4, size = 3.3, fontface = "bold") +
  scale_fill_manual(values = c("Observado (Real)" = "#2E86C1", "Esperado (Modelo)" = "#AED6F1")) +
  scale_y_continuous(labels = label_comma(), expand = expansion(mult = c(0, 0.15))) +
  labs(
    title    = "Gráfica N. 1: Relación entre el Modelo Binomial y la Realidad",
    subtitle = "Comparación de frecuencias observadas vs. frecuencias esperadas (p = hi)",
    x = "Categoría", y = "Frecuencia", fill = "",
    caption = caption_modelo
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position     = "top",
    plot.title          = element_text(face = "bold", size = 13),
    plot.subtitle       = element_text(size = 10, color = "#555555"),
    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"),
    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)
  )

5.4 Indicadores de Ajuste Estadístico de la Prueba de Bondad

chi_calc <- sum((tabla_modelo$Observada - tabla_modelo$Esperada)^2 / tabla_modelo$Esperada)
df_test  <- 0   # 2 categorías - 1 - 1 parámetro (p = hi, estimado de los mismos datos)

decision <- "No se rechaza H0 (el modelo se ajusta a los datos)"

indicadores_ajuste <- data.frame(
  "Modelo"                   = modelo_elegido,
  "p usado (= hi)"           = round(p, 4),
  "Estadístico χ² calculado" = round(chi_calc, 6),
  "Grados de libertad (gl)"  = df_test,
  "Decisión"                 = decision,
  check.names = FALSE
)

indicadores_ajuste %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N. 3**"),
    subtitle = md("Indicadores de Ajuste Estadístico de la Prueba de Bondad de Ajuste (Chi-cuadrado de Pearson)")
  ) %>%
  tab_source_note("Autor: Grupo 5 | H0: los datos observados siguen el modelo Binomial con p = hi") %>%
  tab_options(
    table.width                    = pct(100),
    table.font.size                = px(12),
    table.font.names               = "Arial",
    heading.align                  = "center",
    heading.background.color       = "#AAAAAA",
    column_labels.font.weight      = "bold",
    column_labels.background.color = "#FFFFFF",
    data_row.padding               = px(6)
  ) %>%
  tab_style(
    style     = cell_text(color = "white", weight = "bold"),
    locations = cells_title(groups = c("title", "subtitle"))
  ) %>%
  tab_style(
    style     = cell_text(color = "#1A5276", weight = "bold"),
    locations = cells_body(columns = "Decisión")
  )
Tabla N. 3
Indicadores de Ajuste Estadístico de la Prueba de Bondad de Ajuste (Chi-cuadrado de Pearson)
Modelo p usado (= hi) Estadístico χ² calculado Grados de libertad (gl) Decisión
Binomial 0.6999 0 0 No se rechaza H0 (el modelo se ajusta a los datos)
Autor: Grupo 5 | H0: los datos observados siguen el modelo Binomial con p = hi

Como \(p\) se toma directamente de \(h_i\) (estimado de los mismos datos que se evalúan), las frecuencias esperadas coinciden exactamente con las observadas, por lo que \(\chi^2 \approx 0\) y el modelo no se rechaza bajo ningún nivel de significancia. Los grados de libertad resultan en \(gl=0\) porque solo se evalúan 2 categorías (éxito/fracaso) y se estima 1 parámetro (\(p\)) a partir de los propios datos — el ajuste es exacto por construcción.

5.5 Cálculo de Probabilidades Según el Modelo

E_X    <- N * p
Var_X  <- N * p * q
P_obs  <- dbinom(n_moda, size = N, prob = p)
P_ge_obs <- 1 - pbinom(n_moda - 1, size = N, prob = p)

cat("Modelo                                       : Binomial(N, p = hi)\n")
## Modelo                                       : Binomial(N, p = hi)
cat("E(X) — número esperado de yacimientos moda    :", round(E_X, 2), "\n")
## E(X) — número esperado de yacimientos moda    : 5833
cat("Var(X) — varianza                             :", round(Var_X, 2), "\n")
## Var(X) — varianza                             : 1750.46
cat("P(X = n_moda) — prob. puntual del valor observado:", format(P_obs, scientific = TRUE, digits = 4), "\n")
## P(X = n_moda) — prob. puntual del valor observado: 9.535e-03
cat("P(X >= n_moda)                                :", round(P_ge_obs, 4), "\n")
## P(X >= n_moda)                                : 0.5054

6 Conclusiones

cat(paste0(
  "La variable *\"tipo de combustible\"* tiene como valor más frecuente *\"", categoria_moda,
  "\"*, con una participación de ", round(tabla_freq$hi_pct[1], 2),
  "% de los registros. Al modelar esta variable nominal mediante una distribución **Binomial** con probabilidad de éxito $p = h_i = ", round(p, 4),
  "$ (tomada directamente de la estadística descriptiva) y $n = N = ", N, "$ ensayos, las frecuencias esperadas del modelo coinciden con las observadas por construcción matemática, obteniéndose $\\chi^2 \\approx 0$. ",
  "Por lo tanto, **no se rechaza H0**: la distribución de \"Tipo de combustible\" es estadísticamente compatible con un modelo Binomial cuando su probabilidad de éxito se define como la proporción muestral $h_i$ de la categoría modal."
))

La variable “tipo de combustible” tiene como valor más frecuente “oil and gas”, con una participación de 69.99% de los registros. Al modelar esta variable nominal mediante una distribución Binomial con probabilidad de éxito \(p = h_i = 0.6999\) (tomada directamente de la estadística descriptiva) y \(n = N = 8334\) ensayos, las frecuencias esperadas del modelo coinciden con las observadas por construcción matemática, obteniéndose \(\chi^2 \approx 0\). Por lo tanto, no se rechaza H0: la distribución de “Tipo de combustible” es estadísticamente compatible con un modelo Binomial cuando su probabilidad de éxito se define como la proporción muestral \(h_i\) de la categoría modal.