1. Cargar Librerías

library(readr); library(dplyr); library(gt)
cat("Librerías cargadas correctamente.\n")
## Librerías cargadas correctamente.

2. Cargar Datos

ruta_csv <- file.choose()
datos    <- read_csv(ruta_csv, show_col_types = FALSE)
cat("Archivo:", basename(ruta_csv), "| Filas:", nrow(datos), "\n")
## Archivo: oil_and_gas_leases_data (2).csv | Filas: 47757

3. Conteo

Es una variable cualitativa ordinal: LIFE_STAGE tiene un orden natural (NEW < MATURE < OLD) pero no es numérica. Se le asigna un código de orden (Asignación) 0, 1, 2.

niveles_orden <- c("NEW", "MATURE", "OLD")

x_raw <- datos %>%
  mutate(ESTADO = factor(LIFE_STAGE, levels = niveles_orden, ordered = TRUE)) %>%
  filter(!is.na(ESTADO)) %>%
  pull(ESTADO)

n_conteo  <- length(x_raw)
k_niveles <- length(niveles_orden)

cat("Observaciones válidas:", n_conteo, "\n")
## Observaciones válidas: 47757
cat("Categorías (orden natural):", k_niveles, "\n")
## Categorías (orden natural): 3
cat("Niveles:", paste(niveles_orden, collapse = " < "), "\n")
## Niveles: NEW < MATURE < OLD

4. Tabla de Distribución de Frecuencias

x <- x_raw
n <- length(x)

freq_abs   <- as.integer(table(x))
hi_dec     <- freq_abs / n
asignacion <- 0:(k_niveles - 1)

data.frame(Codigo = asignacion, Categoria = niveles_orden,
           ni = freq_abs, hi_pct = round(hi_dec * 100, 2)) %>%
  gt() %>%
  tab_header(title = md("**TABLA N\u00b0 1: DISTRIBUCIÓN DE FRECUENCIAS DE LA ETAPA DE VIDA**")) %>%
  cols_label(Codigo = md("**Código**"), Categoria = md("**Etapa de Vida**"),
             ni = md("**ni**"), hi_pct = md("**hi (%)**")) %>%
  tab_style(style = cell_text(color = "gray20", weight = "bold"),
            locations = cells_body(columns = c(Codigo, Categoria))) %>%
  cols_align(align = "center", columns = c(Codigo, ni, hi_pct)) %>%
  tab_source_note(source_note = md("*Autor: Fernando Almeida*"))
TABLA N° 1: DISTRIBUCIÓN DE FRECUENCIAS DE LA ETAPA DE VIDA
Código Etapa de Vida ni hi (%)
0 NEW 11615 24.32
1 MATURE 20939 43.84
2 OLD 15203 31.83
Autor: Fernando Almeida

5. Gráficos

grises <- gray(seq(0.30, 0.75, length.out = k_niveles))

par(mar = c(5, 6, 6, 2))
bp <- barplot(hi_dec, names.arg = etiquetas_grafico, col = grises, border = "black",
              las = 1, ylim = c(0, max(hi_dec) * 1.2), ylab = "", xlab = "")
mtext("Probabilidad", side = 2, line = 4.2, cex = 1)
mtext("Etapa de Vida", side = 1, line = 3, cex = 1)
mtext("Distribución de la Etapa de Vida", side = 3, line = 1.5, cex = 1, font = 2)
text(bp, hi_dec, labels = paste0(round(hi_dec * 100, 2), "%"), pos = 3, cex = 0.9)

comparacion <- rbind(Observado = hi_dec, Poisson = p_poisson,
                      Geometrico = p_geom, Binomial = p_binomial)

par(mar = c(5, 6, 6, 2))
bp2 <- barplot(comparacion, beside = TRUE,
               col = gray(seq(0.20, 0.80, length.out = 4)),
               border = "black", las = 1,
               names.arg = etiquetas_grafico,
               ylim = c(0, max(comparacion) * 1.25),
               ylab = "", xlab = "")
mtext("Probabilidad", side = 2, line = 4.2, cex = 1)
mtext("Etapa de Vida", side = 1, line = 3, cex = 1)
mtext("Frecuencia Observada en función de los Modelos Teóricos", side = 3, line = 1.5, cex = 1, font = 2)
legend("topright", legend = rownames(comparacion),
       fill = gray(seq(0.20, 0.80, length.out = 4)), bty = "n", cex = 0.9)

Nota: entre más parecida la altura de cada barra teórica a la barra observada, mejor el ajuste del modelo.

6. Conjeturas

Se conjeturan tres modelos de conteo sobre el código de Etapa de Vida:

  • Poisson: \(\hat{\lambda} =\) 1.0751
  • Geométrico: \(\hat{p} =\) 0.4819
  • Binomial (\(n=\) 2): \(\hat{p} =\) 0.5376

Los tres parámetros se estiman a partir del código promedio observado (\(\bar{k}=\) 1.0751).

data.frame(Categoria = niveles_orden,
           p_Poisson    = round(p_poisson, 4),
           p_Geometrico = round(p_geom, 4),
           p_Binomial   = round(p_binomial, 4),
           p_observada  = round(hi_dec, 4))
##   Categoria p_Poisson p_Geometrico p_Binomial p_observada
## 1       NEW    0.3769       0.5597     0.2138      0.2432
## 2    MATURE    0.4052       0.2900     0.4972      0.4384
## 3       OLD    0.2178       0.1503     0.2890      0.3183

7. Validación: Correlación de Pearson y Prueba Chi-Cuadrado

Se valida cada modelo con dos criterios: la correlación de Pearson entre las frecuencias observadas y las teóricas, y una prueba Chi-Cuadrado de Bondad de Ajuste sobre una submuestra aleatoria, dado que el tamaño muestral completo es demasiado grande para esta prueba.

pearson_poisson <- cor(hi_dec, p_poisson)  * 100
pearson_geom    <- cor(hi_dec, p_geom)     * 100
pearson_binom   <- cor(hi_dec, p_binomial) * 100

set.seed(42)
n_samp    <- 100
muestra   <- sample(asignacion[match(x, niveles_orden)], size = n_samp, replace = FALSE)
freq_samp <- as.integer(table(factor(muestra, levels = asignacion)))

chi_poisson <- chisq.test(x = freq_samp, p = p_poisson)
chi_geom    <- chisq.test(x = freq_samp, p = p_geom)
chi_binom   <- chisq.test(x = freq_samp, p = p_binomial)

val <- function(r) ifelse(r > 70, "APROBADO", "RECHAZADO")

bind_rows(
  data.frame(Modelo = "Poisson",    Pearson = round(pearson_poisson, 2),
             Chi = round(unname(chi_poisson$statistic), 4),
             p_valor = round(chi_poisson$p.value, 4), Validacion = val(pearson_poisson)),
  data.frame(Modelo = "Geométrico", Pearson = round(pearson_geom, 2),
             Chi = round(unname(chi_geom$statistic), 4),
             p_valor = round(chi_geom$p.value, 4), Validacion = val(pearson_geom)),
  data.frame(Modelo = "Binomial",   Pearson = round(pearson_binom, 2),
             Chi = round(unname(chi_binom$statistic), 4),
             p_valor = round(chi_binom$p.value, 4), Validacion = val(pearson_binom))
) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N\u00b0 2: Validación de las Conjeturas**"),
    subtitle = md("*Etapa de Vida — Poisson, Geométrico y Binomial*")
  ) %>%
  cols_label(Modelo = md("**Modelo**"), Pearson = md("**Pearson (%)**"),
             Chi = md("**Chi-Cuadrado**"), p_valor = md("**p-valor**"),
             Validacion = md("**Validación**")) %>%
  tab_style(style = list(cell_fill(color = "gray25"), cell_text(color = "white", weight = "bold")),
            locations = cells_column_labels()) %>%
  tab_style(style = cell_text(weight = "bold"),
            locations = cells_body(columns = Validacion, rows = Validacion == "APROBADO")) %>%
  tab_style(style = cell_text(color = "gray55", style = "italic"),
            locations = cells_body(columns = Validacion, rows = Validacion == "RECHAZADO")) %>%
  cols_align(align = "center", columns = c(Pearson, Chi, p_valor, Validacion)) %>%
  tab_source_note(source_note = md("*Autor: Fernando Almeida*"))
Tabla N° 2: Validación de las Conjeturas
Etapa de Vida — Poisson, Geométrico y Binomial
Modelo Pearson (%) Chi-Cuadrado p-valor Validación
Poisson 26.95 15.8946 0.0004 RECHAZADO
Geométrico -54.18 57.0479 0.0000 RECHAZADO
Binomial 99.12 1.2686 0.5303 APROBADO
Autor: Fernando Almeida

De los tres modelos, únicamente el Binomial logra un ajuste aceptable (Pearson > 70%); Poisson y Geométrico no reproducen bien la forma de la distribución observada.

8. Intervalo de Confianza

En una variable cualitativa el parámetro poblacional de interés es una proporción. Se estima la proporción de pozos en etapa OLD, por ser la categoría de mayor relevancia operativa (pozos al final de su vida útil):

\[P(\hat{p} - E < p < \hat{p} + E) \approx 95\%\]

\[E = z \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]

categoria_interes <- "OLD"
p_hat_ic     <- hi_dec[niveles_orden == categoria_interes]
n_total      <- n
z_95         <- 1.96
error_est    <- sqrt(p_hat_ic * (1 - p_hat_ic) / n_total)
margen       <- z_95 * error_est
lim_inf_ic   <- max(0, p_hat_ic - margen)
lim_sup_ic   <- min(1, p_hat_ic + margen)

data.frame(
  Parametro      = paste0("Proporción Etapa '", categoria_interes, "'"),
  Lim_Inferior   = round(lim_inf_ic, 4),
  Proporcion_Muestral = round(p_hat_ic, 4),
  Lim_Superior   = round(lim_sup_ic, 4),
  Error_Estandar = paste0("+/- ", round(margen, 4)),
  Confianza      = "95% (Z=1.96)"
) %>%
  gt() %>%
  tab_header(
    title    = md("**TABLA N\u00b0 3: ESTIMACIÓN DE LA PROPORCIÓN POBLACIONAL**"),
    subtitle = md("*Inferencia Estadística para la Etapa de Vida*")
  ) %>%
  cols_label(
    Parametro           = md("**Parámetro**"),
    Lim_Inferior        = md("**Lim_Inferior**"),
    Proporcion_Muestral = md("**Proporción_Muestral**"),
    Lim_Superior        = md("**Lim_Superior**"),
    Error_Estandar      = md("**Error_Estándar**"),
    Confianza           = md("**Confianza**")
  ) %>%
  tab_style(style = list(cell_fill(color = "gray25"), cell_text(color = "white", weight = "bold")),
            locations = cells_column_labels()) %>%
  tab_style(style = list(cell_fill(color = "gray90"), cell_text(weight = "bold")),
            locations = cells_body(columns = Proporcion_Muestral)) %>%
  cols_align(align = "center", columns = c(Lim_Inferior, Proporcion_Muestral, Lim_Superior, Error_Estandar, Confianza)) %>%
  tab_source_note(source_note = md("*Autor: Fernando Almeida*"))
TABLA N° 3: ESTIMACIÓN DE LA PROPORCIÓN POBLACIONAL
Inferencia Estadística para la Etapa de Vida
Parámetro Lim_Inferior Proporción_Muestral Lim_Superior Error_Estándar Confianza
Proporción Etapa 'OLD' 0.3142 0.3183 0.3225 +/- 0.0042 95% (Z=1.96)
Autor: Fernando Almeida

9. Conclusiones

Se trabajó con la variable cualitativa ordinal Etapa de Vida (LIFE_STAGE), con categorías NEW < MATURE < OLD codificadas como 0, 1, 2, sobre 47,757 observaciones. Se probaron tres modelos: Poisson (\(\hat{\lambda}=\) 1.0751), Geométrico (\(\hat{p}=\) 0.4819) y Binomial (\(n=\) 2, \(\hat{p}=\) 0.5376), todos estimados a partir del código promedio observado (\(\bar{k}=\) 1.0751). La prueba de Pearson obtuvo 26.95%, -54.18% y 99.12% respectivamente; únicamente el modelo Binomial fue APROBADO (Pearson > 70%). El intervalo de confianza al 95% para la proporción poblacional de pozos en etapa OLD fue [31.42%, 32.25%], con proporción muestral 31.83% y margen de error +/- 0.42%.


Autor: Fernando Almeida — Análisis Estadístico, Kansas Hydrocarbon Leases Dataset