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)
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
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
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")
| 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 |
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))
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.
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")
| 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")
| 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))
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.