Usar Run All (Code → Run Region → Run All), no Knit, porque el chunk de carga usa file.choose().

1. Librerías

library(readxl)
library(dplyr)
library(knitr)
library(kableExtra)
library(DT)

2. Datos

ruta <- file.choose()
datos <- read_excel(ruta)

datos <- datos %>%
  mutate(
    YEARS_ACTIVE = as.numeric(YEARS_ACTIVE),
    CUMULATIVE_PRODUCTION = as.numeric(CUMULATIVE_PRODUCTION)
  ) %>%
  na.omit()

nrow(datos)
## [1] 47757

3. Selección de las variables (causa y efecto)

Causa (X): YEARS_ACTIVEEfecto (Y): CUMULATIVE_PRODUCTION

Justificación:

  • Precedencia temporal: los años activos transcurren de forma independiente del volumen extraído; un pozo cumple años de actividad sin importar cuánto produzca. La producción acumulada, en cambio, solo existe porque el pozo ha estado operando ese tiempo — no puede haber producción acumulada sin que antes haya transcurrido tiempo de actividad.
  • Mecanismo físico: la producción acumulada es, por definición, la suma de lo extraído a lo largo de la vida del pozo, es decir, una función del tiempo que lleva activo. El tiempo activo no depende de la producción: un pozo no “gana” años de actividad por producir más.
  • Direccionalidad: invertir los roles (usar CUMULATIVE_PRODUCTION como X y YEARS_ACTIVE como Y) implicaría que el tiempo transcurrido depende de cuánto petróleo se ha extraído, lo cual no tiene sentido físico.

Por estas tres razones, YEARS_ACTIVE se toma como variable independiente (X) y CUMULATIVE_PRODUCTION como variable dependiente (Y).

str(datos[, c("YEARS_ACTIVE", "CUMULATIVE_PRODUCTION")])
## tibble [47,757 × 2] (S3: tbl_df/tbl/data.frame)
##  $ YEARS_ACTIVE         : num [1:47757] 55 55 47 20 28 55 20 48 48 55 ...
##  $ CUMULATIVE_PRODUCTION: num [1:47757] 47225 275063 82624 7544 681006 ...
summary(datos[, c("YEARS_ACTIVE", "CUMULATIVE_PRODUCTION")])
##   YEARS_ACTIVE  CUMULATIVE_PRODUCTION
##  Min.   : 1.0   Min.   :      1      
##  1st Qu.:11.0   1st Qu.:  15014      
##  Median :19.0   Median :  56275      
##  Mean   :24.3   Mean   : 172246      
##  3rd Qu.:36.0   3rd Qu.: 192934      
##  Max.   :89.0   Max.   :2956609

4. Tabla de pares de variables

estadisticos <- data.frame(
  Variable = c("YEARS_ACTIVE", "CUMULATIVE_PRODUCTION"),
  Media    = c(mean(datos$YEARS_ACTIVE), mean(datos$CUMULATIVE_PRODUCTION)),
  Minimo   = c(min(datos$YEARS_ACTIVE), min(datos$CUMULATIVE_PRODUCTION)),
  Maximo   = c(max(datos$YEARS_ACTIVE), max(datos$CUMULATIVE_PRODUCTION)),
  Rango    = c(max(datos$YEARS_ACTIVE) - min(datos$YEARS_ACTIVE),
               max(datos$CUMULATIVE_PRODUCTION) - min(datos$CUMULATIVE_PRODUCTION))
)

kable(estadisticos, digits = 2, format.args = list(big.mark = ","),
      col.names = c("Variable", "Media", "Mínimo", "Máximo", "Rango"),
      align = "lrrrr") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Variable Media Mínimo Máximo Rango
YEARS_ACTIVE 24.3 1 89 88
CUMULATIVE_PRODUCTION 172,246.1 1 2,956,609 2,956,608

4.1 Tabla condensada (todos los valores, celdas contraíbles)

condensado <- datos %>%
  group_by(YEARS_ACTIVE) %>%
  summarise(
    n_valores = n(),
    valores   = paste(CUMULATIVE_PRODUCTION, collapse = ", "),
    .groups   = "drop"
  ) %>%
  arrange(YEARS_ACTIVE)

condensado_html <- condensado %>%
  mutate(
    CUMULATIVE_PRODUCTION = paste0(
      "<details><summary>", n_valores, " valor(es)</summary>", valores, "</details>"
    )
  ) %>%
  select(YEARS_ACTIVE, CUMULATIVE_PRODUCTION)

datatable(condensado_html, escape = FALSE, rownames = FALSE,
          colnames = c("Años Activos", "Producción Acumulada (valores)"),
          class = "stripe hover compact",
          options = list(pageLength = 10))

4.2 Tabla de pares (X, Y) usando la mediana

tabla_mediana <- datos %>%
  group_by(YEARS_ACTIVE) %>%
  summarise(
    CUMULATIVE_PRODUCTION = median(CUMULATIVE_PRODUCTION),
    .groups = "drop"
  ) %>%
  arrange(YEARS_ACTIVE)

datatable(tabla_mediana, rownames = FALSE,
          colnames = c("Años Activos", "Mediana de Producción Acumulada"),
          class = "stripe hover compact",
          options = list(pageLength = 10)) %>%
  formatRound(columns = "CUMULATIVE_PRODUCTION", digits = 2)
write.csv(condensado[, c("YEARS_ACTIVE", "valores")], "tabla_condensada_por_anios.csv", row.names = FALSE)
write.csv(tabla_mediana, "tabla_mediana_por_anios.csv", row.names = FALSE)

5. Gráfica (nube de puntos)

plot(tabla_mediana$YEARS_ACTIVE, tabla_mediana$CUMULATIVE_PRODUCTION,
     main = "Producción acumulada en función de los años activos",
     xlab = "Años Activos (X)",
     ylab = "Mediana de Producción Acumulada (Y)",
     col  = "#1b2a4a",
     pch  = 19,
     cex  = 1.2)
grid(col = "gray88")

6. Conjetura

La curva crece cerca de cero y se acelera con los años, sin bajar ni aplanarse. Se conjetura un modelo potencial:

\[y = a \cdot x^{b}\]

7. Cálculo de parámetros (lm en R)

\[\ln(y) = \ln(a) + b \cdot \ln(x)\]

datos_potencial <- tabla_mediana %>%
  filter(YEARS_ACTIVE > 0, CUMULATIVE_PRODUCTION > 0)

modelo_log <- lm(log(CUMULATIVE_PRODUCTION) ~ log(YEARS_ACTIVE), data = datos_potencial)
summary(modelo_log)
## 
## Call:
## lm(formula = log(CUMULATIVE_PRODUCTION) ~ log(YEARS_ACTIVE), 
##     data = datos_potencial)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.78790 -0.26552  0.00821  0.21092  1.32199 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        7.24202    0.16736   43.27   <2e-16 ***
## log(YEARS_ACTIVE)  1.24084    0.04596   27.00   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3977 on 87 degrees of freedom
## Multiple R-squared:  0.8934, Adjusted R-squared:  0.8921 
## F-statistic: 728.9 on 1 and 87 DF,  p-value: < 2.2e-16
b <- unname(coef(modelo_log)[2])
a <- unname(exp(coef(modelo_log)[1]))

kable(data.frame(Parámetro = c("a", "b"), Valor = round(c(a, b), 4)),
      align = "lr") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parámetro Valor
a 1396.9081
b 1.2408

8. Comparación del modelo de regresión sobre la realidad

plot(datos_potencial$YEARS_ACTIVE, datos_potencial$CUMULATIVE_PRODUCTION,
     col  = "#5b6b8c",
     pch  = 19,
     cex  = 1.2,
     main = "Modelo de producción acumulada (mediana) en función de los años activos",
     xlab = "Años Activos (X)",
     ylab = "Mediana de Producción Acumulada (Y)")
grid(col = "gray88")

curve(a * x^b, add = TRUE, col = "#1b2a4a", lwd = 2)

legend("topleft",
       legend = c("Datos reales", paste0("y = ", round(a, 2), " x^", round(b, 2))),
       col    = c("#5b6b8c", "#1b2a4a"),
       pch    = c(19, NA),
       lty    = c(NA, 1),
       lwd    = c(NA, 2),
       bty    = "n")

9. Test de Pearson

El coeficiente r se calcula con cor(x, y) sobre los datos originales (años activos vs. mediana de producción). El mostrado corresponde al modelo lineal usado en el paso 7 (modelo_log, sobre log(x) y log(y)), de donde salen los parámetros a y b.

r  <- cor(datos_potencial$YEARS_ACTIVE, datos_potencial$CUMULATIVE_PRODUCTION)
r2 <- summary(modelo_log)$r.squared

resultado_test <- ifelse(abs(r) > 0.7, "Aceptado", "Rechazado")

tabla_test <- data.frame(
  Test      = "Correlación de Pearson (r = cor(x, y))",
  `r`       = round(r, 4),
  `|r|`     = round(abs(r), 4),
  `R²`      = round(r2, 4),
  Criterio  = "|r| > 0.7",
  Resultado = resultado_test,
  check.names = FALSE
)

kable(tabla_test, align = "lrrrrc") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  column_spec(6, bold = TRUE,
              color = ifelse(resultado_test == "Aceptado", "#1b2a4a", "#6b6b6b"))
Test r &#124;r&#124; Criterio Resultado
Correlación de Pearson (r = cor(x, y)) 0.8526 0.8526 0.8934 &#124;r&#124; > 0.7 Aceptado

10. Estimación

nuevos_anios <- c(5, 10, 15, 20, 25, 30)

estimaciones <- data.frame(
  YEARS_ACTIVE = nuevos_anios,
  Produccion_Estimada = a * nuevos_anios^b
)

kable(estimaciones, digits = 2, format.args = list(big.mark = ","),
      col.names = c("Años Activos", "Producción Acumulada Estimada"),
      align = "lr") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Años Activos Producción Acumulada Estimada
5 10,291.46
10 24,322.41
15 40,226.05
20 57,482.58
25 75,820.37
30 95,068.59

11. Conclusiones

Entre los años activos y la producción acumulada existe una relación de tipo potencial, cuya ecuación matemática es

\[y = 1396.908 \cdot x^{1.241}\]

siendo y la producción acumulada y x los años activos, y donde el modelo es válido para x > 0 (años activos positivos), rango en el que fue ajustado.

Cuando los años activos son de 45, se espera una producción acumulada de 157,230.9.

La producción acumulada está influenciada en un 89.3% por los años activos, y en un 10.7% por otros factores.

El test de Pearson sobre los datos originales (r = 0.853) fue Aceptado.