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

x_raw <- datos %>%
  mutate(LAT = suppressWarnings(as.numeric(LATITUDE))) %>%
  filter(!is.na(LAT), LAT >= 36.9, LAT <= 40.1) %>%
  pull(LAT)

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: 36.9944 | Máximo: 40.0002

4 Frecuencia

Al ser Latitud 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.1768

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("*Latitud, 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)
Latitud, Kansas, EE.UU. (n=47,757, k=17 intervalos)
Intervalo MC ni hi% hi Ni (asc) Hi (asc) Ni (desc) Hi (desc)
[36.9944 - 37.1712) 37.0828 6299 13.19 0.1319 6299 0.1319 47757 1.0000
[37.1712 - 37.3481) 37.2596 5330 11.16 0.1116 11629 0.2435 41458 0.8681
[37.3481 - 37.5249) 37.4365 5469 11.45 0.1145 17098 0.3580 36128 0.7565
[37.5249 - 37.7017) 37.6133 3760 7.87 0.0787 20858 0.4368 30659 0.6420
[37.7017 - 37.8785) 37.7901 2983 6.25 0.0625 23841 0.4992 26899 0.5632
[37.8785 - 38.0553) 37.9669 3106 6.50 0.0650 26947 0.5643 23916 0.5008
[38.0553 - 38.2321) 38.1437 2797 5.86 0.0586 29744 0.6228 20810 0.4357
[38.2321 - 38.4089) 38.3205 2922 6.12 0.0612 32666 0.6840 18013 0.3772
[38.4089 - 38.5857) 38.4973 3087 6.46 0.0646 35753 0.7486 15091 0.3160
[38.5857 - 38.7626) 38.6741 3311 6.93 0.0693 39064 0.8180 12004 0.2514
[38.7626 - 38.9394) 38.8510 2231 4.67 0.0467 41295 0.8647 8693 0.1820
[38.9394 - 39.1162) 39.0278 1701 3.56 0.0356 42996 0.9003 6462 0.1353
[39.1162 - 39.293) 39.2046 1642 3.44 0.0344 44638 0.9347 4761 0.0997
[39.293 - 39.4698) 39.3814 1173 2.46 0.0246 45811 0.9593 3119 0.0653
[39.4698 - 39.6466) 39.5582 601 1.26 0.0126 46412 0.9718 1946 0.0407
[39.6466 - 39.8234) 39.7350 757 1.59 0.0159 47169 0.9877 1345 0.0282
[39.8234 - 40.0002] 39.9118 588 1.23 0.0123 47757 1.0000 588 0.0123
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.3006
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("*Latitud, 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
Latitud, Kansas (n=47,757)
Intervalo MC ni hi% hi Ni (asc) Hi (asc) Ni (desc) Hi (desc)
[36.9944 - 37.295) 37.1447 10084 21.12 0.2112 10084 0.2112 47757 1.0000
[37.295 - 37.5956) 37.4453 8692 18.20 0.1820 18776 0.3932 37673 0.7888
[37.5956 - 37.8962) 37.7459 5340 11.18 0.1118 24116 0.5050 28981 0.6068
[37.8962 - 38.1968) 38.0465 5134 10.75 0.1075 29250 0.6125 23641 0.4950
[38.1968 - 38.4973) 38.3470 4958 10.38 0.1038 34208 0.7163 18507 0.3875
[38.4973 - 38.7979) 38.6476 5300 11.10 0.1110 39508 0.8273 13549 0.2837
[38.7979 - 39.0985) 38.9482 3319 6.95 0.0695 42827 0.8968 8249 0.1727
[39.0985 - 39.3991) 39.2488 2566 5.37 0.0537 45393 0.9505 4930 0.1032
[39.3991 - 39.6997) 39.5494 1246 2.61 0.0261 46639 0.9766 2364 0.0495
[39.6997 - 40.0002] 39.8499 1118 2.34 0.0234 47757 1.0000 1118 0.0234
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 Latitud.

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("Latitud (°)",        side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°1: Histograma de Frecuencias Absolutas de la Variable Latitud,\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("Latitud (°)",        side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°2: Polígono de Frecuencias de la Variable Latitud,\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("Latitud (°)", side = 1, line = 3.5, cex = 1)
mtext(
  "Gráfica N°3: Boxplot de la Variable Latitud,\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("Latitud (°)",            side = 1, line = 4.5, cex = 1)
mtext(
  "Gráfica N°4: Ojivas Creciente y Decreciente de la Variable Latitud,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)

7 Indicadores Estadísticos

Para la variable cuantitativa continua Latitud, 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: Latitud*")) %>%
  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: Latitud
Indicador Valor
Tamaño muestral (n) 47,757
Mínimo 36.9944
Máximo 40.0002
Rango 3.0058
Media 38.0146
Mediana 37.8808
Moda (clase modal) 37.2586
Varianza (s²) 0.5712
Desviación estándar (s) 0.7558
Coef. de variación (CV%) 1.99%
Cuartil 1 (Q1) 37.3603
Cuartil 3 (Q3) 38.5872
Rango intercuartílico (IQR) 1.2269
Asimetría de Pearson 0.531
Curtosis 2.3321
Autor: Fernando Almeida

8 Conclusión

Los valores de Latitud fluctúan entre 36.9944 y 40.0002 (rango = 3.0058 grados) y giran en torno a 37.8808, con una desviación estándar de 0.7558 grados, sin presencia de valores atípicos, siendo un conjunto de datos homogéneo (CV = 1.99%), cuyos valores se agrupan medianamente (As = 0.53) en la parte baja de Latitud. Por lo anterior, el comportamiento es beneficioso, ya que los arrendamientos se concentran en una franja latitudinal acotada, lo que facilita la planificación y operación de la industria petrolera en Kansas.


Autor: Fernando Almeida