1 Carga de Librerías

##### 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)
})

2 Carga de datos

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

3 Extracción y Limpieza de la 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

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

# FILA DE TOTALES
fila_total <- data.frame(
  Tipo = "TOTAL",
  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º 1: Distribución de Frecuencia del Estado del Pozo**")
  ) %>%
  cols_label(
    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 = 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 Frecuencia del Estado del Pozo
Estado del Pozo ni hi (%)
PA 20548 89.11
UN 2015 8.74
VP 497 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ón Jerárquica del 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 del 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 Análisis Gráfico

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 / Porcentajes

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 Binormal

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áfico 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 Bondad

7.1 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áfico N\u00ba 4: Correlación 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

7.2 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

7.3 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

8 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.

9 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.