Se cargan las librerías necesarias para leer el conjunto de datos, elaborar tablas, construir gráficas en escala de grises y realizar los cálculos del modelo probabilístico 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 permite leer archivos separados por coma o por punto y coma.
rutas_posibles <- c(
"oil_and_gas_leases_data (2)(2).csv",
"oil_and_gas_leases_data (2)(1).csv",
"oil_and_gas_leases_data (2).csv",
"oil_and_gas_leases_data.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.")
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: oil_and_gas_leases_data (2).csv
cat("Total de registros:", nrow(datos), "\n")
## Total de registros: 47757
cat("Total de columnas:", ncol(datos), "\n")
## Total de columnas: 24
Se analiza la variable PRODUCES_OIL, que tiene dos
resultados posibles: 1 si el arrendamiento produce petróleo y 0 si no
produce petróleo. Por ello se modela como una Binomial con un solo
ensayo, es decir, Bernoulli como caso particular de la Binomial.
x <- datos %>%
mutate(PRODUCE = suppressWarnings(as.integer(PRODUCES_OIL))) %>%
filter(!is.na(PRODUCE), PRODUCE %in% c(0, 1)) %>%
pull(PRODUCE)
n <- length(x)
conteo <- table(factor(x, levels = c(0, 1)))
cat("Total de observaciones válidas:", n, "\n")
## Total de observaciones válidas: 47757
cat("No produce petróleo:", conteo[1], "\n")
## No produce petróleo: 15117
cat("Produce petróleo:", conteo[2], "\n")
## Produce petróleo: 32640
Se construye una sola tabla de distribución de frecuencias para la
variable binaria PRODUCES_OIL.
TDF <- data.frame(
Categoria = c("No produce petróleo (0)", "Produce petróleo (1)"),
Valor = c(0, 1),
ni = as.numeric(conteo)
) %>%
mutate(
hi = round(100 * ni / sum(ni), 2),
Ni = cumsum(ni),
Hi = round(cumsum(hi), 2)
)
TDF_total <- bind_rows(
TDF,
data.frame(Categoria = "TOTAL", Valor = NA, ni = sum(TDF$ni), hi = round(sum(TDF$hi), 2), Ni = NA, Hi = 100)
)
kable(TDF_total, caption = "Tabla N°1: Distribución de Frecuencias — Produces Oil") %>%
kable_styling(full_width = FALSE, position = "center")
| Categoria | Valor | ni | hi | Ni | Hi |
|---|---|---|---|---|---|
| No produce petróleo (0) | 0 | 15117 | 31.65 | 15117 | 31.65 |
| Produce petróleo (1) | 1 | 32640 | 68.35 | 47757 | 100.00 |
| TOTAL | NA | 47757 | 100.00 | NA | 100.00 |
Se presenta el diagrama de barras de las frecuencias observadas en escala de grises.
ggplot(TDF, aes(x = Categoria, y = hi)) +
geom_col(fill = "gray60", color = "black") +
labs(title = "Gráfica N°1: Frecuencias observadas de Produces Oil", x = "Categoría", y = "hi (%)") +
theme_bw()
La variable PRODUCES_OIL solo presenta dos posibles
resultados: produce petróleo o no produce petróleo. Por esta razón, se
propone un modelo Binomial con \(n=1\), donde el éxito corresponde a que el
arrendamiento produzca petróleo.
Para el modelo Binomial se considera \(n=1\) y se estima \(p\) como la proporción de éxitos observada:
\[ \hat{p}=\frac{x}{n} \]
n_ensayos <- 1
p_hat <- mean(x)
prob <- dbinom(c(0, 1), size = n_ensayos, prob = p_hat)
esp <- n * prob
obs <- TDF$ni
pearson <- ifelse(sd(obs) > 0 && sd(esp) > 0, cor(obs, esp), NA)
pearson_porcentaje <- round(pearson * 100, 2)
chi_calculado <- sum((obs - esp)^2 / esp)
gl <- 1
p_valor <- pchisq(chi_calculado, df = gl, lower.tail = FALSE)
chi_critico <- qchisq(0.95, df = gl)
decision <- ifelse(p_valor > 0.05 && chi_calculado < chi_critico,
"No se rechaza H0: modelo aceptado",
"Se rechaza H0: modelo no aceptado")
TDF_modelo <- TDF %>%
mutate(
Probabilidad_Teorica = round(prob, 4),
Frecuencia_Esperada = round(esp, 4),
Porcentaje_Esperado = round(100 * Frecuencia_Esperada / sum(Frecuencia_Esperada), 2)
)
TDF_modelo_total <- bind_rows(
TDF_modelo,
data.frame(Categoria = "TOTAL", Valor = NA, ni = sum(TDF_modelo$ni), hi = round(sum(TDF_modelo$hi), 2),
Ni = NA, Hi = 100, Probabilidad_Teorica = round(sum(TDF_modelo$Probabilidad_Teorica), 4),
Frecuencia_Esperada = round(sum(TDF_modelo$Frecuencia_Esperada), 4), Porcentaje_Esperado = 100)
)
kable(TDF_modelo_total, caption = "Tabla N°2: Probabilidades y frecuencias esperadas — Modelo Binomial") %>%
kable_styling(full_width = FALSE, position = "center")
| Categoria | Valor | ni | hi | Ni | Hi | Probabilidad_Teorica | Frecuencia_Esperada | Porcentaje_Esperado |
|---|---|---|---|---|---|---|---|---|
| No produce petróleo (0) | 0 | 15117 | 31.65 | 15117 | 31.65 | 0.3165 | 15117 | 31.65 |
| Produce petróleo (1) | 1 | 32640 | 68.35 | 47757 | 100.00 | 0.6835 | 32640 | 68.35 |
| TOTAL | NA | 47757 | 100.00 | NA | 100.00 | 1.0000 | 47757 | 100.00 |
resumen <- data.frame(
Variable = "PRODUCES_OIL",
Modelo = "Binomial",
Parametros = paste0("n = 1; p = ", round(p_hat, 4)),
Pearson = paste0(pearson_porcentaje, "%"),
Chi_Cuadrado = round(chi_calculado, 4),
GL = gl,
Valor_p = round(p_valor, 4),
Valor_Critico = round(chi_critico, 4),
Decision = decision
)
kable(resumen, caption = "Tabla N°3: Resumen de Pearson y Chi-cuadrado") %>%
kable_styling(full_width = FALSE, position = "center")
| Variable | Modelo | Parametros | Pearson | Chi_Cuadrado | GL | Valor_p | Valor_Critico | Decision |
|---|---|---|---|---|---|---|---|---|
| PRODUCES_OIL | Binomial | n = 1; p = 0.6835 | 100% | 0 | 1 | 1 | 3.8415 | No se rechaza H0: modelo aceptado |
ggplot(TDF_modelo, aes(x = Categoria, y = Porcentaje_Esperado)) +
geom_col(fill = "gray35", color = "black") +
labs(title = "Gráfica N°2: Frecuencias esperadas del modelo Binomial", x = "Categoría", y = "Porcentaje esperado (%)") +
theme_bw()
Se analizó la variable PRODUCES_OIL como una variable
discreta binaria. Debido a que solo posee dos resultados posibles, se
propuso un modelo Binomial con \(n=1\).
El parámetro estimado fue \(\hat{p}=0.6835\). La prueba de Pearson
obtuvo 100% y el estadístico Chi-cuadrado fue 0, con valor crítico
3.8415. Por tanto, No se rechaza H0: modelo
aceptado.