1 Configuración y Carga de Datos

library(dplyr)
library(gt)

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"
# Si tu archivo se llama distinto (p. ej. con sufijo "__1_"), cambia la línea de arriba

# 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 la columna de fecha de profundidad total
col_prof <- names(Datos_Brutos)[
  grepl("total",  names(Datos_Brutos), ignore.case = TRUE) &
  grepl("depth",  names(Datos_Brutos), ignore.case = TRUE) &
  grepl("date",   names(Datos_Brutos), ignore.case = TRUE)
]

if (length(col_prof) == 0) {
  columnas_txt <- paste(names(Datos_Brutos), collapse = " | ")
  stop("ERROR: No se encontró ninguna columna de fecha de profundidad total ",
       "(se buscó el patrón 'Date'+'Total'+'Depth').\n",
       "Separador usado: '", mejor_sep, "'  |  N° de columnas leídas: ", ncol(Datos_Brutos), "\n",
       "COLUMNAS ENCONTRADAS EN EL ARCHIVO:\n", columnas_txt)
}

nombre_col_prof <- col_prof[1]
cat("Columna de fecha de profundidad total identificada:", nombre_col_prof, "\n")
## Columna de fecha de profundidad total identificada: Date.of.Total.Depth

2 Extracción y Limpieza de la Variable

Se toma la década de la fecha de profundidad total como la categoría de la variable. Al ser categorías con un orden temporal natural (una década es cronológicamente anterior o posterior a otra), la variable se trata como cualitativa ordinal.

# La fecha viene en formato MM/DD/AAAA; se extrae el año con expresión regular
Datos <- Datos_Brutos %>%
  mutate(Anio_Prof = suppressWarnings(as.integer(
    sub(".*/([0-9]{4}).*", "\\1", .data[[nombre_col_prof]])
  )))

# Cada década se convierte directamente en una categoría ordinal (Ej: "1900 - 1909")
Datos <- Datos %>%
  filter(!is.na(Anio_Prof) & Anio_Prof >= 1900 & Anio_Prof <= 2026) %>%
  mutate(
    Decada_Base = floor(Anio_Prof / 10) * 10,
    Categoria_Decada = paste0(Decada_Base, " - ", Decada_Base + 9)
  )

niveles_orden <- Datos %>%
  distinct(Decada_Base, Categoria_Decada) %>%
  arrange(Decada_Base) %>%
  pull(Categoria_Decada)

Datos <- Datos %>%
  mutate(Categoria_Decada = factor(Categoria_Decada, levels = niveles_orden, ordered = TRUE)) %>%
  select(-Decada_Base)

Variable_Ordinal <- Datos$Categoria_Decada
if (length(Variable_Ordinal) == 0) stop("ERROR: No hay datos válidos.")

n_excluidos <- nrow(Datos_Brutos) - length(Variable_Ordinal)

cat("N (pozos con fecha de profundidad total clasificable):", length(Variable_Ordinal), "\n")
## N (pozos con fecha de profundidad total clasificable): 16819
cat("Registros excluidos (sin fecha de profundidad total o fuera de rango 1900-2026):", n_excluidos,
    "(", round(100 * n_excluidos / nrow(Datos_Brutos), 1), "%)\n")
## Registros excluidos (sin fecha de profundidad total o fuera de rango 1900-2026): 30571 ( 64.5 %)

3 Identificación de la Variable

cat("Variable      : Fecha de Profundidad Total (década en que el pozo alcanzó su profundidad total)\n")
## Variable      : Fecha de Profundidad Total (década en que el pozo alcanzó su profundidad total)
cat("Columna base  :", nombre_col_prof, "\n")
## Columna base  : Date.of.Total.Depth
cat("Tipo          : Cualitativa ordinal (", length(niveles_orden), "categorías por década)\n")
## Tipo          : Cualitativa ordinal ( 13 categorías por década)
cat("Niveles       :", paste(niveles_orden, collapse = " < "), "\n")
## Niveles       : 1900 - 1909 < 1910 - 1919 < 1920 - 1929 < 1930 - 1939 < 1940 - 1949 < 1950 - 1959 < 1960 - 1969 < 1970 - 1979 < 1980 - 1989 < 1990 - 1999 < 2000 - 2009 < 2010 - 2019 < 2020 - 2029
cat("N             :", length(Variable_Ordinal), "\n")
## N             : 16819

4 Tabla de Distribución de Frecuencias

TDF_Raw <- Datos %>%
  group_by(Categoria_Decada) %>%
  summarise(ni = n(), .groups = "drop") %>%
  arrange(Categoria_Decada)

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_Estado <- data.frame(
  Categoria = as.character(TDF_Raw$Categoria_Decada),
  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_Estado %>% mutate(across(everything(), as.character))
TDF_Show <- rbind(TDF_Char, totales)

modal_row <- which.max(TDF_Estado$ni)

TDF_Show %>%
  gt() %>%
  tab_header(
    title = md("**DISTRIBUCIÓN DE LA FECHA DE PROFUNDIDAD TOTAL POR DÉCADA**"),
    subtitle = md(paste0("Variable: **Fecha de Profundidad Total (",
                          nombre_col_prof, ")** · Nueva York"))
  ) %>%
  tab_spanner(label = "Frecuencias acumuladas",
              columns = c(Ni_asc, Ni_desc, Hi_asc, Hi_desc)) %>%
  cols_label(
    Categoria = "Década (orden ordinal)",
    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 = Categoria == "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: Dallyanna Lozano (Grupo 1).*"))
DISTRIBUCIÓN DE LA FECHA DE PROFUNDIDAD TOTAL POR DÉCADA
Variable: Fecha de Profundidad Total (Date.of.Total.Depth) · Nueva York
Década (orden ordinal) Cant. Pozos (ni) Porcentaje (hi%)
Frecuencias acumuladas
Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
1900 - 1909 30 0.18 30 16819 0.18 100
1910 - 1919 95 0.56 125 16789 0.74 99.82
1920 - 1929 230 1.37 355 16694 2.11 99.26
1930 - 1939 129 0.77 484 16464 2.88 97.89
1940 - 1949 142 0.84 626 16335 3.72 97.12
1950 - 1959 308 1.83 934 16193 5.55 96.28
1960 - 1969 803 4.77 1737 15885 10.33 94.45
1970 - 1979 3542 21.06 5279 15082 31.39 89.67
1980 - 1989 5392 32.06 10671 11540 63.45 68.61
1990 - 1999 1466 8.72 12137 6148 72.16 36.55
2000 - 2009 2919 17.36 15056 4682 89.52 27.84
2010 - 2019 1421 8.45 16477 1763 97.97 10.48
2020 - 2029 342 2.03 16819 342 100 2.03
TOTAL 16819 100 - - - -
Fuente: NYS DEC — Oil, Gas & Other Regulated Wells. Elaboración: Dallyanna Lozano (Grupo 1).

5 Representación Gráfica

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

vals_x <- TDF_Estado$Categoria
vals_y <- TDF_Estado$ni
ylim_max <- max(vals_y) * 1.15

par(mar = c(10, 5, 4, 2))
bp1 <- barplot(vals_y,
        main = "Gráfica N°1: Distribución de la fecha de profundidad total por década (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.8)
text(x = bp1, y = vals_y, label = vals_y, pos = 3, cex = 0.7, col = col_principal)
title(xlab = "Década de la profundidad total", line = 8)
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_Estado$hi

par(mar = c(10, 5, 4, 2))
bp2 <- barplot(vals_y_pct,
        main = "Gráfica N°2: Distribución porcentual de la fecha de profundidad total (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.8)
text(x = bp2, y = vals_y_pct, label = paste0(round(vals_y_pct, 1), "%"), pos = 3, cex = 0.7, col = col_principal)
title(xlab = "Década de la profundidad total", line = 8)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")
box(bty = "l", col = col_principal)

5.3 Gráfica N°3 — Diagrama Circular (Distribución Porcentual)

etiquetas_pct <- paste0(round(vals_y_pct, 1), "% ", vals_x)
paleta_decadas <- colorRampPalette(c("#1B4F72", "#16A085", "#F4D03F", "#E67E22", "#943126"))(length(vals_x))

par(mar = c(2, 2, 4, 9), xpd = TRUE)
pie(vals_y_pct,
    labels = NA,
    main = "Gráfica N°3: Distribución porcentual de la fecha de profundidad total por década (NY)",
    cex.main = 0.9,
    col = paleta_decadas, border = "white",
    radius = 1,
    clockwise = TRUE)
legend("right", legend = etiquetas_pct, fill = paleta_decadas, border = "white",
       bty = "n", cex = 0.9, inset = c(-0.08, 0), title = "Década", y.intersp = 1.3)

6 Tabla de Indicadores

Al ser una variable ordinal, los únicos indicadores válidos son los de posición basados en el orden de las categorías: Moda, Mediana y Cuartiles. No se calculan media, varianza, asimetría ni curtosis por no tratarse de una escala numérica.

codigo_num <- as.integer(Variable_Ordinal)  # 1 = década más antigua ... k = década más reciente

t_moda      <- table(codigo_num)
moda_pos    <- as.integer(names(t_moda)[which.max(t_moda)])
mediana_pos <- median(codigo_num)
q1_pos      <- quantile(codigo_num, 0.25, type = 1)
q3_pos      <- quantile(codigo_num, 0.75, type = 1)

df_indicadores <- data.frame(
  "Variable"  = "Fecha de Profundidad Total (ordinal por década)",
  "N"         = N,
  "Moda"      = niveles_orden[moda_pos],
  "Mediana"   = niveles_orden[mediana_pos],
  "Cuartil_1" = niveles_orden[q1_pos],
  "Cuartil_3" = niveles_orden[q3_pos],
  "Rango_Intercuartilico" = paste0(niveles_orden[q1_pos], " — ", niveles_orden[q3_pos])
)

df_indicadores %>%
  gt() %>%
  tab_header(
    title = md("**TABLA DE INDICADORES**"),
    subtitle = "Estadísticos de posición de la variable Fecha de Profundidad Total (ordinal por década)"
  ) %>%
  tab_source_note(source_note = "Autor:Dallyanna Lozano (Grupo 1)") %>%
  cols_label(
    Variable = "Variable", N = "N",
    Moda = "Moda (Mo)", Mediana = "Mediana (Me)",
    Cuartil_1 = "Cuartil 1 (Q1)", Cuartil_3 = "Cuartil 3 (Q3)",
    Rango_Intercuartilico = "Rango Intercuartílico"
  ) %>%
  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 de posición de la variable Fecha de Profundidad Total (ordinal por década)
Variable N Moda (Mo) Mediana (Me) Cuartil 1 (Q1) Cuartil 3 (Q3) Rango Intercuartílico
Fecha de Profundidad Total (ordinal por década) 16819 1980 - 1989 1980 - 1989 1970 - 1979 2000 - 2009 1970 - 1979 — 2000 - 2009
Autor:Dallyanna Lozano (Grupo 1)

7 Conclusión

De un total de 16819 pozos clasificables (se excluyeron 30571 registros sin fecha de profundidad total válida), la variable Fecha de Profundidad Total se organizó en 13 categorías ordinales por década, desde 1900 - 1909 hasta 2020 - 2029. La década dominante es 1980 - 1989 con 32.06% de los casos. La moda y la mediana coinciden en 1980 - 1989, lo que confirma que más de la mitad de los pozos alcanzaron su profundidad total en esa década o en una anterior. Al tratarse de una variable ordinal, el análisis se limita a estadísticos de posición (moda, mediana, cuartiles), sin calcular media, varianza, asimetría ni curtosis.