library(readr) # lectura del csv
library(dplyr) # manipulación de datos
library(ggplot2) # gráficos
library(gt) # tablas con diseño premium
library(stringr) # manejo de texto
library(DT) # tabla interactiva paginada
cat("Librerías cargadas: readr, dplyr, ggplot2, gt, stringr, DT")Librerías cargadas: readr, dplyr, ggplot2, gt, stringr, DT
## DATASET ##
# Archivo con las variables YEARS_ACTIVE y CUMULATIVE_PRODUCTION.
# IMPORTANTE: ajusta esta ruta a la ubicación real del archivo en tu equipo.
ruta_archivo <- "oil_and_gas_leases_data___2_.csv"
datos <- read_csv(ruta_archivo, show_col_types = FALSE)
# Rellenamiento de celdas faltantes (NA) con la media de cada variable numérica de interés
if (any(is.na(datos$YEARS_ACTIVE))) {
datos$YEARS_ACTIVE[is.na(datos$YEARS_ACTIVE)] <- mean(datos$YEARS_ACTIVE, na.rm = TRUE)
}
if (any(is.na(datos$CUMULATIVE_PRODUCTION))) {
datos$CUMULATIVE_PRODUCTION[is.na(datos$CUMULATIVE_PRODUCTION)] <- mean(datos$CUMULATIVE_PRODUCTION, na.rm = TRUE)
}
# Se descartan pozos con valores no positivos (no tienen sentido físico y
# además impiden aplicar logaritmos en los modelos exponencial/potencial)
datos <- datos %>%
filter(YEARS_ACTIVE > 0, CUMULATIVE_PRODUCTION > 0)
## Estructura de los datos
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 ...
Se definieron los Años Activos
(YEARS_ACTIVE) como variable independiente / causa
(x), ya que representan el tiempo durante el cual un pozo ha
estado en operación, constituyendo un factor clave en la acumulación de
producción.
La Producción Acumulada
(CUMULATIVE_PRODUCTION) actúa como variable
dependiente / efecto (y), debido a que refleja la
cantidad total de hidrocarburos extraídos a lo largo del tiempo de vida
del pozo.
Justificación: la producción acumulada es, por definición, la suma de la producción a lo largo del tiempo de vida del pozo. Por lo tanto, el tiempo de actividad es la variable que antecede y explica la magnitud de lo acumulado (efecto), y no al revés: el pozo no produce más años porque acumuló más, sino que acumula más precisamente porque lleva más años en producción. Esto satisface la relación causa → efecto exigida.
Esta relación busca modelar el comportamiento de la producción en función del tiempo. Desde el punto de vista operativo, a medida que aumentan los años activos, la producción acumulada tiende a incrementarse, aunque no necesariamente de forma lineal, debido a factores como declinación de producción, mantenimiento y condiciones del yacimiento.
El dataset depurado contiene 47757 pozos, pero solo 89 valores
distintos de Años Activos (x): al haber miles de pozos
que comparten el mismo año de actividad, trabajar con los datos crudos
implica manejar valores de x fuertemente repetidos. Por ello, tanto para
la variable independiente x (Años Activos) como para la
dependiente y (Producción Acumulada) se calcula su
media por cada año (floor(YEARS_ACTIVE)),
obteniendo así un único par (x̄, ȳ) por año — sin valores repetidos — que
es el que se emplea en el resto del análisis.
tabla_xy_completa <- datos %>%
mutate(Año = floor(YEARS_ACTIVE)) %>%
group_by(Año) %>%
summarise(
n_pozos = n(),
x_medio = mean(YEARS_ACTIVE),
y_medio = mean(CUMULATIVE_PRODUCTION),
.groups = "drop"
) %>%
arrange(Año)
cat("Total de pares (x̄, ȳ) obtenidos, uno por año:", nrow(tabla_xy_completa), "\n")Total de pares (x̄, ȳ) obtenidos, uno por año: 89
tabla_xy_completa %>%
gt() %>%
tab_header(
title = md("**Tabla 4.1: Pares (x̄, ȳ) — Media de Años Activos y Producción Acumulada por Año**")
) %>%
fmt_number(columns = c(x_medio, y_medio), decimals = 2) %>%
tab_source_note(source_note = "Autor: Valeska Araujo") %>%
cols_align(align = "center", everything())| Tabla 4.1: Pares (x̄, ȳ) — Media de Años Activos y Producción Acumulada por Año | |||
| Año | n_pozos | x_medio | y_medio |
|---|---|---|---|
| 1 | 2190 | 1.00 | 7,417.80 |
| 2 | 1079 | 2.00 | 18,233.62 |
| 3 | 1145 | 3.00 | 28,953.24 |
| 4 | 1004 | 4.00 | 30,036.10 |
| 5 | 927 | 5.00 | 36,366.82 |
| 6 | 1012 | 6.00 | 42,115.83 |
| 7 | 1002 | 7.00 | 44,855.09 |
| 8 | 1021 | 8.00 | 47,357.63 |
| 9 | 960 | 9.00 | 50,316.09 |
| 10 | 1275 | 10.00 | 71,818.96 |
| 11 | 1724 | 11.00 | 76,910.90 |
| 12 | 1513 | 12.00 | 81,477.96 |
| 13 | 1423 | 13.00 | 69,752.08 |
| 14 | 1424 | 14.00 | 76,954.85 |
| 15 | 1415 | 15.00 | 86,281.62 |
| 16 | 1240 | 16.00 | 93,328.99 |
| 17 | 1706 | 17.00 | 115,349.67 |
| 18 | 1516 | 18.00 | 116,431.91 |
| 19 | 1605 | 19.00 | 135,447.05 |
| 20 | 1065 | 20.00 | 138,592.02 |
| 21 | 895 | 21.00 | 142,537.87 |
| 22 | 720 | 22.00 | 146,039.25 |
| 23 | 584 | 23.00 | 159,312.19 |
| 24 | 604 | 24.00 | 156,501.63 |
| 25 | 512 | 25.00 | 173,665.04 |
| 26 | 459 | 26.00 | 167,545.94 |
| 27 | 510 | 27.00 | 221,088.37 |
| 28 | 640 | 28.00 | 286,316.35 |
| 29 | 644 | 29.00 | 304,490.68 |
| 30 | 740 | 30.00 | 376,278.51 |
| 31 | 681 | 31.00 | 367,319.80 |
| 32 | 517 | 32.00 | 258,318.47 |
| 33 | 582 | 33.00 | 271,697.85 |
| 34 | 534 | 34.00 | 249,772.75 |
| 35 | 625 | 35.00 | 238,604.07 |
| 36 | 470 | 36.00 | 256,554.61 |
| 37 | 505 | 37.00 | 244,447.97 |
| 38 | 455 | 38.00 | 217,837.10 |
| 39 | 467 | 39.00 | 185,162.01 |
| 40 | 622 | 40.00 | 170,227.54 |
| 41 | 652 | 41.00 | 162,225.46 |
| 42 | 573 | 42.00 | 166,751.85 |
| 43 | 649 | 43.00 | 155,494.67 |
| 44 | 717 | 44.00 | 168,395.36 |
| 45 | 579 | 45.00 | 165,096.52 |
| 46 | 433 | 46.00 | 225,448.44 |
| 47 | 342 | 47.00 | 214,105.07 |
| 48 | 334 | 48.00 | 218,698.48 |
| 49 | 258 | 49.00 | 197,851.30 |
| 50 | 269 | 50.00 | 208,358.99 |
| 51 | 189 | 51.00 | 179,587.44 |
| 52 | 184 | 52.00 | 208,321.03 |
| 53 | 186 | 53.00 | 190,127.83 |
| 54 | 200 | 54.00 | 204,165.27 |
| 55 | 715 | 55.00 | 167,524.11 |
| 56 | 163 | 56.00 | 254,946.19 |
| 57 | 208 | 57.00 | 320,837.06 |
| 58 | 185 | 58.00 | 256,471.58 |
| 59 | 166 | 59.00 | 251,611.66 |
| 60 | 443 | 60.00 | 269,649.77 |
| 61 | 509 | 61.00 | 313,301.47 |
| 62 | 97 | 62.00 | 286,942.65 |
| 63 | 84 | 63.00 | 305,814.97 |
| 64 | 70 | 64.00 | 291,217.26 |
| 65 | 68 | 65.00 | 287,004.92 |
| 66 | 82 | 66.00 | 321,568.43 |
| 67 | 72 | 67.00 | 309,578.04 |
| 68 | 125 | 68.00 | 421,431.02 |
| 69 | 74 | 69.00 | 307,741.22 |
| 70 | 71 | 70.00 | 324,466.02 |
| 71 | 92 | 71.00 | 337,328.54 |
| 72 | 105 | 72.00 | 385,930.90 |
| 73 | 74 | 73.00 | 370,913.63 |
| 74 | 83 | 74.00 | 433,378.22 |
| 75 | 67 | 75.00 | 318,363.38 |
| 76 | 69 | 76.00 | 394,878.17 |
| 77 | 57 | 77.00 | 369,816.04 |
| 78 | 42 | 78.00 | 389,982.86 |
| 79 | 35 | 79.00 | 451,744.07 |
| 80 | 40 | 80.00 | 446,000.85 |
| 81 | 41 | 81.00 | 449,159.37 |
| 82 | 49 | 82.00 | 516,179.16 |
| 83 | 53 | 83.00 | 472,788.75 |
| 84 | 46 | 84.00 | 545,037.34 |
| 85 | 48 | 85.00 | 568,383.32 |
| 86 | 41 | 86.00 | 568,579.91 |
| 87 | 29 | 87.00 | 481,062.76 |
| 88 | 45 | 88.00 | 635,580.91 |
| 89 | 32 | 89.00 | 562,425.83 |
| Autor: Valeska Araujo | |||
max_x <- max(datos$YEARS_ACTIVE)
min_x <- min(datos$YEARS_ACTIVE)
max_y <- max(datos$CUMULATIVE_PRODUCTION)
min_y <- min(datos$CUMULATIVE_PRODUCTION)
resumen_general <- data.frame(
Variable = c("YEARS_ACTIVE (X)", "CUMULATIVE_PRODUCTION (Y)"),
Minimo = round(c(min_x, min_y), 2),
Maximo = round(c(max_x, max_y), 2),
Rango = round(c(max_x - min_x, max_y - min_y), 2),
Media = round(c(mean(datos$YEARS_ACTIVE), mean(datos$CUMULATIVE_PRODUCTION)), 2)
)
resumen_general %>%
gt() %>%
tab_header(
title = md("**Tabla 4.2: Resumen General de las Variables**")
) %>%
tab_source_note(source_note = "Autor: Valeska Araujo") %>%
cols_align(align = "center", everything())| Tabla 4.2: Resumen General de las Variables | ||||
| Variable | Minimo | Maximo | Rango | Media |
|---|---|---|---|---|
| YEARS_ACTIVE (X) | 1 | 89 | 88 | 24.3 |
| CUMULATIVE_PRODUCTION (Y) | 1 | 985283 | 985282 | 144072.2 |
| Autor: Valeska Araujo | ||||
Se toma el valor máximo de YEARS_ACTIVE (89 años) y se
divide el eje en tres tercios iguales, de modo que cada
parte agrupe pozos “jóvenes”, “maduros” y “muy antiguos”. Esto también
permite visualizar mejor la nube de puntos, que al graficarse completa
se satura por la gran cantidad de observaciones (47757 pozos).
limite1 <- max_x / 3
limite2 <- 2 * max_x / 3
datos <- datos %>%
mutate(parte = case_when(
YEARS_ACTIVE <= limite1 ~ "Parte 1",
YEARS_ACTIVE <= limite2 ~ "Parte 2",
TRUE ~ "Parte 3"
))
parte1 <- datos %>% filter(parte == "Parte 1")
parte2 <- datos %>% filter(parte == "Parte 2")
parte3 <- datos %>% filter(parte == "Parte 3")
data.frame(
Parte = c("Parte 1", "Parte 2", "Parte 3"),
Rango_X = c(paste0("[", round(min_x,1), " - ", round(limite1,1), "]"),
paste0("(", round(limite1,1), " - ", round(limite2,1), "]"),
paste0("(", round(limite2,1), " - ", round(max_x,1), "]")),
n = c(nrow(parte1), nrow(parte2), nrow(parte3))
) %>%
gt() %>%
tab_header(
title = md("**Tabla 4.3: Distribución de Pozos por Parte**")
) %>%
tab_source_note(source_note = "Autor: Valeska Araujo") %>%
cols_align(align = "center", everything())| Tabla 4.3: Distribución de Pozos por Parte | ||
| Parte | Rango_X | n |
|---|---|---|
| Parte 1 | [1 - 29.7] | 31814 |
| Parte 2 | (29.7 - 59.3] | 13200 |
| Parte 3 | (59.3 - 89] | 2743 |
| Autor: Valeska Araujo | ||
Con miles de pozos por parte, la nube de puntos es puro ruido. Por
eso, en lugar de agrupar por clases de rango, se agrupan los pozos
por cada año exacto de actividad
(floor(YEARS_ACTIVE)) y se calcula el promedio de
ambas variables —el par (x̄, ȳ)— para cada año. Estas parejas,
una por cada año representado dentro de la parte, son las que se usan
para ajustar los modelos de cada parte.
construir_tabla <- function(sub_datos) {
tabla <- sub_datos %>%
mutate(Año = floor(YEARS_ACTIVE)) %>%
group_by(Año) %>%
summarise(
n_pozos = n(),
x_medio = mean(YEARS_ACTIVE),
y_medio = mean(CUMULATIVE_PRODUCTION),
.groups = "drop"
) %>%
arrange(Año)
tabla
}
tabla1 <- construir_tabla(parte1)
tabla2 <- construir_tabla(parte2)
tabla3 <- construir_tabla(parte3)tabla1 %>%
gt() %>%
tab_header(
title = md("**Tabla 4.4.1: Pares (x̄, ȳ) — Parte 1**"),
subtitle = paste0(nrow(tabla1), " años promediados")
) %>%
fmt_number(columns = c(x_medio, y_medio), decimals = 2) %>%
cols_align(align = "center", everything())| Tabla 4.4.1: Pares (x̄, ȳ) — Parte 1 | |||
| 29 años promediados | |||
| Año | n_pozos | x_medio | y_medio |
|---|---|---|---|
| 1 | 2190 | 1.00 | 7,417.80 |
| 2 | 1079 | 2.00 | 18,233.62 |
| 3 | 1145 | 3.00 | 28,953.24 |
| 4 | 1004 | 4.00 | 30,036.10 |
| 5 | 927 | 5.00 | 36,366.82 |
| 6 | 1012 | 6.00 | 42,115.83 |
| 7 | 1002 | 7.00 | 44,855.09 |
| 8 | 1021 | 8.00 | 47,357.63 |
| 9 | 960 | 9.00 | 50,316.09 |
| 10 | 1275 | 10.00 | 71,818.96 |
| 11 | 1724 | 11.00 | 76,910.90 |
| 12 | 1513 | 12.00 | 81,477.96 |
| 13 | 1423 | 13.00 | 69,752.08 |
| 14 | 1424 | 14.00 | 76,954.85 |
| 15 | 1415 | 15.00 | 86,281.62 |
| 16 | 1240 | 16.00 | 93,328.99 |
| 17 | 1706 | 17.00 | 115,349.67 |
| 18 | 1516 | 18.00 | 116,431.91 |
| 19 | 1605 | 19.00 | 135,447.05 |
| 20 | 1065 | 20.00 | 138,592.02 |
| 21 | 895 | 21.00 | 142,537.87 |
| 22 | 720 | 22.00 | 146,039.25 |
| 23 | 584 | 23.00 | 159,312.19 |
| 24 | 604 | 24.00 | 156,501.63 |
| 25 | 512 | 25.00 | 173,665.04 |
| 26 | 459 | 26.00 | 167,545.94 |
| 27 | 510 | 27.00 | 221,088.37 |
| 28 | 640 | 28.00 | 286,316.35 |
| 29 | 644 | 29.00 | 304,490.68 |
tabla2 %>%
gt() %>%
tab_header(
title = md("**Tabla 4.4.2: Pares (x̄, ȳ) — Parte 2**"),
subtitle = paste0(nrow(tabla2), " años promediados")
) %>%
fmt_number(columns = c(x_medio, y_medio), decimals = 2) %>%
cols_align(align = "center", everything())| Tabla 4.4.2: Pares (x̄, ȳ) — Parte 2 | |||
| 30 años promediados | |||
| Año | n_pozos | x_medio | y_medio |
|---|---|---|---|
| 30 | 740 | 30.00 | 376,278.51 |
| 31 | 681 | 31.00 | 367,319.80 |
| 32 | 517 | 32.00 | 258,318.47 |
| 33 | 582 | 33.00 | 271,697.85 |
| 34 | 534 | 34.00 | 249,772.75 |
| 35 | 625 | 35.00 | 238,604.07 |
| 36 | 470 | 36.00 | 256,554.61 |
| 37 | 505 | 37.00 | 244,447.97 |
| 38 | 455 | 38.00 | 217,837.10 |
| 39 | 467 | 39.00 | 185,162.01 |
| 40 | 622 | 40.00 | 170,227.54 |
| 41 | 652 | 41.00 | 162,225.46 |
| 42 | 573 | 42.00 | 166,751.85 |
| 43 | 649 | 43.00 | 155,494.67 |
| 44 | 717 | 44.00 | 168,395.36 |
| 45 | 579 | 45.00 | 165,096.52 |
| 46 | 433 | 46.00 | 225,448.44 |
| 47 | 342 | 47.00 | 214,105.07 |
| 48 | 334 | 48.00 | 218,698.48 |
| 49 | 258 | 49.00 | 197,851.30 |
| 50 | 269 | 50.00 | 208,358.99 |
| 51 | 189 | 51.00 | 179,587.44 |
| 52 | 184 | 52.00 | 208,321.03 |
| 53 | 186 | 53.00 | 190,127.83 |
| 54 | 200 | 54.00 | 204,165.27 |
| 55 | 715 | 55.00 | 167,524.11 |
| 56 | 163 | 56.00 | 254,946.19 |
| 57 | 208 | 57.00 | 320,837.06 |
| 58 | 185 | 58.00 | 256,471.58 |
| 59 | 166 | 59.00 | 251,611.66 |
tabla3 %>%
gt() %>%
tab_header(
title = md("**Tabla 4.4.3: Pares (x̄, ȳ) — Parte 3**"),
subtitle = paste0(nrow(tabla3), " años promediados")
) %>%
fmt_number(columns = c(x_medio, y_medio), decimals = 2) %>%
cols_align(align = "center", everything())| Tabla 4.4.3: Pares (x̄, ȳ) — Parte 3 | |||
| 30 años promediados | |||
| Año | n_pozos | x_medio | y_medio |
|---|---|---|---|
| 60 | 443 | 60.00 | 269,649.77 |
| 61 | 509 | 61.00 | 313,301.47 |
| 62 | 97 | 62.00 | 286,942.65 |
| 63 | 84 | 63.00 | 305,814.97 |
| 64 | 70 | 64.00 | 291,217.26 |
| 65 | 68 | 65.00 | 287,004.92 |
| 66 | 82 | 66.00 | 321,568.43 |
| 67 | 72 | 67.00 | 309,578.04 |
| 68 | 125 | 68.00 | 421,431.02 |
| 69 | 74 | 69.00 | 307,741.22 |
| 70 | 71 | 70.00 | 324,466.02 |
| 71 | 92 | 71.00 | 337,328.54 |
| 72 | 105 | 72.00 | 385,930.90 |
| 73 | 74 | 73.00 | 370,913.63 |
| 74 | 83 | 74.00 | 433,378.22 |
| 75 | 67 | 75.00 | 318,363.38 |
| 76 | 69 | 76.00 | 394,878.17 |
| 77 | 57 | 77.00 | 369,816.04 |
| 78 | 42 | 78.00 | 389,982.86 |
| 79 | 35 | 79.00 | 451,744.07 |
| 80 | 40 | 80.00 | 446,000.85 |
| 81 | 41 | 81.00 | 449,159.37 |
| 82 | 49 | 82.00 | 516,179.16 |
| 83 | 53 | 83.00 | 472,788.75 |
| 84 | 46 | 84.00 | 545,037.34 |
| 85 | 48 | 85.00 | 568,383.32 |
| 86 | 41 | 86.00 | 568,579.91 |
| 87 | 29 | 87.00 | 481,062.76 |
| 88 | 45 | 88.00 | 635,580.91 |
| 89 | 32 | 89.00 | 562,425.83 |
Primero la nube de puntos completa (pozo por pozo), coloreada por parte.
colores <- c("Parte 1" = "#2E86AB", "Parte 2" = "#E67E22", "Parte 3" = "#C0392B")
par(mar = c(5, 5, 4, 2))
plot(datos$YEARS_ACTIVE, datos$CUMULATIVE_PRODUCTION,
col = colores[datos$parte], pch = 16, cex = 0.4,
xlab = "Años Activos (X)", ylab = "Producción Acumulada (Y)",
main = "Gráfica N°1: Nube de puntos completa, dividida en 3 partes",
cex.main = 0.9, frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")
abline(v = c(limite1, limite2), lty = 2, col = "gray40")
legend("topright", legend = names(colores), col = colores, pch = 16, bty = "n")
box()Ya con los pares (x̄, ȳ) que se usarán en la regresión.
par(mar = c(5, 5, 4, 2))
plot(tabla1$x_medio, tabla1$y_medio, pch = 19, col = "#2E86AB",
xlab = "X medio (Años Activos)", ylab = "Y medio (Producción Acumulada)",
main = "Gráfica N°2: Nube de Puntos — Parte 1",
cex.main = 0.9, frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")
box()par(mar = c(5, 5, 4, 2))
plot(tabla2$x_medio, tabla2$y_medio, pch = 19, col = "#E67E22",
xlab = "X medio (Años Activos)", ylab = "Y medio (Producción Acumulada)",
main = "Gráfica N°3: Nube de Puntos — Parte 2",
cex.main = 0.9, frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")
box()par(mar = c(5, 5, 4, 2))
plot(tabla3$x_medio, tabla3$y_medio, pch = 19, col = "#C0392B",
xlab = "X medio (Años Activos)", ylab = "Y medio (Producción Acumulada)",
main = "Gráfica N°4: Nube de Puntos — Parte 3",
cex.main = 0.9, frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")
box()Parte 1 (pozos jóvenes, 0 - 29.7 años): la nube crece rápido al inicio y luego se suaviza — forma típica de curva de declinación de producción (comportamiento hiperbólico/potencial de Arps). Se conjetura un modelo potencial: \[y = a \cdot x^{b}\]
Parte 2 (pozos maduros, 29.7 - 59.3 años): la nube no es monótona: sube, se estabiliza y vuelve a subir (efecto de reacondicionamientos/reactivaciones a mitad de vida del pozo). Ningún modelo monótono (log, exp, potencial) puede seguir esa curvatura, así que se conjetura obligatoriamente un modelo polinómico de grado 2: \[y = a + bx + cx^{2}\]
Parte 3 (pozos muy antiguos, 59.3 - 89 años): el crecimiento se acelera de forma marcada al final (pozos centenarios acumulan de forma compuesta). Se conjetura un modelo exponencial: \[y = a \cdot e^{bx}\]
modelo1 <- lm(log(y_medio) ~ log(x_medio), data = tabla1)
a1 <- exp(coef(modelo1)[1])
b1 <- coef(modelo1)[2]
cat("y =", round(a1, 3), "* x^", round(b1, 3))y = 7490.256 * x^ 0.972
Call:
lm(formula = log(y_medio) ~ log(x_medio), data = tabla1)
Residuals:
Min 1Q Median 3Q Max
-0.26168 -0.06562 -0.01314 0.02253 0.43217
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.92136 0.10032 88.93 <0.0000000000000002 ***
log(x_medio) 0.97196 0.03867 25.14 <0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.1734 on 27 degrees of freedom
Multiple R-squared: 0.959, Adjusted R-squared: 0.9575
F-statistic: 631.9 on 1 and 27 DF, p-value: < 0.00000000000000022
modelo2 <- lm(y_medio ~ x_medio + I(x_medio^2), data = tabla2)
a2 <- coef(modelo2)[1]; b2 <- coef(modelo2)[2]; c2 <- coef(modelo2)[3]
cat("y =", round(a2,2), "+", round(b2,2), "*x +", round(c2,4), "*x^2")y = 1557110 + -60147.85 *x + 654.2263 *x^2
Call:
lm(formula = y_medio ~ x_medio + I(x_medio^2), data = tabla2)
Residuals:
Min 1Q Median 3Q Max
-60489 -18498 -10897 17185 66573
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1557110.1 166220.4 9.368 0.000000000566 ***
x_medio -60147.8 7665.0 -7.847 0.000000019474 ***
I(x_medio^2) 654.2 85.8 7.625 0.000000033495 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 31440 on 27 degrees of freedom
Multiple R-squared: 0.7113, Adjusted R-squared: 0.69
F-statistic: 33.27 on 2 and 27 DF, p-value: 0.00000005189
modelo3 <- lm(log(y_medio) ~ x_medio, data = tabla3)
a3 <- exp(coef(modelo3)[1])
b3 <- coef(modelo3)[2]
cat("y =", round(a3, 3), "* e^(", round(b3, 4), "* x )")y = 56824.06 * e^( 0.0259 * x )
Call:
lm(formula = log(y_medio) ~ x_medio, data = tabla3)
Residuals:
Min 1Q Median 3Q Max
-0.22259 -0.05647 -0.01596 0.06611 0.23948
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.947715 0.151249 72.38 < 0.0000000000000002 ***
x_medio 0.025944 0.002017 12.87 0.000000000000283 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.0956 on 28 degrees of freedom
Multiple R-squared: 0.8553, Adjusted R-squared: 0.8501
F-statistic: 165.5 on 1 and 28 DF, p-value: 0.0000000000002833
par(mar = c(5, 5, 4, 2))
plot(tabla1$x_medio, tabla1$y_medio, col = "#2E86AB", pch = 16,
xlab = "X (Años Activos)", ylab = "Y (Producción Acumulada)",
main = "Gráfica N°5: Modelo Potencial vs. Realidad — Parte 1",
cex.main = 0.9, frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")
curve(a1 * x^b1, add = TRUE, col = "#1F2A33", lwd = 3)
legend("topleft", legend = c("Datos (x̄, ȳ)", "Modelo Potencial"),
col = c("#2E86AB", "#1F2A33"), pch = c(16, NA), lwd = c(NA, 3), bty = "n")
box()par(mar = c(5, 5, 4, 2))
plot(tabla2$x_medio, tabla2$y_medio, col = "#E67E22", pch = 16,
xlab = "X (Años Activos)", ylab = "Y (Producción Acumulada)",
main = "Gráfica N°6: Modelo Polinómico vs. Realidad — Parte 2",
cex.main = 0.9, frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")
curve(a2 + b2*x + c2*x^2, add = TRUE, col = "#1F2A33", lwd = 3)
legend("topleft", legend = c("Datos (x̄, ȳ)", "Modelo Polinómico"),
col = c("#E67E22", "#1F2A33"), pch = c(16, NA), lwd = c(NA, 3), bty = "n")
box()par(mar = c(5, 5, 4, 2))
plot(tabla3$x_medio, tabla3$y_medio, col = "#C0392B", pch = 16,
xlab = "X (Años Activos)", ylab = "Y (Producción Acumulada)",
main = "Gráfica N°7: Modelo Exponencial vs. Realidad — Parte 3",
cex.main = 0.9, frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")
curve(a3 * exp(b3 * x), add = TRUE, col = "#1F2A33", lwd = 3)
legend("topleft", legend = c("Datos (x̄, ȳ)", "Modelo Exponencial"),
col = c("#C0392B", "#1F2A33"), pch = c(16, NA), lwd = c(NA, 3), bty = "n")
box()El coeficiente de correlación de Pearson, calculado en R mediante
cor(x, y), debe superar 0.7 o -0.7 para
aceptar el modelo, dado que toma valores entre 1 y -1. Para los modelos
monótonos (potencial y exponencial) se prueba dicho coeficiente sobre la
escala en que el modelo es lineal (logarítmica). Para el modelo
polinómico, al no ser lineal en una sola escala, se usa el
coeficiente de correlación múltiple \(R = \sqrt{R^2}\), que cumple el mismo rol
de “bondad de ajuste” entre 0 y 1; en este caso el coeficiente
de determinación (\(R^2\))
aparece directamente en el summary() del modelo lineal.
# Parte 1: potencial -> se prueba log(y) vs log(x)
r1 <- cor.test(log(tabla1$x_medio), log(tabla1$y_medio))
# Parte 2: polinómico -> R multiple = sqrt(R^2) del modelo
R2_2 <- summary(modelo2)$r.squared
r2 <- sqrt(R2_2)
# Parte 3: exponencial -> se prueba x vs log(y)
r3 <- cor.test(tabla3$x_medio, log(tabla3$y_medio))
tabla_pearson <- data.frame(
Parte = c("Parte 1 (Potencial)", "Parte 2 (Polinómico)", "Parte 3 (Exponencial)"),
r_o_R = c(r1$estimate, r2, r3$estimate),
R2 = c(r1$estimate^2, R2_2, r3$estimate^2),
Supera_0.7 = c(abs(r1$estimate) > 0.7, r2 > 0.7, abs(r3$estimate) > 0.7),
p_valor_modelo = c(
pf(summary(modelo1)$fstatistic[1], summary(modelo1)$fstatistic[2], summary(modelo1)$fstatistic[3], lower.tail = FALSE),
pf(summary(modelo2)$fstatistic[1], summary(modelo2)$fstatistic[2], summary(modelo2)$fstatistic[3], lower.tail = FALSE),
pf(summary(modelo3)$fstatistic[1], summary(modelo3)$fstatistic[2], summary(modelo3)$fstatistic[3], lower.tail = FALSE)
)
)
tabla_pearson %>%
gt() %>%
tab_header(
title = md("**Tabla 9: Test de Bondad de Ajuste por Parte**"),
subtitle = "Umbral |r| o R > 0.7"
) %>%
fmt_number(columns = c(r_o_R, R2, p_valor_modelo), decimals = 4) %>%
tab_source_note(source_note = "Autor: Valeska Araujo") %>%
cols_align(align = "center", everything())| Tabla 9: Test de Bondad de Ajuste por Parte | ||||
| Umbral |r| o R > 0.7 | ||||
| Parte | r_o_R | R2 | Supera_0.7 | p_valor_modelo |
|---|---|---|---|---|
| Parte 1 (Potencial) | 0.9793 | 0.9590 | TRUE | 0.0000 |
| Parte 2 (Polinómico) | 0.8434 | 0.7113 | TRUE | 0.0000 |
| Parte 3 (Exponencial) | 0.9248 | 0.8553 | TRUE | 0.0000 |
| Autor: Valeska Araujo | ||||
Las tres partes superan el umbral de |r| > 0.7 (o
R > 0.7 en el caso del polinómico) y además el
estadístico F de cada modelo es significativo (p-valor < 0.05), por
lo que los tres modelos se aceptan.
# Un ejemplo de estimación puntual dentro del rango de cada parte
x_est1 <- round(mean(range(tabla1$x_medio)), 1)
x_est2 <- round(mean(range(tabla2$x_medio)), 1)
x_est3 <- round(mean(range(tabla3$x_medio)), 1)
y_est1 <- a1 * x_est1^b1
y_est2 <- a2 + b2*x_est2 + c2*x_est2^2
y_est3 <- a3 * exp(b3 * x_est3)
data.frame(
Parte = c("Parte 1", "Parte 2", "Parte 3"),
X_estimado = c(x_est1, x_est2, x_est3),
Y_estimado = round(c(y_est1, y_est2, y_est3), 1)
) %>%
gt() %>%
tab_header(
title = md("**Tabla 10: Estimaciones Puntuales de Producción Acumulada**")
) %>%
tab_source_note(source_note = "Autor: Valeska Araujo") %>%
cols_align(align = "center", everything())| Tabla 10: Estimaciones Puntuales de Producción Acumulada | ||
| Parte | X_estimado | Y_estimado |
|---|---|---|
| Parte 1 | 15.0 | 104137.7 |
| Parte 2 | 44.5 | 176062.2 |
| Parte 3 | 74.5 | 392607.6 |
| Autor: Valeska Araujo | ||