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
## Variables: 32
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.
## Variable analizada: Fuel Type
## Total de observaciones (n): 8334
## Categorías presentes: oil and gas, gas, oil, gas and condensate
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)
## Verificación — Σnᵢ: 8334 (debe ser 8334 )
## Verificación — Σhᵢ%: 100 (debe ser 100)
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 | |||||
| N° | 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 | |||||
“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
## Categoría 'éxito' (moda) : oil and gas
## p = hi (probabilidad de éxito) : 0.6999
## q = 1 - hi (fracaso) : 0.3001
## N (tamaño de la muestra) : 8334
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 | |||
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)
)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.
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)
## E(X) — número esperado de yacimientos moda : 5833
## 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
## P(X >= n_moda) : 0.5054
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.