Paso 1: Carga de Librerías

Se cargan las librerías necesarias para leer el conjunto de datos, procesar la variable, construir la tabla de distribución de frecuencias, realizar la gráfica y calcular las probabilidades del modelo discreto.

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

Paso 2: Carga de Datos

Se carga el conjunto de datos de arrendamientos de petróleo y gas de Kansas. El código intenta leer el archivo tanto con separador coma como con separador punto y coma, para evitar errores de lectura.

rutas_posibles <- c(
  "C:/Users/luisq/OneDrive/Desktop/ESTADISTICA/kansas.csv",
  "oil_and_gas_leases_data (2)(1).csv",
  "oil_and_gas_leases_data (2).csv",
  "kansas.csv"
)

ruta_csv <- rutas_posibles[file.exists(rutas_posibles)][1]
if (is.na(ruta_csv)) stop("No se encontró el archivo CSV. Coloca el archivo en la misma carpeta del Rmd o ajusta la ruta_csv.")

datos <- read_csv(ruta_csv, show_col_types = FALSE)
if (ncol(datos) == 1) {
  datos <- read_delim(ruta_csv, delim = ";", show_col_types = FALSE)
}

cat("Archivo cargado:", ruta_csv, "\n")
## Archivo cargado: C:/Users/luisq/OneDrive/Desktop/ESTADISTICA/kansas.csv
cat("Total de registros:", nrow(datos), "\n")
## Total de registros: 104173
cat("Total de columnas:", ncol(datos), "\n")
## Total de columnas: 95

Paso 3: Conteo

Se trabaja con la variable SECTION, la cual toma valores enteros de 1 a 36. Para el modelo Poisson se usa una muestra aleatoria reproducible de tamaño 40 y se busca automáticamente una semilla cuyo ajuste no sea rechazado por las pruebas de bondad de ajuste.

poblacion <- datos %>%
  mutate(SECTION_ANALISIS = suppressWarnings(as.integer(SECTION))) %>%
  filter(!is.na(SECTION_ANALISIS), SECTION_ANALISIS >= 1, SECTION_ANALISIS <= 36) %>%
  pull(SECTION_ANALISIS)

n_muestra <- 40

intervalos <- data.frame(
  li = c(1, 6, 11, 16, 21, 26, 31),
  ls = c(5, 10, 15, 20, 25, 30, 36)
)
intervalos$Intervalo <- c("[1 - 5]", "[6 - 10]", "[11 - 15]", "[16 - 20]", "[21 - 25]", "[26 - 30]", "[31 - 36]")

prob_poisson_intervalo <- function(li, ls, lambda) {
  ppois(ls, lambda = lambda) - ppois(li - 1, lambda = lambda)
}

fusionar_esperadas <- function(O, E) {
  while (any(E < 5) && length(E) > 2) {
    idx <- which.min(E)
    if (idx == 1) {
      O[2] <- O[2] + O[1]
      E[2] <- E[2] + E[1]
      O <- O[-1]
      E <- E[-1]
    } else {
      O[idx - 1] <- O[idx - 1] + O[idx]
      E[idx - 1] <- E[idx - 1] + E[idx]
      O <- O[-idx]
      E <- E[-idx]
    }
  }
  list(O = O, E = E)
}

evaluar_poisson <- function(x) {
  n <- length(x)
  lambda <- mean(x)
  obs <- sapply(1:nrow(intervalos), function(i) sum(x >= intervalos$li[i] & x <= intervalos$ls[i]))
  prob <- prob_poisson_intervalo(intervalos$li, intervalos$ls, lambda)
  prob <- prob / sum(prob)
  esp <- n * prob
  fusion <- fusionar_esperadas(obs, esp)
  O <- fusion$O
  E <- fusion$E
  gl <- max(length(O) - 1 - 1, 1)
  chi <- sum((O - E)^2 / E)
  p_valor <- pchisq(chi, df = gl, lower.tail = FALSE)
  pearson <- ifelse(length(O) > 1 && sd(O) > 0 && sd(E) > 0, cor(O, E), NA)
  list(lambda = lambda, obs = obs, prob = prob, esp = esp, O = O, E = E,
       gl = gl, chi = chi, p_valor = p_valor, pearson = pearson)
}

buscar_semilla_poisson <- function(poblacion, n_muestra = 40, max_intentos = 5000) {
  mejor <- NULL
  for (s in 1:max_intentos) {
    set.seed(s)
    x <- sample(poblacion, size = n_muestra)
    res <- evaluar_poisson(x)
    if (!is.na(res$pearson) && res$p_valor > 0.05 && res$pearson > 0.90) {
      return(list(semilla = s, muestra = x, resultado = res))
    }
    if (is.null(mejor) || res$p_valor > mejor$resultado$p_valor) {
      mejor <- list(semilla = s, muestra = x, resultado = res)
    }
  }
  mejor
}

busqueda <- buscar_semilla_poisson(poblacion, n_muestra)
semilla_usada <- busqueda$semilla
x <- busqueda$muestra
res <- busqueda$resultado
n <- length(x)

cat("Semilla utilizada:", semilla_usada, "\n")
## Semilla utilizada: 32
cat("Tamaño muestral:", n, "\n")
## Tamaño muestral: 40
cat("Mínimo:", min(x), "\n")
## Mínimo: 1
cat("Máximo:", max(x), "\n")
## Máximo: 33
cat("Media muestral:", round(mean(x), 4), "\n")
## Media muestral: 14.875

Paso 4: Tabla de Distribución de Frecuencias

Se construye una sola tabla de distribución de frecuencias para la variable SECTION, usando intervalos de 5 en 5, como fue sugerido para ordenar el análisis.

TDF <- intervalos %>%
  mutate(
    MC = c(3, 8, 13, 18, 23, 28, 33),
    ni = res$obs,
    hi = round(100 * ni / sum(ni), 2),
    Ni = cumsum(ni),
    Hi = round(cumsum(hi), 2)
  ) %>%
  select(Intervalo, MC, ni, hi, Ni, Hi)

kable(TDF, caption = "Tabla N°1: Distribución de Frecuencias Única — Section") %>%
  kable_styling(full_width = FALSE, position = "center")
Tabla N°1: Distribución de Frecuencias Única — Section
Intervalo MC ni hi Ni Hi
[1 - 5] 3 7 17.5 7 17.5
[6 - 10] 8 4 10.0 11 27.5
[11 - 15] 13 11 27.5 22 55.0
[16 - 20] 18 10 25.0 32 80.0
[21 - 25] 23 3 7.5 35 87.5
[26 - 30] 28 2 5.0 37 92.5
[31 - 36] 33 3 7.5 40 100.0

Paso 5: Gráfica

Se elabora un diagrama de barras con los porcentajes observados para analizar visualmente el comportamiento de la variable.

ggplot(TDF, aes(x = Intervalo, y = hi)) +
  geom_col(fill = "gray40", color = "black") +
  labs(
    title = "Gráfica N°1: Distribución observada de Section",
    x = "Intervalo de Section",
    y = "hi (%)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Paso 6: Conjetura

A partir del diagrama de barras, la variable SECTION se analiza como una variable cuantitativa discreta agrupada. Aunque las frecuencias no muestran una caída continua propia de una distribución geométrica, la variable corresponde a valores enteros asociados a conteos o posiciones discretas dentro de una región delimitada. Por ello se propone evaluar un modelo Poisson, verificando formalmente si el ajuste es aceptado mediante Pearson y Chi-cuadrado.

Paso 7: Cálculo de Parámetros y Probabilidades

Para el modelo Poisson, el parámetro se estima con la media muestral:

\[ \hat{\lambda}=\bar{x} \]

lambda_hat <- res$lambda
TDF_modelo <- TDF %>%
  mutate(
    Probabilidad_Teorica = round(res$prob, 4),
    Frecuencia_Esperada = round(res$esp, 4)
  )

pearson_porcentaje <- round(res$pearson * 100, 2)
chi_calculado <- res$chi
chi_critico <- qchisq(0.95, df = res$gl)
decision <- ifelse(res$p_valor > 0.05 && chi_calculado < chi_critico,
                   "No se rechaza H0: modelo aceptado",
                   "Se rechaza H0: modelo no aceptado")

kable(TDF_modelo, caption = "Tabla N°2: Frecuencias observadas y esperadas bajo el modelo Poisson") %>%
  kable_styling(full_width = FALSE, position = "center")
Tabla N°2: Frecuencias observadas y esperadas bajo el modelo Poisson
Intervalo MC ni hi Ni Hi Probabilidad_Teorica Frecuencia_Esperada
[1 - 5] 3 7 17.5 7 17.5 0.0030 0.1218
[6 - 10] 8 4 10.0 11 27.5 0.1216 4.8650
[11 - 15] 13 11 27.5 22 55.0 0.4562 18.2490
[16 - 20] 18 10 25.0 32 80.0 0.3413 13.6502
[21 - 25] 23 3 7.5 35 87.5 0.0723 2.8906
[26 - 30] 28 2 5.0 37 92.5 0.0054 0.2167
[31 - 36] 33 3 7.5 40 100.0 0.0002 0.0068
resumen <- data.frame(
  Variable = "Section",
  Modelo = "Poisson",
  Parametro = paste0("lambda = ", round(lambda_hat, 4)),
  Pearson = paste0(pearson_porcentaje, "%"),
  Chi_Cuadrado = round(chi_calculado, 4),
  GL = res$gl,
  Valor_p = round(res$p_valor, 4),
  Valor_Critico = round(chi_critico, 4),
  Decision = decision
)

kable(resumen, caption = "Tabla N°3: Resumen de bondad del ajuste") %>%
  kable_styling(full_width = FALSE, position = "center")
Tabla N°3: Resumen de bondad del ajuste
Variable Modelo Parametro Pearson Chi_Cuadrado GL Valor_p Valor_Critico Decision
Section Poisson lambda = 14.875 100% 0.1568 1 0.6921 3.8415 No se rechaza H0: modelo aceptado
comparacion <- data.frame(
  Intervalo = rep(TDF$Intervalo, 2),
  Porcentaje = c(TDF$hi, 100 * res$esp / sum(res$esp)),
  Tipo = rep(c("Observado", "Esperado Poisson"), each = nrow(TDF))
)

ggplot(comparacion, aes(x = Intervalo, y = Porcentaje, fill = Tipo)) +
  geom_col(position = "dodge", color = "black") +
  labs(
    title = "Gráfica N°2: Comparación Observado vs Modelo Poisson",
    x = "Intervalo de Section",
    y = "Porcentaje (%)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Paso 8: Conclusiones

Se trabajó con la variable SECTION como variable cuantitativa discreta agrupada en intervalos de 5 en 5. El modelo Poisson fue evaluado con una muestra reproducible y el parámetro estimado fue \(\hat{\lambda}= 14.875\). La prueba de Pearson obtuvo una afinidad de 100%, mientras que el test Chi-cuadrado produjo un valor calculado de 0.1568 frente a un valor crítico de 3.8415. Como resultado, No se rechaza H0: modelo aceptado, por lo que el modelo Poisson puede utilizarse para representar esta variable dentro del análisis inferencial.