1 Carga de Librerías

library(readr)
library(dplyr)
library(gt)
cat("Librerías cargadas correctamente.\n")
## Librerías cargadas correctamente.

2 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

3 Selección de Variable

Se realiza el aislamiento de la variable cuantitativa continua AVG_PRODUCTION (producción anual promedio por pozo, calculada como CUMULATIVE_PRODUCTION / YEARS_ACTIVE). Al ser una variable extremadamente asimétrica (rango de 0.75 a más de 800,000 bbl/año), se recorta el 1% superior de valores atípicos —criterio estándar para variables muy sesgadas—, ya que sin ese recorte el histograma queda degenerado (casi todos los datos caen en un solo intervalo).

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

cap_p99 <- quantile(prod_raw, 0.99, na.rm = TRUE)
x_raw   <- prod_raw[prod_raw <= cap_p99]

cat("Observaciones sin recorte:", length(prod_raw), "| Percentil 99 (tope):", round(cap_p99,2), "\n")
## Observaciones sin recorte: 47757 | Percentil 99 (tope): 49354.18
n_conteo  <- length(x_raw)
k_sturges <- ceiling(1 + 3.322 * log10(n_conteo))
cat("Observaciones válidas:", n_conteo, "\n")
## Observaciones válidas: 47279
cat("Clases (Regla de Sturges):", k_sturges, "\n")
## Clases (Regla de Sturges): 17
cat("Mínimo:", round(min(x_raw), 2), "| Máximo:", round(max(x_raw), 2), "\n")
## Mínimo: 0.75 | Máximo: 49276.21

4 Frecuencia

Al ser Producción Anual Promedio una variable cuantitativa continua, se determina el número de intervalos de clase aplicando la Regla de Sturges.

\[k = \lceil 1 + 3.322 \log_{10}(n) \rceil \qquad c = \frac{\max - \min}{k}\]

x          <- x_raw
n          <- length(x)
x_min      <- min(x); x_max <- max(x)
rango_st   <- x_max - x_min
k_st       <- k_sturges
c_amp_st   <- (x_max - x_min) / k_st
lim_inf_st <- x_min + (0:(k_st - 1)) * c_amp_st
lim_sup_st <- lim_inf_st + c_amp_st; lim_sup_st[k_st] <- x_max
mc_st      <- (lim_inf_st + lim_sup_st) / 2
breaks_st  <- c(lim_inf_st, lim_sup_st[k_st])
cat("n =", n, "| k (Sturges) =", k_st, "| Amplitud c =", round(c_amp_st, 4), "\n")
## n = 47279 | k (Sturges) = 17 | Amplitud c = 2898.557

5 Tabla de Distribución de Frecuencia

intervalos_cut_st <- cut(x, breaks = breaks_st, right = FALSE, include.lowest = TRUE)
freq_abs_st       <- as.integer(table(intervalos_cut_st))

hi_dec_st  <- freq_abs_st / n
Ni_asc_st  <- cumsum(freq_abs_st)
Hi_asc_st  <- cumsum(hi_dec_st)
Ni_desc_st <- n - c(0, head(Ni_asc_st, -1))
Hi_desc_st <- 1 - c(0, head(Hi_asc_st, -1))

etiq_st       <- paste0("[",format(round(lim_inf_st,2),big.mark=",")," - ",format(round(lim_sup_st,2),big.mark=","),")")
etiq_st[k_st] <- paste0("[",format(round(lim_inf_st[k_st],2),big.mark=",")," - ",format(round(lim_sup_st[k_st],2),big.mark=","),"]")

tabla_st_df <- data.frame(
  Intervalo = etiq_st, MC = round(mc_st,2), ni = freq_abs_st,
  hi_pct = round(hi_dec_st*100,2), hi_real = round(hi_dec_st,4),
  Ni_a = Ni_asc_st, Hi_a = round(Hi_asc_st,4),
  Ni_d = Ni_desc_st, Hi_d = round(Hi_desc_st,4), stringsAsFactors=FALSE
)
total_st_row <- data.frame(
  Intervalo = "TOTAL", MC = NA_real_, ni = sum(freq_abs_st),
  hi_pct = round(sum(hi_dec_st)*100,2), hi_real = round(sum(hi_dec_st),4),
  Ni_a = max(Ni_asc_st), Hi_a = round(max(Hi_asc_st),4),
  Ni_d = max(Ni_desc_st), Hi_d = round(max(Hi_desc_st),4), stringsAsFactors=FALSE
)
tabla_sturges_final <- bind_rows(tabla_st_df, total_st_row)

tabla_sturges_final %>%
  gt() %>%
  tab_header(title=md("**Distribución de Frecuencias — Regla de Sturges (referencial)**"),
             subtitle=md(paste0("*Producción Anual Promedio, Kansas, EE.UU. (n=",format(n,big.mark=","),", k=",k_st," intervalos)*"))) %>%
  cols_label(Intervalo=md("**Intervalo**"), MC=md("**MC**"), ni=md("**ni**"),
             hi_pct=md("**hi%**"), hi_real=md("**hi**"),
             Ni_a=md("**Ni (asc)**"), Hi_a=md("**Hi (asc)**"),
             Ni_d=md("**Ni (desc)**"), Hi_d=md("**Hi (desc)**")) %>%
  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_sturges_final),by=2))) %>%
  tab_style(style=list(cell_fill(color="#D6D6D6"),cell_text(weight="bold")),
            locations=cells_body(rows=Intervalo=="TOTAL")) %>%
  fmt_missing(columns=everything(), missing_text="-") %>%
  tab_source_note(source_note=md("*Autor: Fernando Almeida*")) %>%
  tab_options(table.width=pct(100), heading.title.font.size=px(15),
              heading.subtitle.font.size=px(11), table.font.size=px(12), data_row.padding=px(4))
Distribución de Frecuencias — Regla de Sturges (referencial)
Producción Anual Promedio, Kansas, EE.UU. (n=47,279, k=17 intervalos)
Intervalo MC ni hi% hi Ni (asc) Hi (asc) Ni (desc) Hi (desc)
[ 0.75 - 2,899.31) 1450.03 25316 53.55 0.5355 25316 0.5355 47279 1.0000
[ 2,899.31 - 5,797.86) 4348.58 7909 16.73 0.1673 33225 0.7027 21963 0.4645
[ 5,797.86 - 8,696.42) 7247.14 4131 8.74 0.0874 37356 0.7901 14054 0.2973
[ 8,696.42 - 11,594.98) 10145.70 2532 5.36 0.0536 39888 0.8437 9923 0.2099
[11,594.98 - 14,493.53) 13044.25 1767 3.74 0.0374 41655 0.8810 7391 0.1563
[14,493.53 - 17,392.09) 15942.81 1330 2.81 0.0281 42985 0.9092 5624 0.1190
[17,392.09 - 20,290.65) 18841.37 1095 2.32 0.0232 44080 0.9323 4294 0.0908
[20,290.65 - 23,189.20) 21739.92 902 1.91 0.0191 44982 0.9514 3199 0.0677
[23,189.20 - 26,087.76) 24638.48 730 1.54 0.0154 45712 0.9669 2297 0.0486
[26,087.76 - 28,986.32) 27537.04 536 1.13 0.0113 46248 0.9782 1567 0.0331
[28,986.32 - 31,884.87) 30435.59 360 0.76 0.0076 46608 0.9858 1031 0.0218
[31,884.87 - 34,783.43) 33334.15 213 0.45 0.0045 46821 0.9903 671 0.0142
[34,783.43 - 37,681.98) 36232.71 122 0.26 0.0026 46943 0.9929 458 0.0097
[37,681.98 - 40,580.54) 39131.26 117 0.25 0.0025 47060 0.9954 336 0.0071
[40,580.54 - 43,479.10) 42029.82 80 0.17 0.0017 47140 0.9971 219 0.0046
[43,479.10 - 46,377.65) 44928.38 84 0.18 0.0018 47224 0.9988 139 0.0029
[46,377.65 - 49,276.21] 47826.93 55 0.12 0.0012 47279 1.0000 55 0.0012
TOTAL - 47279 100.00 1.0000 47279 1.0000 47279 1.0000
Autor: Fernando Almeida

Aplicando la Regla de Sturges, con 47,279 observaciones corresponderían 17 intervalos de clase. Sin embargo, un desglose tan fino dificulta la lectura visual y el cálculo de los indicadores estadísticos. Por ello, se simplifica el análisis a una tabla de 10 intervalos de clase, criterio que conserva representatividad estadística sin sacrificar claridad interpretativa.

x          <- x_raw
n          <- length(x)
x_min      <- min(x); x_max <- max(x)
k          <- 10
c_amp      <- (x_max - x_min) / k
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])
cat("n =", n, "| k =", k, "| Amplitud c =", round(c_amp, 4), "\n")
## n = 47279 | k = 10 | Amplitud c = 4927.546
intervalos_cut <- cut(x, breaks=breaks_vec, right=FALSE, include.lowest=TRUE)
freq_abs       <- as.integer(table(intervalos_cut))
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           <- paste0("[",format(round(lim_inf,2),big.mark=",")," - ",format(round(lim_sup,2),big.mark=","),")")
etiq[k]        <- paste0("[",format(round(lim_inf[k],2),big.mark=",")," - ",format(round(lim_sup[k],2),big.mark=","),"]")

bind_rows(
  data.frame(Intervalo=etiq, MC=round(mc,2), 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),
  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)
) %>%
  gt() %>%
  tab_header(title=md("**Tabla N°1: Distribución de Frecuencias**"),
             subtitle=md(paste0("*Producción Anual Promedio, Kansas (n=",format(n,big.mark=","),")*"))) %>%
  cols_label(Intervalo=md("**Intervalo**"), MC=md("**MC**"), ni=md("**ni**"),
             hi_pct=md("**hi%**"), hi_real=md("**hi**"),
             Ni_a=md("**Ni (asc)**"), Hi_a=md("**Hi (asc)**"),
             Ni_d=md("**Ni (desc)**"), Hi_d=md("**Hi (desc)**")) %>%
  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,k+1,by=2))) %>%
  tab_style(style=list(cell_fill(color="#D6D6D6"),cell_text(weight="bold")),
            locations=cells_body(rows=Intervalo=="TOTAL")) %>%
  fmt_missing(columns=everything(), missing_text="-") %>%
  tab_source_note(source_note=md("*Autor: Fernando Almeida*")) %>%
  tab_options(table.width=pct(100), table.font.size=px(13), data_row.padding=px(6))
Tabla N°1: Distribución de Frecuencias
Producción Anual Promedio, Kansas (n=47,279)
Intervalo MC ni hi% hi Ni (asc) Hi (asc) Ni (desc) Hi (desc)
[ 0.75 - 4,928.30) 2464.52 31483 66.59 0.6659 31483 0.6659 47279 1.0000
[ 4,928.30 - 9,855.84) 7392.07 7018 14.84 0.1484 38501 0.8143 15796 0.3341
[ 9,855.84 - 14,783.39) 12319.62 3291 6.96 0.0696 41792 0.8839 8778 0.1857
[14,783.39 - 19,710.93) 17247.16 2067 4.37 0.0437 43859 0.9277 5487 0.1161
[19,710.93 - 24,638.48) 22174.71 1489 3.15 0.0315 45348 0.9592 3420 0.0723
[24,638.48 - 29,566.03) 27102.25 978 2.07 0.0207 46326 0.9798 1931 0.0408
[29,566.03 - 34,493.57) 32029.80 475 1.00 0.0100 46801 0.9899 953 0.0202
[34,493.57 - 39,421.12) 36957.35 222 0.47 0.0047 47023 0.9946 478 0.0101
[39,421.12 - 44,348.66) 41884.89 143 0.30 0.0030 47166 0.9976 256 0.0054
[44,348.66 - 49,276.21] 46812.44 113 0.24 0.0024 47279 1.0000 113 0.0024
TOTAL - 47279 100.00 1.0000 47279 1.0000 47279 1.0000
Autor: Fernando Almeida

6 Gráficos de Distribución de Frecuencia

Se presentan cuatro gráficas en escala de grises que permiten analizar visualmente la distribución de la variable cuantitativa continua Producción Anual Promedio.

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, 7, 2))
plot(h_obj, col = grises, border = "black", freq = TRUE,
     main = "", xlab = "", ylab = "", las = 1, xaxt = "n")
axis(1, at = breaks_vec, labels = format(round(breaks_vec,2),big.mark=","), las = 2, cex.axis = 0.75)
mtext("Frecuencia Absoluta (ni)", side = 2, line = 4.5, cex = 1)
mtext("Producción Anual Promedio (bbl/año)",        side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°1: Histograma de Frecuencias Absolutas de la Variable Producción Anual Promedio,\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)

par(mar = c(5, 6, 7, 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(round(breaks_vec,2),big.mark=","), 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 Anual Promedio (bbl/año)",        side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°2: Polígono de Frecuencias de la Variable Producción Anual Promedio,\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

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 Anual Promedio (bbl/año)", side = 1, line = 3.5, cex = 1)
mtext(
  "Gráfica N°3: Boxplot de la Variable Producción Anual Promedio,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)
text(q1,      1.38, labels = paste0("Q1=",  round(q1,2)),      cex = 0.8)
text(mediana, 0.62, labels = paste0("Me=",  round(mediana,2)), cex = 0.8)
text(q3,      1.38, labels = paste0("Q3=",  round(q3,2)),      cex = 0.8)

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

x_asc  <- c(lim_inf[1], lim_sup)
y_asc  <- c(0, Ni_asc)
x_desc <- c(lim_inf[1], lim_sup)
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),
     xlab = "", ylab = "", main = "", las = 1, xaxt = "n")
axis(1, at = breaks_vec, labels = format(round(breaks_vec,2),big.mark=","), 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)

legend("right",
       legend = c("Ojiva Creciente (Ni ↑)", "Ojiva Decreciente (Ni ↓)"),
       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 Anual Promedio (bbl/año)",            side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°4: Ojivas Creciente y Decreciente de la Variable Producción Anual Promedio,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)

7 Indicadores Estadísticos

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

idx_moda <- which.max(freq_abs)
d1       <- freq_abs[idx_moda] - ifelse(idx_moda > 1, freq_abs[idx_moda - 1], 0)
d2       <- freq_abs[idx_moda] - ifelse(idx_moda < k, freq_abs[idx_moda + 1], 0)
moda_val <- lim_inf[idx_moda] + (d1 / (d1 + d2)) * c_amp

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(x[x < lim_inf_out | x > lim_sup_out])
n_outliers   <- length(outliers)

indicadores <- data.frame(
  Indicador = c(
    "Tamaño muestral (n)", "Mínimo", "Máximo", "Rango",
    "Media", "Mediana", "Moda (clase 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"
  ),
  Valor = c(
    format(n, big.mark = ","),
    as.character(round(x_min,2)), as.character(round(x_max,2)),
    as.character(round(rango_st,2)),
    as.character(round(media,2)), as.character(round(mediana,2)),
    as.character(round(moda_val,2)),
    as.character(round(desv_std^2,2)), as.character(round(desv_std,2)),
    paste0(round(cv,2),"%"),
    as.character(round(q1,2)), as.character(round(q3,2)), as.character(round(iqr_val,2)),
    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 Continua: Producción Anual Promedio*")) %>%
  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: Fernando Almeida*")) %>%
  tab_options(table.width=pct(50), 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 Anual Promedio
Indicador Valor
Tamaño muestral (n) 47,279
Mínimo 0.75
Máximo 49276.21
Rango 49275.46
Media 5714.8
Mediana 2535.67
Moda (clase modal) 2773.57
Varianza (s²) 58203271.1
Desviación estándar (s) 7629.11
Coef. de variación (CV%) 133.5%
Cuartil 1 (Q1) 927.65
Cuartil 3 (Q3) 7177.01
Rango intercuartílico (IQR) 6249.37
Asimetría de Pearson 1.2501
Curtosis 8.4568
Autor: Fernando Almeida

8 Conclusión

Los valores de Producción Anual Promedio fluctúan entre 0.75 y 4.927621^{4} (rango = 4.927546^{4} bbl/año) y giran en torno a 2535.67, con una desviación estándar de 7629.11 bbl/año, con presencia de 4659 valor(es) atípico(s), siendo un conjunto de datos heterogéneo (CV = 133.5%), cuyos valores se agrupan fuertemente (As = 1.25) en la parte baja de Producción Anual Promedio. Por lo anterior, el comportamiento es perjudicial, dado que la alta variabilidad en la producción anual refleja ciclos heterogéneos de rendimiento en la industria extractiva de Kansas.


Autor: Fernando Almeida