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
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).
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])
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 | ||||||||
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.
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)
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)
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)
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)
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 | |
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