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 LONGITUDE, que representa la coordenada de longitud (en grados decimales) de cada arrendamiento de hidrocarburos en Kansas. Se filtran únicamente los valores dentro del rango geográfico válido del estado (-103.0° a -94.0°).

x_raw <- datos %>%
  mutate(LON = suppressWarnings(as.numeric(LONGITUDE))) %>%
  filter(!is.na(LON), LON >= -103.0, LON <= -94.0) %>%
  pull(LON)

n_conteo  <- length(x_raw)
k_sturges <- ceiling(1 + 3.322 * log10(n_conteo))
cat("Observaciones válidas:", n_conteo, "\n")
## Observaciones válidas: 47757
cat("Clases (Regla de Sturges):", k_sturges, "\n")
## Clases (Regla de Sturges): 17
cat("Mínimo:", round(min(x_raw), 4), "| Máximo:", round(max(x_raw), 4), "\n")
## Mínimo: -102.0439 | Máximo: -94.6179

4 Frecuencia

Al ser Longitud 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 = 47757 | k (Sturges) = 17 | Amplitud c = 0.4368

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("[",round(lim_inf_st,4)," - ",round(lim_sup_st,4),")")
etiq_st[k_st] <- paste0("[",round(lim_inf_st[k_st],4)," - ",round(lim_sup_st[k_st],4),"]")

tabla_st_df <- data.frame(
  Intervalo = etiq_st, MC = round(mc_st,4), 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("*Longitud, 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)
Longitud, Kansas, EE.UU. (n=47,757, k=17 intervalos)
Intervalo MC ni hi% hi Ni (asc) Hi (asc) Ni (desc) Hi (desc)
[-102.0439 - -101.6071) -101.8255 2213 4.63 0.0463 2213 0.0463 47757 1.0000
[-101.6071 - -101.1703) -101.3887 2516 5.27 0.0527 4729 0.0990 45544 0.9537
[-101.1703 - -100.7334) -100.9519 5205 10.90 0.1090 9934 0.2080 43028 0.9010
[-100.7334 - -100.2966) -100.5150 2178 4.56 0.0456 12112 0.2536 37823 0.7920
[-100.2966 - -99.8598) -100.0782 2458 5.15 0.0515 14570 0.3051 35645 0.7464
[-99.8598 - -99.423) -99.6414 3977 8.33 0.0833 18547 0.3884 33187 0.6949
[-99.423 - -98.9862) -99.2046 4644 9.72 0.0972 23191 0.4856 29210 0.6116
[-98.9862 - -98.5493) -98.7678 6007 12.58 0.1258 29198 0.6114 24566 0.5144
[-98.5493 - -98.1125) -98.3309 3895 8.16 0.0816 33093 0.6929 18559 0.3886
[-98.1125 - -97.6757) -97.8941 1677 3.51 0.0351 34770 0.7281 14664 0.3071
[-97.6757 - -97.2389) -97.4573 1021 2.14 0.0214 35791 0.7494 12987 0.2719
[-97.2389 - -96.8021) -97.0205 1788 3.74 0.0374 37579 0.7869 11966 0.2506
[-96.8021 - -96.3652) -96.5836 693 1.45 0.0145 38272 0.8014 10178 0.2131
[-96.3652 - -95.9284) -96.1468 1337 2.80 0.0280 39609 0.8294 9485 0.1986
[-95.9284 - -95.4916) -95.7100 4236 8.87 0.0887 43845 0.9181 8148 0.1706
[-95.4916 - -95.0548) -95.2732 3083 6.46 0.0646 46928 0.9826 3912 0.0819
[-95.0548 - -94.6179] -94.8364 829 1.74 0.0174 47757 1.0000 829 0.0174
TOTAL - 47757 100.00 1.0000 47757 1.0000 47757 1.0000
Autor: Fernando Almeida

Aplicando la Regla de Sturges, con 47,757 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 = 47757 | k = 10 | Amplitud c = 0.7426
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("[",round(lim_inf,4)," - ",round(lim_sup,4),")")
etiq[k]        <- paste0("[",round(lim_inf[k],4)," - ",round(lim_sup[k],4),"]")

bind_rows(
  data.frame(Intervalo=etiq, MC=round(mc,4), 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("*Longitud, 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
Longitud, Kansas (n=47,757)
Intervalo MC ni hi% hi Ni (asc) Hi (asc) Ni (desc) Hi (desc)
[-102.0439 - -101.3013) -101.6726 3926 8.22 0.0822 3926 0.0822 47757 1.0000
[-101.3013 - -100.5587) -100.9300 7021 14.70 0.1470 10947 0.2292 43831 0.9178
[-100.5587 - -99.8161) -100.1874 3872 8.11 0.0811 14819 0.3103 36810 0.7708
[-99.8161 - -99.0735) -99.4448 7460 15.62 0.1562 22279 0.4665 32938 0.6897
[-99.0735 - -98.3309) -98.7022 9191 19.25 0.1925 31470 0.6590 25478 0.5335
[-98.3309 - -97.5883) -97.9596 3517 7.36 0.0736 34987 0.7326 16287 0.3410
[-97.5883 - -96.8457) -97.2170 2406 5.04 0.0504 37393 0.7830 12770 0.2674
[-96.8457 - -96.1031) -96.4744 1630 3.41 0.0341 39023 0.8171 10364 0.2170
[-96.1031 - -95.3605) -95.7318 6222 13.03 0.1303 45245 0.9474 8734 0.1829
[-95.3605 - -94.6179] -94.9892 2512 5.26 0.0526 47757 1.0000 2512 0.0526
TOTAL - 47757 100.00 1.0000 47757 1.0000 47757 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 Longitud.

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 = round(breaks_vec,4), las = 2, cex.axis = 0.75)
mtext("Frecuencia Absoluta (ni)", side = 2, line = 4.5, cex = 1)
mtext("Longitud (°)",        side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°1: Histograma de Frecuencias Absolutas de la Variable Longitud,\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 = round(breaks_vec,4), 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("Longitud (°)",        side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°2: Polígono de Frecuencias de la Variable Longitud,\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("Longitud (°)", side = 1, line = 3.5, cex = 1)
mtext(
  "Gráfica N°3: Boxplot de la Variable Longitud,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)
text(q1,      1.38, labels = paste0("Q1=",  round(q1,4)),      cex = 0.8)
text(mediana, 0.62, labels = paste0("Me=",  round(mediana,4)), cex = 0.8)
text(q3,      1.38, labels = paste0("Q3=",  round(q3,4)),      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 = round(breaks_vec,4), 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("Longitud (°)",            side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°4: Ojivas Creciente y Decreciente de la Variable Longitud,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)

7 Indicadores Estadísticos

Para la variable cuantitativa continua Longitud, 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,4)), as.character(round(x_max,4)),
    as.character(round(rango_st,4)),
    as.character(round(media,4)), as.character(round(mediana,4)),
    as.character(round(moda_val,4)),
    as.character(round(desv_std^2,4)), as.character(round(desv_std,4)),
    paste0(round(cv,2),"%"),
    as.character(round(q1,4)), as.character(round(q3,4)), as.character(round(iqr_val,4)),
    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: Longitud*")) %>%
  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: Longitud
Indicador Valor
Tamaño muestral (n) 47,757
Mínimo -102.0439
Máximo -94.6179
Rango 7.426
Media -98.7189
Mediana -98.9294
Moda (clase modal) -98.8999
Varianza (s²) 3.9556
Desviación estándar (s) 1.9889
Coef. de variación (CV%) -2.01%
Cuartil 1 (Q1) -100.3476
Cuartil 3 (Q3) -97.2287
Rango intercuartílico (IQR) 3.1189
Asimetría de Pearson 0.3176
Curtosis 2.0715
Autor: Fernando Almeida

8 Conclusión

Los valores de Longitud fluctúan entre -102.0439 y -94.6179 (rango = 7.426 grados) y giran en torno a -98.9294, con una desviación estándar de 1.9889 grados, sin presencia de valores atípicos, siendo un conjunto de datos homogéneo (CV = -2.01%), cuyos valores se agrupan débilmente (As = 0.32) en la parte baja de Longitud. Por lo anterior, el comportamiento es beneficioso, ya que los arrendamientos se concentran en una franja longitudinal acotada, lo que facilita la planificación y operación de la industria petrolera en Kansas.


Autor: Fernando Almeida