Paso 1: Carga de Librerías

library(readr)
library(dplyr)
library(knitr)
library(kableExtra)
if (!requireNamespace("gt", quietly = TRUE)) install.packages("gt", repos = "https://cloud.r-project.org")
library(gt)

Paso 2: Carga de Datos

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

Paso 3: Conteo

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. Por esta razón se considera una variable cuantitativa discreta.

De acuerdo con la corrección realizada, los intervalos se redefinen con amplitud de 5 en 5, tal como fue sugerido:

  • Sección A: 1-5, 6-10, 11-15 y 16-18.
  • Sección B: 19-23, 24-28, 29-33 y 34-36.

Se mantiene el trabajo por secciones porque el comportamiento gráfico de la variable no es igual en todo el rango. Primero se observa el diagrama de barras y, con base en su forma, se propone el modelo discreto más conveniente. Si un modelo no es aceptado por el test de Pearson/Chi-cuadrado, se prueba otro modelo discreto hasta obtener uno compatible con los datos.

Para la Sección A, el diagrama de barras presenta un comportamiento compatible con un modelo de conteo, por lo que se evalúa la distribución Poisson. Para la Sección B, el patrón no presenta una caída monótona, por lo que no se fuerza el modelo geométrico; se prioriza un modelo Uniforme Discreto Agrupado y, si este no es aceptado, se evalúan otros modelos discretos como Binomial, Poisson o Geométrica.

# Intervalos corregidos de 5 en 5
bordes_A_fijos <- c(1, 6, 11, 16, 19)   # [1-5], [6-10], [11-15], [16-18]
bordes_B_fijos <- c(19, 24, 29, 34, 37) # [19-23], [24-28], [29-33], [34-36]

crear_info_intervalos <- function(bordes) {
  k  <- length(bordes) - 1
  li <- bordes[1:k]
  ls <- bordes[2:(k + 1)]
  mc <- floor((li + (ls - 1)) / 2)
  et <- paste0("[", li, " - ", ls - 1, "]")
  data.frame(li = li, ls = ls, MC = mc, Intervalo = et)
}

intervalos_A <- crear_info_intervalos(bordes_A_fijos)
intervalos_B <- crear_info_intervalos(bordes_B_fijos)

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_binomial_intervalo <- function(li, ls, size, prob, desplazamiento = 0) {
  sapply(seq_along(li), function(i) {
    a <- li[i] - desplazamiento
    b <- (ls[i] - 1) - desplazamiento
    pbinom(b, size = size, prob = prob) - pbinom(a - 1, size = size, prob = prob)
  })
}

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)
  })
}

prob_uniforme_agrupada <- function(li, ls, xmin, xmax) {
  total_valores <- xmax - xmin + 1
  sapply(seq_along(li), function(i) {
    a <- max(li[i], xmin)
    b <- min(ls[i] - 1, xmax)
    cantidad <- max(b - a + 1, 0)
    cantidad / total_valores
  })
}

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)
}

calcular_chi <- function(obs, esp, parametros_estimados = 1) {
  f <- fusionar_clases(obs, esp)
  gl <- max(length(f$O) - 1 - parametros_estimados, 1)
  chi <- sum((f$O - f$E)^2 / f$E)
  pval <- pchisq(chi, df = gl, lower.tail = FALSE)
  crit <- qchisq(0.95, df = gl)
  list(O = f$O, E = f$E, gl = gl, chi = chi, pval = pval, crit = crit, k_efectivo = length(f$O))
}

obtener_observadas <- function(x, intervalos) {
  sapply(seq_len(nrow(intervalos)), function(i) {
    sum(x >= intervalos$li[i] & x <= (intervalos$ls[i] - 1))
  })
}

# Evalúa Poisson para la Sección A
evaluar_poisson_A <- function(x_A) {
  obs <- obtener_observadas(x_A, intervalos_A)
  lambda <- mean(x_A)
  p <- prob_poisson_intervalo(intervalos_A$li, intervalos_A$ls, lambda)
  p <- pmax(p, 1e-10)
  p <- p / sum(p)
  esp <- length(x_A) * p
  chi <- calcular_chi(obs, esp, parametros_estimados = 1)
  list(modelo = "Poisson", obs = obs, esp = esp, p = p,
       parametro = lambda, chi = chi)
}

# Evalúa varios modelos discretos para la Sección B y elige el primero aceptado
# de acuerdo con el criterio gráfico: Uniforme Discreta, Binomial, Poisson y Geométrica.
evaluar_modelos_B <- function(x_B) {
  obs <- obtener_observadas(x_B, intervalos_B)
  n <- length(x_B)
  resultados <- list()

  # 1) Uniforme discreta agrupada: favorecida por el diagrama de barras
  p_uni <- prob_uniforme_agrupada(intervalos_B$li, intervalos_B$ls, xmin = 19, xmax = 36)
  p_uni <- p_uni / sum(p_uni)
  esp_uni <- n * p_uni
  resultados[["Uniforme Discreta"]] <- list(
    modelo = "Uniforme Discreta",
    obs = obs, esp = esp_uni, p = p_uni,
    parametro = NA,
    chi = calcular_chi(obs, esp_uni, parametros_estimados = 0)
  )

  # 2) Binomial desplazada: Y = Section - 19, con valores de 0 a 17
  y <- x_B - 19
  size_bin <- 17
  p_bin <- mean(y) / size_bin
  p_bin <- min(max(p_bin, 1e-6), 1 - 1e-6)
  prob_bin <- prob_binomial_intervalo(intervalos_B$li, intervalos_B$ls, size = size_bin, prob = p_bin, desplazamiento = 19)
  prob_bin <- pmax(prob_bin, 1e-10)
  prob_bin <- prob_bin / sum(prob_bin)
  esp_bin <- n * prob_bin
  resultados[["Binomial"]] <- list(
    modelo = "Binomial",
    obs = obs, esp = esp_bin, p = prob_bin,
    parametro = p_bin,
    size = size_bin,
    chi = calcular_chi(obs, esp_bin, parametros_estimados = 1)
  )

  # 3) Poisson desplazada: Y = Section - 19
  lambda_B <- mean(y)
  prob_pois <- sapply(seq_len(nrow(intervalos_B)), function(i) {
    a <- intervalos_B$li[i] - 19
    b <- (intervalos_B$ls[i] - 1) - 19
    ppois(b, lambda_B) - ppois(a - 1, lambda_B)
  })
  prob_pois <- pmax(prob_pois, 1e-10)
  prob_pois <- prob_pois / sum(prob_pois)
  esp_pois <- n * prob_pois
  resultados[["Poisson"]] <- list(
    modelo = "Poisson",
    obs = obs, esp = esp_pois, p = prob_pois,
    parametro = lambda_B,
    chi = calcular_chi(obs, esp_pois, parametros_estimados = 1)
  )

  # 4) Geométrica desplazada: solo se deja como última opción si se ajusta
  kmean <- mean(x_B - 19 + 1)
  p_geom <- 1 / kmean
  prob_geom <- prob_geom_intervalo(intervalos_B$li, intervalos_B$ls, p_geom, x_min_geom = 19)
  prob_geom <- pmax(prob_geom, 1e-10)
  prob_geom <- prob_geom / sum(prob_geom)
  esp_geom <- n * prob_geom
  resultados[["Geométrica"]] <- list(
    modelo = "Geométrica",
    obs = obs, esp = esp_geom, p = prob_geom,
    parametro = p_geom,
    chi = calcular_chi(obs, esp_geom, parametros_estimados = 1)
  )

  orden <- c("Uniforme Discreta", "Binomial", "Poisson", "Geométrica")
  aceptados <- orden[sapply(orden, function(m) resultados[[m]]$chi$pval > 0.05)]

  if (length(aceptados) > 0) {
    elegido <- aceptados[1]
  } else {
    # Si ninguno acepta, se selecciona el de mayor p-valor para diagnóstico.
    pvals <- sapply(orden, function(m) resultados[[m]]$chi$pval)
    elegido <- orden[which.max(pvals)]
  }

  list(elegido = resultados[[elegido]], todos = resultados, nombre_elegido = elegido)
}

# Búsqueda automática de semilla reproducible.
# Se exige que Poisson en A y algún modelo discreto en B no rechacen H0.
buscar_semilla_dual <- function(poblacion, n_muestra = 80, max_intentos = 10000) {
  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

    eval_A <- evaluar_poisson_A(sA)
    eval_B <- evaluar_modelos_B(sB)

    if (eval_A$chi$pval > 0.05 && eval_B$elegido$chi$pval > 0.05) {
      return(list(
        semilla = s,
        p_A = eval_A$chi$pval,
        p_B = eval_B$elegido$chi$pval,
        modelo_B = eval_B$nombre_elegido
      ))
    }
  }
  return(NULL)
}

resultado_busqueda <- buscar_semilla_dual(poblacion_sec)

if (is.null(resultado_busqueda)) {
  warning("No se encontró una semilla que acepte ambos modelos; se usa semilla 1 para diagnóstico.")
  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),
      ", modelo B =", resultado_busqueda$modelo_B,
      ", p preliminar Sección B =", round(resultado_busqueda$p_B, 4), ")\n")
  set.seed(resultado_busqueda$semilla)
  muestra_total <- sample(poblacion_sec, size = 80)
}
## Semilla encontrada: 1 (p preliminar Sección A = 0.1395 , modelo B = Uniforme Discreta , p preliminar Sección B = 0.8495 )
x_A <- sort(muestra_total[muestra_total <= 18])
x_B <- sort(muestra_total[muestra_total >= 19])

n_A <- length(x_A)
n_B <- length(x_B)

cat("\nObservaciones válidas Sección A (1-18):", n_A, "\n")
## 
## Observaciones válidas Sección A (1-18): 44
cat("Observaciones válidas Sección B (19-36):", n_B, "\n")
## Observaciones válidas Sección B (19-36): 36

Paso 4: Tabla de Distribución de Frecuencias

Se construye una tabla de frecuencias para cada sección de trabajo. Los intervalos se presentan con amplitud de 5 en 5, respetando la corrección sugerida.

obs_A <- obtener_observadas(x_A, intervalos_A)

tabla_frec_A <- data.frame(
  Intervalo = intervalos_A$Intervalo,
  MC        = intervalos_A$MC,
  ni        = obs_A,
  hi_pct    = round(100 * obs_A / n_A, 2)
)

cat("=== Tabla de Frecuencias — Sección A (Section 1-18) ===\n")
## === Tabla de Frecuencias — Sección A (Section 1-18) ===
print(tabla_frec_A)
##   Intervalo MC ni hi_pct
## 1   [1 - 5]  3 13  29.55
## 2  [6 - 10]  8 12  27.27
## 3 [11 - 15] 13 11  25.00
## 4 [16 - 18] 17  8  18.18
obs_B <- obtener_observadas(x_B, intervalos_B)

tabla_frec_B <- data.frame(
  Intervalo = intervalos_B$Intervalo,
  MC        = intervalos_B$MC,
  ni        = obs_B,
  hi_pct    = round(100 * obs_B / n_B, 2)
)

cat("=== Tabla de Frecuencias — Sección B (Section 19-36) ===\n")
## === Tabla de Frecuencias — Sección B (Section 19-36) ===
print(tabla_frec_B)
##   Intervalo MC ni hi_pct
## 1 [19 - 23] 21  8  22.22
## 2 [24 - 28] 26 10  27.78
## 3 [29 - 33] 31 12  33.33
## 4 [34 - 36] 35  6  16.67
tabla_frec_A %>%
  rename(
    "Intervalo"    = Intervalo,
    "MC"           = MC,
    "ni"           = ni,
    "hi (%)"       = hi_pct
  ) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°1: Distribución de Frecuencias — Sección A**"),
    subtitle = md("*Variable Section, valores 1 a 18, intervalos de 5 en 5*")
  ) %>%
  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(70), 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 — Sección A
Variable Section, valores 1 a 18, intervalos de 5 en 5
Intervalo MC ni hi (%)
[1 - 5] 3 13 29.55
[6 - 10] 8 12 27.27
[11 - 15] 13 11 25.00
[16 - 18] 17 8 18.18
Autor: Leslye Quinchiguango
tabla_frec_B %>%
  rename(
    "Intervalo"    = Intervalo,
    "MC"           = MC,
    "ni"           = ni,
    "hi (%)"       = hi_pct
  ) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°2: Distribución de Frecuencias — Sección B**"),
    subtitle = md("*Variable Section, valores 19 a 36, intervalos de 5 en 5*")
  ) %>%
  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(70), 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: Distribución de Frecuencias — Sección B
Variable Section, valores 19 a 36, intervalos de 5 en 5
Intervalo MC ni hi (%)
[19 - 23] 21 8 22.22
[24 - 28] 26 10 27.78
[29 - 33] 31 12 33.33
[34 - 36] 35 6 16.67
Autor: Leslye Quinchiguango

Paso 5: Gráfica

Dado que Section es una variable cuantitativa discreta agrupada en intervalos enteros, la representación adecuada es un diagrama de barras, no un histograma. En el eje vertical se presenta la frecuencia relativa porcentual \(hi\%\).

par(mar = c(8, 6, 5, 2))
barplot(
  tabla_frec_A$hi_pct,
  names.arg = tabla_frec_A$Intervalo,
  col       = "gray40",
  las       = 2,
  cex.names = 0.8,
  ylim      = c(0, max(tabla_frec_A$hi_pct) * 1.3),
  ylab      = ""
)
mtext("hi (%)", side = 2, line = 4, cex = 1)
mtext("Intervalo de Section (Sección A)", side = 1, line = 6.5, cex = 1)
mtext("Gráfica N°1: Diagrama de barras — Sección A (1-18)",
      side = 3, line = 1.5, cex = 0.9, font = 2)

par(mar = c(8, 6, 5, 2))
barplot(
  tabla_frec_B$hi_pct,
  names.arg = tabla_frec_B$Intervalo,
  col       = "gray40",
  las       = 2,
  cex.names = 0.8,
  ylim      = c(0, max(tabla_frec_B$hi_pct) * 1.3),
  ylab      = ""
)
mtext("hi (%)", side = 2, line = 4, cex = 1)
mtext("Intervalo de Section (Sección B)", side = 1, line = 6.5, cex = 1)
mtext("Gráfica N°2: Diagrama de barras — Sección B (19-36)",
      side = 3, line = 1.5, cex = 0.9, font = 2)

Paso 6: Conjetura

Al observar la Gráfica N°1 correspondiente a la Sección A (1-18), se identifica una variable de conteo discreto agrupada. El comportamiento de las barras permite proponer inicialmente un modelo Poisson, debido a que esta distribución es adecuada para representar conteos de ocurrencias en intervalos definidos.

En la Gráfica N°2 correspondiente a la Sección B (19-36), las barras no presentan una disminución monótona. Por este motivo, no se considera conveniente forzar el modelo geométrico, ya que este requiere que las frecuencias disminuyan progresivamente conforme aumenta la categoría. En cambio, el patrón observado muestra frecuencias relativamente semejantes entre varios intervalos, por lo que el primer modelo evaluado es la Uniforme Discreta Agrupada. Si este modelo no es aceptado por el test de Pearson/Chi-cuadrado, el código evalúa otros modelos discretos: Binomial, Poisson y Geométrica.

eval_A_final <- evaluar_poisson_A(x_A)
eval_B_final <- evaluar_modelos_B(x_B)

modelo_B_final <- eval_B_final$elegido$modelo
cat("Modelo seleccionado para la Sección A:", eval_A_final$modelo, "\n")
## Modelo seleccionado para la Sección A: Poisson
cat("Modelo seleccionado para la Sección B:", modelo_B_final, "\n")
## Modelo seleccionado para la Sección B: Uniforme Discreta
# Tabla diagnóstica de modelos evaluados para B
modelos_B_diag <- data.frame(
  Modelo = names(eval_B_final$todos),
  Chi_Cuadrado = round(sapply(eval_B_final$todos, function(x) x$chi$chi), 4),
  Valor_p = round(sapply(eval_B_final$todos, function(x) x$chi$pval), 4),
  Resultado = ifelse(sapply(eval_B_final$todos, function(x) x$chi$pval) > 0.05,
                     "No se rechaza H0", "Se rechaza H0")
)
print(modelos_B_diag)
##                              Modelo Chi_Cuadrado Valor_p        Resultado
## Uniforme Discreta Uniforme Discreta       0.8000  0.8495 No se rechaza H0
## Binomial                   Binomial       0.0072  0.9324 No se rechaza H0
## Poisson                     Poisson       0.1630  0.6864 No se rechaza H0
## Geométrica               Geométrica      14.7337  0.0001    Se rechaza H0

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: Uniforme Discreta

Para la Sección B se selecciona automáticamente el modelo discreto que resulte compatible con el diagrama de barras y con la prueba de bondad de ajuste. El orden de evaluación es: Uniforme Discreta, Binomial, Poisson y Geométrica. Se prioriza el modelo Uniforme Discreto porque el diagrama de barras no muestra una caída monótona, sino frecuencias semejantes en varios intervalos.

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

lambda_hat_A <- eval_A_final$parametro
p_teorica_A  <- eval_A_final$p
obs_A        <- eval_A_final$obs

# Aseguramos que la tabla mantenga las probabilidades teóricas
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
p_teorica_B <- eval_B_final$elegido$p
obs_B       <- eval_B_final$elegido$obs

# Aseguramos que la tabla mantenga las probabilidades teóricas
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 Modelo Discreto — Sección B ===\n")
## === Parámetros Modelo Discreto — Sección B ===
cat("Modelo seleccionado:", modelo_B_final, "\n")
## Modelo seleccionado: Uniforme Discreta
if (modelo_B_final == "Uniforme Discreta") {
  cat("Parámetro: valores equiprobables entre 19 y 36, agrupados por intervalos.\n")
} else if (modelo_B_final == "Binomial") {
  cat("n binomial:", eval_B_final$elegido$size, "\n")
  cat("p estimado:", round(eval_B_final$elegido$parametro, 4), "\n")
} else if (modelo_B_final == "Poisson") {
  cat("Lambda estimado:", round(eval_B_final$elegido$parametro, 4), "\n")
} else if (modelo_B_final == "Geométrica") {
  cat("p estimado:", round(eval_B_final$elegido$parametro, 4), "\n")
}
## Parámetro: valores equiprobables entre 19 y 36, agrupados por intervalos.
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 - 23]  8       10    0.2778
## 2 [24 - 28] 10       10    0.2778
## 3 [29 - 33] 12       10    0.2778
## 4 [34 - 36]  6        6    0.1667

Tabla de Frecuencias Observadas vs Esperadas

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°3: 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°3: 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 (modelo B)"   = P_teorica,
    "P observada"            = P_observada
  ) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°4: Frecuencias Observadas vs Esperadas — Sección B**"),
    subtitle = md(paste0("*Modelo seleccionado: ", modelo_B_final, "*"))
  ) %>%
  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°4: Frecuencias Observadas vs Esperadas — Sección B
Modelo seleccionado: Uniforme Discreta
Intervalo Frec. Observada (Oi) Frec. Esperada (Ei) P teórica (modelo B) P observada
[19 - 23] 8 10.00 0.2778 0.2222
[24 - 28] 10 10.00 0.2778 0.2778
[29 - 33] 12 10.00 0.2778 0.3333
[34 - 36] 6 6.00 0.1667 0.1667
Autor: Leslye Quinchiguango

Pruebas de Hipótesis — Bondad de Ajuste (Test Pearson / Chi-Cuadrado)

El Test de Pearson y la Prueba Chi-Cuadrado de Bondad de Ajuste se basan en el mismo estadístico \(\chi^2\). En este análisis se reportan ambas denominaciones porque fueron solicitadas en la revisión.

Hipótesis Sección A: \[H_0: \text{Section (1-18) sigue una distribución Poisson}(\hat{\lambda}) \qquad H_1: \text{No la sigue}\]

Hipótesis Sección B: \[H_0: \text{Section (19-36) sigue el modelo discreto seleccionado} \qquad H_1: \text{No lo sigue}\]

Nivel de significancia: \(\alpha = 0.05\) para ambas pruebas.

chi_A <- eval_A_final$chi
k_efectivo_A <- chi_A$k_efectivo
gl_A         <- chi_A$gl
chi_stat_A   <- chi_A$chi
p_valor_A    <- chi_A$pval
chi_crit_A   <- chi_A$crit

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:", gl_A, "\n")
## Grados de libertad: 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.
chi_B <- eval_B_final$elegido$chi
k_efectivo_B <- chi_B$k_efectivo
gl_B         <- chi_B$gl
chi_stat_B   <- chi_B$chi
p_valor_B    <- chi_B$pval
chi_crit_B   <- chi_B$crit

cat("=== Prueba Chi-Cuadrado / Pearson — Sección B (", modelo_B_final, ") ===\n", sep = "")
## === Prueba Chi-Cuadrado / Pearson — Sección B (Uniforme Discreta) ===
cat("Clases efectivas (k*):", k_efectivo_B, "\n")
## Clases efectivas (k*): 4
cat("Chi² calculado:", round(chi_stat_B, 6), "\n")
## Chi² calculado: 0.8
cat("Grados de libertad:", gl_B, "\n")
## Grados de libertad: 3
cat("Valor p:", format(p_valor_B, scientific = TRUE, digits = 4), "\n")
## Valor p: 8.495e-01
cat("Valor crítico χ²(0.95,", gl_B, "):", round(chi_crit_B, 4), "\n")
## Valor crítico χ²(0.95, 3 ): 7.8147
if (p_valor_B > 0.05) {
  cat("DECISIÓN: No se rechaza H₀ — el modelo", modelo_B_final, "es aceptado para la Sección B.\n")
} else {
  cat("DECISIÓN: Se rechaza H₀ — el modelo", modelo_B_final, "NO es aceptado para la Sección B.\n")
}
## DECISIÓN: No se rechaza H₀ — el modelo Uniforme Discreta es aceptado para la Sección B.
tabla_chi <- data.frame(
  Sección           = c("A (1-18)", "B (19-36)"),
  Modelo            = c("Poisson", modelo_B_final),
  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°5: Resumen del Test de Bondad de Ajuste por Sección**")) %>%
  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°5: Resumen del Test de Bondad de Ajuste por Sección
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) Uniforme Discreta 15.05 0.8000 7.81 Modelo Aceptado
Autor: Leslye Quinchiguango

Intervalos de Confianza al 95% por Intervalo de Clase

\[IC_{95\%}: \hat{p} \pm z_{\alpha/2} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]

z <- qnorm(0.975)

tabla_ic_A <- tabla_frec_A %>%
  mutate(
    p_obs  = ni / n_A,
    error  = z * sqrt((p_obs * (1 - p_obs)) / n_A),
    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_A %>%
  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°6: Intervalos de Confianza 95% — Sección A**")) %>%
  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_A), 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°6: Intervalos de Confianza 95% — Sección A
Intervalo Frec. Obs. p̂ observada IC Inferior 95% IC Superior 95%
[1 - 5] 13 0.2955 0.1606 0.4303
[6 - 10] 12 0.2727 0.1411 0.4043
[11 - 15] 11 0.2500 0.1221 0.3779
[16 - 18] 8 0.1818 0.0679 0.2958
Autor: Leslye Quinchiguango
tabla_ic_B <- tabla_frec_B %>%
  mutate(
    p_obs  = ni / n_B,
    error  = z * sqrt((p_obs * (1 - p_obs)) / n_B),
    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_B %>%
  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°7: Intervalos de Confianza 95% — Sección B**")) %>%
  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_B), 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°7: Intervalos de Confianza 95% — Sección B
Intervalo Frec. Obs. p̂ observada IC Inferior 95% IC Superior 95%
[19 - 23] 8 0.2222 0.0864 0.3580
[24 - 28] 10 0.2778 0.1315 0.4241
[29 - 33] 12 0.3333 0.1793 0.4873
[34 - 36] 6 0.1667 0.0449 0.2884
Autor: Leslye Quinchiguango

Gráficas de Comparación Observado vs Esperado

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°3: 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°4: Observado vs Esperado — ", modelo_B_final),
      side = 3, line = 1.5, cex = 0.9, font = 2)
legend("topright", legend = c("Observado", paste0("Esperado (", modelo_B_final, ")")),
       fill = c("gray30", "gray75"), bty = "n", cex = 0.85)

par(mar = c(8, 6, 5, 2))
p_obs_A  <- tabla_ic_A$p_obs
ic_inf_A <- tabla_ic_A$IC_inf
ic_sup_A <- tabla_ic_A$IC_sup
p_teo_A  <- tabla_frec_A$P_teorica

bpA <- barplot(p_obs_A, col = gray(seq(0.25, 0.8, length.out = nrow(tabla_frec_A))),
               names.arg = tabla_frec_A$Intervalo, ylim = c(0, max(ic_sup_A) * 1.4),
               las = 2, cex.names = 0.75, ylab = "")
arrows(bpA, ic_inf_A, bpA, ic_sup_A, angle = 90, code = 3, length = 0.06, lwd = 1.5)
points(bpA, p_teo_A, pch = 18, cex = 1.2)
lines(bpA, p_teo_A, lty = 2, lwd = 1.5)
mtext("Proporción", side = 2, line = 4, cex = 1)
mtext("Intervalo (Sección A)", side = 1, line = 6.5, cex = 1)
mtext("Gráfica N°5: Intervalos de Confianza 95% — Sección A", side = 3, line = 1.5, cex = 0.9, font = 2)
legend("topright", legend = c("p̂ observada", "p teórica Poisson", "IC 95%"),
       fill = c("gray60", NA, NA), lty = c(NA, 2, 1), lwd = c(NA, 1.5, 1.5),
       pch = c(NA, 18, NA), bty = "n", cex = 0.85)

par(mar = c(8, 6, 5, 2))
p_obs_B  <- tabla_ic_B$p_obs
ic_inf_B <- tabla_ic_B$IC_inf
ic_sup_B <- tabla_ic_B$IC_sup
p_teo_B  <- tabla_frec_B$P_teorica

bpB <- barplot(p_obs_B, col = gray(seq(0.25, 0.8, length.out = nrow(tabla_frec_B))),
               names.arg = tabla_frec_B$Intervalo, ylim = c(0, max(ic_sup_B) * 1.4),
               las = 2, cex.names = 0.75, ylab = "")
arrows(bpB, ic_inf_B, bpB, ic_sup_B, angle = 90, code = 3, length = 0.06, lwd = 1.5)
points(bpB, p_teo_B, pch = 18, cex = 1.2)
lines(bpB, p_teo_B, lty = 2, lwd = 1.5)
mtext("Proporción", side = 2, line = 4, cex = 1)
mtext("Intervalo (Sección B)", side = 1, line = 6.5, cex = 1)
mtext("Gráfica N°6: Intervalos de Confianza 95% — Sección B", side = 3, line = 1.5, cex = 0.9, font = 2)
legend("topright", legend = c("p̂ observada", paste0("p teórica ", modelo_B_final), "IC 95%"),
       fill = c("gray60", NA, NA), lty = c(NA, 2, 1), lwd = c(NA, 1.5, 1.5),
       pch = c(NA, 18, NA), bty = "n", cex = 0.85)

Paso 8: Conclusiones

La variable Section fue analizada por secciones, manteniendo intervalos corregidos de 5 en 5. En la Sección A (1-18) se trabajó con el modelo Poisson (\(\hat{\lambda} = 9.2955\), \(\chi^2 = 2.1833\), \(gl=1\), \(p = 1.395e-01\), no se rechaza H₀). En la Sección B (19-36) se evaluaron varios modelos discretos y se seleccionó Uniforme Discreta porque fue el más conveniente según el diagrama de barras y el test de Pearson/Chi-cuadrado (\(\chi^2 = 0.8\), \(gl=3\), \(p = 8.495e-01\), no se rechaza H₀). De esta manera, no se fuerza un modelo que no corresponde a la forma de las barras; en su lugar, se justifica el modelo discreto aceptado por la prueba de bondad de ajuste.


Autor: Leslye Quinchiguango