1 IDENTIFICACIÓN Y JUSTIFICACIÓN DE LA VARIABLE

\(Variable\) \(de\) \(Estudio\): Estado Operativo del Pozo (Well Status).

  1. Nivel Bajo (PA - Plugged and Abandoned): Pozos taponados y abandonados. Representan el fin de la vida productiva y un impacto económico nulo en la actualidad.

  2. Nivel Medio (IN - Inactive / Shut-in): Pozos inactivos o cerrados temporalmente. No están produciendo, pero conservan viabilidad técnica o reservas recuperables a futuro.

  3. Nivel Alto (AC - Active): Pozos activos y produciendo. Representan el estado óptimo de rentabilidad y operatividad en el campo.

2 CARGA DE DATOS

##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: DALLYANA LOZANO ####
### CARRERA: INGENIER\u00cdA EN PETR\u00d3LEOS #####
#### VARIABLE ESTADO DEL POZO ####
## DATASET ##
suppressPackageStartupMessages({
  library(tidyverse)
  library(readxl)
  library(gt)
  library(dplyr)
  library(readr)
})

Datos <- read_delim("Dataset.csv", delim = ";", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)

3 EXTRAER VARIABLE

Extraemos la variable Well Status, omitimos las celdas en blanco y verificamos el tamaño muestral.

Estado_Vec <- factor(Datos$`Well Status`, 
                     levels = c("Nivel_Bajo", "Nivel_Medio", "Nivel_Alto"), 
                     ordered = TRUE)

Estado_Vec <- na.omit(Estado_Vec)
conteo <- table(Estado_Vec)

4 TABLAS DE DISTRIBUCIÓN DE FRECUENCIA

4.1 DISTRIBUCIÓN DE FRECUENCIAS DEL ESTADO OPERATIVO DEL POZO

Se extrajo la variable de estado para determinar su frecuencia absoluta (\(n_i\)) y el porcentaje relativo (\(hi\)) respecto al total.

suppressPackageStartupMessages({
  library(gt)
  library(dplyr)
  library(readr)
})

# CREAR LA VARIABLE
Estado_Vec <- factor(Datos$`Well Status`, 
                     levels = c("PA", "UN", "VP"), # <-- CAMBIAR POR EL ORDEN REAL DE SU VARIABLE
                     ordered = TRUE)
Estado_Vec <- na.omit(Estado_Vec)

# FRECUENCIAS
conteo_raw <- table(Estado_Vec)
ni_val <- as.numeric(conteo_raw)
hi_val <- (ni_val / sum(ni_val)) * 100

# FRECUENCIAS ACUMULADAS
Ni_asc  <- cumsum(ni_val)
Ni_desc <- rev(cumsum(rev(ni_val)))
Hi_asc  <- cumsum(hi_val)
Hi_desc <- rev(cumsum(rev(hi_val)))

# DATA FRAME PRINCIPAL 
df_estado_final <- data.frame(
  Tipo = names(conteo_raw),
  ni = as.character(ni_val),
  hi = as.character(round(hi_val, 2)),
  Ni_asc = as.character(Ni_asc),
  Ni_desc = as.character(Ni_desc),
  Hi_asc = as.character(round(Hi_asc, 2)),
  Hi_desc = as.character(round(Hi_desc, 2))
)

# FILA DE TOTALES
fila_total <- data.frame(
  Tipo = "TOTAL",
  ni = as.character(sum(ni_val)),
  hi = as.character(round(sum(hi_val), 2)),
  Ni_asc = "-",
  Ni_desc = "-",
  Hi_asc = "-",
  Hi_desc = "-"
)

df_show <- bind_rows(df_estado_final, fila_total)

# TABLA
df_show %>%
  gt() %>%
  tab_header(
    title = md("**TABLA Nº 1: DISTRIBUCIÓN DE FRECUENCIAS DEL ESTADO DEL POZO**")
  ) %>%
  cols_label(
    Tipo = "Estado del Pozo", 
    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 = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#D0ECE7"), cell_text(weight = "bold")),
    locations = cells_body(rows = Tipo == "TOTAL")
  ) %>%
  tab_options(
    table.width = pct(90),                    
    data_row.padding = px(12),                
    column_labels.padding = px(15),          
    table.border.top.style = "solid",
    table.border.top.color = "#2E4053",
    table.border.bottom.style = "solid",
    table.border.bottom.color = "#2E4053"
  )
TABLA Nº 1: DISTRIBUCIÓN DE FRECUENCIAS DEL ESTADO DEL POZO
Estado del Pozo ni hi (%) Ni (Asc) Ni (Desc) Hi (%) (Asc) Hi (%) (Desc)
PA 20548 89.11 20548 23060 89.11 100
UN 2015 8.74 22563 2512 97.84 10.89
VP 497 2.16 23060 497 100 2.16
TOTAL 23060 100 - - - -

4.2 ASIGNACIÓN JERÁRQUICA

Posteriormente, se incorporó una asignación jerárquica ordinal y se consolidó la información en un data frame estructurado para su presentación formal.

suppressPackageStartupMessages({
  library(gt)
  library(dplyr)
  library(readr)
})

# CREAR LA VARIABLE
Estado_Vec <- factor(Datos$`Well Status`, 
                     levels = c("PA", "UN", "VP"), # <-- CAMBIAR POR EL ORDEN REAL DE SU VARIABLE
                     ordered = TRUE)

Estado_Vec <- na.omit(Estado_Vec)

# FRECUENCIAS
conteo_raw <- table(Estado_Vec)
ni_val <- as.numeric(conteo_raw)
hi_val <- (ni_val / sum(ni_val)) * 100

# DATA FRAME PRINCIPAL (convertido a texto para unificar con el total)
df_estado_final <- data.frame(
  Asignacion = as.character(1:length(conteo_raw)),
  Tipo = names(conteo_raw),
  ni = as.character(ni_val),
  hi = as.character(round(hi_val, 2))
)

# FILA DE TOTALES
fila_total <- data.frame(
  Asignacion = "TOTAL",
  Tipo = "",
  ni = as.character(sum(ni_val)),
  hi = as.character(round(sum(hi_val), 2))
)

df_show <- bind_rows(df_estado_final, fila_total)

# TABLA
df_show %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N\u00ba 2: ASIGNACI\u00d3N JERÁRQUICA DE LA VARIABLE ESTADO DEL POZO**")
  ) %>%
  cols_label(
    Asignacion = "Asignaci\u00f3n", 
    Tipo = "Estado del Pozo", 
    ni = "ni", 
    hi = "hi (%)"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#D0ECE7"), cell_text(weight = "bold")),
    locations = cells_body(rows = Asignacion == "TOTAL")
  ) %>%
  tab_options(
    table.width = pct(90),                    
    data_row.padding = px(12),                
    column_labels.padding = px(15),          
    table.border.top.style = "solid",
    table.border.top.color = "#2E4053",
    table.border.bottom.style = "solid",
    table.border.bottom.color = "#2E4053"
  )
TABLA Nº 2: ASIGNACIÓN JERÁRQUICA DE LA VARIABLE ESTADO DEL POZO
Asignación Estado del Pozo ni hi (%)
1 PA 20548 89.11
2 UN 2015 8.74
3 VP 497 2.16
TOTAL 23060 100

5 REPRESENTACIÓN GRÁFICA

5.1 DIAGRAMA DE BARRAS - FRECUENCIA ABSOLUTA

par(mar = c(5, 4, 4, 2))

barplot(as.numeric(df_estado_final$ni),
        main = "GRÁFICO No 1: DISTRIBUCIÓN DEL ESTADO DEL POZO",
        ylab = "Cantidad de Pozos",
        col = "#B0C4DE",      
        names.arg = df_estado_final$Tipo, 
        las = 1,            
        cex.names = 1.0,      
        cex.axis = 0.8,      
        cex.main = 1.1,        
        ylim = c(0, max(as.numeric(df_estado_final$ni), na.rm = TRUE) + max(as.numeric(df_estado_final$ni), na.rm = TRUE) * 0.1)) 

mtext("Estado del Pozo", side = 1, line = 3)

5.2 DIAGRAMA DE BARRAS - FRECUENCIA RELATIVA

par(mar = c(5, 4, 4, 2))

barplot(as.numeric(df_estado_final$hi),
        main = "GRÁFICO No 2: DISTRIBUCIÓN DE PORCENTAJE DEL ESTADO DEL POZO",
        ylab = "Porcentaje (%)",
        col = "#B0C4DE",      
        names.arg = df_estado_final$Asignacion, 
        las = 1,            
        cex.names = 1.0,      
        cex.axis = 0.8,      
        cex.main = 1.1,        
        ylim = c(0, max(as.numeric(df_estado_final$hi), na.rm = TRUE) + 10)) 

mtext("Asignación", side = 1, line = 3)

6 CONJETURA DEL MODELO

Se validó el estado de los pozos mediante una Distribución Binomial \(B(2, p)\). Este modelo se ajusta a variables ordinales y contrasta los datos de campo con la teoría. La alta similitud entre las distribuciones confirma un comportamiento probabilístico coherente, validando el análisis operativo.

n_total_Estado <- sum(as.numeric(df_estado_final$ni))
size_binom <- 2   
X_indices <- 0:2  

media_obs <- sum(X_indices * as.numeric(df_estado_final$ni)) / n_total_Estado
prob_p <- media_obs / size_binom

P_Binomial <- dbinom(X_indices, size = size_binom, prob = prob_p) * 100

par(mar = c(9, 4, 4, 2))
max_y <- max(max(as.numeric(df_estado_final$hi)), max(P_Binomial))

barplot(rbind(as.numeric(df_estado_final$hi), P_Binomial), 
        beside = TRUE,
        main = "GR\u00c1FICO N\u00ba 3: Comparado de lo Observado frente a lo Esperado del Estado del Pozo",
        ylab = "Porcentaje (%)",
        names.arg = df_estado_final$Asignacion, 
        col = c("#B0C4DE", "#AED6F1"), 
        ylim = c(0, max_y + 25), 
        las = 1, 
        cex.names = 0.9,
        cex.main = 0.85)

legend("topright", 
       legend = c("Realidad", "Modelo"), 
       fill = c("#B0C4DE", "#AED6F1"), 
       bty = "n", cex = 0.8)

mtext("Nivel del Estado del Pozo", side = 1, line = 6)

7 TEST DE PEARSON

Fo_E <- as.numeric(df_estado_final$hi)
Fe_E <- P_Binomial 

test_correlacion <- cor.test(Fo_E, Fe_E)
r_valor <- round(test_correlacion$estimate, 4)

par(mar = c(5, 5, 4, 2)) 

plot(Fo_E, Fe_E, 
     main = "GR\u00c1FICO N\u00ba 4: CORRELACI\u00d3N DEL MODELO BINORMAL",
     cex.main = 0.85,
     xlab = "Frecuencia Observada (%)", 
     ylab = "Frecuencia Esperada (%)", 
     pch = 19,            
     col = "#2E4053",    
     cex = 1.5)         

abline(lm(Fe_E ~ Fo_E), col = "red", lwd = 2)

text(x = min(Fo_E), y = max(Fe_E), 
     labels = paste("r =", r_valor), 
     pos = 4, font = 2, col = "#2E4053")

Correlacion_E <- cor(Fo_E, Fe_E) * 100

Correlacion_E
## [1] 99.83708

8 TEST DE CHI-CUADRADO

x2_E <- sum(((Fo_E - Fe_E)^2) / Fe_E)
gl_E <- length(Fo_E) - 1
vc_E <- qchisq(0.99, gl_E)

cat("Estadístico Chi-cuadrado (Calculado):", round(x2_E, 4), "\n")
## Estadístico Chi-cuadrado (Calculado): 8.0808
cat("Valor Crítico (Tabla):", round(vc_E, 4), "\n")
## Valor Crítico (Tabla): 9.2103
cat("¿Se acepta el modelo? (Calculado < Crítico):", x2_E < vc_E, "\n")
## ¿Se acepta el modelo? (Calculado < Crítico): TRUE

9 TABLA RESUMEN DE BONDAD DEL AJUSTE

tabla_resumen_E <- data.frame(
  Variable = "Estado del Pozo",
  Pearson = round(Correlacion_E, 2),
  Chi2    = round(x2_E, 4),
  Umbral  = round(vc_E, 2),
  Resultado = ifelse(x2_E < vc_E, "Modelo Aceptado", "Modelo Rechazado")
)

tabla_resumen_E %>% 
  gt() %>% 
  tab_header(
    title = md("**TABLA Nº 3: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD**")
  ) %>%
  cols_label(
    Variable = "Variable",        
    Pearson  = "Test Pearson (%)",
    Chi2     = "Chi Cuadrado", 
    Umbral   = "Umbral de Aceptación",
    Resultado = "Resultado Final"
  ) %>%
  tab_source_note(
    source_note = "Autor: Dallyana Lozano"
  ) %>%
  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.width = pct(95),
    table.border.top.color = "#2E4053",
    table.border.bottom.color = "#2E4053",
    column_labels.border.bottom.color = "#2E4053",
    data_row.padding = px(10) 
  )
TABLA Nº 3: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado Final
Estado del Pozo 99.84 8.0808 9.21 Modelo Aceptado
Autor: Dallyana Lozano

10 CÁLCULO DE PROBABILIDADES

  1. ¿Cuál es la probabilidad de que un pozo seleccionado al azar dentro del bloque se encuentre en un estado operativo Activo?
# Para la probabilidad alta (última categoría de tu tabla)
prob_alta <- df_estado_final$hi[nrow(df_estado_final)]
prob_alta
## [1] "2.16"

La probabilidad de que un pozo seleccionado al azar sea Activo es de 2.155%. Este valor es fundamental para la evaluación económica del campo, ya que confirma la proporción de pozos que actualmente contribuyen a la producción diaria y mantienen la rentabilidad del proyecto.

  1. ¿Cuál es la probabilidad de encontrar pozos que hayan llegado al fin de su vida productiva?
# Para la probabilidad baja (primera categoría)
prob_baja <- df_estado_final$hi[1]
prob_baja
## [1] "89.11"

La probabilidad de encontrar pozos Taponados y Abandonados es del 89.10%. Esta métrica es vital para la gestión ambiental y el control de pasivos, permitiendo dimensionar históricamente cuántas perforaciones del campo han agotado sus reservas recuperables y han sido selladas de forma definitiva.

11 CONCLUSIÓN

El modelo binomial validado demuestra que el campo se encuentra en una etapa de declinación avanzada, con una probabilidad activa de apenas 2.16% frente a un 89.11% de pozos taponados y abandonados. Esta condición exige priorizar urgentemente proyectos de recobro mejorado y una gestión estricta de pasivos ambientales para asegurar la rentabilidad futura del activo.