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
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. | ||||||||
Esta sección presenta la visualización de la distribución del punto de kickoff de los pozos.
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")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")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")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 | ||||||||||
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.