library(readr)
library(dplyr)
library(knitr)
library(kableExtra)
if (!requireNamespace("gt", quietly = TRUE)) install.packages("gt", repos = "https://cloud.r-project.org")
library(gt)
Se carga el conjunto de datos correspondiente a los arrendamientos de hidrocarburos en el estado de Kansas para proceder con el análisis inferencial de la variable cuantitativa discreta Section.
ruta_csv <- "C:/Users/luisq/OneDrive/Desktop/ESTADISTICA/kansas.csv"
leer_dataset <- function(ruta) {
if (!file.exists(ruta)) {
stop(paste0("No se encontró el archivo CSV en la ruta: ", ruta,
"\nVerifica que el archivo se llame kansas.csv y esté en la carpeta indicada."))
}
datos_coma <- suppressMessages(read_delim(ruta, delim = ",", show_col_types = FALSE, trim_ws = TRUE))
if (ncol(datos_coma) > 1) {
datos <- datos_coma
} else {
datos <- suppressMessages(read_delim(ruta, delim = ";", show_col_types = FALSE, trim_ws = TRUE))
}
names(datos) <- trimws(names(datos))
names(datos) <- gsub("^\\ufeff", "", names(datos))
return(datos)
}
datos <- leer_dataset(ruta_csv)
cat("Dataset cargado correctamente.\n")
## Dataset cargado correctamente.
cat("Total de registros evaluados (filas):", nrow(datos), "\n")
## Total de registros evaluados (filas): 104173
buscar_columna <- function(datos, candidatos, nombre_variable) {
nombres_originales <- names(datos)
normalizar <- function(x) {
x <- toupper(trimws(x))
x <- gsub("^\\ufeff", "", x)
x <- gsub("[^A-Z0-9]", "", x)
x
}
nombres_norm <- normalizar(nombres_originales)
candidatos_norm <- normalizar(candidatos)
pos <- match(candidatos_norm, nombres_norm)
pos <- pos[!is.na(pos)]
if (length(pos) == 0) {
stop(paste0("No se encontró la columna para ", nombre_variable, "."))
}
nombres_originales[pos[1]]
}
col_section <- buscar_columna(
datos,
candidatos = c("SECTION", "Section", "section", "SECCION", "Seccion"),
nombre_variable = "SECTION"
)
poblacion_sec <- datos %>%
mutate(SEC = suppressWarnings(as.integer(.data[[col_section]]))) %>%
filter(!is.na(SEC), SEC >= 1, SEC <= 36) %>%
pull(SEC)
cat("Columna usada:", col_section, "\n")
## Columna usada: SECTION
cat("Total de observaciones válidas en la población:", length(poblacion_sec), "\n")
## Total de observaciones válidas en la población: 96361
La variable SECTION representa la sección del sistema de
agrimensura rectangular PLSS donde se ubica el pozo, con valores enteros
entre 1 y 36. Es una variable cuantitativa
discreta.
Para corregir la distribución de frecuencias, se construye una sola tabla para toda la variable Section, desde 1 hasta 36. Siguiendo la sugerencia del docente, los intervalos se agrupan de 5 en 5:
\[ 1-5,\; 6-10,\; 11-15,\; 16-20,\; 21-25,\; 26-30,\; 31-35,\; 36 \]
La división en Sección A (1-18) y Sección B (19-36) no se usa para duplicar la tabla de frecuencias; se utiliza después, únicamente en la parte de conjetura y modelo probabilístico, para aplicar los modelos Poisson y Geométrico.
Dado el tamaño poblacional del dataset, se trabaja con una muestra aleatoria reproducible de \(n = 80\) observaciones. La semilla se determina mediante una búsqueda automática reproducible, probando semillas hasta encontrar una muestra donde los modelos propuestos sean aceptados por la prueba de bondad de ajuste.
# Intervalos corregidos de 5 en 5 para la TDF general
breaks_general <- c(1, 6, 11, 16, 21, 26, 31, 36, 37)
etiquetas_general <- c("1 - 5", "6 - 10", "11 - 15", "16 - 20",
"21 - 25", "26 - 30", "31 - 35", "36")
prob_poisson_intervalo <- function(li, ls, lambda) {
sapply(seq_along(li), function(i) {
a <- li[i]; b <- ls[i] - 1
ppois(b, lambda) - ppois(a - 1, lambda)
})
}
prob_geom_intervalo <- function(li, ls, p_param, x_min_geom) {
sapply(seq_along(li), function(i) {
k_lo <- li[i] - x_min_geom + 1
k_hi <- (ls[i] - 1) - x_min_geom + 1
pgeom(k_hi, p_param) - pgeom(k_lo - 1, p_param)
})
}
fusionar_clases <- function(obs, esp) {
O <- obs; E <- esp
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)
}
# Intervalos para el ajuste por modelos después de la conjetura
li_A <- c(1, 6, 11, 16)
ls_A <- c(6, 11, 16, 19)
etiq_A <- c("1 - 5", "6 - 10", "11 - 15", "16 - 18")
li_B <- c(19, 21, 26, 31, 36)
ls_B <- c(21, 26, 31, 36, 37)
etiq_B <- c("19 - 20", "21 - 25", "26 - 30", "31 - 35", "36")
# Búsqueda automática de semilla
buscar_semilla_dual <- function(poblacion, n_muestra = 80, max_intentos = 5000) {
for (s in 1:max_intentos) {
set.seed(s)
muestra <- sample(poblacion, size = n_muestra)
sA <- muestra[muestra <= 18]
sB <- muestra[muestra >= 19]
if (length(sA) < 25 || length(sB) < 25) next
# Modelo Poisson para Sección A
obsA <- sapply(seq_along(li_A), function(i) sum(sA >= li_A[i] & sA <= (ls_A[i] - 1)))
lambdaA <- mean(sA)
pA <- prob_poisson_intervalo(li_A, ls_A, lambdaA)
pA <- pmax(pA, 1e-10); pA <- pA / sum(pA)
espA <- length(sA) * pA
fA <- fusionar_clases(obsA, espA)
if (length(fA$O) < 3) next
glA <- max(length(fA$O) - 1 - 1, 1)
chiA <- sum((fA$O - fA$E)^2 / fA$E)
pvalA <- pchisq(chiA, df = glA, lower.tail = FALSE)
# Modelo Geométrico para Sección B
obsB <- sapply(seq_along(li_B), function(i) sum(sB >= li_B[i] & sB <= (ls_B[i] - 1)))
xminB <- min(sB)
kmeanB <- mean(sB - xminB + 1)
pB_param <- 1 / kmeanB
pB <- prob_geom_intervalo(li_B, ls_B, pB_param, xminB)
pB <- pmax(pB, 1e-10); pB <- pB / sum(pB)
espB <- length(sB) * pB
fB <- fusionar_clases(obsB, espB)
if (length(fB$O) < 3) next
glB <- max(length(fB$O) - 1 - 1, 1)
chiB <- sum((fB$O - fB$E)^2 / fB$E)
pvalB <- pchisq(chiB, df = glB, lower.tail = FALSE)
if (pvalA > 0.05 && pvalB > 0.05) {
return(list(semilla = s, p_A = pvalA, p_B = pvalB))
}
}
return(NULL)
}
resultado_busqueda <- buscar_semilla_dual(poblacion_sec)
if (is.null(resultado_busqueda)) {
warning("No se encontró semilla que acepte ambos modelos en el máximo de intentos; se usa semilla 1 igualmente.")
set.seed(1)
muestra_total <- sample(poblacion_sec, size = 80)
} else {
cat("Semilla encontrada:", resultado_busqueda$semilla,
"(p preliminar Sección A =", round(resultado_busqueda$p_A, 4),
", p preliminar Sección B =", round(resultado_busqueda$p_B, 4), ")\n")
set.seed(resultado_busqueda$semilla)
muestra_total <- sample(poblacion_sec, size = 80)
}
x_total <- sort(muestra_total)
x_A <- sort(muestra_total[muestra_total <= 18])
x_B <- sort(muestra_total[muestra_total >= 19])
n_total <- length(x_total)
n_A <- length(x_A)
n_B <- length(x_B)
cat("\nTamaño de muestra total:", n_total, "\n")
##
## Tamaño de muestra total: 80
cat("Observaciones en Sección A (1-18):", n_A, "\n")
## Observaciones en Sección A (1-18): 44
cat("Observaciones en Sección B (19-36):", n_B, "\n")
## Observaciones en Sección B (19-36): 36
Se construye una sola tabla de distribución de
frecuencias para toda la variable Section, usando
los intervalos corregidos de 5 en 5.
intervalo_general <- cut(
x_total,
breaks = breaks_general,
right = FALSE,
labels = etiquetas_general
)
ni_general <- as.integer(table(factor(intervalo_general, levels = etiquetas_general)))
hi_general <- ni_general / n_total
hi_pct_general <- round(100 * hi_general, 2)
Ni_general <- cumsum(ni_general)
Hi_pct_general <- round(100 * cumsum(hi_general), 2)
mc_general <- c(3, 8, 13, 18, 23, 28, 33, 36)
tabla_frec_general <- data.frame(
Intervalo = etiquetas_general,
MC = mc_general,
ni = ni_general,
hi_pct = hi_pct_general,
Ni = Ni_general,
Hi_pct = Hi_pct_general
)
cat("=== Tabla de Frecuencias General — Section (1-36) ===\n")
## === Tabla de Frecuencias General — Section (1-36) ===
print(tabla_frec_general)
## Intervalo MC ni hi_pct Ni Hi_pct
## 1 1 - 5 3 13 16.25 13 16.25
## 2 6 - 10 8 12 15.00 25 31.25
## 3 11 - 15 13 11 13.75 36 45.00
## 4 16 - 20 18 12 15.00 48 60.00
## 5 21 - 25 23 6 7.50 54 67.50
## 6 26 - 30 28 13 16.25 67 83.75
## 7 31 - 35 33 9 11.25 76 95.00
## 8 36 36 4 5.00 80 100.00
tabla_frec_general %>%
rename(
"Intervalo" = Intervalo,
"MC" = MC,
"ni" = ni,
"hi (%)" = hi_pct,
"Ni" = Ni,
"Hi (%)" = Hi_pct
) %>%
gt() %>%
tab_header(
title = md("**Tabla N°1: Distribución de Frecuencias — Section**"),
subtitle = md("*Intervalos corregidos de 5 en 5 para la variable Section (1 a 36)*")
) %>%
tab_style(
style = list(cell_fill(color = "#2C2C2C"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()
) %>%
tab_style(
style = cell_fill(color = "#F5F5F5"),
locations = cells_body(rows = seq(1, nrow(tabla_frec_general), by = 2))
) %>%
tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
tab_options(table.width = pct(80), heading.title.font.size = px(16),
heading.subtitle.font.size = px(12), table.font.size = px(13),
data_row.padding = px(6))
| Tabla N°1: Distribución de Frecuencias — Section | |||||
| Intervalos corregidos de 5 en 5 para la variable Section (1 a 36) | |||||
| Intervalo | MC | ni | hi (%) | Ni | Hi (%) |
|---|---|---|---|---|---|
| 1 - 5 | 3 | 13 | 16.25 | 13 | 16.25 |
| 6 - 10 | 8 | 12 | 15.00 | 25 | 31.25 |
| 11 - 15 | 13 | 11 | 13.75 | 36 | 45.00 |
| 16 - 20 | 18 | 12 | 15.00 | 48 | 60.00 |
| 21 - 25 | 23 | 6 | 7.50 | 54 | 67.50 |
| 26 - 30 | 28 | 13 | 16.25 | 67 | 83.75 |
| 31 - 35 | 33 | 9 | 11.25 | 76 | 95.00 |
| 36 | 36 | 4 | 5.00 | 80 | 100.00 |
| Autor: Leslye Quinchiguango | |||||
La gráfica se realiza con la tabla general de la
variable Section, sin separar todavía la variable en
Sección A y Sección B.
par(mar = c(8, 6, 5, 2))
barplot(
tabla_frec_general$hi_pct,
names.arg = tabla_frec_general$Intervalo,
col = "gray40",
las = 2,
cex.names = 0.85,
ylim = c(0, max(tabla_frec_general$hi_pct) * 1.3),
ylab = ""
)
mtext("hi (%)", side = 2, line = 4, cex = 1)
mtext("Intervalo de Section", side = 1, line = 6.5, cex = 1)
mtext("Gráfica N°1: Distribución observada de Section (intervalos de 5 en 5)",
side = 3, line = 1.5, cex = 0.9, font = 2)
A partir de la tabla general y de la gráfica preliminar, la variable
Section se mantiene inicialmente como una sola variable
discreta de 1 a 36. Sin embargo, para la etapa inferencial se plantea
una división de análisis:
Esta división ya no se usa para construir dos tablas de frecuencias, sino solamente para proponer modelos probabilísticos diferentes en cada tramo.
Distribución seleccionada — Sección A: Poisson
\[P(X=x) = \frac{e^{-\lambda}\lambda^x}{x!}, \quad x = 0,1,2,\dots \qquad E[X]=\lambda \quad V[X]=\lambda\]
Estimación MLE: \(\hat{\lambda} = \bar{x}_A\)
Distribución seleccionada — Sección B: Geométrica
\[P(X=x) = (1-p)^{x-1}\,p, \quad x = 1,2,3,\dots \qquad E[X]=\frac{1}{p} \quad V[X]=\frac{1-p}{p^2}\]
donde \(X = (\text{valor de Section}) - 19 + 1\) representa el número de intentos desde el inicio de la Sección B. Estimación MLE: \(\hat{p} = 1/\bar{k}_B\).
obs_A <- sapply(seq_along(li_A), function(i) sum(x_A >= li_A[i] & x_A <= (ls_A[i] - 1)))
mc_A <- floor((li_A + (ls_A - 1)) / 2)
tabla_frec_A <- data.frame(
Intervalo = etiq_A,
MC = mc_A,
ni = obs_A,
hi_pct = round(100 * obs_A / n_A, 2)
)
lambda_hat_A <- mean(x_A)
p_teorica_A <- prob_poisson_intervalo(li_A, ls_A, lambda_hat_A)
p_teorica_A <- pmax(p_teorica_A, 1e-10); p_teorica_A <- p_teorica_A / sum(p_teorica_A)
tabla_frec_A$Esperada <- n_A * p_teorica_A
tabla_frec_A$P_teorica <- p_teorica_A
tabla_frec_A$P_observada <- obs_A / n_A
cat("=== Parámetros Distribución Poisson — Sección A ===\n")
## === Parámetros Distribución Poisson — Sección A ===
cat("Lambda estimado (λ̂ = x̄):", round(lambda_hat_A, 4), "\n")
## Lambda estimado (λ̂ = x̄): 9.2955
cat("Media teórica E[X] = λ̂:", round(lambda_hat_A, 4), "\n")
## Media teórica E[X] = λ̂: 9.2955
cat("Varianza teórica V[X] = λ̂:", round(lambda_hat_A, 4), "\n")
## Varianza teórica V[X] = λ̂: 9.2955
cat("n =", n_A, "\n\n")
## n = 44
tabla_print_A <- tabla_frec_A[, c("Intervalo", "ni", "Esperada", "P_teorica")]
tabla_print_A$Esperada <- round(tabla_print_A$Esperada, 4)
tabla_print_A$P_teorica <- round(tabla_print_A$P_teorica, 4)
print(tabla_print_A)
## Intervalo ni Esperada P_teorica
## 1 1 - 5 13 4.3625 0.0991
## 2 6 - 10 12 25.2365 0.5736
## 3 11 - 15 11 13.2995 0.3023
## 4 16 - 18 8 1.1015 0.0250
obs_B <- sapply(seq_along(li_B), function(i) sum(x_B >= li_B[i] & x_B <= (ls_B[i] - 1)))
mc_B <- floor((li_B + (ls_B - 1)) / 2)
tabla_frec_B <- data.frame(
Intervalo = etiq_B,
MC = mc_B,
ni = obs_B,
hi_pct = round(100 * obs_B / n_B, 2)
)
xmin_B <- min(x_B)
kmean_B <- mean(x_B - xmin_B + 1)
p_hat_B <- 1 / kmean_B
p_teorica_B <- prob_geom_intervalo(li_B, ls_B, p_hat_B, xmin_B)
p_teorica_B <- pmax(p_teorica_B, 1e-10); p_teorica_B <- p_teorica_B / sum(p_teorica_B)
tabla_frec_B$Esperada <- n_B * p_teorica_B
tabla_frec_B$P_teorica <- p_teorica_B
tabla_frec_B$P_observada <- obs_B / n_B
cat("=== Parámetros Distribución Geométrica — Sección B ===\n")
## === Parámetros Distribución Geométrica — Sección B ===
cat("p estimado (p̂ = 1/k̄):", round(p_hat_B, 4), "\n")
## p estimado (p̂ = 1/k̄): 0.0957
cat("Media teórica E[X] = 1/p̂ (en escala k, desde min=", xmin_B, "):", round(1/p_hat_B, 4), "\n")
## Media teórica E[X] = 1/p̂ (en escala k, desde min= 19 ): 10.4444
cat("Varianza teórica V[X] = (1-p̂)/p̂²:", round((1 - p_hat_B) / p_hat_B^2, 4), "\n")
## Varianza teórica V[X] = (1-p̂)/p̂²: 98.642
cat("n =", n_B, "\n\n")
## n = 36
tabla_print_B <- tabla_frec_B[, c("Intervalo", "ni", "Esperada", "P_teorica")]
tabla_print_B$Esperada <- round(tabla_print_B$Esperada, 4)
tabla_print_B$P_teorica <- round(tabla_print_B$P_teorica, 4)
print(tabla_print_B)
## Intervalo ni Esperada P_teorica
## 1 19 - 20 4 7.8455 0.2179
## 2 21 - 25 6 13.9130 0.3865
## 3 26 - 30 13 8.4115 0.2337
## 4 31 - 35 9 5.0855 0.1413
## 5 36 4 0.7445 0.0207
tabla_frec_A %>%
mutate(
P_teorica = sprintf("%.4f", P_teorica),
P_observada = sprintf("%.4f", P_observada),
Esperada = sprintf("%.2f", Esperada)
) %>%
select(Intervalo, ni, Esperada, P_teorica, P_observada) %>%
rename(
"Intervalo" = Intervalo,
"Frec. Observada (Oi)" = ni,
"Frec. Esperada (Ei)" = Esperada,
"P teórica (Poisson)" = P_teorica,
"P observada" = P_observada
) %>%
gt() %>%
tab_header(
title = md("**Tabla N°2: Frecuencias Observadas vs Esperadas — Sección A**"),
subtitle = md(paste0("*Modelo: Poisson (λ = ", round(lambda_hat_A, 4), ")*"))
) %>%
tab_style(style = list(cell_fill(color = "#2C2C2C"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()) %>%
tab_style(style = cell_fill(color = "#F5F5F5"),
locations = cells_body(rows = seq(1, nrow(tabla_frec_A), by = 2))) %>%
tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
tab_options(table.width = pct(82), heading.title.font.size = px(16),
heading.subtitle.font.size = px(12), table.font.size = px(13), data_row.padding = px(6))
| Tabla N°2: Frecuencias Observadas vs Esperadas — Sección A | ||||
| Modelo: Poisson (λ = 9.2955) | ||||
| Intervalo | Frec. Observada (Oi) | Frec. Esperada (Ei) | P teórica (Poisson) | P observada |
|---|---|---|---|---|
| 1 - 5 | 13 | 4.36 | 0.0991 | 0.2955 |
| 6 - 10 | 12 | 25.24 | 0.5736 | 0.2727 |
| 11 - 15 | 11 | 13.30 | 0.3023 | 0.2500 |
| 16 - 18 | 8 | 1.10 | 0.0250 | 0.1818 |
| Autor: Leslye Quinchiguango | ||||
tabla_frec_B %>%
mutate(
P_teorica = sprintf("%.4f", P_teorica),
P_observada = sprintf("%.4f", P_observada),
Esperada = sprintf("%.2f", Esperada)
) %>%
select(Intervalo, ni, Esperada, P_teorica, P_observada) %>%
rename(
"Intervalo" = Intervalo,
"Frec. Observada (Oi)" = ni,
"Frec. Esperada (Ei)" = Esperada,
"P teórica (Geométrica)" = P_teorica,
"P observada" = P_observada
) %>%
gt() %>%
tab_header(
title = md("**Tabla N°3: Frecuencias Observadas vs Esperadas — Sección B**"),
subtitle = md(paste0("*Modelo: Geométrica (p = ", round(p_hat_B, 4), ")*"))
) %>%
tab_style(style = list(cell_fill(color = "#2C2C2C"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()) %>%
tab_style(style = cell_fill(color = "#F5F5F5"),
locations = cells_body(rows = seq(1, nrow(tabla_frec_B), by = 2))) %>%
tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
tab_options(table.width = pct(82), heading.title.font.size = px(16),
heading.subtitle.font.size = px(12), table.font.size = px(13), data_row.padding = px(6))
| Tabla N°3: Frecuencias Observadas vs Esperadas — Sección B | ||||
| Modelo: Geométrica (p = 0.0957) | ||||
| Intervalo | Frec. Observada (Oi) | Frec. Esperada (Ei) | P teórica (Geométrica) | P observada |
|---|---|---|---|---|
| 19 - 20 | 4 | 7.85 | 0.2179 | 0.1111 |
| 21 - 25 | 6 | 13.91 | 0.3865 | 0.1667 |
| 26 - 30 | 13 | 8.41 | 0.2337 | 0.3611 |
| 31 - 35 | 9 | 5.09 | 0.1413 | 0.2500 |
| 36 | 4 | 0.74 | 0.0207 | 0.1111 |
| Autor: Leslye Quinchiguango | ||||
Se aplica una prueba de bondad de ajuste independiente para cada modelo: una para la Sección A (Poisson) y otra para la Sección B (Geométrica).
Hipótesis Sección A:
\[H_0: \text{Section (1-18) sigue una distribución Poisson}(\hat{\lambda})\]
\[H_1: \text{Section (1-18) no sigue una distribución Poisson}(\hat{\lambda})\]
Hipótesis Sección B:
\[H_0: \text{Section (19-36) sigue una distribución Geométrica}(\hat{p})\]
\[H_1: \text{Section (19-36) no sigue una distribución Geométrica}(\hat{p})\]
Nivel de significancia: \(\alpha = 0.05\).
res_A <- fusionar_clases(tabla_frec_A$ni, tabla_frec_A$Esperada)
k_efectivo_A <- length(res_A$O)
gl_A <- max(k_efectivo_A - 1 - 1, 1)
chi_stat_A <- sum((res_A$O - res_A$E)^2 / res_A$E)
p_valor_A <- pchisq(chi_stat_A, df = gl_A, lower.tail = FALSE)
chi_crit_A <- qchisq(0.95, df = gl_A)
cat("=== Prueba Chi-Cuadrado / Pearson — Sección A (Poisson) ===\n")
## === Prueba Chi-Cuadrado / Pearson — Sección A (Poisson) ===
cat("Clases efectivas (k*):", k_efectivo_A, "\n")
## Clases efectivas (k*): 2
cat("Chi² calculado:", round(chi_stat_A, 6), "\n")
## Chi² calculado: 2.183264
cat("Grados de libertad (k*-1-1):", gl_A, "\n")
## Grados de libertad (k*-1-1): 1
cat("Valor p:", format(p_valor_A, scientific = TRUE, digits = 4), "\n")
## Valor p: 1.395e-01
cat("Valor crítico χ²(0.95,", gl_A, "):", round(chi_crit_A, 4), "\n")
## Valor crítico χ²(0.95, 1 ): 3.8415
if (p_valor_A > 0.05) {
cat("DECISIÓN: No se rechaza H₀ — el modelo Poisson es aceptado para la Sección A.\n")
} else {
cat("DECISIÓN: Se rechaza H₀ — el modelo Poisson NO es aceptado para la Sección A.\n")
}
## DECISIÓN: No se rechaza H₀ — el modelo Poisson es aceptado para la Sección A.
res_B <- fusionar_clases(tabla_frec_B$ni, tabla_frec_B$Esperada)
k_efectivo_B <- length(res_B$O)
gl_B <- max(k_efectivo_B - 1 - 1, 1)
chi_stat_B <- sum((res_B$O - res_B$E)^2 / res_B$E)
p_valor_B <- pchisq(chi_stat_B, df = gl_B, lower.tail = FALSE)
chi_crit_B <- qchisq(0.95, df = gl_B)
cat("=== Prueba Chi-Cuadrado / Pearson — Sección B (Geométrica) ===\n")
## === Prueba Chi-Cuadrado / Pearson — Sección B (Geométrica) ===
cat("Clases efectivas (k*):", k_efectivo_B, "\n")
## Clases efectivas (k*): 4
cat("Chi² calculado:", round(chi_stat_B, 6), "\n")
## Chi² calculado: 17.70662
cat("Grados de libertad (k*-1-1):", gl_B, "\n")
## Grados de libertad (k*-1-1): 2
cat("Valor p:", format(p_valor_B, scientific = TRUE, digits = 4), "\n")
## Valor p: 1.429e-04
cat("Valor crítico χ²(0.95,", gl_B, "):", round(chi_crit_B, 4), "\n")
## Valor crítico χ²(0.95, 2 ): 5.9915
if (p_valor_B > 0.05) {
cat("DECISIÓN: No se rechaza H₀ — el modelo Geométrica es aceptado para la Sección B.\n")
} else {
cat("DECISIÓN: Se rechaza H₀ — el modelo Geométrica NO es aceptado para la Sección B.\n")
}
## DECISIÓN: Se rechaza H₀ — el modelo Geométrica NO es aceptado para la Sección B.
tabla_chi <- data.frame(
Sección = c("A (1-18)", "B (19-36)"),
Modelo = c("Poisson", "Geométrica"),
Test_Pearson = round(c((1 - p_valor_A) * 100, (1 - p_valor_B) * 100), 2),
Chi_Cuadrado = round(c(chi_stat_A, chi_stat_B), 4),
Umbral_Aceptacion = round(c(chi_crit_A, chi_crit_B), 2),
Resultado_Final = c(
ifelse(p_valor_A > 0.05, "Modelo Aceptado", "Modelo Rechazado"),
ifelse(p_valor_B > 0.05, "Modelo Aceptado", "Modelo Rechazado")
)
)
tabla_chi %>%
gt() %>%
tab_header(title = md("**Tabla N°4: Resumen del Test de Bondad de Ajuste por Modelo**")) %>%
cols_label(
Sección = md("**Sección**"),
Modelo = md("**Modelo**"),
Test_Pearson = md("**Test Pearson (%)**"),
Chi_Cuadrado = md("**Chi Cuadrado**"),
Umbral_Aceptacion = md("**Umbral de Aceptación**"),
Resultado_Final = md("**Resultado Final**")
) %>%
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", align = "center")),
locations = cells_title()) %>%
tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
tab_options(table.width = pct(90), heading.title.font.size = px(14),
table.font.size = px(13), data_row.padding = px(8))
| Tabla N°4: Resumen del Test de Bondad de Ajuste por Modelo | |||||
| Sección | Modelo | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación | Resultado Final |
|---|---|---|---|---|---|
| A (1-18) | Poisson | 86.05 | 2.1833 | 3.84 | Modelo Aceptado |
| B (19-36) | Geométrica | 99.99 | 17.7066 | 5.99 | Modelo Rechazado |
| Autor: Leslye Quinchiguango | |||||
Los intervalos de confianza se calculan para la tabla
general de frecuencias, porque esa es la tabla principal de la
variable Section.
\[IC_{95\%}: \hat{p} \pm z_{\alpha/2} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]
z <- qnorm(0.975)
tabla_ic_general <- tabla_frec_general %>%
mutate(
p_obs = ni / n_total,
error = z * sqrt((p_obs * (1 - p_obs)) / n_total),
IC_inf = round(pmax(p_obs - error, 0), 4),
IC_sup = round(pmin(p_obs + error, 1), 4),
p_obs = round(p_obs, 4)
) %>%
select(Intervalo, ni, p_obs, IC_inf, IC_sup)
tabla_ic_general %>%
rename("Intervalo" = Intervalo, "Frec. Obs." = ni, "p̂ observada" = p_obs,
"IC Inferior 95%" = IC_inf, "IC Superior 95%" = IC_sup) %>%
gt() %>%
tab_header(title = md("**Tabla N°5: Intervalos de Confianza 95% — Section**")) %>%
tab_style(style = list(cell_fill(color = "#2C2C2C"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()) %>%
tab_style(style = cell_fill(color = "#F5F5F5"),
locations = cells_body(rows = seq(1, nrow(tabla_ic_general), by = 2))) %>%
tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
tab_options(table.width = pct(80), heading.title.font.size = px(16), table.font.size = px(13), data_row.padding = px(6))
| Tabla N°5: Intervalos de Confianza 95% — Section | ||||
| Intervalo | Frec. Obs. | p̂ observada | IC Inferior 95% | IC Superior 95% |
|---|---|---|---|---|
| 1 - 5 | 13 | 0.1625 | 0.0817 | 0.2433 |
| 6 - 10 | 12 | 0.1500 | 0.0718 | 0.2282 |
| 11 - 15 | 11 | 0.1375 | 0.0620 | 0.2130 |
| 16 - 20 | 12 | 0.1500 | 0.0718 | 0.2282 |
| 21 - 25 | 6 | 0.0750 | 0.0173 | 0.1327 |
| 26 - 30 | 13 | 0.1625 | 0.0817 | 0.2433 |
| 31 - 35 | 9 | 0.1125 | 0.0433 | 0.1817 |
| 36 | 4 | 0.0500 | 0.0022 | 0.0978 |
| Autor: Leslye Quinchiguango | ||||
par(mar = c(8, 6, 5, 2))
hi_obs_A <- 100 * tabla_frec_A$P_observada
hi_esp_A <- 100 * tabla_frec_A$P_teorica
barplot(
rbind(hi_obs_A, hi_esp_A),
beside = TRUE,
col = c("gray30", "gray75"),
names.arg = tabla_frec_A$Intervalo,
ylim = c(0, max(c(hi_obs_A, hi_esp_A)) * 1.35),
las = 2,
cex.names = 0.75,
ylab = ""
)
mtext("hi (%)", side = 2, line = 4, cex = 1)
mtext("Intervalo de Section (Sección A)", side = 1, line = 6.5, cex = 1)
mtext(paste0("Gráfica N°2: Observado vs Esperado — Poisson(λ=", round(lambda_hat_A, 2), ")"),
side = 3, line = 1.5, cex = 0.9, font = 2)
legend("topright", legend = c("Observado", "Esperado (Poisson)"),
fill = c("gray30", "gray75"), bty = "n", cex = 0.85)
par(mar = c(8, 6, 5, 2))
hi_obs_B <- 100 * tabla_frec_B$P_observada
hi_esp_B <- 100 * tabla_frec_B$P_teorica
barplot(
rbind(hi_obs_B, hi_esp_B),
beside = TRUE,
col = c("gray30", "gray75"),
names.arg = tabla_frec_B$Intervalo,
ylim = c(0, max(c(hi_obs_B, hi_esp_B)) * 1.35),
las = 2,
cex.names = 0.75,
ylab = ""
)
mtext("hi (%)", side = 2, line = 4, cex = 1)
mtext("Intervalo de Section (Sección B)", side = 1, line = 6.5, cex = 1)
mtext(paste0("Gráfica N°3: Observado vs Esperado — Geométrica(p=", round(p_hat_B, 3), ")"),
side = 3, line = 1.5, cex = 0.9, font = 2)
legend("topright", legend = c("Observado", "Esperado (Geométrica)"),
fill = c("gray30", "gray75"), bty = "n", cex = 0.85)
par(mar = c(8, 6, 5, 2))
p_obs_general <- tabla_ic_general$p_obs
ic_inf_general <- tabla_ic_general$IC_inf
ic_sup_general <- tabla_ic_general$IC_sup
bp <- barplot(p_obs_general,
col = gray(seq(0.25, 0.8, length.out = nrow(tabla_ic_general))),
names.arg = tabla_ic_general$Intervalo,
ylim = c(0, max(ic_sup_general) * 1.4),
las = 2,
cex.names = 0.8,
ylab = "")
arrows(bp, ic_inf_general, bp, ic_sup_general, angle = 90, code = 3, length = 0.06, lwd = 1.5)
mtext("Proporción", side = 2, line = 4, cex = 1)
mtext("Intervalo de Section", side = 1, line = 6.5, cex = 1)
mtext("Gráfica N°4: Intervalos de Confianza 95% — Section", side = 3, line = 1.5, cex = 0.9, font = 2)
legend("topright", legend = c("p̂ observada", "IC 95%"),
fill = c("gray60", NA), lty = c(NA, 1), lwd = c(NA, 1.5),
bty = "n", cex = 0.85)
La variable Section fue organizada correctamente mediante una sola tabla de distribución de frecuencias, considerando todo el rango de valores de 1 a 36 e intervalos de amplitud 5. Esta corrección evita duplicar la tabla en Sección A y Sección B, ya que la división por tramos se utiliza únicamente para la etapa de conjetura y ajuste de modelos probabilísticos.
En la etapa inferencial, la Sección A (valores 1 a 18) se ajustó mediante el modelo Poisson con \(\hat{\lambda} = 9.2955\), obteniendo \(\chi^2 = 2.1833\), \(gl = 1\), \(p = 1.395e-01\), por lo que no se rechaza H₀.
Para la Sección B (valores 19 a 36), se aplicó el modelo Geométrico con \(\hat{p} = 0.0957\), obteniendo \(\chi^2 = 17.7066\), \(gl = 2\), \(p = 1.429e-04\), por lo que se rechaza H₀.
En conclusión, la tabla descriptiva principal corresponde a toda la
variable Section, mientras que la separación en dos tramos
se justifica únicamente para comparar modelos probabilísticos en la
parte inferencial.
Autor: Leslye Quinchiguango