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 p̂ 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 p̂ 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 p̂ 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 sí infiere correctamente la muestra en la población (resultado esperado, ya que p̂ se estimó directamente de estos mismos datos).


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