1 Configuración y Carga de Datos

Para iniciar el procesamiento estadístico, se verifica la estructura global del conjunto de datos correspondientes a los bloques contractuales y arrendamientos de hidrocarburos en el estado de Kansas.

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

2 Extraer Variable

Se realiza el aislamiento de la variable cuantitativa discreta YEARS_ACTIVE, que representa la cantidad de años que un arrendamiento de hidrocarburos ha permanecido activo (en producción) en Kansas. Sus valores son números enteros contables en el rango 1–89. Se filtran únicamente los valores válidos dentro de ese rango.

x_raw <- datos %>%
  mutate(YRS = suppressWarnings(as.integer(YEARS_ACTIVE))) %>%
  filter(!is.na(YRS), YRS >= 1, YRS <= 89) %>%
  pull(YRS)

n_unique <- length(unique(x_raw))
cat("Observaciones válidas:", length(x_raw), "\n")
## Observaciones válidas: 47757
cat("Valores únicos:", n_unique, "\n")
## Valores únicos: 89
cat("Como hay", n_unique, "> 10 valores únicos, se agrupa en intervalos de clase (máx. 10).\n")
## Como hay 89 > 10 valores únicos, se agrupa en intervalos de clase (máx. 10).

3 Determinación de los Intervalos

Se aplica el criterio de máximo 10 intervalos para variables discretas agrupadas. Los intervalos se construyen con notación \([L_i, L_s)\) —cerrado a la izquierda, abierto a la derecha—, excepto el último que se cierra en ambos extremos.

\[k = 10 \quad \text{(máximo permitido)} \qquad c = \left\lceil \frac{\max - \min}{k} \right\rceil\]

x         <- x_raw
n         <- length(x)
x_min     <- min(x)
x_max     <- max(x)
rango_val <- x_max - x_min

k      <- 10
c_amp  <- ceiling(rango_val / k)

cat("n =", n, "| k =", k, "| Rango =", rango_val, "| Amplitud c =", c_amp, "\n")
## n = 47757 | k = 10 | Rango = 88 | Amplitud c = 9
lim_inf    <- x_min + (0:(k - 1)) * c_amp
lim_sup    <- lim_inf + c_amp
lim_sup[k] <- x_max + 1
mc         <- floor((lim_inf + lim_sup) / 2)
breaks_vec <- c(lim_inf, lim_sup[k])

4 Tabla de Distribución de Frecuencias

Se calcula la distribución de frecuencias absolutas y relativas para la variable cuantitativa discreta agrupada Años Activo, correspondiente a los arrendamientos de hidrocarburos registrados en Kansas, EE.UU.

Justificación del agrupamiento. Años Activo es discreta, pero al tener 89 valores únicos (más de los 10 recomendados) una tabla de frecuencia simple resultaría demasiado extensa y poco legible. Por ello se agrupa en intervalos de clase, como se hace con variables continuas, únicamente como recurso para resumir la información; su naturaleza discreta se conserva en los límites e indicadores, que siguen siendo enteros.

intervalos_cut <- cut(x, breaks = breaks_vec, right = FALSE, include.lowest = TRUE)
freq_abs       <- as.integer(table(intervalos_cut))

li <- lim_inf
ls <- lim_sup

hi_dec  <- freq_abs / n
Ni_asc  <- cumsum(freq_abs)
Hi_asc  <- cumsum(hi_dec)
Ni_desc <- n - c(0, head(Ni_asc, -1))
Hi_desc <- 1 - c(0, head(Hi_asc, -1))

etiq_intervalo    <- paste0("[", li, " – ", ls, ")")
etiq_intervalo[k] <- paste0("[", li[k], " – ", ls[k] - 1, "]")

tabla_df <- data.frame(
  Intervalo = etiq_intervalo,
  MC        = as.integer(mc),
  ni        = freq_abs,
  hi_pct    = round(hi_dec * 100, 2),
  hi_real   = round(hi_dec, 4),
  Ni_a      = Ni_asc,
  Hi_a      = round(Hi_asc, 4),
  Ni_d      = Ni_desc,
  Hi_d      = round(Hi_desc, 4),
  stringsAsFactors = FALSE
)

total_row <- data.frame(
  Intervalo = "TOTAL",
  MC        = NA_integer_,
  ni        = sum(freq_abs),
  hi_pct    = round(sum(hi_dec) * 100, 2),
  hi_real   = round(sum(hi_dec), 4),
  Ni_a      = max(Ni_asc),
  Hi_a      = round(max(Hi_asc), 4),
  Ni_d      = max(Ni_desc),
  Hi_d      = round(max(Hi_desc), 4),
  stringsAsFactors = FALSE
)

tabla_final_freq <- bind_rows(tabla_df, total_row)

tabla_final_freq %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°1: Distribución de Frecuencias**"),
    subtitle = md(paste0(
      "*Variable Cuantitativa Discreta Agrupada: Años Activo, ",
      "arrendamientos de hidrocarburos, Kansas, EE.UU. (n = ",
      format(n, big.mark = ","), " registros válidos)*"
    ))
  ) %>%
  cols_label(
    Intervalo = md("**Intervalo [Li – Ls)**"),
    MC        = md("**Marca de Clase**"),
    ni        = md("**ni (FA)**"),
    hi_pct    = md("**hi %**"),
    hi_real   = md("**hi (decimal)**"),
    Ni_a      = md("**Ni ↑ (FAAa)**"),
    Hi_a      = md("**Hi ↑ (FRAa)**"),
    Ni_d      = md("**Ni ↓ (FAAd)**"),
    Hi_d      = md("**Hi ↓ (FRAd)**")
  ) %>%
  tab_spanner(label = md("**Frecuencia Relativa**"), columns = c(hi_pct, hi_real)) %>%
  tab_spanner(label = md("**Acumulada ↑**"),         columns = c(Ni_a, Hi_a)) %>%
  tab_spanner(label = md("**Acumulada ↓**"),         columns = c(Ni_d, Hi_d)) %>%
  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")
    ),
    locations = cells_column_spanners()
  ) %>%
  tab_style(
    style = cell_fill(color = "#F5F5F5"),
    locations = cells_body(rows = seq(1, nrow(tabla_final_freq), by = 2))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#D6D6D6"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      rows    = Intervalo == "TOTAL",
      columns = everything()
    )
  ) %>%
  fmt_missing(columns = everything(), missing_text = "—") %>%
  tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
  tab_options(
    table.width                = pct(100),
    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
Variable Cuantitativa Discreta Agrupada: Años Activo, arrendamientos de hidrocarburos, Kansas, EE.UU. (n = 47,757 registros válidos)
Intervalo [Li – Ls) Marca de Clase ni (FA)
Frecuencia Relativa
Acumulada ↑
Acumulada ↓
hi % hi (decimal) Ni ↑ (FAAa) Hi ↑ (FRAa) Ni ↓ (FAAd) Hi ↓ (FRAd)
[1 – 10) 5 10340 21.65 0.2165 10340 0.2165 47757 1.0000
[10 – 19) 14 13236 27.72 0.2772 23576 0.4937 37417 0.7835
[19 – 28) 23 6954 14.56 0.1456 30530 0.6393 24181 0.5063
[28 – 37) 32 5433 11.38 0.1138 35963 0.7530 17227 0.3607
[37 – 46) 41 5219 10.93 0.1093 41182 0.8623 11794 0.2470
[46 – 55) 50 2395 5.01 0.0501 43577 0.9125 6575 0.1377
[55 – 64) 59 2570 5.38 0.0538 46147 0.9663 4180 0.0875
[64 – 73) 68 759 1.59 0.0159 46906 0.9822 1610 0.0337
[73 – 82) 77 508 1.06 0.0106 47414 0.9928 851 0.0178
[82 – 89] 86 343 0.72 0.0072 47757 1.0000 343 0.0072
TOTAL 47757 100.00 1.0000 47757 1.0000 47757 1.0000
Autor: Leslye Quinchiguango

5 Representación Gráfica

Se presentan cuatro gráficas en escala de grises que permiten analizar visualmente la distribución de la variable cuantitativa discreta agrupada Años Activo.

5.1 Gráfica N°1 — Histograma de Frecuencias Absolutas

grises <- gray(seq(0.25, 0.80, length.out = k))
h_obj  <- hist(x, breaks = breaks_vec, plot = FALSE)

par(mar = c(5, 6, 6, 2))
plot(h_obj,
     col    = grises,
     border = "black",
     freq   = TRUE,
     main   = "",
     xlab   = "",
     ylab   = "",
     las    = 1,
     xaxt   = "n")

axis(1, at = breaks_vec, labels = breaks_vec, las = 1, cex.axis = 0.9)
mtext("Frecuencia Absoluta (ni)", side = 2, line = 4.5, cex = 1)
mtext("Años Activo",                 side = 1, line = 3.5, cex = 1)
mtext(
  "Gráfica N°1: Histograma de Frecuencias Absolutas de la Variable Años Activo,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)

5.2 Gráfica N°2 — Polígono de Frecuencias

mc_ext <- c(mc[1] - c_amp, mc, mc[k] + c_amp)
ni_ext <- c(0, freq_abs, 0)

grises <- gray(seq(0.25, 0.80, length.out = k))
h_obj  <- hist(x, breaks = breaks_vec, plot = FALSE)

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

plot(h_obj,
     col    = grises,
     border = "black",
     freq   = TRUE,
     main   = "",
     xlab   = "",
     ylab   = "",
     las    = 1,
     xaxt   = "n",
     ylim   = c(0, max(freq_abs) * 1.20))

axis(1, at = breaks_vec, labels = breaks_vec, las = 1, cex.axis = 0.9)

lines(mc_ext, ni_ext, col = "black", lwd = 2, lty = 1)
points(mc_ext, ni_ext, pch = 16, col = "black", cex = 0.9)

mtext("Frecuencia Absoluta (ni)", side = 2, line = 4.5, cex = 1)
mtext("Años Activo",                 side = 1, line = 3.5, cex = 1)
mtext(
  "Gráfica N°2: Polígono de Frecuencias de la Variable Años Activo,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)
legend("topright",
       legend = c("Histograma", "Polígono de frecuencias"),
       fill   = c("gray60", NA), border = c("black", NA),
       lty    = c(NA, 1),        pch    = c(NA, 16),
       lwd    = c(NA, 2),        col    = c(NA, "black"),
       bty = "n", cex = 0.85)

5.3 Gráfica N°3 — Boxplot

# Calcular indicadores necesarios para el boxplot
media    <- mean(x)
mediana  <- median(x)
desv_std <- sd(x)
q1       <- as.numeric(quantile(x, 0.25))
q3       <- as.numeric(quantile(x, 0.75))

par(mar = c(5, 4, 6, 2))
boxplot(x,
        col = "gray75", border = "black",
        horizontal = TRUE, outline = TRUE, pch = 16, cex = 0.5,
        main = "", xlab = "", ylab = "")
mtext("Años Activo", side = 1, line = 3.5, cex = 1)
mtext(
  "Gráfica N°3: Boxplot de la Variable Años Activo,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)
text(q1,      1.38, labels = paste0("Q1=", q1),      cex = 0.8)
text(mediana, 0.62, labels = paste0("Me=", mediana), cex = 0.8)
text(q3,      1.38, labels = paste0("Q3=", q3),      cex = 0.8)

5.4 Gráfica N°4 — Ojivas Creciente y Decreciente

x_asc  <- c(li[1], ls)
y_asc  <- c(0, Ni_asc)
x_desc <- c(li[1], ls)
y_desc <- c(n, Ni_desc)

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

plot(x_asc, y_asc,
     type = "b", pch = 16, lwd = 2, col = "black",
     ylim = c(0, n * 1.10),
     xlim = c(min(x_asc) - 1, max(x_asc) + 1),
     xlab = "", ylab = "", main = "",
     las  = 1, xaxt = "n")

axis(1, at = breaks_vec, labels = breaks_vec, las = 1, cex.axis = 0.9)

lines(x_desc, y_desc,
      type = "b", pch = 17, lwd = 2, col = "gray40", lty = 2)

grid(col = "gray85", lty = "dotted")

y_cruce <- n / 2
abline(h = y_cruce, col = "gray50", lty = 3, lwd = 1.2)
abline(v = mediana,  col = "gray50", lty = 3, lwd = 1.2)
text(mediana + 0.5, y_cruce + (n * 0.04),
     labels = paste0("Cruce \u2248 Me = ", mediana),
     cex = 0.82, col = "black", font = 3)

legend("right",
       legend = c("Ojiva Creciente (Ni \u2191)", "Ojiva Decreciente (Ni \u2193)"),
       col = c("black", "gray40"), lty = c(1, 2), pch = c(16, 17),
       lwd = 2, bty = "n", cex = 0.9)

mtext("Frecuencia Absoluta Acumulada (Ni)", side = 2, line = 5,   cex = 1)
mtext("Años Activo",                            side = 1, line = 3.5, cex = 1)
mtext(
  "Gráfica N°4: Ojivas Creciente y Decreciente de la Variable Años Activo,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)

6 Indicadores Estadísticos

Para la variable cuantitativa discreta agrupada Años Activo, se calculan todos los indicadores de tendencia central, dispersión y forma.

moda_val <- as.integer(names(sort(table(x), decreasing = TRUE)[1]))
cv       <- (desv_std / media) * 100
iqr_val  <- IQR(x)
asimetria    <- (3 * (media - mediana)) / desv_std
curtosis_val <- (sum((x - media)^4) / length(x)) / (desv_std^4)
lim_inf_out  <- q1 - 1.5 * iqr_val
lim_sup_out  <- q3 + 1.5 * iqr_val
outliers     <- sort(unique(x[x < lim_inf_out | x > lim_sup_out]))
outliers_str <- if (length(outliers) == 0) "Sin valores atípicos" else paste(outliers, collapse = ", ")

indicadores <- data.frame(
  Indicador = c(
    "Tamaño muestral (n)",
    "Mínimo",
    "Máximo",
    "Rango",
    "Media",
    "Mediana",
    "Moda",
    "Varianza (s²)",
    "Desviación estándar (s)",
    "Coef. de variación (CV%)",
    "Cuartil 1 (Q1)",
    "Cuartil 3 (Q3)",
    "Rango intercuartílico (IQR)",
    "Asimetría de Pearson",
    "Curtosis"
  ),
  Valor = c(
    format(n, big.mark = ","),
    as.character(x_min),
    as.character(x_max),
    as.character(rango_val),
    as.character(round(media)),
    as.character(round(mediana)),
    as.character(moda_val),
    as.character(round(desv_std^2, 2)),
    as.character(round(desv_std, 2)),
    paste0(round(cv, 2), "%"),
    as.character(round(q1)),
    as.character(round(q3)),
    as.character(round(iqr_val)),
    as.character(round(asimetria, 4)),
    as.character(round(curtosis_val, 4))
  ),
  stringsAsFactors = FALSE
)

indicadores %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°2: Indicadores Estadísticos**"),
    subtitle = md("*Variable Cuantitativa Discreta Agrupada: Años Activo*")
  ) %>%
  cols_label(
    Indicador = md("**Indicador**"),
    Valor     = md("**Valor**")
  ) %>%
  cols_align(align = "left",  columns = Indicador) %>%
  cols_align(align = "right", columns = Valor) %>%
  tab_style(
    style = list(
      cell_fill(color = "#2C2C2C"),
      cell_text(color = "white", weight = "bold")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", color = "#E0E0E0", weight = px(1)),
    locations = cells_body(rows = everything())
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#F0F0F0"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      rows    = Indicador == "Media",
      columns = everything()
    )
  ) %>%
  tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
  tab_options(
    table.width                = pct(45),
    heading.title.font.size    = px(15),
    heading.subtitle.font.size = px(11),
    table.font.size            = px(12),
    data_row.padding           = px(4),
    column_labels.border.top.width    = px(2),
    column_labels.border.bottom.width = px(2),
    table_body.border.bottom.width    = px(2),
    table.border.top.style     = "hidden",
    table.border.bottom.style  = "hidden"
  )
Tabla N°2: Indicadores Estadísticos
Variable Cuantitativa Discreta Agrupada: Años Activo
Indicador Valor
Tamaño muestral (n) 47,757
Mínimo 1
Máximo 89
Rango 88
Media 24
Mediana 19
Moda 1
Varianza (s²) 339.18
Desviación estándar (s) 18.42
Coef. de variación (CV%) 75.8%
Cuartil 1 (Q1) 11
Cuartil 3 (Q3) 36
Rango intercuartílico (IQR) 25
Asimetría de Pearson 0.8629
Curtosis 3.3584
Autor: Leslye Quinchiguango

7 Conclusiones

La variable Años Activo fluctúa entre 1 y 89 (rango = 88 años) y sus valores varían en torno a 19, con una desviación estándar de 18.42 años, siendo un grupo de valores heterogéneo (CV = 75.8%), con presencia de valores atípicos en los años de actividad: 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89. El conjunto de valores se concentra a la derecha (As = 0.86), con mayor concentración de arrendamientos de corta duración. Por lo tanto, el comportamiento es medianamente favorable, dado que la alta variabilidad en la duración de actividad refleja ciclos heterogéneos de producción en la industria extractiva de Kansas.


Autor: Leslye Quinchiguango