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

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

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

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

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

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

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

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

7. Conclusiones

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.