library(readxl)
library(dplyr)
library(tidyr)
library(gt)
library(ggplot2)
library(scales)
library(forcats)
datos <- read_excel("dataset_mundial_petro.xlsx")
cat("Número de registros:", nrow(datos), "\n")
## Número de registros: 8334
cat("Número de variables:", ncol(datos), "\n")
## Número de variables: 23
La variable Fuel type indica el tipo de hidrocarburo que produce cada yacimiento. Tiene 4 categorías, sin valores N/S. Se ordena de forma lógica: primero los combustibles “puros” y luego las combinaciones.
n_total <- nrow(datos)
datos_fuel <- datos %>% filter(!is.na(`Fuel type`) & `Fuel type` != "N/S")
n <- nrow(datos_fuel)
cat("Registros excluidos por N/S o vacío:", n_total - n, "\n")
## Registros excluidos por N/S o vacío: 0
cat("Número de registros válidos:", n, "\n")
## Número de registros válidos: 8334
datos_fuel <- datos_fuel %>%
mutate(Tipo = recode(`Fuel type`,
"oil" = "Petróleo",
"gas" = "Gas",
"oil and gas" = "Petróleo y Gas",
"gas and condensate" = "Gas y Condensado"
))
# Orden lógico (no por frecuencia): combustibles puros primero, luego mezclas
orden_labels <- c("Petróleo", "Gas", "Petróleo y Gas", "Gas y Condensado")
datos_fuel$Tipo <- factor(datos_fuel$Tipo, levels = orden_labels, ordered = TRUE)
conteo <- as.data.frame(table(datos_fuel$Tipo)) %>%
rename(Estado = Var1, ni = Freq) %>%
mutate(
hi = round(ni / n, 4),
hi_pct = round(ni / n * 100, 2)
)
k <- nrow(conteo)
cat("Total de categorías:", k, "\n")
## Total de categorías: 4
cat("Categoría más frecuente:", conteo$Estado[which.max(conteo$ni)],
"con", max(conteo$ni), "registros\n")
## Categoría más frecuente: 3 con 5833 registros
cat("Categoría menos frecuente:", conteo$Estado[which.min(conteo$ni)],
"con", min(conteo$ni), "registro(s)\n")
## Categoría menos frecuente: 4 con 31 registro(s)
fila_total <- tibble(
Estado = "TOTAL",
ni = sum(conteo$ni),
hi = sum(conteo$hi),
hi_pct = sum(conteo$hi_pct)
)
tdf_final <- bind_rows(conteo %>% mutate(Estado = as.character(Estado)), fila_total)
tdf_final %>%
gt() %>%
tab_header(
title = md("**Tabla N° 1**"),
subtitle = md("Distribución de yacimientos según tipo de combustible")
) %>%
cols_label(
Estado = "Tipo de Combustible",
ni = "Frecuencia (ni)",
hi = "Proporción (hi)",
hi_pct = "Porcentaje (hi%)"
) %>%
fmt_number(columns = hi, decimals = 4) %>%
fmt_number(columns = hi_pct, decimals = 2) %>%
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",
table.border.top.style = "solid",
table.border.bottom.style = "solid",
column_labels.font.weight = "bold",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "grey",
table_body.border.bottom.color = "black"
)
| Tabla N° 1 | |||
| Distribución de yacimientos según tipo de combustible | |||
| Tipo de Combustible | Frecuencia (ni) | Proporción (hi) | Porcentaje (hi%) |
|---|---|---|---|
| Petróleo | 1233 | 0.1479 | 14.79 |
| Gas | 1237 | 0.1484 | 14.84 |
| Petróleo y Gas | 5833 | 0.6999 | 69.99 |
| Gas y Condensado | 31 | 0.0037 | 0.37 |
| TOTAL | 8334 | 0.9999 | 99.99 |
| Autor: Grupo 5 | |||
colores <- colorRampPalette(c("#2E86C1", "#AED6F1"))(k)
ggplot(conteo, aes(x = Estado, y = ni, fill = Estado)) +
geom_col(width = 0.6, color = "white") +
geom_text(aes(label = ni), vjust = -0.4, size = 3.2, fontface = "bold") +
scale_x_discrete(limits = orden_labels) +
scale_fill_manual(values = colores) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N°1: Frecuencia Absoluta por Tipo de Combustible",
x = "Tipo de Combustible",
y = "Frecuencia (ni)",
caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(conteo, aes(x = Estado, y = hi_pct, fill = Estado)) +
geom_col(width = 0.6, color = "white") +
geom_text(aes(label = paste0(hi_pct, "%")), vjust = -0.4, size = 3.2, fontface = "bold") +
scale_x_discrete(limits = orden_labels) +
scale_fill_manual(values = colores) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N°2: Frecuencia Relativa (Pi) por Tipo de Combustible",
x = "Tipo de Combustible",
y = "Frecuencia Relativa (%)",
caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1))
El orden lógico de las secciones anteriores no es apto para ajustar un modelo Geométrico. Por eso, solo para este ajuste, se reordenan las categorías por frecuencia descendente (sin alterar la tabla ni los gráficos ya presentados).
conteo_modelo <- conteo %>%
mutate(Estado = as.character(Estado)) %>%
arrange(desc(ni))
conteo_modelo$ID <- 1:nrow(conteo_modelo)
# Estimación del parámetro p por método de momentos
media_observada <- sum(conteo_modelo$ID * conteo_modelo$hi)
p_estimado <- 1 / media_observada
cat("Parámetro estimado p =", round(p_estimado, 4), "\n")
## Parámetro estimado p = 0.6872
# Probabilidades del modelo geométrico
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)
df_comparativo <- conteo_modelo %>%
select(Estado, 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$Estado <- factor(df_comparativo$Estado, levels = conteo_modelo$Estado)
ggplot(df_comparativo, aes(x = Estado, y = Valor, fill = Origen)) +
geom_bar(stat = "identity", position = "dodge", color = "white") +
scale_fill_manual(values = c("Modelo" = "skyblue", "Realidad" = "#2E4053")) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
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 (orden por frecuencia)",
y = "Probabilidad (%)",
fill = "Origen"
)
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 (%): 97.9821
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 = "#2E4053")
abline(lm(Fe ~ 0 + Fo), col = "red", lwd = 2)
legend("topleft",
legend = paste0("r = ", round(r_pearson, 2), "%"),
bty = "n")
chi2_calc <- sum(((Fo - Fe)^2) / Fe)
gl <- length(Fo) - 2
chi2_crit <- qchisq(0.95, gl)
cat("Chi-Cuadrado:", round(chi2_calc, 4), "\n")
## Chi-Cuadrado: 0.1304
cat("Valor Crítico:", round(chi2_crit, 4), "\n")
## Valor Crítico: 5.9915
cat("¿El modelo geométrico es aceptado?:", chi2_calc < chi2_crit, "\n")
## ¿El modelo geométrico es aceptado?: TRUE
tabla_test <- data.frame(
Variable = "Tipo de Combustible",
`Test Pearson (%)`= round(r_pearson, 2),
`Chi Cuadrado` = round(chi2_calc, 2),
`Umbral de Aceptación` = round(chi2_crit, 2),
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 de Probabilidad**")
) %>%
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 de Probabilidad | ||||
| Variable | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación | Resultado |
|---|---|---|---|---|
| Tipo de Combustible | 97.98 | 0.13 | 5.99 | Modelo Aceptado |
| Autor: Grupo 5 | ||||
prob_mixto <- conteo$hi_pct[conteo$Estado == "Petróleo y Gas"]
cat("Probabilidad de ser un yacimiento de tipo 'Petróleo y Gas':", prob_mixto, "%\n")
## Probabilidad de ser un yacimiento de tipo 'Petróleo y Gas': 69.99 %
pozos_puros <- sum(conteo$ni[conteo$Estado %in% c("Petróleo", "Gas")])
cat("Yacimientos de un solo tipo de combustible (Petróleo o Gas):", pozos_puros, "\n")
## Yacimientos de un solo tipo de combustible (Petróleo o Gas): 2470
Se calcula el intervalo de confianza al 95% para la proporción de la categoría más frecuente, usando la aproximación normal para proporciones.
idx_max <- which.max(conteo$hi)
p_hat <- conteo$hi[idx_max]
categoria_frecuente <- as.character(conteo$Estado[idx_max])
z <- qnorm(0.975)
margen <- z * sqrt(p_hat * (1 - p_hat) / n)
ic_inf <- p_hat - margen
ic_sup <- p_hat + margen
cat("Categoría más frecuente:", categoria_frecuente, "\n")
## Categoría más frecuente: Petróleo y 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 % )
La variable Fuel type muestra que la categoría Petróleo y Gas concentra 69.99% de los yacimientos. Al reordenar por frecuencia descendente para el ajuste del modelo, el modelo Geométrico (p = 0.6872) obtuvo un Chi-cuadrado de 0.1304 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 (Petróleo y Gas) se ubica entre 69.01% y 70.97%.