1. Configuración y carga de datos

# 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

2. Extracción y limpieza de la variable

# Localizamos la columna de Longitud de Superficie de forma robusta (el nombre
# puede llegar alterado por R como "Surface.Longitude" al leer "Surface Longitude")
col_long <- grep("Surface.?Longitude", names(Datos), value = TRUE)[1]

if (is.na(col_long)) stop("ERROR: No se encontró la columna de Longitud de Superficie en el dataset.")

# Extracción y conversión a numérico
Variable_bruta <- suppressWarnings(as.numeric(Datos[[col_long]]))

# --- 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 de Superficie tras la limpieza.")

cat("Columna detectada:", col_long, "\n")
## Columna detectada: Surface.Longitude
cat("N° de pozos con longitud de superficie válida:", length(Variable), "\n")
## N° de pozos con longitud de superficie válida: 46299

3. Identificación de la variable

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 de superficie (Surface Longitude) es la coordenada geográfica de longitud del punto de ubicación en superficie de la boca del pozo, expresada en grados decimales (°). 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°).

4. Tabla de distribución de frecuencias

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 DE SUPERFICIE**"),
    subtitle = md("Variable: **Longitud de superficie 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 DE SUPERFICIE
Variable: Longitud de superficie 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 2490 5.38 2490 46299 5.38 100
-79.3622 -78.9638 -79.163 4928 10.64 7418 43809 16.02 94.62
-78.9638 -78.5655 -78.7647 7113 15.36 14531 38881 31.39 83.98
-78.5655 -78.1672 -78.3663 11942 25.79 26473 31768 57.18 68.61
-78.1672 -77.7688 -77.968 13050 28.19 39523 19826 85.36 42.82
-77.7688 -77.3705 -77.5697 2727 5.89 42250 6776 91.25 14.64
-77.3705 -76.9722 -77.1713 811 1.75 43061 4049 93.01 8.75
-76.9722 -76.5738 -76.773 1426 3.08 44487 3238 96.09 6.99
-76.5738 -76.1755 -76.3747 484 1.05 44971 1812 97.13 3.91
-76.1755 -75.7772 -75.9763 405 0.87 45376 1328 98.01 2.87
-75.7772 -75.3788 -75.578 416 0.9 45792 923 98.9 1.99
-75.3788 -74.9805 -75.1797 63 0.14 45855 507 99.04 1.1
-74.9805 -74.5822 -74.7813 35 0.08 45890 444 99.12 0.96
-74.5822 -74.1838 -74.383 23 0.05 45913 409 99.17 0.88
-74.1838 -73.7855 -73.9847 363 0.78 46276 386 99.95 0.83
-73.7855 -73.3871 -73.5863 23 0.05 46299 23 100 0.05
TOTAL - - 46299 100 - - - -
Fuente: NYS DEC — Oil, Gas & Other Regulated Wells. Elaboración: JENNY.

5. Representación gráfica

h_base <- hist(Variable, breaks = "Sturges", plot = FALSE)

5.1 Histogramas de freuencia (frecuencia absoluta)

par(mar = c(8, 5, 4, 2))
plot(h_base,
     main = "Gráfica N°1: Distribución de la longitud de superficie de los pozos (NY)",
     xlab = "Longitud de superficie (°)", 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")

5.2 Histograma porcentual(frecuencia relativa)

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 de superficie",
     xlab = "Longitud de superficie (°)", 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")

5.3 Diagrama de caja/boxplot

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 de superficie",
        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 de superficie (°)", side = 1, line = 5.5)
grid(nx = NULL, ny = NA, col = col_grid, lty = "dotted")

5.4 Diagrama de ojivas

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 de superficie",
     xlab = "Longitud de superficie (°)", 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")

6. Tabla de indicadores

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 de superficie (°)",
  "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 de superficie 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 de superficie 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 de superficie (°) [-79.7605 ; -73.3872] −78.2572 −78.2402 -77.968 0.6720 0.8197 1.0475 1.8668 6.9148 5745 [-79.7605 ; -73.3872]
Autor: JENNY

7. Conclusiones

La variable Longitud de superficie fluctúa entre -79.7605° y -73.3872°, y sus valores se concentran alrededor de -78.2572° (mediana ≈ -78.2402°). Presenta una desviación estándar de 0.8197°, siendo una variable homogénea (C.V. = 1.05%).

La distribución es asimétrica positiva (sesgo hacia la derecha) (As = 1.8668) y leptocúrtica (más apuntada que la normal) (Curtosis = 6.9148). Se identificaron 5745 valores atípicos en el conjunto de datos.