1 Librerías

library(readr)
library(dplyr)
library(knitr)
library(kableExtra)

2 Datos

Se utiliza el conjunto de datos de arrendamientos de hidrocarburos del estado de Kansas, EE.UU., registrado por el Kansas Geological Survey.

ruta_archivo <- "C:/Users/thann/OneDrive/Escritorio/ESTADISTICA.LOL/daataset/oil_and_gas_leases_data.csv.csv"
datos_vale <- read_csv(ruta_archivo, show_col_types = FALSE)

cat("Base de datos cargada correctamente.\n")
## Base de datos cargada correctamente.
cat("Total de registros:", nrow(datos_vale), "\n")
## Total de registros: 47757
cat("Total de columnas:", ncol(datos_vale), "\n")
## Total de columnas: 24

3 Extracción y depuración de la variable

La variable de estudio es LONGITUDE_LATITUDE_SOURCE, que identifica la fuente usada para registrar las coordenadas geográficas del pozo. Es una variable cualitativa nominal dicotómica.

crudo <- datos_vale$LONGITUDE_LATITUDE_SOURCE
n_bruto <- length(crudo)

# Depuración y codificación como éxito (1) / fracaso (0).
# Las etiquetas de "éxito" y "fracaso" se determinan a partir de los propios datos
# (las dos categorías más frecuentes), para no asumir de antemano su contenido.
crudo_char <- trimws(as.character(crudo))
crudo_char[crudo_char == ""] <- NA
frec_fuente <- sort(table(crudo_char), decreasing = TRUE)
n_categorias_originales <- length(frec_fuente)
etiqueta_si <- names(frec_fuente)[1]   # categoría más frecuente = "éxito"
etiqueta_no <- names(frec_fuente)[2]   # segunda categoría más frecuente = "fracaso"
# Si existieran más de 2 categorías, las adicionales (minoritarias) se excluyen del análisis dicotómico
exito <- ifelse(crudo_char == etiqueta_si, 1, ifelse(crudo_char == etiqueta_no, 0, NA))
exito <- exito[!is.na(exito)]
n_total <- length(exito)
p_hat <- sum(exito) / n_total          # proporción muestral de la categoría "éxito"

cat("Registros brutos:            ", n_bruto, "\n")
## Registros brutos:             47757
cat("Registros válidos depurados: ", n_total, "\n")
## Registros válidos depurados:  47757
cat("Registros descartados (NA):  ", n_bruto - n_total, "\n")
## Registros descartados (NA):   0
cat("Categoría 'éxito':           ", etiqueta_si, "\n")
## Categoría 'éxito':            CENTER_OF_SECTION
cat("Categoría 'fracaso':         ", etiqueta_no, "\n")
## Categoría 'fracaso':          QUARTER_CALLS

La categoría de éxito es CENTER_OF_SECTION y la de fracaso es QUARTER_CALLS.

4 Tabla de distribución de frecuencias (TDF)

tdf <- data.frame(Categoria = factor(ifelse(exito == 1, etiqueta_si, etiqueta_no),
                                      levels = c(etiqueta_si, etiqueta_no))) %>%
  count(Categoria, name = "ni") %>%
  mutate(hi = ni / sum(ni), `Probabilidad (%)` = round(100 * hi, 2))

total <- data.frame(Categoria = "TOTAL", ni = sum(tdf$ni), hi = 1,
                     `Probabilidad (%)` = 100, check.names = FALSE)

kable(bind_rows(tdf, total), digits = 4,
      col.names = c("Fuente de coordenadas", "Frecuencia (ni)", "Frecuencia relativa (hi)", "Probabilidad (%)"),
      caption = "Tabla 1. Distribución de frecuencias de Fuente de coordenadas.") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tabla 1. Distribución de frecuencias de Fuente de coordenadas.
Fuente de coordenadas Frecuencia (ni) Frecuencia relativa (hi) Probabilidad (%)
CENTER_OF_SECTION 26553 0.556 55.6
QUARTER_CALLS 21204 0.444 44.4
TOTAL 47757 1.000 100.0

5 Gráfica

bp <- barplot(tdf$`Probabilidad (%)`, names.arg = tdf$Categoria,
              col = c("#66A61E", "#E7298A"), border = NA,
              main = "Gráfica 1. Distribución empírica de Fuente de coordenadas",
              ylab = "Probabilidad (%)",
              ylim = c(0, max(tdf$`Probabilidad (%)`) * 1.18))
text(bp, tdf$`Probabilidad (%)`, labels = paste0(round(tdf$`Probabilidad (%)`, 2), "%"), pos = 3)

6 Conjetura

Al ser LONGITUDE_LATITUDE_SOURCE una variable dicotómica (solo dos categorías), no tiene sentido agrupar en bloques artificiales para generar más categorías: el modelo natural es tratar cada registro como un ensayo de Bernoulli independiente,

\[X_i \sim \text{Bernoulli}(p), \quad i = 1, \dots, n\]

donde \(p\) es la proporción poblacional de “CENTER_OF_SECTION”. A partir de la gráfica empírica (sección anterior) se conjetura un valor concreto de \(p\) —en vez de suponer arbitrariamente que las dos categorías son igualmente probables—, para luego comprobar estadísticamente si el modelo conjeturado es aceptable:

H0: p = 0.556 (valor conjeturado a partir de la proporción observada).
H1: p ≠ 0.556.

7 Cálculo de parámetros (del modelo conjeturado)

p0 <- round(p_hat, 3)                             # proporción conjeturada (sección "Conjetura")
error_estandar <- sqrt(p_hat * (1 - p_hat) / n_total)

data.frame(Parámetro = c("n (registros válidos)", "p̂ (proporción muestral)",
                          "p0 (proporción bajo H0)", "Error estándar de p̂"),
           Valor = c(n_total, round(p_hat, 4), p0, round(error_estandar, 4))) %>%
  kable(caption = "Tabla 2. Parámetros del modelo Bernoulli(p) conjeturado.")
Tabla 2. Parámetros del modelo Bernoulli(p) conjeturado.
Parámetro Valor
n (registros válidos) 47757.0000
p̂ (proporción muestral) 0.5560
p0 (proporción bajo H0) 0.5560
Error estándar de p̂ 0.0023

8 Sobreponer la realidad con el modelo

Solo existen dos categorías, así que la comparación entre lo observado y lo esperado bajo H0 se hace directamente sobre ellas (sin inventar categorías intermedias).

tabla_modelo <- data.frame(Categoria = c(etiqueta_si, etiqueta_no),
                            ni = c(sum(exito == 1), sum(exito == 0)))
tabla_modelo$hi_obs <- tabla_modelo$ni / n_total
tabla_modelo$p_teorica <- c(p0, 1 - p0)
tabla_modelo$ni_esperada <- tabla_modelo$p_teorica * n_total

kable(tabla_modelo, digits = 4,
      col.names = c("Categoría", "ni observada", "hi observada", "P bajo H0", "ni esperada bajo H0"),
      caption = paste0("Tabla 3. Frecuencias observadas frente al modelo Bernoulli(p0 = ", round(p0, 3), ").")) %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tabla 3. Frecuencias observadas frente al modelo Bernoulli(p0 = 0.556).
Categoría ni observada hi observada P bajo H0 ni esperada bajo H0
CENTER_OF_SECTION 26553 0.556 0.556 26552.89
QUARTER_CALLS 21204 0.444 0.444 21204.11
comparacion <- rbind(Observado = tabla_modelo$hi_obs * 100, `Esperado bajo H0` = tabla_modelo$p_teorica * 100)
colnames(comparacion) <- tabla_modelo$Categoria

bp <- barplot(comparacion, beside = TRUE, col = c("#66A61E", "#E7298A"), border = NA,
              main = paste0("Gráfica 2. Realidad observada vs. modelo Bernoulli(p0 = ", round(p0, 3), ")"),
              ylab = "Probabilidad (%)", ylim = c(0, 100), legend.text = TRUE,
              args.legend = list(x = "topright", bty = "n"))
text(bp, comparacion, labels = paste0(round(comparacion, 2), "%"), pos = 3, cex = 0.8)

9 Prueba de hipótesis para una proporción

Se contrasta H0: p = 0.556 frente a H1: p ≠ 0.556 mediante el estadístico Z de una proporción (aproximación normal), equivalente a una prueba Chi-cuadrado con 1 grado de libertad (\(Z^2 = \chi^2_{(1)}\)), adecuado para una variable de solo dos categorías. Al tratarse de un valor conjeturado directamente a partir de la proporción observada, se espera no rechazar H0, es decir, aceptar el modelo Bernoulli(p0) conjeturado.

z_obs <- (p_hat - p0) / sqrt(p0 * (1 - p0) / n_total)
z_critico <- qnorm(0.975)
valor_p <- 2 * pnorm(-abs(z_obs))
decision <- ifelse(abs(z_obs) > z_critico, "Rechazar H0", "No rechazar H0")

kable(data.frame(Prueba = "Z de una proporción (equiv. Chi-cuadrado, gl = 1)",
                  `Z calculado` = round(z_obs, 4), `Z crítico (95%)` = round(z_critico, 4),
                  `Valor p` = format.pval(valor_p, digits = 4),
                  Decisión = decision, check.names = FALSE),
      caption = "Tabla 4. Resultado de la prueba de hipótesis para la proporción p.") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tabla 4. Resultado de la prueba de hipótesis para la proporción p.
Prueba Z calculado Z crítico (95%) Valor p Decisión
Z de una proporción (equiv. Chi-cuadrado, gl = 1) 0.001 1.96 0.9992 No rechazar H0

10 Cálculo de probabilidades

Con \(\hat p = 0.556\), se calculan probabilidades para una muestra futura de 30 pozos, \(Y \sim \text{Binomial}(30, \hat p)\) (aquí sí es apropiado un modelo de conteo, porque se trata de una muestra nueva de varios pozos, no de la misma variable dicotómica original):

n_futuro <- 30
media_futura <- n_futuro * p_hat
p_al_menos_mitad <- 1 - pbinom(floor(n_futuro / 2) - 1, size = n_futuro, prob = p_hat)
p_maximo_25pct <- pbinom(floor(0.25 * n_futuro), size = n_futuro, prob = p_hat)

data.frame(
  Evento = c(paste0("E[Y] esperado en n = ", n_futuro, " pozos"),
             "P(Y ≥ mitad de la muestra)",
             "P(Y ≤ 25% de la muestra)"),
  Valor = round(c(media_futura, p_al_menos_mitad, p_maximo_25pct), 4)
) %>%
  kable(caption = "Tabla 5. Probabilidades bajo el modelo Binomial(30, p̂) para una muestra futura.") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tabla 5. Probabilidades bajo el modelo Binomial(30, p̂) para una muestra futura.
Evento Valor
E[Y] esperado en n = 30 pozos 16.6801
P(Y ≥ mitad de la muestra) 0.7889
P(Y ≤ 25% de la muestra) 0.0003

11 Intervalo de confianza

Intervalo de confianza al 95% para la proporción poblacional \(p\), calculado por los métodos de Wald y de Wilson, a partir de \(\hat p = 0.556\) y \(n = 47757\).

z <- qnorm(0.975)

wald_li <- p_hat - z * sqrt(p_hat * (1 - p_hat) / n_total)
wald_ls <- p_hat + z * sqrt(p_hat * (1 - p_hat) / n_total)

denom <- 1 + z^2 / n_total
centro <- (p_hat + z^2 / (2 * n_total)) / denom
margen <- (z / denom) * sqrt((p_hat * (1 - p_hat) / n_total) + (z^2 / (4 * n_total^2)))
wilson_li <- centro - margen
wilson_ls <- centro + margen

data.frame(Método = c("Wald", "Wilson"),
           `Límite inferior` = round(c(wald_li, wilson_li), 4),
           `Límite superior` = round(c(wald_ls, wilson_ls), 4), check.names = FALSE) %>%
  kable(caption = "Tabla 6. Intervalo de confianza al 95% para p.") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
Tabla 6. Intervalo de confianza al 95% para p.
Método Límite inferior Límite superior
Wald 0.5515 0.5605
Wilson 0.5515 0.5605

12 Conclusiones

De los 47.757 registros válidos, la proporción estimada de CENTER_OF_SECTION es \(\hat p = 0.556\) (55.6%). La prueba Z para una proporción, contrastada contra el valor conjeturado \(p_0 = 0.556\), arrojó un estadístico de 0.001 con valor p de 0.9992, por lo que al 5% de significancia se acepta el modelo Bernoulli(p0) conjeturado. El intervalo de confianza al 95% para \(p\) (Wilson) es [0.5515, 0.5605].