# Librerías necesarias
library(dplyr)
library(gt)
library(e1071)
# Paleta de colores del informe
col_principal <- "#0E6655"
col_barras <- "#16A085"
col_acento <- "#E67E22"
col_claro <- "#E8F8F5"
col_grid <- "#D7DBDD"
# --- Carga de datos ---
# El dataset está separado por ";" y usa codificación Latin-1 (según el archivo
# "Oil_Gas_Other_Regulated_Wells_Beginning_1860" descargado del NYS DEC).
# Ajusta la ruta según la ubicación del archivo en tu equipo.
ruta_csv <- "C:/Users/PATRICIA/Desktop/pr-estadistica/Oil__Gas____Other_Regulated_Wells__Beginning_1860 (3).csv"
Datos <- read.csv(ruta_csv,
header = TRUE,
sep = ";",
dec = ".",
fileEncoding = "Latin1",
stringsAsFactors = FALSE)
cat("Dimensiones del dataset:", nrow(Datos), "filas x", ncol(Datos), "columnas\n")
## Dimensiones del dataset: 47407 filas x 55 columnas
# Localizamos la columna de Spacing Acres de forma robusta (el nombre puede
# llegar alterado por R como "Spacing.Acres" al leer "Spacing Acres")
col_spacing <- grep("Spacing.*Acres", names(Datos), value = TRUE)[1]
if (is.na(col_spacing)) stop("ERROR: No se encontró la columna de Spacing Acres en el dataset.")
# Extracción y conversión a numérico
Variable <- suppressWarnings(as.numeric(Datos[[col_spacing]]))
# Limpieza: se eliminan NA y valores 0 o sin dato registrado
# (según la ficha de variables, el dominio válido es x > 0)
Variable <- na.omit(Variable)
Variable <- Variable[Variable > 0]
if (length(Variable) == 0) stop("ERROR: No hay datos válidos de Spacing Acres tras la limpieza.")
cat("Columna detectada:", col_spacing, "\n")
## Columna detectada: Spacing.Acres
cat("N° de pozos con superficie de espaciamiento válida:", length(Variable), "\n")
## N° de pozos con superficie de espaciamiento válida: 820
N <- length(Variable)
min_val <- min(Variable)
max_val <- max(Variable)
Rango <- max_val - min_val
K <- floor(1 + 3.322 * log10(N)) # N° de clases (Regla de Sturges)
Amplitud <- Rango / K
ficha <- data.frame(
Característica = c("Nombre de la variable", "Tipo de variable", "Unidad de medida",
"Población de referencia", "Tamaño de muestra (N)",
"Valor mínimo", "Valor máximo", "Rango",
"N° de clases (Sturges)", "Amplitud de clase"),
Valor = c("Superficie de espaciamiento (Spacing Acres)", "Cuantitativa continua", "Acres",
"Pozos de petróleo y gas de Nueva York con superficie de espaciamiento registrada",
as.character(N), round(min_val, 2), round(max_val, 2),
round(Rango, 2), as.character(K), round(Amplitud, 2))
)
ficha %>%
gt() %>%
tab_header(title = md("**FICHA TÉCNICA DE LA VARIABLE**")) %>%
cols_align(align = "left", 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()) %>%
opt_row_striping() %>%
tab_options(table.font.size = px(13), heading.align = "left")
| FICHA TÉCNICA DE LA VARIABLE | |
| Característica | Valor |
|---|---|
| Nombre de la variable | Superficie de espaciamiento (Spacing Acres) |
| Tipo de variable | Cuantitativa continua |
| Unidad de medida | Acres |
| Población de referencia | Pozos de petróleo y gas de Nueva York con superficie de espaciamiento registrada |
| Tamaño de muestra (N) | 820 |
| Valor mínimo | 36.56 |
| Valor máximo | 691.78 |
| Rango | 655.22 |
| N° de clases (Sturges) | 10 |
| Amplitud de clase | 65.52 |
El Spacing Acres (superficie de espaciamiento) es la extensión de terreno, medida en acres, que la normativa exige mantener entre unidades de perforación para evitar la interferencia entre pozos. Se excluyen del análisis los pozos con espaciamiento 0 o sin dato registrado.
breaks_table <- seq(min_val, max_val, length.out = K + 1)
breaks_table[length(breaks_table)] <- max_val + 0.0001
lim_inf_table <- breaks_table[1:K]
lim_sup_table <- breaks_table[2:(K + 1)]
MC <- (lim_inf_table + lim_sup_table) / 2
ni <- numeric(K)
for (i in 1:K) {
if (i < K) {
ni[i] <- length(Variable[Variable >= lim_inf_table[i] & Variable < lim_sup_table[i]])
} else {
ni[i] <- length(Variable[Variable >= lim_inf_table[i] & Variable <= lim_sup_table[i]])
}
}
hi <- (ni / sum(ni)) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
TDF_Spacing <- data.frame(
Li = round(lim_inf_table, 2),
Ls = round(lim_sup_table, 2),
MC = round(MC, 2),
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)
)
# Fila de totales
totales <- c("TOTAL", "-", "-", sum(ni), round(sum(hi), 2), "-", "-", "-", "-")
TDF_Char <- TDF_Spacing %>% mutate(across(everything(), as.character))
TDF_Final <- rbind(TDF_Char, totales)
modal_row <- which.max(TDF_Spacing$ni)
TDF_Final %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN DE FRECUENCIAS — SUPERFICIE DE ESPACIAMIENTO**"),
subtitle = md("Variable: **Spacing Acres (acres)**")
) %>%
tab_spanner(label = "Frecuencias acumuladas",
columns = c(Ni_asc, Ni_desc, Hi_asc, Hi_desc)) %>%
cols_label(
Li = "Lím. Inf", Ls = "Lím. Sup", MC = "Marca de clase (Xi)",
ni = "ni", hi = "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 = nrow(TDF_Final))) %>%
opt_row_striping() %>%
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: JENNY.*"))
| DISTRIBUCIÓN DE FRECUENCIAS — SUPERFICIE DE ESPACIAMIENTO | ||||||||
| Variable: Spacing Acres (acres) | ||||||||
| Lím. Inf | Lím. Sup | Marca de clase (Xi) | ni | hi (%) |
Frecuencias acumuladas
|
|||
|---|---|---|---|---|---|---|---|---|
| Ni (Asc) | Ni (Desc) | Hi (Asc) | Hi (Desc) | |||||
| 36.56 | 102.08 | 69.32 | 470 | 57.32 | 470 | 820 | 57.32 | 100 |
| 102.08 | 167.6 | 134.84 | 96 | 11.71 | 566 | 350 | 69.02 | 42.68 |
| 167.6 | 233.13 | 200.36 | 11 | 1.34 | 577 | 254 | 70.37 | 30.98 |
| 233.13 | 298.65 | 265.89 | 6 | 0.73 | 583 | 243 | 71.1 | 29.63 |
| 298.65 | 364.17 | 331.41 | 52 | 6.34 | 635 | 237 | 77.44 | 28.9 |
| 364.17 | 429.69 | 396.93 | 2 | 0.24 | 637 | 185 | 77.68 | 22.56 |
| 429.69 | 495.21 | 462.45 | 0 | 0 | 637 | 183 | 77.68 | 22.32 |
| 495.21 | 560.74 | 527.98 | 0 | 0 | 637 | 183 | 77.68 | 22.32 |
| 560.74 | 626.26 | 593.5 | 37 | 4.51 | 674 | 183 | 82.2 | 22.32 |
| 626.26 | 691.78 | 659.02 | 146 | 17.8 | 820 | 146 | 100 | 17.8 |
| TOTAL | - | - | 820 | 100 | - | - | - | - |
| Fuente: NYS DEC — Oil, Gas & Other Regulated Wells. Elaboración: JENNY. | ||||||||
h_base <- hist(Variable, breaks = "Sturges", plot = FALSE)
par(mar = c(8, 5, 4, 2))
plot(h_base,
main = "Gráfica N°1: Distribución de la superficie de espaciamiento de los pozos (NY)",
xlab = "Spacing Acres (acres)", ylab = "Frecuencia absoluta (n° de pozos)",
col = col_barras, border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.1))
axis(1, at = round(h_base$breaks, 1), labels = format(round(h_base$breaks, 1), big.mark = ","),
las = 2, cex.axis = 0.7)
axis(2)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")
h_porc <- h_base
h_porc$counts <- (h_porc$counts / sum(h_porc$counts)) * 100
h_porc$density <- h_porc$counts
y_max <- ceiling(max(h_porc$counts) / 5) * 5
par(mar = c(8, 5, 4, 2))
plot(h_porc,
main = "Gráfica N°2: Distribución porcentual de la superficie de espaciamiento",
xlab = "Spacing Acres (acres)", ylab = "Porcentaje de pozos (%)",
col = col_barras, border = "white", axes = FALSE,
ylim = c(0, y_max))
axis(1, at = round(h_base$breaks, 1), labels = format(round(h_base$breaks, 1), big.mark = ","),
las = 2, cex.axis = 0.7)
axis(2)
text(x = h_base$mids, y = h_porc$counts, labels = paste0(round(h_porc$counts, 1), "%"),
pos = 3, cex = 0.6, col = col_principal)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")
par(mar = c(7, 5, 4, 2))
boxplot(Variable, horizontal = TRUE, col = col_barras,
main = "Gráfica N°3: Diagrama de caja de la superficie de espaciamiento",
xlab = "", outline = TRUE, axes = FALSE,
outcol = col_acento, boxwex = 0.5, frame.plot = FALSE)
eje_x <- pretty(Variable, n = 8)
axis(1, at = eje_x, labels = format(eje_x, scientific = FALSE, big.mark = ","),
las = 2, cex.axis = 0.8)
mtext("Spacing Acres (acres)", side = 1, line = 5.5)
grid(nx = NULL, ny = NA, col = col_grid, lty = "dotted")
par(mar = c(5, 5, 4, 8), xpd = TRUE)
x_ac <- breaks_table
y_asc <- c(0, Ni_asc)
y_des <- c(Ni_desc, 0)
x_range <- range(x_ac)
y_range <- c(0, max(c(y_asc, y_des)))
plot(x_ac, y_asc, type = "o", col = col_principal, lwd = 2, pch = 16,
main = "Gráfica N°4: Ojivas de la superficie de espaciamiento",
xlab = "Spacing Acres (acres)", ylab = "Frecuencia acumulada (n° de pozos)",
xlim = x_range, ylim = y_range, axes = FALSE, frame.plot = FALSE)
axis(1, at = round(breaks_table, 1), labels = format(round(breaks_table, 1), big.mark = ","),
las = 2, cex.axis = 0.6)
axis(2, at = pretty(y_asc), labels = format(pretty(y_asc), big.mark = ","))
lines(x_ac, y_des, type = "o", col = col_acento, lwd = 2, pch = 16)
legend("right", legend = c("Ascendente (Ni↑)", "Descendente (Ni↓)"),
col = c(col_principal, col_acento), lty = 1, pch = 16,
inset = c(-0.18, 0), bty = "n")
grid(col = col_grid, lty = "dotted")
media_val <- mean(Variable)
mediana_val <- median(Variable)
freq_max <- max(TDF_Spacing$ni)
modas_calc <- TDF_Spacing$MC[TDF_Spacing$ni == freq_max]
moda_txt <- paste(round(modas_calc, 2), collapse = " ; ")
rango_txt <- paste0("[", round(min_val, 2), " ; ", round(max_val, 2), "]")
varianza_val <- var(Variable)
sd_val <- sd(Variable)
cv_val <- (sd_val / abs(media_val)) * 100
asimetria_val <- skewness(Variable, type = 2)
curtosis_val <- kurtosis(Variable, type = 2)
vals_atipicos <- boxplot.stats(Variable)$out
num_atipicos <- length(vals_atipicos)
status_atipicos <- if (num_atipicos > 0) {
paste0(num_atipicos, " [", round(min(vals_atipicos), 2), " ; ", round(max(vals_atipicos), 2), "]")
} else {
"0 (Sin atípicos)"
}
df_resumen <- data.frame(
"Variable" = "Spacing Acres (acres)",
"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,
check.names = FALSE
)
df_resumen %>%
gt() %>%
tab_header(
title = md("**RESUMEN ESTADÍSTICO Y MEDIDAS DESCRIPTIVAS**"),
subtitle = "Indicadores de la superficie de espaciamiento de los pozos (acres) — Nueva York"
) %>%
tab_source_note(source_note = "Autor: JENNY") %>%
fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc), decimals = 2) %>%
fmt_number(columns = c(Asimetria, Curtosis), decimals = 4) %>%
cols_label(
Variable = "Variable", Rango = "Rango Total",
Media = "Media (X)", Mediana = "Mediana (Me)", Moda = "Moda (Mo)",
Varianza = "Varianza (S2)", Desv_Std = "Desv. Est. (S)", CV_Porc = "C.V. (%)",
Asimetria = "Asimetría (As)", Curtosis = "Curtosis", Atipicos = "Atípicos"
) %>%
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_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
)
| RESUMEN ESTADÍSTICO Y MEDIDAS DESCRIPTIVAS | ||||||||||
| Indicadores de la superficie de espaciamiento de los pozos (acres) — Nueva York | ||||||||||
| Variable | Rango Total | Media (X) | Mediana (Me) | Moda (Mo) | Varianza (S2) | Desv. Est. (S) | C.V. (%) | Asimetría (As) | Curtosis | Atípicos |
|---|---|---|---|---|---|---|---|---|---|---|
| Spacing Acres (acres) | [36.56 ; 691.78] | 219.90 | 86.68 | 69.32 | 55,387.12 | 235.34 | 107.02 | 1.0587 | −0.6391 | 0 (Sin atípicos) |
| Autor: JENNY | ||||||||||
La variable Spacing Acres fluctúa entre 36.56 y 691.78 acres, y sus valores se concentran alrededor de 219.9 acres (mediana ≈ 86.68 acres). Presenta una desviación estándar de 235.34 acres, siendo una variable heterogénea (C.V. = 107.02%).
La distribución es asimétrica positiva (sesgo hacia la derecha) (As = 1.0587) y platicúrtica (más aplanada que la normal) (Curtosis = -0.6391). Se identificaron 0 valores atípicos en el conjunto de datos.
De un total de 47407 pozos registrados en la base original, 820 pozos presentan un dato de superficie de espaciamiento válido (> 0), lo cual permite caracterizar la normativa territorial que rige la separación mínima entre unidades de perforación en Nueva York.