1. Carga de librerías

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)

2. Carga de datos

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

3. Selección de variables

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
cat("Registros con año de inicio de producción:", sum(!is.na(AINIP)), "\n")
## Registros con año de inicio de producción: 1947

4. Tabla de pares de valores

Paso 1 — Todos los datos

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

Paso 2 — Grafica original

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

Paso 3 — Agrupación de múltiples Y por X

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)"
)

5. Gráfica

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.


6. Conjetura del modelo matemático

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

modelorl <- lm(y_var ~ x_var)
summary(modelorl)
## 
## 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

7. Cálculo de parámetros

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:

  • m representa la pendiente: el cambio esperado en el año de inicio de producción por cada año adicional en el año de descubrimiento.
  • b corresponde al intercepto: el valor estimado de y cuando x es igual a cero.
b <- coef(modelorl)[1]
m <- coef(modelorl)[2]

cat("El intercepto (b) es:", round(b, 3), "\n")
## El intercepto (b) es: 142.806
cat("La pendiente  (m) es:", round(m, 4), "\n")
## La pendiente  (m) es: 0.9332
cat("La ecuación de la recta es: y =", round(b, 3), "+", round(m, 4), "* x\n")
## La ecuación de la recta es: y = 142.806 + 0.9332 * x

8. Comparación del modelo con la realidad

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:

  • y representa el Año de Inicio de Producción.
  • x representa el Año de Descubrimiento.
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"
  )


9. Test de Pearson

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 %
cat("El porcentaje de variación explicado (R²) es:", round(r2, 2), "%\n")
## 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")
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
Test Pearson Coeficiente de determinación Ecuación de la recta
96.39 92.91 y = 142.81 + 0.9332 * x

10. Estimación del modelo

¿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

11. Conclusión

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.