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 DEPTH_OF_WELL, que representa la profundidad (en pies) de cada pozo de hidrocarburos en Kansas. Se filtran únicamente los valores positivos válidos.

x_raw <- datos %>%
  mutate(PROF = suppressWarnings(as.numeric(DEPTH_OF_WELL))) %>%
  filter(!is.na(PROF), PROF > 0) %>%
  pull(PROF)

n_conteo  <- length(x_raw)
k_sturges <- ceiling(1 + 3.322 * log10(n_conteo))
cat("Observaciones válidas:", n_conteo, "\n")
## Observaciones válidas: 47753
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: 1 | Máximo: 9999

4 Frecuencia

Al ser Profundidad de Pozo 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 = 47753 | k (Sturges) = 17 | Amplitud c = 588.1176

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("*Profundidad de Pozo, 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)
Profundidad de Pozo, Kansas, EE.UU. (n=47,753, k=17 intervalos)
Intervalo MC ni hi% hi Ni (asc) Hi (asc) Ni (desc) Hi (desc)
[ 1.00 - 589.12) 295.06 558 1.17 0.0117 558 0.0117 47753 1.0000
[ 589.12 - 1,177.24) 883.18 5848 12.25 0.1225 6406 0.1341 47195 0.9883
[1,177.24 - 1,765.35) 1471.29 3284 6.88 0.0688 9690 0.2029 41347 0.8659
[1,765.35 - 2,353.47) 2059.41 1173 2.46 0.0246 10863 0.2275 38063 0.7971
[2,353.47 - 2,941.59) 2647.53 3902 8.17 0.0817 14765 0.3092 36890 0.7725
[2,941.59 - 3,529.71) 3235.65 8105 16.97 0.1697 22870 0.4789 32988 0.6908
[3,529.71 - 4,117.82) 3823.76 6689 14.01 0.1401 29559 0.6190 24883 0.5211
[4,117.82 - 4,705.94) 4411.88 7681 16.08 0.1608 37240 0.7798 18194 0.3810
[4,705.94 - 5,294.06) 5000.00 4620 9.67 0.0967 41860 0.8766 10513 0.2202
[5,294.06 - 5,882.18) 5588.12 2934 6.14 0.0614 44794 0.9380 5893 0.1234
[5,882.18 - 6,470.29) 6176.24 1473 3.08 0.0308 46267 0.9689 2959 0.0620
[6,470.29 - 7,058.41) 6764.35 657 1.38 0.0138 46924 0.9826 1486 0.0311
[7,058.41 - 7,646.53) 7352.47 48 0.10 0.0010 46972 0.9836 829 0.0174
[7,646.53 - 8,234.65) 7940.59 39 0.08 0.0008 47011 0.9845 781 0.0164
[8,234.65 - 8,822.76) 8528.71 94 0.20 0.0020 47105 0.9864 742 0.0155
[8,822.76 - 9,410.88) 9116.82 249 0.52 0.0052 47354 0.9916 648 0.0136
[9,410.88 - 9,999] 9704.94 399 0.84 0.0084 47753 1.0000 399 0.0084
TOTAL - 47753 100.00 1.0000 47753 1.0000 47753 1.0000
Autor: Fernando Almeida

Aplicando la Regla de Sturges, con 47,753 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 = 47753 | k = 10 | Amplitud c = 999.8
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("*Profundidad de Pozo, 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
Profundidad de Pozo, Kansas (n=47,753)
Intervalo MC ni hi% hi Ni (asc) Hi (asc) Ni (desc) Hi (desc)
[ 1.0 - 1,000.8) 500.9 4168 8.73 0.0873 4168 0.0873 47753 1.0000
[1,000.8 - 2,000.6) 1500.7 5971 12.50 0.1250 10139 0.2123 43585 0.9127
[2,000.6 - 3,000.4) 2500.5 5420 11.35 0.1135 15559 0.3258 37614 0.7877
[3,000.4 - 4,000.2) 3500.3 13201 27.64 0.2764 28760 0.6023 32194 0.6742
[4,000.2 - 5,000.0) 4500.1 11219 23.49 0.2349 39979 0.8372 18993 0.3977
[5,000.0 - 5,999.8) 5499.9 5126 10.73 0.1073 45105 0.9445 7774 0.1628
[5,999.8 - 6,999.6) 6499.7 1795 3.76 0.0376 46900 0.9821 2648 0.0555
[6,999.6 - 7,999.4) 7499.5 101 0.21 0.0021 47001 0.9843 853 0.0179
[7,999.4 - 8,999.2) 8499.3 157 0.33 0.0033 47158 0.9875 752 0.0157
[8,999.2 - 9,999] 9499.1 595 1.25 0.0125 47753 1.0000 595 0.0125
TOTAL - 47753 100.00 1.0000 47753 1.0000 47753 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 Profundidad de Pozo.

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

7 Indicadores Estadísticos

Para la variable cuantitativa continua Profundidad de Pozo, 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: Profundidad de Pozo*")) %>%
  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: Profundidad de Pozo
Indicador Valor
Tamaño muestral (n) 47,753
Mínimo 1
Máximo 9999
Rango 9998
Media 3553.7
Mediana 3600
Moda (clase modal) 3797.23
Varianza (s²) 2905697.17
Desviación estándar (s) 1704.61
Coef. de variación (CV%) 47.97%
Cuartil 1 (Q1) 2620
Cuartil 3 (Q3) 4600
Rango intercuartílico (IQR) 1980
Asimetría de Pearson -0.0815
Curtosis 3.8868
Autor: Fernando Almeida

8 Conclusión

Los valores de Profundidad de Pozo fluctúan entre 1 y 9999 (rango = 9998 pies) y giran en torno a 3600, con una desviación estándar de 1704.61 pies, con presencia de 786 valor(es) atípico(s), siendo un conjunto de datos heterogéneo (CV = 47.97%), cuyos valores se agrupan de forma equilibrada (As ≈ -0.08) en la parte media de Profundidad de Pozo. Por lo anterior, el comportamiento es perjudicial, dado que la alta variabilidad en la profundidad de los pozos implica mayores costos y complejidad técnica en la operación de perforación.


Autor: Fernando Almeida