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.

ruta_csv <- file.choose()
datos <- read_delim(ruta_csv, delim = ",", show_col_types = FALSE)
cat("Dataset cargada correctamente.\n")
## Dataset 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 continua AVG_PRODUCTION, que representa el volumen promedio de hidrocarburos producido por el pozo en un año, expresado en barriles/año/año. Sus valores pertenecen a los reales no negativos. Se filtran únicamente los valores válidos mayores a cero.

x_raw <- datos %>%
  mutate(AP = suppressWarnings(as.numeric(AVG_PRODUCTION))) %>%
  filter(!is.na(AP), AP > 0) %>%
  pull(AP)

cat("Observaciones válidas:", length(x_raw), "\n")
## Observaciones válidas: 47757

3. Determinación de los Intervalos

Para la variable cuantitativa continua Producción Promedio Anual, se aplica el criterio de máximo 10 intervalos de clase. La amplitud se calcula como \(c = \left\lceil \dfrac{\max - \min}{k} \right\rceil\), y 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 = 868923.2 | Amplitud c = 86893
lim_inf    <- x_min + (0:(k - 1)) * c_amp
lim_sup    <- lim_inf + c_amp
lim_sup[k] <- x_max
mc         <- (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 continua Producción Promedio Anual, correspondiente a los pozos de hidrocarburos registrados en Kansas, EE.UU.

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("[", format(li, big.mark=",", scientific=FALSE), " – ", format(ls, big.mark=",", scientific=FALSE), ")")
etiq_intervalo[k] <- paste0("[", format(li[k], big.mark=",", scientific=FALSE), " – ", format(ls[k], big.mark=",", scientific=FALSE), "]")

tabla_df <- data.frame(
  Intervalo = etiq_intervalo,
  MC        = round(mc, 0),
  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_real_,
  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 Continua: Producción Promedio Anual, ",
      "pozos 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())
  ) %>%
  sub_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 Continua: Producción Promedio Anual, pozos 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)
[ 0.75 – 86,893.75) 43447 47620 99.71 0.9971 47620 0.9971 47757 1.0000
[ 86,893.75 – 173,786.75) 130340 102 0.21 0.0021 47722 0.9993 137 0.0029
[173,786.75 – 260,679.75) 217233 24 0.05 0.0005 47746 0.9998 35 0.0007
[260,679.75 – 347,572.75) 304126 8 0.02 0.0002 47754 0.9999 11 0.0002
[347,572.75 – 434,465.75) 391019 1 0.00 0.0000 47755 1.0000 3 0.0001
[434,465.75 – 521,358.75) 477912 1 0.00 0.0000 47756 1.0000 2 0.0000
[521,358.75 – 608,251.75) 564805 0 0.00 0.0000 47756 1.0000 1 0.0000
[608,251.75 – 695,144.75) 651698 0 0.00 0.0000 47756 1.0000 1 0.0000
[695,144.75 – 782,037.75) 738591 0 0.00 0.0000 47756 1.0000 1 0.0000
[782,037.8 – 868,924] 825481 1 0.00 0.0000 47757 1.0000 1 0.0000
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 continua Producción Promedio Anual.

5.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 = format(breaks_vec, big.mark=",", scientific=FALSE), las = 2, cex.axis = 0.75)
mtext("Frecuencia Absoluta (ni)",       side = 2, line = 4.5, cex = 1)
mtext("Producción Promedio Anual (barriles/año)", side = 1, line = 4.5, cex = 1)
mtext("Producción Promedio Anual,\npozos de hidrocarburos, Kansas, EE.UU.",
      side = 3, line = 3, cex = 0.9, font = 2)

5.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 = format(breaks_vec, big.mark=",", scientific=FALSE), las = 2, cex.axis = 0.75)
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("Producción Promedio Anual (barriles/año)", side = 1, line = 4.5, cex = 1)
mtext("Producción Promedio Anual,\npozos 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 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("Producción Promedio Anual (barriles/año)", side = 1, line = 3.5, cex = 1)
mtext("Producción Promedio Anual,\npozos de hidrocarburos, Kansas, EE.UU.",
      side = 3, line = 3, cex = 0.9, font = 2)
text(q1,      1.38, labels = paste0("Q1=", format(round(q1), big.mark=",")), cex = 0.8)
text(mediana, 0.62, labels = paste0("Me=", format(round(mediana), big.mark=",")), cex = 0.8)
text(q3,      1.38, labels = paste0("Q3=", format(round(q3), big.mark=",")), cex = 0.8)

5.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[-length(Ni_desc)], 0)

par(mar = c(6, 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), max(x_asc)),
     xlab = "", ylab = "", main = "", las = 1, xaxt = "n")
axis(1, at = breaks_vec, labels = format(breaks_vec, big.mark=",", scientific=FALSE), las = 2, cex.axis = 0.75)
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 + c_amp * 0.3, y_cruce + (n * 0.04),
     labels = paste0("Cruce \u2248 Me = ", format(round(mediana), big.mark=",")),
     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("Producción Promedio Anual (barriles/año)",    side = 1, line = 5,   cex = 1)
mtext("Producción Promedio Anual,\npozos de hidrocarburos, Kansas, EE.UU.",
      side = 3, line = 3, cex = 0.9, font = 2)

6. Indicadores Estadísticos

Para la variable cuantitativa continua Producción Promedio Anual, se calculan todos los indicadores de tendencia central, dispersión y forma.

moda_int     <- etiq_intervalo[which.max(freq_abs)]
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
n_outliers   <- sum(x < lim_inf_out | x > lim_sup_out)
outliers_str <- if (n_outliers == 0) "Sin valores atípicos" else paste0(format(n_outliers, big.mark=","), " valores atípicos detectados")

data.frame(
  Indicador = c("Tamaño muestral (n)", "Mínimo", "Máximo", "Rango",
                "Media", "Mediana", "Moda (intervalo modal)",
                "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", "Valores atípicos (Outliers)"),
  Valor = c(format(n, big.mark = ","),
            paste0(format(round(x_min, 2), big.mark=","), " bbl"),
            paste0(format(round(x_max, 2), big.mark=","), " bbl"),
            paste0(format(round(rango_val, 2), big.mark=","), " bbl"),
            paste0(format(round(media, 2), big.mark=","), " bbl"),
            paste0(format(round(mediana, 2), big.mark=","), " bbl"),
            moda_int,
            as.character(format(round(desv_std^2, 2), big.mark=",")),
            paste0(format(round(desv_std, 2), big.mark=","), " bbl"),
            paste0(round(cv, 2), "%"),
            paste0(format(round(q1, 2), big.mark=","), " bbl"),
            paste0(format(round(q3, 2), big.mark=","), " bbl"),
            paste0(format(round(iqr_val, 2), big.mark=","), " bbl"),
            as.character(round(asimetria, 4)),
            as.character(round(curtosis_val, 4)),
            outliers_str),
  stringsAsFactors = FALSE
) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°2: Indicadores Estadísticos**"),
    subtitle = md("*Variable Cuantitativa Continua: Producción Promedio Anual (barriles/año)*")
  ) %>%
  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_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
  tab_options(
    table.width = pct(55), 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 Continua: Producción Promedio Anual (barriles/año)
Indicador Valor
Tamaño muestral (n) 47,757
Mínimo 0.75 bbl
Máximo 868,924 bbl
Rango 868,923.2 bbl
Media 6,539.69 bbl
Mediana 2,581.72 bbl
Moda (intervalo modal) [ 0.75 – 86,893.75)
Varianza (s²) 165,063,292
Desviación estándar (s) 12,847.7 bbl
Coef. de variación (CV%) 196.46%
Cuartil 1 (Q1) 940.3 bbl
Cuartil 3 (Q3) 7,428.16 bbl
Rango intercuartílico (IQR) 6,487.86 bbl
Asimetría de Pearson 0.9242
Curtosis 569.8983
Valores atípicos (Outliers) 4,870 valores atípicos detectados
Autor: Leslye Quinchiguango

7. Conclusiones

La variable Producción Promedio Anual fluctúa entre 0.75 y 868,924 barriles/año (rango = 868,923.2 bbl) y sus valores varían en torno a 2,581.72 bbl, con una desviación estándar de 12,847.7 bbl, siendo un grupo de valores heterogéneo (CV = 196.46%), con 4,870 valores atípicos detectados. El conjunto de valores se concentra a la derecha (As = 0.92), con mayor concentración de pozos de baja producción promedio anual y una cola hacia pozos de muy alta producción. Por lo tanto, el comportamiento es medianamente favorable, dado que la alta variabilidad en la producción promedio anual refleja una cartera de pozos muy heterogénea, con pozos de bajo y alto rendimiento que requieren estrategias de gestión diferenciadas.


Autor: Leslye Quinchiguango — Análisis Estadístico, Kansas Hydrocarbon Leases Dataset