1 Configuración y Carga de Datos

library(dplyr)
library(gt)

col_principal <- "#0E6655"
col_barras    <- "#16A085"
col_acento    <- "#E67E22"
col_grid      <- "#D7DBDD"

# Paleta ordinal: de menor a mayor grado de cierre del pozo
col_categorias <- c("#1E8449", "#F4D03F", "#E67E22", "#C0392B")

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 estado del pozo (soporta variaciones de nombre)
col_status <- names(Datos_Brutos)[
  grepl("well", names(Datos_Brutos), ignore.case = TRUE) &
  grepl("status", names(Datos_Brutos), ignore.case = TRUE)
]
if (length(col_status) == 0) {
  col_status <- names(Datos_Brutos)[
    grepl("status", names(Datos_Brutos), ignore.case = TRUE)
  ]
}

if (length(col_status) == 0) {
  columnas_txt <- paste(names(Datos_Brutos), collapse = " | ")
  stop("ERROR: No se encontro ninguna columna de estado del pozo ",
       "(se busco el patron 'Well'+'Status').\n",
       "Separador usado: '", mejor_sep, "'  |  N. de columnas leidas: ", ncol(Datos_Brutos), "\n",
       "COLUMNAS ENCONTRADAS EN EL ARCHIVO:\n", columnas_txt)
}

nombre_col_status <- col_status[1]
cat("Columna de estado del pozo identificada:", nombre_col_status, "\n")
## Columna de estado del pozo identificada: Well.Status

2 Extracción y Limpieza de la Variable

niveles_orden <- c("Activo", "Inactivo", "Suspendido/Expirado",
                    "Taponado y Abandonado")

Datos <- Datos_Brutos %>%
  mutate(
    Estado_Pozo = case_when(
      .data[[nombre_col_status]] == "AC"                 ~ "Activo",
      .data[[nombre_col_status]] %in% c("IN", "SI", "TA") ~ "Inactivo",
      .data[[nombre_col_status]] %in% c("EX", "VP")       ~ "Suspendido/Expirado",
      .data[[nombre_col_status]] %in% c("PA", "PB")       ~ "Taponado y Abandonado",
      TRUE ~ NA_character_
    )
  ) %>%
  filter(!is.na(Estado_Pozo)) %>%
  mutate(Estado_Pozo = factor(Estado_Pozo, levels = niveles_orden, ordered = TRUE))

Variable_Ordinal <- Datos$Estado_Pozo
if (length(Variable_Ordinal) == 0) stop("ERROR: No hay datos validos.")

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

cat("N (pozos con estado clasificable):", length(Variable_Ordinal), "\n")
## N (pozos con estado clasificable): 37842
cat("Registros excluidos (codigos administrativos no ordinales):", n_excluidos,
    "(", round(100 * n_excluidos / nrow(Datos_Brutos), 1), "%)\n")
## Registros excluidos (codigos administrativos no ordinales): 9548 ( 20.1 %)

3 Identificación de la Variable

cat("Variable      : Estado del Pozo\n")
## Variable      : Estado del Pozo
cat("Columna base  :", nombre_col_status, "\n")
## Columna base  : Well.Status
cat("Tipo          : Cualitativa ordinal (4 categorias jerarquicas)\n")
## Tipo          : Cualitativa ordinal (4 categorias jerarquicas)
cat("Niveles       :", paste(niveles_orden, collapse = " < "), "\n")
## Niveles       : Activo < Inactivo < Suspendido/Expirado < Taponado y Abandonado
cat("N             :", length(Variable_Ordinal), "\n")
## N             : 37842

4 Tabla de Distribución de Frecuencias

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

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$Estado_Pozo),
  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 DEL ESTADO DEL POZO**"),
    subtitle = md(paste0("Variable: **Estado del Pozo (",
                          nombre_col_status, ")** · Nueva York"))
  ) %>%
  tab_spanner(label = "Frecuencias acumuladas",
              columns = c(Ni_asc, Ni_desc, Hi_asc, Hi_desc)) %>%
  cols_label(
    Categoria = "Estado (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 DEL ESTADO DEL POZO
Variable: Estado del Pozo (Well.Status) · Nueva York
Estado (orden ordinal) Cant. Pozos (ni) Porcentaje (hi%)
Frecuencias acumuladas
Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
Activo 11782 31.13 11782 37842 31.13 100
Inactivo 2693 7.12 14475 26060 38.25 68.87
Suspendido/Expirado 2785 7.36 17260 23367 45.61 61.75
Taponado y Abandonado 20582 54.39 37842 20582 100 54.39
TOTAL 37842 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 del estado del pozo (NY)",
        cex.main = 0.9, ylab = "Cantidad de pozos (ni)",
        col = col_categorias, 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.8, col = col_principal)
title(xlab = "Estado del pozo", 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 del estado del pozo (NY)",
        cex.main = 0.9, ylab = "% del total (hi)",
        col = col_categorias, 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.8, col = col_principal)
title(xlab = "Estado del pozo", 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(vals_x, "\n", round(vals_y_pct, 1), "%")

par(mar = c(2, 2, 4, 2))
pie(vals_y_pct,
    labels = etiquetas_pct,
    main = "Gráfica N°3: Distribución porcentual del estado del pozo (NY)",
    cex.main = 0.9, cex = 0.85,
    col = col_categorias, border = "white",
    clockwise = TRUE)

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=Activo ... 4=Taponado y Abandonado

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"  = "Estado del Pozo (ordinal)",
  "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 Estado del Pozo (ordinal)"
  ) %>%
  tab_source_note(source_note = "Autor: EDUARDO") %>%
  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 Estado del Pozo (ordinal)
Variable N Moda (Mo) Mediana (Me) Cuartil 1 (Q1) Cuartil 3 (Q3) Rango Intercuartílico
Estado del Pozo (ordinal) 37842 Taponado y Abandonado Taponado y Abandonado Activo Taponado y Abandonado Activo — Taponado y Abandonado
Autor: EDUARDO

7 Conclusión

De un total de 37842 pozos clasificables (se excluyeron 9548 registros con códigos puramente administrativos no comparables en la escala), la categoría dominante es Taponado y Abandonado con 54.39% de los casos. La moda y la mediana coinciden en Taponado y Abandonado, lo que confirma que más de la mitad de los pozos registrados en el estado de Nueva York se encuentran en un estado avanzado de cierre definitivo. Solo el 31.13% de los pozos permanece Activo, evidenciando que el sistema regulado está compuesto mayoritariamente por infraestructura histórica ya clausurada y no por pozos en explotación vigente.