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 Unit type indica la escala/tipo de unidad registrada (campo, activo, cuenca, etc.). Tiene 11 categorías puntuales, sin valores N/S. Se consolidan en 3 grupos generales según la escala física de la unidad, ordenados de mayor a menor extensión.
n_total <- nrow(datos)
datos_unit <- datos %>% filter(!is.na(`Unit type`) & `Unit type` != "N/S")
n <- nrow(datos_unit)
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_unit <- datos_unit %>%
mutate(Categoria = case_when(
`Unit type` %in% c("basin", "sub-basin", "area") ~ "Unidades Geológicas Amplias",
`Unit type` %in% c("concession", "block", "project", "complex") ~ "Unidades Administrativas/Contractuales",
`Unit type` %in% c("field", "pool", "asset", "phase") ~ "Unidades Productivas",
TRUE ~ NA_character_
))
# Orden lógico (no por frecuencia): de mayor a menor escala física
orden_labels <- c(
"Unidades Geológicas Amplias",
"Unidades Administrativas/Contractuales",
"Unidades Productivas"
)
datos_unit$Categoria <- factor(datos_unit$Categoria, levels = orden_labels, ordered = TRUE)
conteo <- as.data.frame(table(datos_unit$Categoria)) %>%
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: 3
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 7932 registros
cat("Categoría menos frecuente:", conteo$Estado[which.min(conteo$ni)],
"con", min(conteo$ni), "registro(s)\n")
## Categoría menos frecuente: 1 con 19 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 unidad")
) %>%
cols_label(
Estado = "Tipo de Unidad",
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 unidad | |||
| Tipo de Unidad | Frecuencia (ni) | Proporción (hi) | Porcentaje (hi%) |
|---|---|---|---|
| Unidades Geológicas Amplias | 19 | 0.0023 | 0.23 |
| Unidades Administrativas/Contractuales | 383 | 0.0460 | 4.60 |
| Unidades Productivas | 7932 | 0.9518 | 95.18 |
| TOTAL | 8334 | 1.0001 | 100.01 |
| 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 Unidad",
x = "Tipo de Unidad",
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 = 20, 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 Unidad",
x = "Tipo de Unidad",
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 = 20, 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.9517
# 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 = 20, hjust = 1)) +
labs(
title = "Gráfica N°3: Modelo Geométrico comparado con la Realidad — Tipo de Unidad",
subtitle = paste0("p estimado = ", round(p_estimado, 4)),
x = "Tipo de Unidad (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 (%): 100
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
cat("Valor Crítico:", round(chi2_crit, 4), "\n")
## Valor Crítico: 3.8415
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 Unidad",
`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 Unidad | 100 | 0 | 3.84 | Modelo Aceptado |
| Autor: Grupo 5 | ||||
prob_productivas <- conteo$hi_pct[conteo$Estado == "Unidades Productivas"]
cat("Probabilidad de ser una 'Unidad Productiva':", prob_productivas, "%\n")
## Probabilidad de ser una 'Unidad Productiva': 95.18 %
unidades_amplias <- sum(conteo$ni[conteo$Estado == "Unidades Geológicas Amplias"])
cat("Unidades registradas como formaciones geológicas amplias:", unidades_amplias, "\n")
## Unidades registradas como formaciones geológicas amplias: 19
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: Unidades Productivas
cat("Intervalo de confianza al 95%: (",
round(ic_inf * 100, 2), "% ,", round(ic_sup * 100, 2), "% )\n")
## Intervalo de confianza al 95%: ( 94.72 % , 95.64 % )
Tras consolidar la variable Unit type en 3 categorías generales según su escala física, la categoría Unidades Productivas concentra 95.18% de los registros. Al reordenar por frecuencia descendente para el ajuste del modelo, el modelo Geométrico (p = 0.9517) obtuvo un Chi-cuadrado de 0 frente a un valor crítico de 3.8415, por lo que el modelo es aceptado, con una correlación de Pearson del 100%. El intervalo de confianza al 95% para la categoría más frecuente (Unidades Productivas) se ubica entre 94.72% y 95.64%.