# 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 Latitud del Fondo del Pozo de forma robusta (el nombre
# puede llegar alterado por R como "Bottom.Hole.Latitude" al leer "Bottom Hole Latitude")
col_bhla <- grep("Bottom.?Hole.?Latitude", names(Datos), value = TRUE)[1]
if (is.na(col_bhla)) stop("ERROR: No se encontró la columna de Latitud del Fondo del Pozo en el dataset.")
# Extracción y conversión a numérico
Variable_bruta <- suppressWarnings(as.numeric(Datos[[col_bhla]]))
# --- 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. 42.19713 aparece como 4219713, 42197130000
# o 42197130000000000 según el registro). Para reconstruir la latitud real
# se normaliza cada valor para que conserve únicamente 2 dígitos enteros,
# que es el formato correcto de una latitud geográfica en el estado de
# Nueva York (aprox. entre 40 y 45 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 latitudes dentro del rango geográfico
# válido para pozos de Nueva York (evita registros corruptos o mal escalados)
Variable <- Variable[Variable >= 40 & Variable <= 45]
Variable <- na.omit(Variable)
if (length(Variable) == 0) stop("ERROR: No hay datos válidos de Latitud del Fondo del Pozo tras la limpieza.")
cat("Columna detectada:", col_bhla, "\n")
## Columna detectada: Bottom.Hole.Latitude
cat("N° de pozos con latitud del fondo del pozo válida:", length(Variable), "\n")
## N° de pozos con latitud del fondo del pozo válida: 46170
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 latitud del fondo del pozo (Bottom Hole Latitude) es la coordenada geográfica de latitud del punto final de la perforación (fondo del pozo), expresada en grados decimales (°). En pozos verticales coincide con la latitud de superficie, pero en pozos direccionales o desviados (Slant distinto de “Vertical”) puede diferir de ella. Al ubicarse Nueva York en el hemisferio norte, todos sus valores son positivos. Se excluyen del análisis los pozos sin dato registrado y los valores fuera del rango geográfico válido del estado (aprox. 40° a 45°).
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 — LATITUD DEL FONDO DEL POZO**"),
subtitle = md("Variable: **Latitud 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 — LATITUD DEL FONDO DEL POZO | ||||||||
| Variable: Latitud 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) | |||||
| 40.6387 | 40.8937 | 40.7662 | 251 | 0.54 | 251 | 46170 | 0.54 | 100 |
| 40.8937 | 41.1487 | 41.0212 | 65 | 0.14 | 316 | 45919 | 0.68 | 99.46 |
| 41.1487 | 41.4038 | 41.2763 | 3 | 0.01 | 319 | 45854 | 0.69 | 99.32 |
| 41.4038 | 41.6588 | 41.5313 | 31 | 0.07 | 350 | 45851 | 0.76 | 99.31 |
| 41.6588 | 41.9139 | 41.7864 | 18 | 0.04 | 368 | 45820 | 0.8 | 99.24 |
| 41.9139 | 42.1689 | 42.0414 | 30500 | 66.06 | 30868 | 45802 | 66.86 | 99.2 |
| 42.1689 | 42.424 | 42.2964 | 4971 | 10.77 | 35839 | 15302 | 77.62 | 33.14 |
| 42.424 | 42.679 | 42.5515 | 4256 | 9.22 | 40095 | 10331 | 86.84 | 22.38 |
| 42.679 | 42.934 | 42.8065 | 4557 | 9.87 | 44652 | 6075 | 96.71 | 13.16 |
| 42.934 | 43.1891 | 43.0616 | 1193 | 2.58 | 45845 | 1518 | 99.3 | 3.29 |
| 43.1891 | 43.4441 | 43.3166 | 128 | 0.28 | 45973 | 325 | 99.57 | 0.7 |
| 43.4441 | 43.6992 | 43.5716 | 174 | 0.38 | 46147 | 197 | 99.95 | 0.43 |
| 43.6992 | 43.9542 | 43.8267 | 17 | 0.04 | 46164 | 23 | 99.99 | 0.05 |
| 43.9542 | 44.2093 | 44.0817 | 4 | 0.01 | 46168 | 6 | 100 | 0.01 |
| 44.2093 | 44.4643 | 44.3368 | 0 | 0 | 46168 | 2 | 100 | 0 |
| 44.4643 | 44.7194 | 44.5919 | 2 | 0 | 46170 | 2 | 100 | 0 |
| TOTAL | - | - | 46170 | 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 latitud del fondo del pozo de los pozos (NY)",
xlab = "Latitud 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 latitud del fondo del pozo",
xlab = "Latitud 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 latitud 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("Latitud 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 latitud del fondo del pozo",
xlab = "Latitud 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" = "Latitud 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 latitud 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 latitud 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 |
|---|---|---|---|---|---|---|---|---|---|---|
| Latitud del fondo del pozo (°) | [40.6387 ; 44.7193] | 42.2295 | 42.0848 | 42.0414 | 0.1072 | 0.3274 | 0.7753 | 0.8092 | 3.6118 | 4006 [40.6387 ; 44.7193] |
| Autor: JENNY | ||||||||||
La variable Latitud del fondo del pozo fluctúa entre 40.6387° y 44.7193°, y sus valores se concentran alrededor de 42.2295° (mediana ≈ 42.0848°). Presenta una desviación estándar de 0.3274°, siendo una variable homogénea (C.V. = 0.78%).
La distribución es asimétrica positiva (sesgo hacia la derecha) (As = 0.8092) y leptocúrtica (más apuntada que la normal) (Curtosis = 3.6118). Se identificaron 4006 valores atípicos en el conjunto de datos.