1.Carga de Datos y Librerías

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

2.Extracción de Variable Aleatoria

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)

3.Tabla de Distribución de Frecuencias

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

4.Análisis Gráfico

4.1 Diagrama de Barras — Frecuencia Absoluta

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))

4.2 Diagrama de Barras — Frecuencia Relativa (Pi)

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))


5.Conjetura de Modelo Geométrico

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)

5.1 Gráfica comparativa observado vs modelo

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"
  )


6.Test de bondad

6.1 Test de Pearson

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")

6.2 Test Chi-Cuadrado

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 resumen del test

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

7.Cálculo de probabilidades

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

8.Intervalo de confianza

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 % )

9.Conclusión

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%.