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 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

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 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°).

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 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.

5. Representación gráfica

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

5.1 Histogramas de freuencia

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")

5.2 Histograma porcentual

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")

5.3 Diagrama de caja

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")

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 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")

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 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

7. Conclusiones

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.