1. Cargar Librerías

suppressMessages(suppressWarnings({
  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 nominal: sus categorías (Sí produce / No produce) no tienen ningún orden natural entre sí. .

niveles_orden <- c("0", "1")
niveles_es    <- c("No produce", "Sí produce")   # etiquetas en español para mostrar

x_raw <- datos %>%
  mutate(ESTADO = factor(as.character(PRODUCES_OIL), levels = niveles_orden)) %>%
  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 (sin orden):", k_niveles, "\n")
## Categorías (sin orden): 2
cat("Niveles:", paste(niveles_es, collapse = " / "), "\n")
## Niveles: No produce / Sí produce

4. Tabla de Distribución de Frecuencias

x <- x_raw
n <- length(x)

freq_abs   <- as.integer(table(x))
hi_dec     <- freq_abs / n
prob_pct   <- round(hi_dec * 100, 2)
asignacion <- seq_along(niveles_orden) - 1   # 0 y 1

data.frame(Categoria = niveles_es, Asignacion = asignacion,
           ni = freq_abs, hi = round(hi_dec, 4), Probabilidad = prob_pct,
           stringsAsFactors = FALSE) %>%
  gt() %>%
  tab_header(title = md("**Tabla N\u00b0 1: Distribuci\u00f3n de Frecuencias de Produce Petr\u00f3leo**")) %>%
  cols_label(Categoria = md("**Produce Petróleo**"), Asignacion = md("**Valor asignado**"),
             ni = md("**Frecuencia absoluta (ni)**"), hi = md("**Frecuencia relativa (hi)**"),
             Probabilidad = md("**Probabilidad (%)**")) %>%
  tab_style(style = cell_borders(sides = "bottom", color = "#333333", weight = px(2)),
            locations = cells_column_labels()) %>%
  tab_style(style = cell_borders(sides = "bottom", color = "#eeeeee", weight = px(1)),
            locations = cells_body(rows = everything())) %>%
  tab_style(style = cell_text(color = "#555555"),
            locations = cells_body(columns = Asignacion)) %>%
  cols_align(align = "center", columns = c(Asignacion, ni, hi, Probabilidad)) %>%
  cols_align(align = "left",   columns = Categoria) %>%
  tab_source_note(source_note = md("*Autor: Fernando Almeida*")) %>%
  tab_options(table.width = pct(100), table.font.size = px(13), data_row.padding = px(9),
              table.border.top.style = "hidden", table.border.bottom.style = "hidden",
              column_labels.border.top.style = "hidden")
Tabla N° 1: Distribución de Frecuencias de Produce Petróleo
Produce Petróleo Valor asignado Frecuencia absoluta (ni) Frecuencia relativa (hi) Probabilidad (%)
No produce 0 15117 0.3165 31.65
Sí produce 1 32640 0.6835 68.35
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(prob_pct, names.arg = niveles_es, col = grises, border = "black",
              las = 1, ylim = c(0, max(prob_pct) * 1.2), ylab = "", xlab = "")
mtext("Probabilidad (%)",  side = 2, line = 4.2, cex = 1)
mtext("Produce Petróleo",        side = 1, line = 3, cex = 1)
mtext("Distribución de Produce Petróleo", side = 3, line = 1.5, cex = 1, font = 2)
text(bp, prob_pct, labels = paste0(round(prob_pct, 2), "%"), pos = 3, cex = 0.9)

6. Conjetura

Basado en el gráfico se conjetura un modelo Bernoulli con estimado directamente de los datos (proporción muestral de “Sí produce”): p̂ = 0.6835. A diferencia de fijar p=0.5, aquí el parámetro se calcula de la propia muestra, por lo que el modelo va a coincidir exactamente con lo observado.

cat("p estimado (MLE, proporción de 'Sí produce'):", round(p_hat, 4), "\n")
## p estimado (MLE, proporción de 'Sí produce'): 0.6835
data.frame(Categoria = niveles_es,
           p_H0        = round(p_bernoulli, 4),
           p_observada = round(hi_dec, 4))
##    Categoria   p_H0 p_observada
## 0 No produce 0.3165      0.3165
## 1 Sí produce 0.6835      0.6835
comparacion <- rbind(Observado = prob_pct, `Modelo Bernoulli` = p_bernoulli_pct)

par(mar = c(5, 6, 6, 2))
bp2 <- barplot(comparacion, beside = TRUE,
               col = c(gray(0.35), gray(0.75)),
               border = "black", las = 1,
               names.arg = niveles_es,
               ylim = c(0, max(comparacion) * 1.25),
               ylab = "", xlab = "")
mtext("Probabilidad (%)", side = 2, line = 4.2, cex = 1)
mtext("Produce Petróleo",       side = 1, line = 3, cex = 1)
mtext("Frecuencia Observada en función del Modelo Bernoulli Teórico", side = 3, line = 1.5, cex = 1, font = 2)
text(bp2, comparacion, labels = paste0(round(comparacion, 1), "%"), pos = 3, cex = 0.8)
legend("topright", legend = c("Observado", "Modelo Bernoulli (p̂ estimado)"),
       fill = c(gray(0.35), gray(0.75)), bty = "n", cex = 0.9)

Nota: en el segundo gráfico, barras grises oscuras = frecuencia real observada; barras grises claras = probabilidad teórica del modelo Bernoulli. Al estimarse de la misma muestra, ambas barras de cada par deberían salir prácticamente idénticas — es el comportamiento esperado, no un error.

7. Test

Se valida el 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.

La prueba Chi-Cuadrado se calcula sobre el tamaño muestral completo (n = 47757). Como se estimó de la misma muestra (1 parámetro para 2 categorías, modelo saturado), se espera que el ajuste sea prácticamente perfecto: Chi² ≈ 0 y Pearson ≈ 100%.

# Correlación de Pearson entre hi observado y p teórico (modelo Bernoulli, p estimado por MLE).
pearson_r <- cor(cumsum(hi_dec), cumsum(p_bernoulli)) * 100

prueba_chi <- chisq.test(x = freq_abs, p = p_bernoulli)
chi_stat   <- unname(prueba_chi$statistic)
chi_gl     <- unname(prueba_chi$parameter)
chi_pval   <- prueba_chi$p.value

val_pearson <- ifelse(pearson_r > 70, "APROBADO", "RECHAZADO")
val_chi     <- ifelse(chi_pval > 0.05, "APROBADO", "RECHAZADO")

bind_rows(
  data.frame(Prueba = "Correlación de Pearson (hi vs. p teórico)",
             Estadistico = round(pearson_r, 2), GL = NA_integer_,
             p_valor = NA_real_, Validacion = val_pearson, stringsAsFactors = FALSE),
  data.frame(Prueba = paste0("Chi-Cuadrado (muestra completa n=", n, ")"),
             Estadistico = round(chi_stat, 4), GL = chi_gl,
             p_valor = round(chi_pval, 4), Validacion = val_chi, stringsAsFactors = FALSE)
) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N\u00b0 2: Validación de la Conjetura (Modelo Bernoulli)**"),
    subtitle = md("*Produce Petróleo — p̂ estimado por MLE*")
  ) %>%
  cols_label(Prueba = md("**Prueba**"), Estadistico = md("**Estadístico**"),
             GL = md("**G.L.**"), p_valor = md("**p-valor**"), Validacion = md("**Validación**")) %>%
  tab_style(style = list(cell_fill(color = "#2C2C2C"), cell_text(color = "white", weight = "bold")),
            locations = cells_column_labels()) %>%
  tab_style(style = list(cell_fill(color = "#2C2C2C"), cell_text(color = "white", weight = "bold")),
            locations = cells_title(groups = "title")) %>%
  tab_style(style = cell_text(color = "#000000", weight = "bold"),
            locations = cells_body(columns = Validacion, rows = Validacion == "APROBADO")) %>%
  tab_style(style = cell_text(color = "#8A8A8A", weight = "bold"),
            locations = cells_body(columns = Validacion, rows = Validacion == "RECHAZADO")) %>%
  cols_align(align = "center", columns = c(Estadistico, GL, p_valor, Validacion)) %>%
  cols_align(align = "left",   columns = Prueba) %>%
  fmt_missing(columns = everything(), missing_text = "-") %>%
  tab_source_note(source_note = md("*Autor: Fernando Almeida*")) %>%
  tab_options(table.width = pct(90), table.font.size = px(13),
              heading.title.font.size = px(16), heading.subtitle.font.size = px(12),
              data_row.padding = px(6),
              column_labels.border.top.width = px(2),
              column_labels.border.bottom.width = px(2),
              table_body.border.bottom.width = px(2),
              table.border.top.style = "hidden", table.border.bottom.style = "hidden")
Tabla N° 2: Validación de la Conjetura (Modelo Bernoulli)
Produce Petróleo — p̂ estimado por MLE
Prueba Estadístico G.L. p-valor Validación
Correlación de Pearson (hi vs. p teórico) 100 - - APROBADO
Chi-Cuadrado (muestra completa n=47757) 0 1 1 APROBADO
Autor: Fernando Almeida

8. Conclusiones

Se trabajó con la variable cualitativa nominal Produce Petróleo (PRODUCES_OIL), sin orden natural entre sus categorías (Sí produce / No produce). Se conjeturó un modelo Bernoulli con p̂ = 0.6835 estimado por MLE; al realizar una prueba de Pearson se obtuvo 100% y la prueba Chi-Cuadrado sobre la muestra completa (n=47757) obtuvo un valor estadístico de 0 con 1 grado(s) de libertad y un p-valor de 1, lo que demuestra que el modelo Bernoulli infiere correctamente la muestra en la población (resultado esperado, ya que se estimó directamente de estos mismos datos).


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