library(readr)
library(dplyr)
library(gt)
cat("Librerías cargadas correctamente.\n")
## Librerías cargadas correctamente.
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
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
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
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 | ||||||||
Se presentan cuatro gráficas en escala de grises que permiten analizar visualmente la distribución de la variable cuantitativa continua Profundidad de Pozo.
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
)
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)
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)
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
)
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 | |
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