1 Configuración y 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 cualitativa ordinal Nivel de Profundidad.

datos <- read_csv(file.choose(), show_col_types = FALSE)
cat("Dataset cargado correctamente.\n")
## Dataset cargado correctamente.
cat("Total de registros evaluados (filas):", nrow(datos), "\n")
## Total de registros evaluados (filas): 47757

2 Extraer y Ordenar Variable

Se extrae la variable DEPTH_LEVEL y se traduce al español con su orden lógico establecido.

datos <- datos %>%
  mutate(
    PROFUNDIDAD = case_when(
      DEPTH_LEVEL == "SHALLOW" ~ "Superficial",
      DEPTH_LEVEL == "MEDIUM"  ~ "Medio",
      DEPTH_LEVEL == "DEEP"    ~ "Profundo",
      TRUE                     ~ "No registrado"
    )
  ) %>%
  filter(PROFUNDIDAD != "No registrado")

orden_logico <- c("Superficial", "Medio", "Profundo")

datos <- datos %>%
  mutate(
    PROFUNDIDAD = factor(PROFUNDIDAD, levels = orden_logico, ordered = TRUE)
  )

cat("Orden de categorías establecido:\n")
## Orden de categorías establecido:
cat(paste(levels(datos$PROFUNDIDAD), collapse = " → "), "\n")
## Superficial → Medio → Profundo
cat("\nDistribución por nivel:\n")
## 
## Distribución por nivel:
print(table(datos$PROFUNDIDAD))
## 
## Superficial       Medio    Profundo 
##       15986       15852       15919

3 Identificación del Modelo Probabilístico

La variable Nivel de Profundidad es una variable cualitativa ordinal con k = 3 categorías discretas. A partir del análisis descriptivo previo se observó que las tres categorías presentan proporciones prácticamente iguales (~33,3% cada una), lo que indica que ninguna categoría es más probable que otra.

Distribución seleccionada: Uniforme Discreta

Una variable aleatoria discreta \(X\) sigue una distribución Uniforme Discreta con \(k\) valores posibles si:

\[P(X = x_i) = \frac{1}{k}, \quad i = 1, 2, \ldots, k\]

En este caso \(k = 3\), por lo tanto la probabilidad teórica de cada categoría bajo \(H_0\) es:

\[P(X = x_i) = \frac{1}{3} \approx 0.3333\]

4 Parámetros del Modelo

k <- 3
p_teorica <- 1 / k

# Frecuencias observadas
tabla_frec <- datos %>%
  group_by(PROFUNDIDAD, .drop = FALSE) %>%
  summarise(Observada = n(), .groups = "drop") %>%
  arrange(PROFUNDIDAD)

n_total <- sum(tabla_frec$Observada)

# Frecuencia esperada bajo Uniforme
tabla_frec <- tabla_frec %>%
  mutate(
    Esperada      = n_total * p_teorica,
    P_teorica     = p_teorica,
    P_observada   = Observada / n_total
  )

# Media y varianza de la Uniforme Discreta
media_uniforme    <- (1 + k) / 2
varianza_uniforme <- (k^2 - 1) / 12

cat("=== Parámetros Uniforme Discreta ===\n")
## === Parámetros Uniforme Discreta ===
cat("Número de categorías (k):", k, "\n")
## Número de categorías (k): 3
cat("Probabilidad teórica por categoría (p):", round(p_teorica, 4), "\n")
## Probabilidad teórica por categoría (p): 0.3333
cat("Media teórica E[X]:", round(media_uniforme, 4), "\n")
## Media teórica E[X]: 2
cat("Varianza teórica V[X]:", round(varianza_uniforme, 4), "\n")
## Varianza teórica V[X]: 0.6667
cat("Total de observaciones (n):", n_total, "\n")
## Total de observaciones (n): 47757

5 Tabla de Frecuencias Observadas vs Esperadas

Se comparan las frecuencias observadas con las frecuencias teóricas esperadas bajo el modelo Uniforme Discreta.

tabla_frec %>%
  mutate(
    P_teorica   = sprintf("%.4f", P_teorica),
    P_observada = sprintf("%.4f", P_observada),
    Esperada    = sprintf("%.2f", Esperada)
  ) %>%
  rename(
    "Categoría"            = PROFUNDIDAD,
    "Frec. Observada (Oi)" = Observada,
    "Frec. Esperada (Ei)"  = Esperada,
    "P teórica"            = P_teorica,
    "P observada"          = P_observada
  ) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°1: Frecuencias Observadas vs Esperadas**"),
    subtitle = md("*Modelo: Uniforme Discreta — Nivel de Profundidad*")
  ) %>%
  cols_label(
    "Categoría"            = md("**Categoría**"),
    "Frec. Observada (Oi)" = md("**Frec. Observada (Oi)**"),
    "Frec. Esperada (Ei)"  = md("**Frec. Esperada (Ei)**"),
    "P teórica"            = md("**P teórica**"),
    "P observada"          = md("**P observada**")
  ) %>%
  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), by = 2))
  ) %>%
  tab_source_note(source_note = md("*Autor: Fernando Almeida*")) %>%
  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: Frecuencias Observadas vs Esperadas
Modelo: Uniforme Discreta — Nivel de Profundidad
Categoría Frec. Observada (Oi) Frec. Esperada (Ei) P teórica P observada
Superficial 15986 15919.00 0.3333 0.3347
Medio 15852 15919.00 0.3333 0.3319
Profundo 15919 15919.00 0.3333 0.3333
Autor: Fernando Almeida

6 Prueba de Hipótesis — Bondad de Ajuste Chi-Cuadrado

Se aplica la Prueba Chi-Cuadrado de Bondad de Ajuste (\(\chi^2\)) para determinar si la distribución observada de la variable Nivel de Profundidad se ajusta significativamente al modelo teórico Uniforme Discreta.

6.1 Planteamiento de Hipótesis

\[H_0: \text{La variable Nivel de Profundidad sigue una distribución Uniforme Discreta}\] \[H_1: \text{La variable Nivel de Profundidad NO sigue una distribución Uniforme Discreta}\]

Nivel de significancia: \(\alpha = 0.05\)

6.2 Estadístico de Prueba

El estadístico Chi-Cuadrado se calcula como:

\[\chi^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i}\]

Donde \(O_i\) = frecuencia observada y \(E_i\) = frecuencia esperada bajo \(H_0\).

# Prueba Chi-Cuadrado de bondad de ajuste
chi_result <- chisq.test(
  x = tabla_frec$Observada,
  p = rep(p_teorica, k)
)

cat("=== Prueba Chi-Cuadrado de Bondad de Ajuste ===\n")
## === Prueba Chi-Cuadrado de Bondad de Ajuste ===
cat("Estadístico Chi² calculado:", round(chi_result$statistic, 6), "\n")
## Estadístico Chi² calculado: 0.56398
cat("Grados de libertad (gl):", chi_result$parameter, "\n")
## Grados de libertad (gl): 2
cat("Valor p:", format(chi_result$p.value, scientific = TRUE, digits = 4), "\n")
## Valor p: 7.543e-01
cat("Nivel de significancia α:", 0.05, "\n")
## Nivel de significancia α: 0.05
# Valor crítico
chi_critico <- qchisq(0.95, df = k - 1)
cat("Valor crítico χ²(0.95,", k-1, "):", round(chi_critico, 4), "\n")
## Valor crítico χ²(0.95, 2 ): 5.9915
# Decisión
if (chi_result$p.value > 0.05) {
  cat("\nDECISIÓN: No se rechaza H₀.\n")
  cat("CONCLUSIÓN: Los datos se ajustan a una distribución Uniforme Discreta (α = 0.05).\n")
} else {
  cat("\nDECISIÓN: Se rechaza H₀.\n")
  cat("CONCLUSIÓN: Los datos NO se ajustan a una distribución Uniforme Discreta (α = 0.05).\n")
}
## 
## DECISIÓN: No se rechaza H₀.
## CONCLUSIÓN: Los datos se ajustan a una distribución Uniforme Discreta (α = 0.05).

6.3 Tabla de Resultados de la Prueba

tabla_chi <- data.frame(
  Variable             = "Nivel de Profundidad",
  Test_Pearson         = round((1 - chi_result$p.value) * 100, 2),
  Chi_Cuadrado         = round(chi_result$statistic, 4),
  Umbral_Aceptacion    = round(chi_critico, 2),
  Resultado_Final      = ifelse(chi_result$p.value > 0.05,
                                "Modelo Aceptado",
                                "Modelo Rechazado")
)

tabla_chi %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N°2: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD (UNIFORME DISCRETA)**")
  ) %>%
  cols_label(
    Variable          = md("**Variable**"),
    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: Fernando Almeida*")) %>%
  tab_options(
    table.width                = pct(80),
    heading.title.font.size    = px(14),
    table.font.size            = px(13),
    data_row.padding           = px(8)
  )
TABLA N°2: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD (UNIFORME DISCRETA)
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado Final
Nivel de Profundidad 24.57 0.564 5.99 Modelo Aceptado
Autor: Fernando Almeida

7 Intervalos de Confianza por Categoría

Se estima el intervalo de confianza al 95% para la proporción poblacional de cada categoría mediante la aproximación normal (intervalo de Wilson).

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

z <- qnorm(0.975)  # z para 95% de confianza

tabla_ic <- tabla_frec %>%
  mutate(
    p_obs  = Observada / 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(PROFUNDIDAD, Observada, p_obs, IC_inf, IC_sup)

tabla_ic %>%
  rename(
    "Categoría"       = PROFUNDIDAD,
    "Frec. Obs."      = Observada,
    "p̂ observada"    = p_obs,
    "IC Inferior 95%" = IC_inf,
    "IC Superior 95%" = IC_sup
  ) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°3: Intervalos de Confianza al 95%**"),
    subtitle = md("*Proporción por categoría — Nivel de Profundidad*")
  ) %>%
  cols_label(
    "Categoría"       = md("**Categoría**"),
    "Frec. Obs."      = md("**Frec. Obs.**"),
    "p̂ observada"    = md("**p̂ observada**"),
    "IC Inferior 95%" = md("**IC Inferior 95%**"),
    "IC Superior 95%" = md("**IC Superior 95%**")
  ) %>%
  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), by = 2))
  ) %>%
  tab_source_note(source_note = md("*Autor: Fernando Almeida*")) %>%
  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°3: Intervalos de Confianza al 95%
Proporción por categoría — Nivel de Profundidad
Categoría Frec. Obs. p̂ observada IC Inferior 95% IC Superior 95%
Superficial 15986 0.3347 0.3305 0.3390
Medio 15852 0.3319 0.3277 0.3362
Profundo 15919 0.3333 0.3291 0.3376
Autor: Fernando Almeida

8 Representación Gráfica

8.1 Frecuencias Observadas vs Esperadas

par(mar = c(8, 6, 5, 2))

categorias  <- as.character(tabla_frec$PROFUNDIDAD)
obs_vals    <- tabla_frec$Observada
esp_vals    <- rep(tabla_frec$Esperada[1], k)

barras <- barplot(
  rbind(obs_vals, esp_vals),
  beside     = TRUE,
  col        = c("gray30", "gray75"),
  names.arg  = categorias,
  ylim       = c(0, max(obs_vals) * 1.2),
  las        = 2,
  cex.names  = 0.9,
  main       = ""
)

mtext("Frecuencia", side = 2, line = 4.5, cex = 1)
mtext("Nivel de Profundidad", side = 1, line = 6, cex = 1)
mtext("Gráfica N°1: Frecuencias Observadas vs Esperadas — Uniforme Discreta",
      side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)

legend("topright",
       legend = c("Observada", "Esperada (Uniforme)"),
       fill   = c("gray30", "gray75"),
       bty    = "n", cex = 0.85)

8.2 Probabilidades Observadas vs Teóricas

par(mar = c(8, 6, 5, 2))

p_obs_vals <- tabla_frec$P_observada
p_teo_vals <- rep(p_teorica, k)

bp2 <- barplot(
  rbind(p_obs_vals, p_teo_vals),
  beside     = TRUE,
  col        = c("gray30", "gray75"),
  names.arg  = categorias,
  ylim       = c(0, 0.5),
  las        = 2,
  cex.names  = 0.9,
  ylab       = "Probabilidad",
  main       = ""
)

abline(h = p_teorica, col = "black", lty = 2, lwd = 1.5)

mtext("Nivel de Profundidad", side = 1, line = 6, cex = 1)
mtext("Gráfica N°2: Probabilidades Observadas vs Teóricas (p = 1/3)",
      side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)

legend("topright",
       legend = c("P observada", "P teórica (1/3)"),
       fill   = c("gray30", "gray75"),
       bty    = "n", cex = 0.85)

8.3 Intervalos de Confianza al 95%

par(mar = c(8, 6, 5, 2))

p_obs  <- tabla_ic$p_obs
ic_inf <- tabla_ic$IC_inf
ic_sup <- tabla_ic$IC_sup

bp3 <- barplot(
  p_obs,
  col       = c("gray30", "gray60", "gray85"),
  names.arg = as.character(tabla_ic$PROFUNDIDAD),
  ylim      = c(0, 0.5),
  las       = 2,
  cex.names = 0.9,
  ylab      = "Proporción",
  main      = ""
)

# Barras de error
arrows(x0  = bp3, y0 = ic_inf,
       x1  = bp3, y1 = ic_sup,
       angle = 90, code = 3, length = 0.08, lwd = 1.5)

abline(h = p_teorica, col = "black", lty = 2, lwd = 1.5)

mtext("Nivel de Profundidad", side = 1, line = 6, cex = 1)
mtext("Gráfica N°3: Intervalos de Confianza al 95% por Categoría",
      side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)

legend("topright",
       legend = c("p̂ observada", "p teórica (1/3)", "IC 95%"),
       fill   = c("gray60", NA, NA),
       lty    = c(NA, 2, 1),
       lwd    = c(NA, 1.5, 1.5),
       bty    = "n", cex = 0.85)

9 Tabla de Indicadores Inferenciales

tabla_inf <- data.frame(
  Indicador = c(
    "Variable",
    "Tipo de variable",
    "Modelo probabilístico",
    "Número de categorías (k)",
    "Probabilidad teórica (p = 1/k)",
    "Estadístico χ² calculado",
    "Grados de libertad",
    "Valor p",
    "Valor crítico χ²(0.95, 2)",
    "Nivel de significancia (α)",
    "Decisión sobre H₀",
    "IC 95% — Superficial",
    "IC 95% — Medio",
    "IC 95% — Profundo"
  ),
  Valor = c(
    "Nivel de Profundidad",
    "Cualitativa Ordinal",
    "Uniforme Discreta",
    as.character(k),
    sprintf("%.4f", p_teorica),
    sprintf("%.6f", chi_result$statistic),
    as.character(chi_result$parameter),
    format(chi_result$p.value, scientific = TRUE, digits = 4),
    sprintf("%.4f", chi_critico),
    "0.05",
    ifelse(chi_result$p.value > 0.05, "No se rechaza H₀", "Se rechaza H₀"),
    sprintf("[%.4f ; %.4f]", tabla_ic$IC_inf[1], tabla_ic$IC_sup[1]),
    sprintf("[%.4f ; %.4f]", tabla_ic$IC_inf[2], tabla_ic$IC_sup[2]),
    sprintf("[%.4f ; %.4f]", tabla_ic$IC_inf[3], tabla_ic$IC_sup[3])
  )
)

tabla_inf %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°4: Indicadores Inferenciales**"),
    subtitle = md("*Variable Cualitativa Ordinal: Nivel de Profundidad*")
  ) %>%
  cols_label(
    Indicador = md("**Indicador**"),
    Valor     = md("**Valor**")
  ) %>%
  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_inf), by = 2))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#D6D6D6"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      rows    = Indicador == "Decisión sobre H₀",
      columns = everything()
    )
  ) %>%
  tab_source_note(source_note = md("*Autor: Fernando Almeida*")) %>%
  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°4: Indicadores Inferenciales
Variable Cualitativa Ordinal: Nivel de Profundidad
Indicador Valor
Variable Nivel de Profundidad
Tipo de variable Cualitativa Ordinal
Modelo probabilístico Uniforme Discreta
Número de categorías (k) 3
Probabilidad teórica (p = 1/k) 0.3333
Estadístico χ² calculado 0.563980
Grados de libertad 2
Valor p 7.543e-01
Valor crítico χ²(0.95, 2) 5.9915
Nivel de significancia (α) 0.05
Decisión sobre H₀ No se rechaza H₀
IC 95% — Superficial [0.3305 ; 0.3390]
IC 95% — Medio [0.3277 ; 0.3362]
IC 95% — Profundo [0.3291 ; 0.3376]
Autor: Fernando Almeida

10 Conclusiones

La variable Nivel de Profundidad fue modelada bajo una distribución Uniforme Discreta con \(k = 3\) categorías y probabilidad teórica \(p = 1/3\) por categoría. La prueba Chi-Cuadrado de bondad de ajuste arrojó un estadístico \(\chi^2 = 0.564\) con un valor \(p = 7.543e-01\), por lo que con un nivel de significancia \(\alpha = 0.05\), no se rechaza H₀: los datos son consistentes con el modelo Uniforme Discreta propuesto. Los intervalos de confianza al 95% para cada categoría incluyen el valor teórico \(p = 0.3333\), lo que refuerza la conclusión inferencial.


Autor: Fernando Almeida