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
## Variables: 32
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.
## Variable analizada: Tipo de Combustible (Fuel type)
## Total de observaciones (n): 8334
## Categorías identificadas: gas, gas and condensate, oil, oil and gas
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 ──
## 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)
## Verificación — Σnᵢ : 8334 (debe ser 8334 )
## 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 | |||||
| N° | 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 | |||||
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_baseggplot(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_basePara poder ajustar un modelo de probabilidad discreto, la variable nominal Tipo de Combustible 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.
## Variable tratada : rango (i) por frecuencia descendente
## Soporte del modelo : i = 1, 2, ..., 4
## # A tibble: 4 × 4
## i `Tipo de Combustible` ni Pi
## <int> <chr> <int> <dbl>
## 1 1 oil and gas 5833 0.700
## 2 2 gas 1237 0.148
## 3 3 oil 1233 0.148
## 4 4 gas and condensate 31 0.00372
La gráfica de la sección 4 muestra un descenso marcado y sostenido desde el tipo de combustible 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:
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 = 1.4555
## 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
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)
)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))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
## Valor crítico (α=0.05, gl= 2 ): 5.9915
## ¿El modelo geométrico es aceptado?: TRUE
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 | |||||
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%
El comportamiento del Tipo de Combustible se explica con un modelo Geométrico con parámetro 0.6871.