# 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
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(4, 5, 5, 2), 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), con una desviación estándar de 235.34 acres, lo que la caracteriza como una variable heterogénea (C.V. = 107.02%); asimismo, su 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), habiéndose identificado 0 valores atípicos en el conjunto de datos.