Para ejecutar el análisis de regresión lineal sobre el dataset mundial de petróleo y gas, se cargan las librerías necesarias.
library(dplyr)
library(ggplot2)
library(knitr)
library(kableExtra)
library(readxl)
library(reactable)
library(htmltools)Se importa el dataset global de extracción de petróleo y gas, conformado por 49,212 registros de yacimientos y unidades productivas distribuidas en distintos países del mundo.
datos <- read_excel("dataset_mundial_petro.xlsx")
cat("Dimensiones del dataset:", nrow(datos), "filas y", ncol(datos), "columnas\n")## Dimensiones del dataset: 49212 filas y 32 columnas
Se eligen las variables Discovery year y Production start year porque representan hitos temporales clave del ciclo de vida de un yacimiento, permitiendo analizar la relación entre el año de descubrimiento y el tiempo que tarda en iniciar su explotación.
Ambas son variables cuantitativas discretas de escala de intervalo, lo que las hace comparables mediante un análisis de correlación o dispersión.
ADESC <- as.numeric(datos$`Discovery year`)
AINIP <- as.numeric(datos$`Production start year`)
cat("Registros con año de descubrimiento:", sum(!is.na(ADESC)), "\n")## Registros con año de descubrimiento: 4935
## Registros con año de inicio de producción: 1947
Se extraen todos los registros disponibles para ambas variables antes de aplicar cualquier filtro, con el fin de conocer el volumen total de datos con que cuenta el dataset para este par de variables.
ADESC <- as.numeric(datos$`Discovery year`)
AINIP <- as.numeric(datos$`Production start year`)
tabla_base <- data.frame(ADESC = ADESC, AINIP = AINIP) %>%
filter(!is.na(ADESC))
tabla_condensada <- tabla_base %>%
group_by(`Año de Descubrimiento (X)` = ADESC) %>%
summarise(
valores = list(AINIP),
`Año de Inicio de Producción (valores)` = n(),
.groups = "drop"
)
reactable(
tabla_condensada %>% select(`Año de Descubrimiento (X)`,
`Año de Inicio de Producción (valores)`),
pageSize = 10,
bordered = TRUE,
striped = TRUE,
highlight = TRUE,
defaultSorted = "Año de Descubrimiento (X)",
details = function(index) {
valores_fila <- tabla_condensada$valores[[index]]
valores_fila <- ifelse(is.na(valores_fila), "Sin dato", as.character(valores_fila))
htmltools::div(
style = "padding: 10px; background: #f5f5f5;",
reactable(
data.frame(`Año de Inicio de Producción` = valores_fila,
check.names = FALSE),
pageSize = 10,
bordered = TRUE,
striped = TRUE,
highlight = TRUE
)
)
}
)Se presenta la gráfica original con todos los datos disponibles del dataset, sin ningún tipo de filtro ni tratamiento. Los valores NA simplemente no se grafican pero no son eliminados del dataset.
ggplot(data.frame(x = ADESC, y = AINIP), aes(x = x, y = y)) +
geom_point(color = "black", shape = 7, alpha = 0.5, size = 2) +
scale_x_continuous(limits = c(min(ADESC, na.rm = TRUE), max(ADESC, na.rm = TRUE))) +
scale_y_continuous(limits = c(min(AINIP, na.rm = TRUE), max(AINIP, na.rm = TRUE))) +
labs(
title = "Gráfica N°1: Diagrama de dispersión original\nAño de Descubrimiento vs Año de Inicio de Producción",
x = "Año de Descubrimiento",
y = "Año de Inicio de Producción",
caption = "Fuente: Dataset Mundial de Petróleo y Gas | Datos originales sin tratamiento"
) +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold", hjust = 0.5))Se conservan únicamente los registros donde el año de inicio de producción sea mayor o igual al año de descubrimiento, ya que físicamente un yacimiento no puede producir antes de ser descubierto. Para cada año de descubrimiento se calcula el promedio de todos sus valores de año de inicio de producción, obteniendo así un único punto (X, Y) por cada año.
## Paso 3 — Agrupación de múltiples Y por X
tabla_purificada <- data.frame(x = ADESC, y = AINIP) %>%
filter(!is.na(x), !is.na(y), y >= x) %>%
group_by(`Año de Descubrimiento (X)` = x) %>%
summarise(
`Año de Inicio de Producción (Media)` = round(mean(y, na.rm = TRUE), 0),
`N° de yacimientos` = n(),
.groups = "drop"
) %>%
filter(is.finite(`Año de Inicio de Producción (Media)`))
x_var <- tabla_purificada$`Año de Descubrimiento (X)`
y_var <- tabla_purificada$`Año de Inicio de Producción (Media)`
n_obs <- tabla_purificada$`N° de yacimientos`
cat("Grupos (años de descubrimiento) válidos tras la depuración:", nrow(tabla_purificada), "\n")## Grupos (años de descubrimiento) válidos tras la depuración: 97
cat("NA/NaN restantes en x_var:", sum(!is.finite(x_var)), " | en y_var:", sum(!is.finite(y_var)), "\n")## NA/NaN restantes en x_var: 0 | en y_var: 0
reactable(
tabla_purificada,
pageSize = 10,
bordered = TRUE,
striped = TRUE,
highlight = TRUE,
defaultSorted = "Año de Descubrimiento (X)"
)Se construye el diagrama de dispersión entre el año de descubrimiento y el año de inicio de producción para observar la forma general de la relación entre ambas variables antes de proponer el modelo de regresión.
ggplot(data.frame(x = x_var, y = y_var, n = n_obs), aes(x = x, y = y)) +
geom_point(color = "#2980b9", size = 3, alpha = 0.85, shape = 16) +
labs(
title = "Gráfica N°1: Diagrama de dispersión del año de inicio de producción\nen función del año de descubrimiento de yacimientos",
x = "Año de Descubrimiento (x)",
y = "Año de Inicio de Producción (y)",
caption = "Fuente: Dataset Mundial de Petróleo y Gas"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "grey40", size = 10),
panel.grid.minor = element_blank(),
legend.position = "right"
)Análisis del gráfico: la nube de puntos revela una tendencia positiva clara: a medida que el año de descubrimiento avanza, el año de inicio de producción también lo hace de forma proporcional. La distribución lineal ascendente de los puntos justifica la conjetura de un modelo de regresión lineal.
Con base en la forma lineal observada en el diagrama de dispersión, se propone un modelo de regresión lineal simple de la forma:
y = b + m · x
##
## Call:
## lm(formula = y_var ~ x_var)
##
## Residuals:
## Min 1Q Median 3Q Max
## -14.872 -5.332 -0.457 5.208 45.529
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 142.80620 52.19626 2.736 0.00742 **
## x_var 0.93316 0.02645 35.286 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.972 on 95 degrees of freedom
## Multiple R-squared: 0.9291, Adjusted R-squared: 0.9284
## F-statistic: 1245 on 1 and 95 DF, p-value: < 2.2e-16
Se obtienen los coeficientes estimados del modelo: la pendiente (m) y el intercepto (b), los cuales permiten expresar la ecuación de la recta de regresión lineal bajo la forma general y = m·x + b.
Donde:
## El intercepto (b) es: 142.806
## La pendiente (m) es: 0.9332
## La ecuación de la recta es: y = 142.806 + 0.9332 * x
Se evalúan las restricciones del modelo para determinar en qué rango de valores su aplicación es válida y confiable.
La ecuación del modelo es:
y = 142.81 + 0.9332 · x
Donde:
b_tmp <- coef(modelorl)[1]
m_tmp <- coef(modelorl)[2]
r2_tmp <- summary(modelorl)$r.squared * 100
ggplot(data.frame(x = x_var, y = y_var, n = n_obs), aes(x = x, y = y)) +
geom_point(color = "#2980b9", size = 3, alpha = 0.85, shape = 16) +
geom_smooth(method = "lm", color = "#c0392b",
linewidth = 1.3, se = FALSE) +
labs(
title = "Gráfica N°2: Modelo de regresión lineal entre el año de\ndescubrimiento y el año de inicio de producción",
x = "Año de Descubrimiento",
y = "Año de Inicio de Producción",
caption = "Fuente: Dataset Mundial de Petróleo y Gas"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "grey40", size = 10),
panel.grid.minor = element_blank(),
legend.position = "right"
)El coeficiente de correlación de Pearson indica el grado de asociación lineal entre ambas variables. Un valor cercano a ±1 representa una relación fuerte, mientras que valores cercanos a 0 indican una relación débil.
r <- cor(x_var, y_var, use = "complete.obs") * 100
r2 <- ((r / 100)^2) * 100
cat("La correlación lineal entre ambas variables es:", round(r, 2), "%\n")## La correlación lineal entre ambas variables es: 96.39 %
## El porcentaje de variación explicado (R²) es: 92.91 %
Tabla_resumen <- data.frame(
`Test Pearson` = round(r, 2),
`Coeficiente de determinación` = round(r2, 2),
`Ecuación de la recta` = paste0("y = ", round(b, 2), " + ", round(m, 4), " * x"),
check.names = FALSE
)
kable(Tabla_resumen, align = "c",
caption = "Tabla N°2: Resumen del modelo de regresión lineal del año de inicio
de producción en función del año de descubrimiento de yacimientos de hidrocarburos") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "bordered"),
full_width = FALSE,
position = "center") %>%
row_spec(0, bold = TRUE, background = "#d9d9d9", color = "black")| Test Pearson | Coeficiente de determinación | Ecuación de la recta |
|---|---|---|
| 96.39 | 92.91 | y = 142.81 + 0.9332 * x |
¿Cuál sería el año estimado de inicio de producción si el yacimiento fue descubierto en el año 2005?
x_pred <- 2005
y_esperado <- m * x_pred + b
cat("Para un yacimiento descubierto en el año", x_pred,
", el año estimado de inicio de producción es:",
round(y_esperado, 0), "\n")## Para un yacimiento descubierto en el año 2005 , el año estimado de inicio de producción es: 2014
Entre el Año de Descibrimiento (x) y Año de Inicio de producción (y) existe una relación lineal, cuya ecuación es:
y= 142.81+0.9332·x
Con una correlación de pearson de 96.39% y un coeficiente de determinación de 92.91%, lo que indica un ajuste lienal muy fuerte.