1 Configuración y Carga de Datos

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

2 Extracción y Limpieza de la Variable

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

3 Identificación de la Variable

cat("Variable      : Día de Finalización de la perforación\n")
## Variable      : Día de Finalización de la perforación
cat("Columna base  :", nombre_col_fin, "\n")
## Columna base  : Date.Well.Completed
cat("Tipo          : Cuantitativa discreta (escala ordinal-numérica, 1 a 31)\n")
## Tipo          : Cuantitativa discreta (escala ordinal-numérica, 1 a 31)
cat("Rango         :", min(Variable_Exacta), "-", max(Variable_Exacta), "\n")
## Rango         : 1 - 31
cat("N             :", length(Variable_Exacta), "\n")
## N             : 22668

4 Tabla de Distribución de Frecuencias

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.

5 Representación Gráfica

5.1 Gráfica N°1 — Diagrama de Barras (Frecuencia Absoluta)

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)

5.2 Gráfica N°2 — Diagrama de Barras (Porcentaje)

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)

5.3 Gráfica N°3 — Diagrama de Barras Horizontal (Distribución Porcentual)

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)

5.4 Diagrama de Caja (Día Exacto de Finalización)

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)

5.5 Ojivas (Frecuencias Acumuladas por Día)

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")

6 Tabla de Indicadores

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

7 Conclusión

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.