Variable: Día de Finalización de la perforación — día calendario (1 a 31) en que se alcanzó la profundidad total del pozo (Completion Day, según el dataset). Tipo: cuantitativa discreta.
Reagrupación de clases: no fue necesaria — la variable ya toma un número reducido de valores (31 días), cada uno con frecuencia suficiente para el análisis (ver tabla, sección 4).
library(dplyr)
library(gt)
library(e1071)
col_principal <- "#0E6655"
col_barras <- "#16A085"
col_acento <- "#E67E22"
col_grid <- "#D7DBDD"
setwd("C:/Users/ASUS/Desktop/Estadistica/new_york_exel")
archivo_csv <- "Oil__Gas____Other_Regulated_Wells__Beginning_1860.csv"
# Detección de separador (evita depender de un delimitador fijo)
separadores <- c(",", ";", "\t", "|")
mejor_sep <- NULL
mejor_ncol <- 1
for (s in separadores) {
n_campos <- tryCatch(utils::count.fields(archivo_csv, sep = s)[1],
error = function(e) 1)
if (!is.na(n_campos) && n_campos > mejor_ncol) {
mejor_ncol <- n_campos
mejor_sep <- s
}
}
if (is.null(mejor_sep)) mejor_sep <- ","
cat("Separador detectado:", ifelse(mejor_sep == "\t", "TAB", mejor_sep),
"| Columnas detectadas:", mejor_ncol, "\n")## Separador detectado: , | Columnas detectadas: 52
Datos_Brutos <- read.csv(archivo_csv, header = TRUE, sep = mejor_sep,
check.names = TRUE, stringsAsFactors = FALSE)
# Localización de columna de día de finalización: soporta dos variantes del dataset
# (A) "Completion Day" (numérica, 1-31) (B) "Date Well Completed" (fecha completa MM/DD/AAAA)
col_dia <- names(Datos_Brutos)[
grepl("completion", names(Datos_Brutos), ignore.case = TRUE) &
grepl("day", names(Datos_Brutos), ignore.case = TRUE)
]
col_fecha_fin <- names(Datos_Brutos)[
grepl("complet", names(Datos_Brutos), ignore.case = TRUE) &
grepl("date", names(Datos_Brutos), ignore.case = TRUE)
]
if (length(col_dia) > 0) {
modo_columna_fin <- "dia"
nombre_col_fin <- col_dia[1]
} else if (length(col_fecha_fin) > 0) {
modo_columna_fin <- "fecha"
nombre_col_fin <- col_fecha_fin[1]
} else {
columnas_txt <- paste(names(Datos_Brutos), collapse = " | ")
stop("ERROR: No se encontró ninguna columna de día/fecha de finalización ",
"(se buscaron patrones 'Completion'+'Day' y 'Complet*'+'Date').\n",
"Separador usado: '", mejor_sep, "' | N° de columnas leídas: ", ncol(Datos_Brutos), "\n",
"COLUMNAS ENCONTRADAS EN EL ARCHIVO:\n", columnas_txt)
}
cat("Columna de día de finalización identificada (modo '", modo_columna_fin, "'): ",
nombre_col_fin, "\n", sep = "")## Columna de día de finalización identificada (modo 'fecha'): Date.Well.Completed
if (modo_columna_fin == "dia") {
# Variante A: día numérico directo
Datos <- Datos_Brutos %>%
mutate(Dia_Fin = suppressWarnings(as.integer(.data[[nombre_col_fin]])))
} else {
# Variante B: extraer día desde fecha MM/DD/AAAA
Datos <- Datos_Brutos %>%
mutate(Dia_Fin = suppressWarnings(as.integer(
sub("^[0-9]{1,2}/([0-9]{1,2})/.*", "\\1", .data[[nombre_col_fin]])
)))
}
Datos <- Datos %>%
filter(!is.na(Dia_Fin) & Dia_Fin >= 1 & Dia_Fin <= 31) %>%
mutate(
Dia_Etiqueta = sprintf("Día %02d", Dia_Fin)
)
Variable_Exacta <- Datos$Dia_Fin
if (length(Variable_Exacta) == 0) stop("ERROR: No hay datos válidos.")
cat("N (pozos con día de finalización 1-31):", length(Variable_Exacta),
"| Días distintos:", length(unique(Datos$Dia_Fin)), "\n")## N (pozos con día de finalización 1-31): 22668 | Días distintos: 31
## Variable : Día de Finalización de la perforación
## Columna base : Date.Well.Completed
## Tipo : Cuantitativa discreta (escala ordinal-numérica, 1 a 31)
## Rango : 1 - 31
## N : 22668
TDF_Raw <- Datos %>%
group_by(Dia_Fin, Dia_Etiqueta) %>%
summarise(ni = n(), .groups = "drop") %>%
arrange(Dia_Fin)
ni <- TDF_Raw$ni
N <- sum(ni)
hi <- (ni / N) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
TDF_Dias <- data.frame(
Dia = TDF_Raw$Dia_Etiqueta,
ni = ni,
hi = round(hi, 2),
Ni_asc = Ni_asc,
Ni_desc = Ni_desc,
Hi_asc = round(Hi_asc, 2),
Hi_desc = round(Hi_desc, 2)
)
totales <- c("TOTAL", sum(ni), round(sum(hi), 2), "-", "-", "-", "-")
TDF_Char <- TDF_Dias %>% mutate(across(everything(), as.character))
TDF_Show <- rbind(TDF_Char, totales)
modal_row <- which.max(TDF_Dias$ni)
TDF_Show %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN POR DÍA DE FINALIZACIÓN**"),
subtitle = md(paste0("Variable: **Día de Finalización de la perforación (",
nombre_col_fin, ")** · Nueva York"))
) %>%
tab_spanner(label = "Frecuencias acumuladas",
columns = c(Ni_asc, Ni_desc, Hi_asc, Hi_desc)) %>%
cols_label(
Dia = "Día",
ni = "Cant. Pozos (ni)",
hi = "Porcentaje (hi%)",
Ni_asc = "Ni (Asc)", Ni_desc = "Ni (Desc)",
Hi_asc = "Hi (Asc)", Hi_desc = "Hi (Desc)"
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = col_principal), cell_text(color = "white", weight = "bold")),
locations = cells_title()
) %>%
tab_style(
style = list(cell_fill(color = "#148F77"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()
) %>%
tab_style(
style = list(cell_fill(color = "#148F77"), cell_text(color = "white", weight = "bold")),
locations = cells_column_spanners()
) %>%
tab_style(
style = list(cell_fill(color = "#FDEBD0"), cell_text(weight = "bold")),
locations = cells_body(rows = modal_row)
) %>%
tab_style(
style = list(cell_fill(color = "#D0ECE7"), cell_text(weight = "bold")),
locations = cells_body(rows = Dia == "TOTAL")
) %>%
opt_row_striping() %>%
opt_table_font(font = google_font("Roboto")) %>%
tab_options(
table.font.size = px(13),
heading.align = "left",
heading.title.font.size = px(17),
data_row.padding = px(7),
table.border.top.color = col_principal,
table.border.bottom.color = col_principal,
column_labels.border.bottom.color = col_principal
) %>%
tab_source_note(md("*Fuente: NYS DEC — Oil, Gas & Other Regulated Wells. Elaboración: EDUARDO.*"))| DISTRIBUCIÓN POR DÍA DE FINALIZACIÓN | ||||||
| Variable: Día de Finalización de la perforación (Date.Well.Completed) · Nueva York | ||||||
| Día | Cant. Pozos (ni) | Porcentaje (hi%) |
Frecuencias acumuladas
|
|||
|---|---|---|---|---|---|---|
| Ni (Asc) | Ni (Desc) | Hi (Asc) | Hi (Desc) | |||
| Día 01 | 2252 | 9.93 | 2252 | 22668 | 9.93 | 100 |
| Día 02 | 785 | 3.46 | 3037 | 20416 | 13.4 | 90.07 |
| Día 03 | 731 | 3.22 | 3768 | 19631 | 16.62 | 86.6 |
| Día 04 | 644 | 2.84 | 4412 | 18900 | 19.46 | 83.38 |
| Día 05 | 770 | 3.4 | 5182 | 18256 | 22.86 | 80.54 |
| Día 06 | 723 | 3.19 | 5905 | 17486 | 26.05 | 77.14 |
| Día 07 | 665 | 2.93 | 6570 | 16763 | 28.98 | 73.95 |
| Día 08 | 732 | 3.23 | 7302 | 16098 | 32.21 | 71.02 |
| Día 09 | 719 | 3.17 | 8021 | 15366 | 35.38 | 67.79 |
| Día 10 | 754 | 3.33 | 8775 | 14647 | 38.71 | 64.62 |
| Día 11 | 630 | 2.78 | 9405 | 13893 | 41.49 | 61.29 |
| Día 12 | 730 | 3.22 | 10135 | 13263 | 44.71 | 58.51 |
| Día 13 | 654 | 2.89 | 10789 | 12533 | 47.6 | 55.29 |
| Día 14 | 690 | 3.04 | 11479 | 11879 | 50.64 | 52.4 |
| Día 15 | 803 | 3.54 | 12282 | 11189 | 54.18 | 49.36 |
| Día 16 | 648 | 2.86 | 12930 | 10386 | 57.04 | 45.82 |
| Día 17 | 650 | 2.87 | 13580 | 9738 | 59.91 | 42.96 |
| Día 18 | 722 | 3.19 | 14302 | 9088 | 63.09 | 40.09 |
| Día 19 | 643 | 2.84 | 14945 | 8366 | 65.93 | 36.91 |
| Día 20 | 758 | 3.34 | 15703 | 7723 | 69.27 | 34.07 |
| Día 21 | 681 | 3 | 16384 | 6965 | 72.28 | 30.73 |
| Día 22 | 656 | 2.89 | 17040 | 6284 | 75.17 | 27.72 |
| Día 23 | 712 | 3.14 | 17752 | 5628 | 78.31 | 24.83 |
| Día 24 | 655 | 2.89 | 18407 | 4916 | 81.2 | 21.69 |
| Día 25 | 653 | 2.88 | 19060 | 4261 | 84.08 | 18.8 |
| Día 26 | 593 | 2.62 | 19653 | 3608 | 86.7 | 15.92 |
| Día 27 | 676 | 2.98 | 20329 | 3015 | 89.68 | 13.3 |
| Día 28 | 632 | 2.79 | 20961 | 2339 | 92.47 | 10.32 |
| Día 29 | 578 | 2.55 | 21539 | 1707 | 95.02 | 7.53 |
| Día 30 | 712 | 3.14 | 22251 | 1129 | 98.16 | 4.98 |
| Día 31 | 417 | 1.84 | 22668 | 417 | 100 | 1.84 |
| TOTAL | 22668 | 100 | - | - | - | - |
| Fuente: NYS DEC — Oil, Gas & Other Regulated Wells. Elaboración: EDUARDO. | ||||||
vals_x <- TDF_Dias$Dia
vals_y <- TDF_Dias$ni
ylim_max <- max(vals_y) * 1.15
par(mar = c(8, 5, 4, 2))
bp1 <- barplot(vals_y,
main = "Gráfica N°1: Distribución del día de finalización de perforación (NY)",
cex.main = 0.9, ylab = "Cantidad de pozos (ni)",
col = col_barras, border = "white", axes = FALSE,
ylim = c(0, ylim_max), axisnames = FALSE)
axis(2, col = col_principal, col.axis = col_principal)
axis(1, at = bp1, labels = vals_x, col = col_principal, col.axis = col_principal, las = 2, cex.axis = 0.65)
text(x = bp1, y = vals_y, label = vals_y, pos = 3, cex = 0.6, col = col_principal)
title(xlab = "Día de finalización", line = 6)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")
box(bty = "l", col = col_principal)vals_y_pct <- TDF_Dias$hi
par(mar = c(8, 5, 4, 2))
bp2 <- barplot(vals_y_pct,
main = "Gráfica N°2: Distribución porcentual del día de finalización (NY)",
cex.main = 0.9, ylab = "% del total (hi)",
col = col_barras, border = "white", axes = FALSE,
ylim = c(0, max(vals_y_pct) * 1.2), axisnames = FALSE)
axis(2, col = col_principal, col.axis = col_principal)
axis(1, at = bp2, labels = vals_x, col = col_principal, col.axis = col_principal, las = 2, cex.axis = 0.65)
text(x = bp2, y = vals_y_pct, label = paste0(round(vals_y_pct, 1), "%"), pos = 3, cex = 0.6, col = col_principal)
title(xlab = "Día de finalización", line = 6)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")
box(bty = "l", col = col_principal)Nota: no se usa diagrama circular (no aplica a variable cuantitativa discreta). Se usa barra horizontal para mantener el orden calendario de los días (1 → 31).
par(mar = c(5, 8, 4, 3))
bp3 <- barplot(rev(vals_y_pct),
main = "Gráfica N°3: Distribución porcentual del día de finalización (NY)",
cex.main = 0.9, xlab = "% del total (hi)",
col = col_barras, border = "white", axes = FALSE,
horiz = TRUE, xlim = c(0, max(vals_y_pct) * 1.2), names.arg = rep("", length(vals_y_pct)))
axis(1, col = col_principal, col.axis = col_principal)
axis(2, at = bp3, labels = rev(vals_x), col = col_principal, col.axis = col_principal,
las = 1, cex.axis = 0.65)
text(x = rev(vals_y_pct), y = bp3, label = paste0(round(rev(vals_y_pct), 1), "%"),
pos = 4, cex = 0.6, col = col_principal)
grid(nx = NULL, ny = NA, col = col_grid, lty = "dotted")
box(bty = "l", col = col_principal)Muestra dispersión y valores atípicos del día exacto (escala numérica 1-31).
par(mar = c(6, 5, 4, 2))
boxplot(Variable_Exacta, horizontal = TRUE, col = col_barras,
main = "Diagrama de caja del día de finalización de perforación (NY)",
cex.main = 0.9, xlab = "", outline = TRUE, outpch = 19, outcol = col_acento,
boxwex = 0.5, frame.plot = FALSE, xaxt = "n")
eje_x <- pretty(Variable_Exacta, n = 10)
axis(1, at = eje_x, labels = eje_x, cex.axis = 0.8,
col = col_principal, col.axis = col_principal)
title(xlab = "Día exacto de finalización (1-31)", line = 4)Muestra la frecuencia acumulada ascendente y descendente por día.
par(mar = c(8, 5, 4, 8), xpd = TRUE)
x_vals_num <- sort(unique(Datos$Dia_Fin))
x_labels <- TDF_Dias$Dia
y_asc <- TDF_Dias$Ni_asc
y_desc <- TDF_Dias$Ni_desc
plot(x_vals_num, y_asc, type = "o", col = col_principal, lwd = 2, pch = 19,
main = "Ojivas ascendente y descendente del día de finalización (NY)",
cex.main = 0.9, ylab = "Frecuencia acumulada", xlab = "",
axes = FALSE, frame.plot = FALSE)
axis(1, at = x_vals_num, labels = x_labels, las = 2, cex.axis = 0.65,
col = col_principal, col.axis = col_principal)
axis(2, col = col_principal, col.axis = col_principal)
title(xlab = "Día de finalización", line = 6)
lines(x_vals_num, y_desc, type = "o", col = col_acento, lwd = 2, pch = 19)
legend("right", legend = c("Ascendente", "Descendente"),
col = c(col_principal, col_acento), lty = 1, pch = 19, cex = 0.7, lwd = 2,
inset = c(-0.15, 0), bty = "n")
grid(nx = NULL, ny = NULL, col = col_grid, lty = "dotted")media_val <- mean(Variable_Exacta)
mediana_val <- median(Variable_Exacta)
t_moda <- table(Variable_Exacta)
freq_max <- max(t_moda)
modas_calc <- as.numeric(names(t_moda)[t_moda == freq_max])
moda_txt <- paste(modas_calc, collapse = ", ")
rango_txt <- paste0("[", min(Variable_Exacta), "; ", max(Variable_Exacta), "]")
varianza_val <- var(Variable_Exacta)
sd_val <- sd(Variable_Exacta)
cv_val <- (sd_val / abs(media_val)) * 100
asimetria_val <- skewness(Variable_Exacta, type = 2)
curtosis_val <- kurtosis(Variable_Exacta, type = 2)
vals_atipicos <- boxplot.stats(Variable_Exacta)$out
num_atipicos <- length(vals_atipicos)
status_atipicos <- if (num_atipicos > 0) paste0(num_atipicos, " outliers") else "0 (Sin atípicos)"
df_indicadores <- data.frame(
"Variable" = "Día de finalización (día exacto, 1-31)",
"Rango" = rango_txt,
"Media" = media_val,
"Mediana" = mediana_val,
"Moda" = moda_txt,
"Varianza" = varianza_val,
"Desv_Std" = sd_val,
"CV_Porc" = cv_val,
"Asimetria" = asimetria_val,
"Curtosis" = curtosis_val,
"Atipicos" = status_atipicos
)
df_indicadores %>%
gt() %>%
tab_header(
title = md("**TABLA DE INDICADORES**"),
subtitle = "Estadísticos descriptivos de la variable Día de Finalización"
) %>%
tab_source_note(source_note = "Autor: EDUARDO") %>%
fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc, Curtosis), decimals = 2) %>%
fmt_number(columns = c(Asimetria), decimals = 4) %>%
cols_label(
Variable = "Variable", Rango = "Rango [Min; Max]",
Media = "Media (X̄)", Mediana = "Mediana (Me)", Moda = "Moda (Mo)",
Varianza = "Varianza (S²)", Desv_Std = "Desv. Est. (S)", CV_Porc = "C.V. (%)",
Asimetria = "Asimetría (As)", Curtosis = "Curtosis (K)", Atipicos = "Outliers"
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = col_principal), cell_text(color = "white", weight = "bold")),
locations = cells_title()
) %>%
tab_style(
style = list(cell_fill(color = "#148F77"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()
) %>%
tab_style(
style = list(cell_fill(color = "#FDEBD0"), cell_text(weight = "bold")),
locations = cells_body(columns = Moda)
) %>%
opt_table_font(font = google_font("Roboto")) %>%
tab_options(
table.font.size = px(13),
heading.align = "left",
data_row.padding = px(9),
table.border.top.color = col_principal,
table.border.bottom.color = col_principal,
column_labels.border.bottom.color = col_principal
)| TABLA DE INDICADORES | ||||||||||
| Estadísticos descriptivos de la variable Día de Finalización | ||||||||||
| Variable | Rango [Min; Max] | Media (X̄) | Mediana (Me) | Moda (Mo) | Varianza (S²) | Desv. Est. (S) | C.V. (%) | Asimetría (As) | Curtosis (K) | Outliers |
|---|---|---|---|---|---|---|---|---|---|---|
| Día de finalización (día exacto, 1-31) | [1; 31] | 14.49 | 14.00 | 1 | 85.84 | 9.27 | 63.92 | 0.0997 | −1.23 | 0 (Sin atípicos) |
| Autor: EDUARDO | ||||||||||
El análisis abarca los días del 1 al 31 de cualquier mes (N = 22668 pozos). El día de mayor actividad de finalización fue Día 01 (moda: 1). CV = 63.92% (ritmo variable a lo largo del mes). Asimetría = 0.0997 (una distribución aproximadamente simétrica a lo largo del mes). Sin días atípicos.