El presente informe estadístico analiza la variable Profundidad Medida (en metros) de pozos petroleros de Brasil, aplicando técnicas descriptivas e inferenciales.
Dado que la profundidad de los pozos abarca un rango muy amplio (desde pozos someros hasta más de 7,000 metros), trabajar con valores individuales generaría demasiado ruido estadístico. Por ello, agrupamos los datos en intervalos de 1,000 metros. Esto nos permite visualizar la tendencia estructural y facilita el cálculo de probabilidades en los modelos continuos.
library(tidyverse)
library(gt)
library(MASS)
if(!require(janitor)) install.packages("janitor", quiet = TRUE)
library(janitor)
# 1. Carga de datos
Datos_Brutos <- read.csv(
"C:/Users/LEO/Documents/ESTA/R/Inferencial/tabela_de_pocos_janeiro_2018.csv",
header = TRUE,
sep = ",",
dec = ".",
fileEncoding = "UTF-8"
)
Datos <- Datos_Brutos %>%
clean_names() %>%
mutate(profundidade_medida_m = as.numeric(as.character(profundidade_medida_m))) %>%
filter(!is.na(profundidade_medida_m) & profundidade_medida_m > 0 & profundidade_medida_m <= 7000)
X <- Datos$profundidade_medida_m
# TABLA DE FRECUENCIAS
breaks_prof <- seq(0, 7000, by = 1000)
h_total <- hist(X, breaks = breaks_prof, plot = FALSE)
TDF_General <- data.frame(
Rango = paste(head(breaks_prof, -1), tail(breaks_prof, -1), sep = "-"),
ni = h_total$counts,
hi = round((h_total$counts / sum(h_total$counts)) * 100, 2)
)
totales_simplificados <- data.frame(
Rango = "TOTAL",
ni = sum(TDF_General$ni),
hi = 100.00
)
TDF_Show_Simple <- rbind(TDF_General, totales_simplificados)
TDF_Show_Simple %>%
gt() %>%
tab_header(
title = md("TABLA DE FRECUENCIAS: INFERENCIA ESTADÍSTICA"),
subtitle = md("Variable: **Profundidad Medida (m)**")
) %>%
tab_source_note(source_note = "Fuente: Tabela de Poços 2018") %>%
cols_label(
Rango = "Rango de Profundidad (m)",
ni = "Frecuencia Absoluta (ni)",
hi = "Frecuencia Relativa (hi%)"
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_title(groups = c("title", "subtitle"))
) %>%
tab_style(
style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
locations = cells_column_labels()
)
| TABLA DE FRECUENCIAS: INFERENCIA ESTADÍSTICA | ||
| Variable: Profundidad Medida (m) | ||
| Rango de Profundidad (m) | Frecuencia Absoluta (ni) | Frecuencia Relativa (hi%) |
|---|---|---|
| 0-1000 | 4244 | 47.32 |
| 1000-2000 | 1641 | 18.30 |
| 2000-3000 | 909 | 10.13 |
| 3000-4000 | 1191 | 13.28 |
| 4000-5000 | 535 | 5.96 |
| 5000-6000 | 361 | 4.02 |
| 6000-7000 | 88 | 0.98 |
| TOTAL | 8969 | 100.00 |
| Fuente: Tabela de Poços 2018 | ||
A continuación, presentamos el histograma de frecuencias.
col_barras <- "#5D6D7E"
col_ejes <- "#2E4053"
par(mar = c(6, 5, 4, 2))
vals_x <- TDF_General$Rango
vals_y <- TDF_General$ni
ylim_max <- max(vals_y) * 1.1
bp <- barplot(
vals_y,
main = "Gráfica N°1: Distribución de Profundidad Medida de Pozos Petroleros de Brasil",
cex.main = 0.9,
ylab = "Cantidad de Pozos",
col = col_barras, border = "white",
axes = FALSE, ylim = c(0, ylim_max), axisnames = FALSE
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = bp, labels = vals_x, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Intervalos de Profundidad (m)", line = 5)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)
Al observar la Gráfica N°1, se evidencia que la variable Profundidad Medida no presenta un comportamiento homogéneo en todo su rango. Se distinguen claramente dos dinámicas operacionales:
Por esta razón, desde un punto de vista inferencial, es necesario segmentar la muestra en dos periodos independientes. Esto permite ajustar modelos de probabilidad específicos (Normal y Gamma) que describan con mayor precisión la realidad de cada tramo de perforación.
En este bloque analizamos si las profundidades menores a 3,000 metros siguen un comportamiento normal.
X1 <- X[!is.na(X) & X <= 3000]
if(length(X1) > 0) {
hist(
X1,
breaks = seq(0, 3000, by = 500),
col = col_barras,
border = "white",
main = "Histograma Sección 1 (0–3,000 m)",
xlab = "Profundidad (m)",
ylab = "Frecuencia"
)
} else {
print("¡Cuidado! No hay datos en el rango de 0 a 3000 después de la limpieza.")
}
Calculamos los parámetros fundamentales de la distribución normal: la Media (μ) y la Desviación Estándar (σ) de este tramo, para generar una curva teórica y compararla con los datos reales.
if(length(X1) > 1) {
# Cálculo de parámetros
mu1 <- mean(X1)
sd1 <- sd(X1)
# Preparación de datos para el histograma
h1 <- hist(X1, breaks = seq(0, 3000, by = 500), plot = FALSE)
Fo1 <- h1$counts / sum(h1$counts)
Fe1 <- diff(pnorm(seq(0, 3000, by = 500), mean = mu1, sd = sd1))
Fe1 <- Fe1 / sum(Fe1)
# Gráfica
barplot(
rbind(Fo1, Fe1),
beside = TRUE,
col = c(col_barras, "#F2F3F4"),
border = "black",
names.arg = paste0(head(seq(0, 3000, by = 500), -1), "-", tail(seq(0, 3000, by = 500), -1)),
main = "Gráfica N°2: Modelo de Probabilidad Normal (0–3,000 m)",
cex.main = 0.85,
ylab = "Probabilidad",
xlab = "Rangos (m)"
)
legend("topright", legend = c("Real", "Modelo Normal"),
fill = c(col_barras, "#F2F3F4"), border = "white", bty = "n")
} else {
message("No hay datos suficientes en el Tramo 1 para calcular el modelo.")
}
Aplicamos el coeficiente de correlación para medir qué tan fuerte es la relación lineal entre la frecuencia observada (realidad) y la esperada (modelo normal).
plot(
Fo1, Fe1,
main = "Gráfica N°3: Correlación de Pearson — Sección 1",
xlab = "Frecuencia Observada",
ylab = "Frecuencia Esperada",
pch = 19, col = col_barras,
xlim = c(0, max(Fo1) * 1.05),
ylim = c(0, max(Fe1) * 1.05)
)
abline(lm(Fe1 ~ Fo1 + 0), col = "red", lwd = 2)
cor1 <- cor(Fo1, Fe1) * 100
cor1
## [1] 61.72831
Realizamos la prueba de bondad de ajuste de Chi-Cuadrado (χ²). Esta prueba indica si las diferencias entre el modelo y la realidad son aceptables (modelo válido) o si el modelo debe rechazarse.
x2_1 <- sum((Fo1 - Fe1)^2 / Fe1)
x2_1
## [1] 0.3437592
vc1 <- qchisq(0.95, length(Fo1) - 1)
vc1
## [1] 11.0705
tabla_1 <- data.frame(
Modelo = "Normal",
Pearson = round(cor1, 2),
Chi_Cuadrado = round(x2_1, 4),
Umbral = round(vc1, 4),
Decision = ifelse(x2_1 < vc1, "Modelo aceptado", "Modelo rechazado")
)
gt(tabla_1) %>%
tab_header(title = md("**Tabla N°2: Resumen Bondad de Ajuste Sección 1**")) %>%
tab_source_note(source_note = "Autor: Leonardo Ruiz") %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_title()
) %>%
tab_style(
style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
locations = cells_column_labels()
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(6))
| Tabla N°2: Resumen Bondad de Ajuste Sección 1 | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Normal | 61.73 | 0.3438 | 11.0705 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
¿Cuál fue la probabilidad calculada de que un pozo tenga una profundidad menor a 1,500 metros en este primer tramo?
p_1500 <- pnorm(1500, mean = mu1, sd = sd1)
p_1500
## [1] 0.7329983
La probabilidad es del 73.3%.
Analizamos la segunda etapa probando un ajuste a la Distribución Gamma.
X2 <- X[X > 3000 & X <= 7000]
X2 <- X2[!is.na(X2)]
breaks_seccion2 <- seq(3000, 7000, by = 1000)
hist(
X2,
breaks = breaks_seccion2,
col = col_barras,
border = "white",
main = "Histograma Sección 2 (3,000–7,000 m)",
xlab = "Profundidad (m)",
ylab = "Frecuencia"
)
Para este segundo periodo (3,000–7,000 m), el histograma muestra una caída continua en las frecuencias conforme aumenta la profundidad, generando una asimetría que el modelo Normal (simétrico) no puede capturar correctamente.
Por esta razón, conjeturamos que los datos siguen una Distribución Gamma, flexible y frecuentemente usada para modelar variables con sesgo, donde estimaremos los parámetros de Forma (α) y Tasa (β).
fit_gamma <- fitdistr(X2, "gamma")
alpha <- fit_gamma$estimate["shape"]
beta <- fit_gamma$estimate["rate"]
h2 <- hist(X2, breaks = breaks_seccion2, plot = FALSE)
Fo2 <- h2$counts / sum(h2$counts)
Fe2 <- diff(pgamma(breaks_seccion2, shape = alpha, rate = beta))
Fe2 <- Fe2 / sum(Fe2)
etiquetas_prof <- c("3k-4k", "4k-5k", "5k-6k", "6k-7k")
barplot(
rbind(Fo2, Fe2),
beside = TRUE,
col = c(col_barras, "#F2F3F4"),
border = "black",
names.arg = etiquetas_prof,
main = "Gráfica N°5: Modelo de Probabilidad Gamma de Profundidad (3,000–7,000 m)",
cex.main = 0.85,
ylab = "Probabilidad"
)
legend("topright", legend = c("Real", "Modelo Gamma"),
fill = c(col_barras, "#F2F3F4"), border = "white", bty = "n")
Evaluamos la Correlación de Pearson para cuantificar la relación lineal entre las frecuencias observadas y las probabilidades teóricas generadas por la distribución Gamma.
plot(
Fo2, Fe2,
main = "Gráfica N°6: Correlación de Pearson — Sección 2 (Gamma)",
xlab = "Frecuencia Observada",
ylab = "Frecuencia Esperada",
pch = 19, col = col_barras,
xlim = c(0, max(Fo2) * 1.05),
ylim = c(0, max(Fe2) * 1.05)
)
abline(lm(Fe2 ~ Fo2 + 0), col = "red", lwd = 2)
cor2 <- cor(Fo2, Fe2) * 100
cor2
## [1] 81.80606
Aplicamos la prueba de bondad de ajuste Chi-Cuadrado (χ²) para validar estadísticamente el modelo Gamma con un 95% de confianza.
x2_2 <- sum((Fo2 - Fe2)^2 / Fe2)
x2_2
## [1] 0.120501
vc2 <- qchisq(0.95, length(Fo2) - 1)
vc2
## [1] 7.814728
tabla_2 <- data.frame(
Modelo = "Gamma",
Pearson = round(cor2, 2),
Chi_Cuadrado = round(x2_2, 4),
Umbral = round(vc2, 4),
Decision = ifelse(x2_2 < vc2, "Modelo aceptado", "Modelo rechazado")
)
gt(tabla_2) %>%
tab_header(title = md("**Tabla N°3: Resumen Bondad de Ajuste Sección 2**")) %>%
tab_source_note(source_note = "Autor: Leonardo Ruiz") %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_title()
) %>%
tab_style(
style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
locations = cells_column_labels()
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(6))
| Tabla N°3: Resumen Bondad de Ajuste Sección 2 | ||||
| Modelo | Pearson | Chi_Cuadrado | Umbral | Decision |
|---|---|---|---|---|
| Gamma | 81.81 | 0.1205 | 7.8147 | Modelo aceptado |
| Autor: Leonardo Ruiz | ||||
De cada 1,000 pozos perforados en el tramo profundo (3,000–7,000 m), ¿cuántos se estimó que se encuentran en el intervalo crítico de ultraprofundidad (5,000–7,000 m)?
p_ultra <- pgamma(7000, shape = alpha, rate = beta) - pgamma(5000, shape = alpha, rate = beta)
cantidad_estimada <- round(p_ultra * 1000, 0)
El modelo Gamma estimó que, por cada 1,000 pozos de este periodo, aproximadamente 164 correspondieron al intervalo de ultraprofundidad de 5,000 a 7,000 metros.
El análisis segmentado nos permite concluir: Tramo 0–3,000 m: Se modeló bajo una distribución Normal para evaluar las tendencias de la perforación somera clásica. Tramo 3,000–7,000 m: Al analizar la perforación profunda, el modelo Gamma logró capturar la asimetría de los datos generada por los desafíos técnicos y geológicos de los pozos de gran profundidad.