1 Introducción y Metodología

El presente informe analiza la variable Kickoff (punto de desvío) de los pozos de petróleo y gas del estado de Nueva York, una variable cuantitativa continua medida en pies (ft). El kickoff es la profundidad a la que un pozo se desvía de la vertical, por lo que solo los pozos direccionales y horizontales poseen un valor de kickoff; los pozos verticales (la gran mayoría) tienen kickoff 0 y se excluyen del análisis. Se trabaja, por tanto, con los 556 pozos desviados que sí registran este punto. Se aplican técnicas de estadística descriptiva: tabla de distribución de frecuencias por intervalos (regla de Sturges), análisis gráfico (histogramas, polígonos porcentuales, diagrama de caja y ojivas) y el cálculo de las principales medidas de tendencia central, dispersión y forma.

library(readxl)
library(dplyr)
library(gt)
library(e1071)

col_principal <- "#0E6655"   
col_barras    <- "#16A085"   
col_acento    <- "#E67E22"   
col_claro     <- "#E8F8F5"   
col_grid      <- "#D7DBDD"   

setwd("C:/Users/PATRICIA/Desktop/excel")
Datos <- read.csv("C:/Users/PATRICIA/Desktop/excel/oil_dataset.csv",
                  header = TRUE, sep = ";", dec = ",")

Variable <- suppressWarnings(as.numeric(Datos$Kickoff..ft))
Variable <- na.omit(Variable)
Variable <- Variable[Variable > 0]           

if (length(Variable) == 0) stop("ERROR: No hay datos validos en 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))
Amplitud <- Rango / K

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

cat("N (pozos desviados con Profundidad de Punto de Inicio):", N, "| Clases (Sturges):", K,
    "| Amplitud:", round(Amplitud, 1), "ft\n")
## N (pozos desviados con Profundidad de Punto de Inicio): 556 | Clases (Sturges): 10 | Amplitud: 1144 ft

2 Distribución de Frecuencias

A continuación se presenta la tabla de distribución de frecuencias por intervalos de Profundidad de Punto de Inicio. Se resalta en naranja la clase modal (la de mayor frecuencia) y en verde la fila de totales.

# Fila de totales
totales <- c("TOTAL", "-", "-", sum(ni), round(sum(hi), 2), "-", "-", "-", "-")
TDF_Char  <- TDF_Kick %>% mutate(across(everything(), as.character))
TDF_Final <- rbind(TDF_Char, totales)

modal_row <- which.max(TDF_Kick$ni)   

TDF_Final %>%
  gt() %>%
  tab_header(
    title = md("**DISTRIBUCIÓN DE FRECUENCIAS — PUNTO DE INICIO**"),
    subtitle = md("Variable: **Profundidad de Punto de Inicio del pozo (ft)** · Pozos desviados de Nueva York")
  ) %>%
  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() %>%
  opt_table_font(font = google_font("Roboto")) %>%
  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 — PUNTO DE INICIO
Variable: Profundidad de Punto de Inicio del pozo (ft) · Pozos desviados de Nueva York
Lím. Inf Lím. Sup Marca de clase (Xi) ni hi (%)
Frecuencias acumuladas
Ni (Asc) Ni (Desc) Hi (Asc) Hi (Desc)
360 1504 932 93 16.73 93 556 16.73 100
1504 2648 2076 82 14.75 175 463 31.47 83.27
2648 3792 3220 45 8.09 220 381 39.57 68.53
3792 4936 4364 61 10.97 281 336 50.54 60.43
4936 6080 5508 49 8.81 330 275 59.35 49.46
6080 7224 6652 58 10.43 388 226 69.78 40.65
7224 8368 7796 31 5.58 419 168 75.36 30.22
8368 9512 8940 80 14.39 499 137 89.75 24.64
9512 10656 10084 52 9.35 551 57 99.1 10.25
10656 11800 11228 5 0.9 556 5 100 0.9
TOTAL - - 556 100 - - - -
Fuente: NYS DEC — Oil, Gas & Other Regulated Wells. Elaboración: JENNY.

3 Análisis Gráfico

Esta sección presenta la visualización de la distribución del punto de kickoff de los pozos.

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

3.1 Histogramas de Frecuencia

par(mar = c(8, 5, 4, 2))
plot(h_base,
     main = "Gráfica N°1: Distribución del punto de Profundidad de Punto de Inicio de los pozos desviados (NY)",
     xlab = "Profundidad de Punto de Inicio (ft)", ylab = "Frecuencia absoluta (n° de pozos)",
     col = col_barras, border = "white", axes = FALSE, cex.main = 0.95,
     ylim = c(0, max(h_base$counts) * 1.1))
axis(1, at = round(h_base$breaks), labels = format(round(h_base$breaks), scientific = FALSE),
     las = 2, cex.axis = 0.7)
axis(2)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")

par(mar = c(8, 5, 4, 2))
plot(h_base,
     main = "Gráfica N°2: Distribución global del punto de Inicio",
     xlab = "Profundidad de kickoff (ft)", ylab = "N° de pozos",
     col = col_barras, border = "white", axes = FALSE, cex.main = 0.95,
     ylim = c(0, sum(h_base$counts)))
axis(1, at = round(h_base$breaks), labels = format(round(h_base$breaks), scientific = FALSE),
     las = 2, cex.axis = 0.7)
axis(2)
grid(nx = NA, ny = NULL, col = col_grid, lty = "dotted")

3.2 Gráficos Porcentuales

h_porc <- h_base
h_porc$counts <- (h_porc$counts / sum(h_porc$counts)) * 100
h_porc$density <- h_porc$counts

par(mar = c(8, 5, 4, 2))
plot(h_porc,
     main = "Gráfica N°3: Distribución porcentual del punto de kickoff",
     xlab = "Profundidad de kickoff (ft)", ylab = "Porcentaje (%)",
     col = col_barras, border = "white", axes = FALSE, freq = TRUE, cex.main = 0.95,
     ylim = c(0, max(h_porc$counts) * 1.2))
axis(1, at = round(h_base$breaks), labels = format(round(h_base$breaks), scientific = FALSE),
     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(8, 5, 4, 2))
plot(h_porc,
     main = "Gráfica N°4: Distribución porcentual global (punto de Inicio)",
     xlab = "Profundidad de kickoff (ft)", ylab = "% del total",
     col = col_barras, border = "white", axes = FALSE, freq = TRUE, cex.main = 0.95,
     ylim = c(0, 100))
axis(1, at = round(h_base$breaks), labels = format(round(h_base$breaks), scientific = FALSE),
     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)
abline(h = seq(0, 100, 20), col = col_grid, lty = "dotted")

3.3 Diagrama de Caja y Ojivas

par(mar = c(5, 5, 4, 2))
boxplot(Variable, horizontal = TRUE, col = col_barras,
        main = "Gráfica N°5: Diagrama de caja del punto de Inicio",
        xlab = "Profundidad de kickoff (ft)", outline = TRUE, outpch = 19,
        outcol = col_acento, boxwex = 0.5, frame.plot = FALSE, xaxt = "n")
eje_x <- pretty(Variable, n = 15)
axis(1, at = eje_x, labels = format(eje_x, scientific = FALSE), cex.axis = 0.7, las = 2)
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 = 19,
     main = "Gráfica N°6: Ojivas del punto de Inicio",
     xlab = "Profundidad del Punto de Inicio (ft)", ylab = "Frecuencia acumulada (n° de pozos)",
     xlim = x_range, ylim = y_range, axes = FALSE, frame.plot = FALSE, cex.main = 0.95)
axis(1, at = round(breaks_table), labels = format(round(breaks_table), scientific = FALSE),
     las = 2, cex.axis = 0.6)
axis(2, at = pretty(y_asc), labels = format(pretty(y_asc), scientific = FALSE))
lines(x_ac, y_des, type = "o", col = col_acento, lwd = 2, pch = 19)
legend("right", legend = c("Ascendente (Ni↑)", "Descendente (Ni↓)"),
       col = c(col_principal, col_acento), lty = 1, pch = 19, cex = 0.75, lwd = 2,
       inset = c(-0.18, 0), bty = "n")
grid(col = col_grid, lty = "dotted")

4 Resumen Estadístico

media_val    <- mean(Variable)
mediana_val  <- median(Variable)
freq_max     <- max(TDF_Kick$ni)
modas_calc   <- TDF_Kick$MC[TDF_Kick$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 atipicos)" }

df_resumen <- data.frame(
  "Variable"  = "Punto de kickoff (ft)",
  "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 del punto de inicio de los pozos desviados (ft) — Nueva York"
  ) %>%
  tab_source_note(source_note = "Autor: JENNY") %>%
  fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc, Curtosis), decimals = 2) %>%
  fmt_number(columns = c(Asimetria), 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 = "Asimetria (As)", Curtosis = "Curtosis (K)", Atipicos = "Outliers [Intervalo]"
  ) %>%
  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()
  ) %>%
  opt_table_font(font = google_font("Roboto")) %>%
  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 del punto de inicio de los pozos desviados (ft) — Nueva York
Variable Rango Total Media (X) Mediana (Me) Moda (Mo) Varianza (S2) Desv. Est. (S) C.V. (%) Asimetria (As) Curtosis (K) Outliers [Intervalo]
Punto de kickoff (ft) [360; 11800] 5,135.08 4,861.00 932 9,861,489.03 3,140.30 61.15 0.1661 −1.35 0 (Sin atipicos)
Autor: JENNY

5 Conclusiones

5.1 Análisis Descriptivo

La variable Profundidad de Punto de Inicio fluctúa entre 360 y 11800 pies, y sus valores se concentran alrededor de 5135.1 ft (mediana ≈ 4861 ft). Presenta una desviación estándar de 3140.3 ft, siendo una variable heterogénea (C.V. = 61.15%), cuyos valores se ubican en la parte baja (desvíos más someros) de la distribución, sin valores atípicos significativos.

La distribución muestra una distribución aproximadamente simétrica. La gran dispersión (C.V. = 61.15%) indica que, entre los pocos pozos direccionales y horizontales de Nueva York (apenas 556 de los más de 47.000 pozos), el punto de desvío respecto de la vertical se inicia a profundidades muy variadas —desde 360 hasta 11800 ft— en función de la formación objetivo de cada perforación. La media (5135 ft) es mayor que la mediana (4861 ft), lo que confirma el comportamiento casi simétrico de la variable.