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 Elevación de forma robusta (el nombre puede llegar
# alterado por R como "Elevation..ft" al leer "Elevation, ft")
col_elev <- grep("Elevation", names(Datos), value = TRUE)[1]

if (is.na(col_elev)) stop("ERROR: No se encontró la columna de Elevación en el dataset.")

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

# Limpieza: se eliminan NA y valores 0 o sin dato registrado
Variable <- na.omit(Variable)
Variable <- Variable[Variable > 0]

if (length(Variable) == 0) stop("ERROR: No hay datos válidos de Elevación tras la limpieza.")

cat("Columna detectada:", col_elev, "\n")
## Columna detectada: Elevation..ft
cat("N° de pozos con elevación válida:", length(Variable), "\n")
## N° de pozos con elevación válida: 25548

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

ficha <- data.frame(
  Característica = c("Nombre de la variable", "Tipo de variable", "Unidad de medida",
                      "Población de referencia", "Tamaño de muestra (N)",
                      "Valor mínimo", "Valor máximo", "Rango",
                      "N° de clases (Sturges)", "Amplitud de clase"),
  Valor = c("Elevación del terreno (Elevation)", "Cuantitativa continua", "Pies s.n.m. (ft)",
            "Pozos de petróleo y gas de Nueva York con elevación registrada",
            as.character(N), round(min_val, 1), round(max_val, 1),
            round(Rango, 1), as.character(K), round(Amplitud, 1))
)

ficha %>%
  gt() %>%
  tab_header(title = md("**FICHA TÉCNICA DE LA VARIABLE**")) %>%
  cols_align(align = "left", 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()) %>%
  opt_row_striping() %>%
  tab_options(table.font.size = px(13), heading.align = "left")
FICHA TÉCNICA DE LA VARIABLE
Característica Valor
Nombre de la variable Elevación del terreno (Elevation)
Tipo de variable Cuantitativa continua
Unidad de medida Pies s.n.m. (ft)
Población de referencia Pozos de petróleo y gas de Nueva York con elevación registrada
Tamaño de muestra (N) 25548
Valor mínimo 3
Valor máximo 3500
Rango 3497
N° de clases (Sturges) 15
Amplitud de clase 233.1

La elevación (Elevation) es la altura del terreno donde se ubica la boca del pozo, medida en pies sobre el nivel del mar (ft s.n.m.). Se excluyen del análisis los pozos con elevación 0 o sin dato registrado.

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_Elev <- data.frame(
  Li = round(lim_inf_table, 1),
  Ls = round(lim_sup_table, 1),
  MC = round(MC, 1),
  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_Elev %>% mutate(across(everything(), as.character))
TDF_Final <- rbind(TDF_Char, totales)

modal_row <- which.max(TDF_Elev$ni)

TDF_Final %>%
  gt() %>%
  tab_header(
    title = md("**DISTRIBUCIÓN DE FRECUENCIAS — ELEVACIÓN DEL TERRENO**"),
    subtitle = md("Variable: **Elevación del pozo (ft s.n.m.)**")
  ) %>%
  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 — ELEVACIÓN DEL TERRENO
Variable: Elevación del pozo (ft s.n.m.)
Lím. Inf Lím. Sup Marca de clase (Xi) ni hi (%)
Frecuencias acumuladas
Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
3 236.1 119.6 303 1.19 303 25548 1.19 100
236.1 469.3 352.7 464 1.82 767 25245 3 98.81
469.3 702.4 585.8 2087 8.17 2854 24781 11.17 97
702.4 935.5 819 2992 11.71 5846 22694 22.88 88.83
935.5 1168.7 1052.1 2159 8.45 8005 19702 31.33 77.12
1168.7 1401.8 1285.2 3095 12.11 11100 17543 43.45 68.67
1401.8 1634.9 1518.4 4704 18.41 15804 14448 61.86 56.55
1634.9 1868.1 1751.5 3684 14.42 19488 9744 76.28 38.14
1868.1 2101.2 1984.6 2830 11.08 22318 6060 87.36 23.72
2101.2 2334.3 2217.8 2966 11.61 25284 3230 98.97 12.64
2334.3 2567.5 2450.9 254 0.99 25538 264 99.96 1.03
2567.5 2800.6 2684 7 0.03 25545 10 99.99 0.04
2800.6 3033.7 2917.2 2 0.01 25547 3 100 0.01
3033.7 3266.9 3150.3 0 0 25547 1 100 0
3266.9 3500 3383.4 1 0 25548 1 100 0
TOTAL - - 25548 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

par(mar = c(8, 5, 4, 2))
plot(h_base,
     main = "Gráfica N°1: Distribución de la elevación del terreno de los pozos (NY)",
     xlab = "Elevación (ft s.n.m.)", 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), labels = format(round(h_base$breaks), 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 elevación",
     xlab = "Elevación (ft s.n.m.)", ylab = "Porcentaje de pozos (%)",
     col = col_barras, border = "white", axes = FALSE,
     ylim = c(0, y_max))
axis(1, at = round(h_base$breaks), labels = format(round(h_base$breaks), 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 elevación",
        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("Elevación (ft s.n.m.)", 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 elevación",
     xlab = "Elevación (ft s.n.m.)", ylab = "Frecuencia acumulada (n° de pozos)",
     xlim = x_range, ylim = y_range, axes = FALSE, frame.plot = FALSE)
axis(1, at = round(breaks_table), labels = format(round(breaks_table), 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_Elev$ni)
modas_calc   <- TDF_Elev$MC[TDF_Elev$ni == freq_max]
moda_txt     <- paste(round(modas_calc, 1), collapse = " ; ")
rango_txt    <- paste0("[", round(min_val, 1), " ; ", round(max_val, 1), "]")
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), 1), " ; ", round(max(vals_atipicos), 1), "]")
} else {
  "0 (Sin atípicos)"
}

df_resumen <- data.frame(
  "Variable"  = "Elevación (ft s.n.m.)",
  "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 elevación del terreno de los pozos (ft) — Nueva York"
  ) %>%
  tab_source_note(source_note = "Autor: JENNY") %>%
  fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc), decimals = 2) %>%
  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 elevación del terreno de los pozos (ft) — Nueva York
Variable Rango Total Media (X) Mediana (Me) Moda (Mo) Varianza (S2) Desv. Est. (S) C.V. (%) Asimetría (As) Curtosis Atípicos
Elevación (ft s.n.m.) [3 ; 3500] 1,432.98 1,495.00 1518.4 291,239.03 539.67 37.66 −0.2732 −0.7318 1 [3500 ; 3500]
Autor: JENNY

7. Conclusiones

La variable Elevación fluctúa entre 3 y 3500 pies sobre el nivel del mar, y sus valores se concentran alrededor de 1433 ft (mediana ≈ 1495 ft). Presenta una desviación estándar de 539.7 ft, siendo una variable heterogénea (C.V. = 37.66%).

La distribución es aproximadamente simétrica (As = -0.2732) y platicúrtica (más aplanada que la normal) (Curtosis = -0.7318). Se identificaron 1 valores atípicos en el conjunto de datos.

De un total de 47407 pozos registrados en la base original, 25548 pozos presentan un dato de elevación válido (> 0), lo cual permite caracterizar el terreno donde se concentra la actividad de perforación en Nueva York.