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 audiencia
col_audiencia <- names(Datos_Brutos)[
grepl("hearing", names(Datos_Brutos), ignore.case = TRUE) &
grepl("date", names(Datos_Brutos), ignore.case = TRUE)
]
if (length(col_audiencia) == 0) {
columnas_txt <- paste(names(Datos_Brutos), collapse = " | ")
stop("ERROR: No se encontró ninguna columna de fecha de audiencia ",
"(se buscó el patrón 'Hearing'+'Date').\n",
"Separador usado: '", mejor_sep, "' | N° de columnas leídas: ", ncol(Datos_Brutos), "\n",
"COLUMNAS ENCONTRADAS EN EL ARCHIVO:\n", columnas_txt)
}
nombre_col_audiencia <- col_audiencia[1]
cat("Columna de fecha de audiencia identificada:", nombre_col_audiencia, "\n")## Columna de fecha de audiencia identificada: Hearing.Date
Se toma la década de la fecha de audiencia 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_Audiencia = suppressWarnings(as.integer(
sub(".*/([0-9]{4}).*", "\\1", .data[[nombre_col_audiencia]])
)))
# Cada década se convierte directamente en una categoría ordinal (Ej: "1900 - 1909")
Datos <- Datos %>%
filter(!is.na(Anio_Audiencia) & Anio_Audiencia >= 1900 & Anio_Audiencia <= 2026) %>%
mutate(
Decada_Base = floor(Anio_Audiencia / 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 audiencia clasificable):", length(Variable_Ordinal), "\n")## N (pozos con fecha de audiencia clasificable): 287
cat("Registros excluidos (sin fecha de audiencia o fuera de rango 1900-2026):", n_excluidos,
"(", round(100 * n_excluidos / nrow(Datos_Brutos), 1), "%)\n")## Registros excluidos (sin fecha de audiencia o fuera de rango 1900-2026): 47103 ( 99.4 %)
## Variable : Fecha de Audiencia (década en que se realizó la audiencia del pozo)
## Columna base : Hearing.Date
## Tipo : Cualitativa ordinal ( 2 categorías por década)
## Niveles : 2000 - 2009 < 2010 - 2019
## N : 287
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 AUDIENCIA POR DÉCADA**"),
subtitle = md(paste0("Variable: **Fecha de Audiencia (",
nombre_col_audiencia, ")** · 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 AUDIENCIA POR DÉCADA | ||||||
| Variable: Fecha de Audiencia (Hearing.Date) · Nueva York | ||||||
| Década (orden ordinal) | Cant. Pozos (ni) | Porcentaje (hi%) |
Frecuencias acumuladas
|
|||
|---|---|---|---|---|---|---|
| Ni (Asc) | Ni (Desc) | Hi (Asc) | Hi (Desc) | |||
| 2000 - 2009 | 226 | 78.75 | 226 | 287 | 78.75 | 100 |
| 2010 - 2019 | 61 | 21.25 | 287 | 61 | 100 | 21.25 |
| TOTAL | 287 | 100 | - | - | - | - |
| Fuente: NYS DEC — Oil, Gas & Other Regulated Wells. Elaboración: Dallyanna Lozano (Grupo 1). | ||||||
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 audiencia 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 audiencia", line = 8)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")
box(bty = "l", col = col_principal)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 audiencia (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 audiencia", line = 8)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")
box(bty = "l", col = col_principal)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 audiencia 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)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 Audiencia (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 Audiencia (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 Audiencia (ordinal por década) | ||||||
| Variable | N | Moda (Mo) | Mediana (Me) | Cuartil 1 (Q1) | Cuartil 3 (Q3) | Rango Intercuartílico |
|---|---|---|---|---|---|---|
| Fecha de Audiencia (ordinal por década) | 287 | 2000 - 2009 | 2000 - 2009 | 2000 - 2009 | 2000 - 2009 | 2000 - 2009 — 2000 - 2009 |
| Autor: Dallyanna Lozano (Grupo 1) | ||||||
De un total de 287 pozos clasificables (se excluyeron 47103 registros sin fecha de audiencia válida), la variable Fecha de Audiencia se organizó en 2 categorías ordinales por década, desde 2000 - 2009 hasta 2010 - 2019. La década dominante es 2000 - 2009 con 78.75% de los casos. La moda y la mediana coinciden en 2000 - 2009, lo que confirma que más de la mitad de las audiencias se realizaron 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.