# 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 Longitud del Fondo del Pozo de forma robusta (el nombre
# puede llegar alterado por R como "Bottom.Hole.Longitude" al leer "Bottom Hole Longitude")
col_bhl <- grep("Bottom.?Hole.?Longitude", names(Datos), value = TRUE)[1]
if (is.na(col_bhl)) stop("ERROR: No se encontró la columna de Longitud del Fondo del Pozo en el dataset.")
# Extracción y conversión a numérico
Variable_bruta <- suppressWarnings(as.numeric(Datos[[col_bhl]]))
# --- Corrección de escala ---
# La columna original presenta un error de captura del sistema del NYS DEC: el
# punto decimal se pierde y los valores quedan almacenados con distinta
# cantidad de dígitos (p. ej. -78.01913 aparece como -7801913, -78019130000
# o -78019130000000000 según el registro). Para reconstruir la longitud real
# se normaliza cada valor para que conserve únicamente 2 dígitos enteros,
# que es el formato correcto de una longitud geográfica en el estado de
# Nueva York (aprox. entre -71 y -80 grados).
Variable_bruta <- Variable_bruta[!is.na(Variable_bruta) & Variable_bruta != 0]
orden_mag <- floor(log10(abs(Variable_bruta)))
Variable <- Variable_bruta / (10 ^ (orden_mag - 1))
# Limpieza final: se conservan solo longitudes dentro del rango geográfico
# válido para pozos de Nueva York (evita registros corruptos o mal escalados)
Variable <- Variable[Variable >= -80 & Variable <= -71]
Variable <- na.omit(Variable)
if (length(Variable) == 0) stop("ERROR: No hay datos válidos de Longitud del Fondo del Pozo tras la limpieza.")
cat("Columna detectada:", col_bhl, "\n")
## Columna detectada: Bottom.Hole.Longitude
cat("N° de pozos con longitud del fondo del pozo válida:", length(Variable), "\n")
## N° de pozos con longitud del fondo del pozo válida: 46169
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
La longitud del fondo del pozo (Bottom Hole Longitude) es la coordenada geográfica de longitud del punto final de la perforación (fondo del pozo), expresada en grados decimales (°). En pozos verticales coincide con la longitud de superficie, pero en pozos direccionales o desviados (Slant distinto de “Vertical”) puede diferir de ella. Al ser Nueva York un estado ubicado al oeste del meridiano de Greenwich, todos sus valores son negativos. Se excluyen del análisis los pozos sin dato registrado y los valores fuera del rango geográfico válido del estado (aprox. -71° a -80°).
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_Long <- data.frame(
Li = round(lim_inf_table, 4),
Ls = round(lim_sup_table, 4),
MC = round(MC, 4),
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_Long %>% mutate(across(everything(), as.character))
TDF_Final <- rbind(TDF_Char, totales)
modal_row <- which.max(TDF_Long$ni)
TDF_Final %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN DE FRECUENCIAS — LONGITUD DEL FONDO DEL POZO**"),
subtitle = md("Variable: **Longitud del fondo del pozo (°)**")
) %>%
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 — LONGITUD DEL FONDO DEL POZO | ||||||||
| Variable: Longitud del fondo del pozo (°) | ||||||||
| Lím. Inf | Lím. Sup | Marca de clase (Xi) | ni | hi (%) |
Frecuencias acumuladas
|
|||
|---|---|---|---|---|---|---|---|---|
| Ni (Asc) | Ni (Desc) | Hi (Asc) | Hi (Desc) | |||||
| -79.7605 | -79.3622 | -79.5613 | 2489 | 5.39 | 2489 | 46169 | 5.39 | 100 |
| -79.3622 | -78.9638 | -79.163 | 4927 | 10.67 | 7416 | 43680 | 16.06 | 94.61 |
| -78.9638 | -78.5655 | -78.7647 | 7108 | 15.4 | 14524 | 38753 | 31.46 | 83.94 |
| -78.5655 | -78.1672 | -78.3663 | 11914 | 25.81 | 26438 | 31645 | 57.26 | 68.54 |
| -78.1672 | -77.7688 | -77.968 | 13003 | 28.16 | 39441 | 19731 | 85.43 | 42.74 |
| -77.7688 | -77.3705 | -77.5697 | 2693 | 5.83 | 42134 | 6728 | 91.26 | 14.57 |
| -77.3705 | -76.9722 | -77.1713 | 806 | 1.75 | 42940 | 4035 | 93.01 | 8.74 |
| -76.9722 | -76.5738 | -76.773 | 1416 | 3.07 | 44356 | 3229 | 96.07 | 6.99 |
| -76.5738 | -76.1755 | -76.3747 | 486 | 1.05 | 44842 | 1813 | 97.13 | 3.93 |
| -76.1755 | -75.7772 | -75.9763 | 402 | 0.87 | 45244 | 1327 | 98 | 2.87 |
| -75.7772 | -75.3788 | -75.578 | 418 | 0.91 | 45662 | 925 | 98.9 | 2 |
| -75.3788 | -74.9805 | -75.1797 | 63 | 0.14 | 45725 | 507 | 99.04 | 1.1 |
| -74.9805 | -74.5822 | -74.7813 | 35 | 0.08 | 45760 | 444 | 99.11 | 0.96 |
| -74.5822 | -74.1838 | -74.383 | 23 | 0.05 | 45783 | 409 | 99.16 | 0.89 |
| -74.1838 | -73.7855 | -73.9847 | 363 | 0.79 | 46146 | 386 | 99.95 | 0.84 |
| -73.7855 | -73.3871 | -73.5863 | 23 | 0.05 | 46169 | 23 | 100 | 0.05 |
| TOTAL | - | - | 46169 | 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 longitud del fondo del pozo de los pozos (NY)",
xlab = "Longitud del fondo del pozo (°)", 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, 2), labels = format(round(h_base$breaks, 2), 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 longitud del fondo del pozo",
xlab = "Longitud del fondo del pozo (°)", ylab = "Porcentaje de pozos (%)",
col = col_barras, border = "white", axes = FALSE,
ylim = c(0, y_max))
axis(1, at = round(h_base$breaks, 2), labels = format(round(h_base$breaks, 2), 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 longitud del fondo del pozo",
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("Longitud del fondo del pozo (°)", 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 longitud del fondo del pozo",
xlab = "Longitud del fondo del pozo (°)", ylab = "Frecuencia acumulada (n° de pozos)",
xlim = x_range, ylim = y_range, axes = FALSE, frame.plot = FALSE)
axis(1, at = round(breaks_table, 2), labels = format(round(breaks_table, 2), 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_Long$ni)
modas_calc <- TDF_Long$MC[TDF_Long$ni == freq_max]
moda_txt <- paste(round(modas_calc, 4), collapse = " ; ")
rango_txt <- paste0("[", round(min_val, 4), " ; ", round(max_val, 4), "]")
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), 4), " ; ", round(max(vals_atipicos), 4), "]")
} else {
"0 (Sin atípicos)"
}
df_resumen <- data.frame(
"Variable" = "Longitud del fondo del pozo (°)",
"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 longitud del fondo del pozo de los pozos (°) — Nueva York"
) %>%
tab_source_note(source_note = "Autor: JENNY") %>%
fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc), decimals = 4) %>%
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 longitud del fondo del pozo de los pozos (°) — Nueva York | ||||||||||
| Variable | Rango Total | Media (X) | Mediana (Me) | Moda (Mo) | Varianza (S2) | Desv. Est. (S) | C.V. (%) | Asimetría (As) | Curtosis | Atípicos |
|---|---|---|---|---|---|---|---|---|---|---|
| Longitud del fondo del pozo (°) | [-79.7605 ; -73.3872] | −78.2582 | −78.2412 | -77.968 | 0.6728 | 0.8203 | 1.0481 | 1.8699 | 6.9219 | 5726 [-79.7605 ; -73.3872] |
| Autor: JENNY | ||||||||||
La variable Longitud del fondo del pozo fluctúa entre -79.7605° y -73.3872°, y sus valores se concentran alrededor de -78.2582° (mediana ≈ -78.2412°). Presenta una desviación estándar de 0.8203°, siendo una variable homogénea (C.V. = 1.05%).
La distribución es asimétrica positiva (sesgo hacia la derecha) (As = 1.8699) y leptocúrtica (más apuntada que la normal) (Curtosis = 6.9219). Se identificaron 5726 valores atípicos en el conjunto de datos.