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 <- "C:/Users/luisq/OneDrive/Desktop/ESTADISTICA/kansas.csv"
datos <- read_delim(ruta_csv, delim = ";", show_col_types = FALSE)
cat("Data set cargada correctamente.\n")
## Data set cargada correctamente.
cat("Total de registros (filas):", nrow(datos), "\n")
## Total de registros (filas): 104173

2. Extraer Variable

Se realiza el aislamiento de la variable cuantitativa discreta YEARS_ACTIVE, que representa el tiempo total, expresado en años enteros, durante el cual cada pozo de hidrocarburos ha permanecido en operació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.

# Detectar el nombre exacto de la columna (maneja variantes de nombre)
col_ya <- grep("YEAR", names(datos), value = TRUE, ignore.case = TRUE)
if (length(col_ya) == 0) stop("No se encontró columna de años activos en el dataset.")
col_ya <- col_ya[1]
cat("Columna detectada:", col_ya, "\n")
## Columna detectada: WIZARD_BASE_REFERENCE_YEAR
x_raw <- datos %>%
  mutate(YA = suppressWarnings(as.integer(.data[[col_ya]]))) %>%
  filter(!is.na(YA), YA >= 1, YA <= 100) %>%
  pull(YA)

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

3. Determinación de los Intervalos

Aunque YEARS_ACTIVE es una variable cuantitativa discreta, presenta 22 valores únicos, lo que supera el umbral de 10. Por esta razón, se la trata como variable continua agrupada en intervalos de clase: con tantos valores distintos, listarlos individualmente no aporta información útil y el agrupamiento permite identificar patrones en la vida operativa de los pozos de forma clara y comparable. 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, aplicando el criterio de máximo 10 intervalos.

\[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 = 37 | k = 10 | Rango = 91 | Amplitud c = 10
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 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("[", 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, ",
      "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())
  ) %>%
  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, pozos de hidrocarburos, Kansas, EE.UU. (n = 37 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)
[2 – 12) 7 7 18.92 0.1892 7 0.1892 37 1.0000
[12 – 22) 17 1 2.70 0.0270 8 0.2162 30 0.8108
[22 – 32) 27 4 10.81 0.1081 12 0.3243 29 0.7838
[32 – 42) 37 2 5.41 0.0541 14 0.3784 25 0.6757
[42 – 52) 47 2 5.41 0.0541 16 0.4324 23 0.6216
[52 – 62) 57 3 8.11 0.0811 19 0.5135 21 0.5676
[62 – 72) 67 6 16.22 0.1622 25 0.6757 18 0.4865
[72 – 82) 77 4 10.81 0.1081 29 0.7838 12 0.3243
[82 – 92) 87 6 16.22 0.1622 35 0.9459 8 0.2162
[92 – 93] 93 2 5.41 0.0541 37 1.0000 2 0.0541
TOTAL 37 100.00 1.0000 37 1.0000 37 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 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("Años Activo,\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 = 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("Años Activo,\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("Años activo", side = 1, line = 3.5, cex = 1)
mtext("Años Activo,\npozos 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=", as.integer(mediana)), cex = 0.8)
text(q3,      1.38, labels = paste0("Q3=", q3),                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)

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 = ", as.integer(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("Años Activo,\npozos 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 = ", ")

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", "Valores atípicos (Outliers)"),
  Valor = c(format(n, big.mark = ","), as.character(x_min), as.character(x_max),
            as.character(rango_val), as.character(round(media, 2)),
            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)),
            outliers_str),
  stringsAsFactors = FALSE
) %>%
  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_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) 37
Mínimo 2
Máximo 93
Rango 91
Media 51.49
Mediana 56
Moda 79
Varianza (s²) 924.31
Desviación estándar (s) 30.4
Coef. de variación (CV%) 59.05%
Cuartil 1 (Q1) 25
Cuartil 3 (Q3) 79
Rango intercuartílico (IQR) 54
Asimetría de Pearson -0.4454
Curtosis 1.5394
Valores atípicos (Outliers) Sin valores atípicos
Autor: Leslye Quinchiguango

7. Conclusiones

La variable Años Activo fluctúa entre 2 y 93 años (rango = 91 años) y sus valores varían en torno a 56, con una desviación estándar de 30.4 años, siendo un grupo de valores heterogéneo (CV = 59.05%), sin presencia de valores atípicos. El conjunto de valores se concentra a la izquierda (As = -0.45), con mayor concentración de pozos con muchos años de actividad y una cola hacia pozos de corta operación. Por lo tanto, el comportamiento es medianamente favorable, dado que la alta variabilidad en los años de actividad refleja una cartera de pozos heterogénea, con pozos de corta y larga vida operativa que demandan estrategias de gestión diferenciadas.


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