1 Carga de Datos y Librerías

Se cargan las librerías necesarias y el dataset Global Oil and Gas Extraction Tracker (GOGET), que contiene registros de unidades de extracción de petróleo y gas a nivel mundial.

library(readxl)
library(dplyr)
library(gt)
library(ggplot2)
library(scales)
library(e1071)

setwd("C:/Users/DETPC/Downloads")
datos <- read_excel("dataset_mundial_petro.xlsx") %>%
  filter(!is.na(Latitude))

cat("Registros válidos:", nrow(datos), "\n")
## Registros válidos: 7537
cat("Variables:", ncol(datos), "\n")
## Variables: 32

2 Extracción de la Variable

Se extrae la variable Latitude (Latitud). Es una variable de escala cuantitativa continua, ya que puede tomar cualquier valor decimal dentro de un rango geográfico definido (-90° a 90°).

lat <- datos$Latitude
n <- length(lat)

cat("Variable analizada: Latitude\n")
## Variable analizada: Latitude
cat("Total de observaciones (n):", n, "\n")
## Total de observaciones (n): 7537
cat("Valor mínimo:", round(min(lat), 4), "\n")
## Valor mínimo: -53.9713
cat("Valor máximo:", round(max(lat), 4), "\n")
## Valor máximo: 73.4344

3 Distribución de Frecuencias por Clases

Para una variable continua, se construye una distribución de frecuencias agrupada en clases (intervalos), utilizando la Regla de Sturges para determinar el número óptimo de clases.

3.1 Cálculo del Número de Clases (Regla de Sturges)

\[ k = 1 + 3.322 \times \log_{10}(n) \]

rango <- max(lat) - min(lat)
k <- ceiling(1 + 3.322 * log10(n))
amplitud <- rango / k

cat("Rango (R):", round(rango, 4), "\n")
## Rango (R): 127.4057
cat("Número de clases (k):", k, "\n")
## Número de clases (k): 14
cat("Amplitud de clase (A):", round(amplitud, 4), "\n")
## Amplitud de clase (A): 9.1004

3.2 Cálculo de Frecuencias

limite_inf <- min(lat)

tabla_freq <- data.frame(i = 1:k) %>%
  mutate(
    Li = limite_inf + (i - 1) * amplitud,
    Ls = limite_inf + i * amplitud,
    Marca = (Li + Ls) / 2
  )

# Asignar cada observación a su clase
tabla_freq$ni <- sapply(1:k, function(j) {
  if (j < k) {
    sum(lat >= tabla_freq$Li[j] & lat < tabla_freq$Ls[j])
  } else {
    sum(lat >= tabla_freq$Li[j] & lat <= tabla_freq$Ls[j])
  }
})

tabla_freq <- tabla_freq %>%
  mutate(
    Ni      = cumsum(ni),
    hi_prop = ni / n,
    hi_pct  = hi_prop * 100,
    Hi_pct  = cumsum(hi_pct)
  ) %>%
  select(i, Li, Ls, Marca, ni, Ni, hi_pct, hi_prop, Hi_pct)

cat("Verificación — Σnᵢ:", sum(tabla_freq$ni), "(debe ser", n, ")\n")
## Verificación — Σnᵢ: 7536 (debe ser 7537 )
cat("Verificación — Σhᵢ%:", round(sum(tabla_freq$hi_pct), 2), "(debe ser 100)\n")
## Verificación — Σhᵢ%: 99.99 (debe ser 100)

4 Tabla de Distribución de Frecuencias

tabla_freq %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N. 1**"),
    subtitle = md("Distribución de frecuencias de la Latitud — yacimientos de petróleo y gas")
  ) %>%
  cols_label(
    i       = md("**N°**"),
    Li      = md("**Límite inferior**"),
    Ls      = md("**Límite superior**"),
    Marca   = md("**Marca de clase**"),
    ni      = md("**nᵢ**"),
    Ni      = md("**Nᵢ**"),
    hi_pct  = md("**(%)**"),
    hi_prop = md("**(proporción)**"),
    Hi_pct  = md("**Hᵢ (%)**")
  ) %>%
  tab_spanner(label = md("**hᵢ**"), columns = c(hi_pct, hi_prop)) %>%
  fmt_number(columns = c(Li, Ls, Marca), decimals = 2) %>%
  fmt_number(columns = c(ni, Ni),        decimals = 0, use_seps = TRUE) %>%
  fmt_number(columns = hi_pct,           decimals = 2) %>%
  fmt_number(columns = hi_prop,          decimals = 4) %>%
  fmt_number(columns = Hi_pct,           decimals = 2) %>%
  grand_summary_rows(
    columns = c(ni, hi_pct, hi_prop),
    fns = list(label = "Total", fn = "sum"),
    fmt = list(
      ~ fmt_number(., columns = ni,      decimals = 0, use_seps = TRUE),
      ~ fmt_number(., columns = hi_pct,  decimals = 2),
      ~ fmt_number(., columns = hi_prop, decimals = 4)
    )
  ) %>%
  tab_source_note("Autor: Grupo 5") %>%
  tab_options(
    table.width                       = pct(100),
    table.font.size                   = px(12),
    table.font.names                  = "Arial",
    heading.title.font.size           = px(15),
    heading.subtitle.font.size        = px(12),
    heading.align                     = "center",
    heading.background.color          = "#AAAAAA",
    column_labels.font.weight         = "bold",
    column_labels.background.color    = "#FFFFFF",
    column_labels.border.top.color    = "#AAAAAA",
    column_labels.border.bottom.color = "#AAAAAA",
    table.border.top.color            = "#AAAAAA",
    table.border.bottom.color         = "#AAAAAA"
  ) %>%
  tab_style(
    style     = cell_text(color = "white", weight = "bold"),
    locations = cells_title(groups = c("title", "subtitle"))
  ) %>%
  tab_style(
    style     = cell_text(weight = "bold"),
    locations = list(cells_column_labels(), cells_column_spanners(), cells_grand_summary())
  )
Tabla N. 1
Distribución de frecuencias de la Latitud — yacimientos de petróleo y gas
Límite inferior Límite superior Marca de clase nᵢ Nᵢ
hᵢ
Hᵢ (%)
(%) (proporción)
1 −53.97 −44.87 −49.42 79 79 1.05 0.0105 1.05
2 −44.87 −35.77 −40.32 121 200 1.61 0.0161 2.65
3 −35.77 −26.67 −31.22 27 227 0.36 0.0036 3.01
4 −26.67 −17.57 −22.12 124 351 1.65 0.0165 4.66
5 −17.57 −8.47 −13.02 65 416 0.86 0.0086 5.52
6 −8.47 0.63 −3.92 245 661 3.25 0.0325 8.77
7 0.63 9.73 5.18 662 1,323 8.78 0.0878 17.55
8 9.73 18.83 14.28 211 1,534 2.80 0.0280 20.35
9 18.83 27.93 23.38 480 2,014 6.37 0.0637 26.72
10 27.93 37.03 32.48 2,389 4,403 31.70 0.3170 58.42
11 37.03 46.13 41.58 559 4,962 7.42 0.0742 65.84
12 46.13 55.23 50.68 1,717 6,679 22.78 0.2278 88.62
13 55.23 64.33 59.78 727 7,406 9.65 0.0965 98.26
14 64.33 73.43 68.88 130 7,536 1.72 0.0172 99.99
Total 7,536 99.99 0.9999
Autor: Grupo 5

5 Gráficas

pie_label <- paste0("n = ", format(n, big.mark = ","),
                    " | Fuente: Global Energy Monitor — GOGET 2023")

tema_base <- theme_minimal(base_size = 12) +
  theme(
    legend.position    = "none",
    plot.title         = element_text(face = "bold", size = 13),
    plot.caption       = element_text(color = "#888888", size = 9, hjust = 0),
    axis.title         = element_text(face = "bold", size = 11),
    axis.text.x        = element_text(face = "bold"),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(color = "#EEEEEE"),
    panel.grid.minor   = element_blank(),
    plot.background    = element_rect(fill = "white", color = NA)
  )

5.1 Histograma de Frecuencias Absolutas

ggplot(tabla_freq, aes(x = Marca, y = ni)) +
  geom_col(width = amplitud * 0.95, fill = "#2E86C1", color = "white") +
  geom_text(aes(label = ni), vjust = -0.4, size = 3.5, fontface = "bold") +
  scale_x_continuous(breaks = round(c(tabla_freq$Li, tabla_freq$Ls[k]), 1)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title   = "Gráfica N. 1: Histograma de frecuencias — Latitud",
       x = "Latitud (grados)", y = "Frecuencia Absoluta (nᵢ)",
       caption = pie_label) +
  tema_base +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

5.2 Polígono de Frecuencias

ggplot(tabla_freq, aes(x = Marca, y = ni)) +
  geom_line(color = "#2E86C1", linewidth = 1) +
  geom_point(color = "#1A5276", size = 2.5) +
  geom_text(aes(label = ni), vjust = -0.8, size = 3.5, fontface = "bold") +
  scale_x_continuous(breaks = round(tabla_freq$Marca, 1)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(title   = "Gráfica N. 2: Polígono de frecuencias — Latitud",
       x = "Marca de clase (Latitud)", y = "Frecuencia Absoluta (nᵢ)",
       caption = pie_label) +
  tema_base +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

5.3 Ojiva (Frecuencia Acumulada)

ggplot(tabla_freq, aes(x = Ls, y = Ni)) +
  geom_line(color = "#1A5276", linewidth = 1) +
  geom_point(color = "#2E86C1", size = 2.5) +
  geom_text(aes(label = Ni), vjust = -0.8, size = 3.5, fontface = "bold") +
  scale_x_continuous(breaks = round(c(min(lat), tabla_freq$Ls), 1)) +
  scale_y_continuous(labels = label_comma(),
                      expand = expansion(mult = c(0, 0.12))) +
  labs(title   = "Gráfica N. 3: Ojiva — Frecuencia acumulada de la Latitud",
       x = "Latitud (límite superior de clase)", y = "Frecuencia Acumulada (Nᵢ)",
       caption = pie_label) +
  tema_base +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

5.4 Diagrama de Caja (Boxplot)

ggplot(datos, aes(x = "", y = Latitude)) +
  geom_boxplot(fill = "#AED6F1", color = "#1A5276", width = 0.3, outlier.color = "#E74C3C") +
  coord_flip() +
  labs(title   = "Gráfica N. 4: Diagrama de caja — Latitud",
       x = "", y = "Latitud (grados)",
       caption = pie_label) +
  tema_base +
  theme(axis.text.y = element_blank())


6 Indicadores Estadísticos

La variable Latitud es cuantitativa continua. Se calculan las medidas de tendencia central, dispersión, asimetría y curtosis sobre los datos no agrupados.

media   <- mean(lat)
mediana <- median(lat)

moda_clase <- tabla_freq$Marca[which.max(tabla_freq$ni)]

varianza <- var(lat)
desv_est <- sd(lat)
cv       <- (desv_est / media) * 100
asimetria <- skewness(lat)
curtosis  <- kurtosis(lat)

cat("Media (X):", round(media, 4), "\n")
## Media (X): 32.2538
cat("Mediana (Me):", round(mediana, 4), "\n")
## Mediana (Me): 32.5302
cat("Moda (clase modal, marca):", round(moda_clase, 4), "\n")
## Moda (clase modal, marca): 32.4826
cat("Varianza (V):", round(varianza, 4), "\n")
## Varianza (V): 521.1647
cat("Desviación Estándar (Sd):", round(desv_est, 4), "\n")
## Desviación Estándar (Sd): 22.829
cat("Coeficiente de Variación (%):", round(cv, 2), "\n")
## Coeficiente de Variación (%): 70.78
cat("Asimetría (As):", round(asimetria, 4), "\n")
## Asimetría (As): -1.2217
cat("Curtosis (K):", round(curtosis, 4), "\n")
## Curtosis (K): 1.6975
data.frame(
  "Variable"        = "Latitude",
  "Rango"           = "D=[-90°, 90°]",
  "Media (X)"       = round(media, 4),
  "Mediana (Me)"    = round(mediana, 4),
  "Moda (Mo)"       = round(moda_clase, 4),
  "Varianza (V)"    = round(varianza, 4),
  "Desv. Est. (Sd)" = round(desv_est, 4),
  "C.V. (%)"        = round(cv, 2),
  "Asimetría (As)"  = round(asimetria, 4),
  "Curtosis (K)"    = round(curtosis, 4),
  check.names = FALSE
) %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2 de Conclusiones — Latitud en yacimientos de petróleo y gas**")
  ) %>%
  tab_source_note("Autor: Grupo 5") %>%
  tab_options(
    table.width                       = pct(100),
    table.font.size                   = px(12),
    table.font.names                  = "Arial",
    heading.align                     = "center",
    heading.title.font.size           = px(13),
    heading.background.color          = "#AAAAAA",
    heading.border.bottom.color       = "#AAAAAA",
    column_labels.font.weight         = "normal",
    column_labels.background.color    = "#FFFFFF",
    column_labels.border.top.color    = "#CCCCCC",
    column_labels.border.top.width    = px(1),
    column_labels.border.bottom.color = "#CCCCCC",
    column_labels.border.bottom.width = px(1),
    table_body.border.bottom.color    = "#CCCCCC",
    table_body.border.bottom.width    = px(1),
    table.border.top.color            = "#AAAAAA",
    table.border.top.width            = px(1),
    table.border.bottom.color         = "#AAAAAA",
    table.border.bottom.width         = px(1),
    source_notes.font.size            = px(11),
    source_notes.border.lr.color      = "transparent",
    data_row.padding                  = px(5)
  ) %>%
  tab_style(
    style     = cell_text(color = "white", weight = "bold"),
    locations = cells_title(groups = "title")
  ) %>%
  tab_style(
    style     = cell_text(color = "#333333", align = "center"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style     = cell_text(color = "#333333", align = "center"),
    locations = cells_body(columns = c("Media (X)", "Mediana (Me)", "Moda (Mo)",
                                       "Varianza (V)", "Desv. Est. (Sd)",
                                       "C.V. (%)", "Asimetría (As)", "Curtosis (K)"))
  )
Tabla N°2 de Conclusiones — Latitud en yacimientos de petróleo y gas
Variable Rango Media (X) Mediana (Me) Moda (Mo) Varianza (V) Desv. Est. (Sd) C.V. (%) Asimetría (As) Curtosis (K)
Latitude D=[-90°, 90°] 32.2538 32.5302 32.4826 521.1647 22.829 70.78 -1.2217 1.6975
Autor: Grupo 5

7 Conclusiones

La variable “Latitud” presenta una media de aproximadamente 32.25°, con una mediana cercana de 32.53°, lo que sugiere una distribución ligeramente asimétrica hacia la izquierda (asimetría negativa), confirmada por el coeficiente de asimetría obtenido. La desviación estándar de aproximadamente 22.83° y un coeficiente de variación cercano al 70.8% indican una alta dispersión de las unidades de extracción de petróleo y gas a lo largo del eje latitudinal, reflejando que estas se distribuyen ampliamente entre el hemisferio sur y el hemisferio norte, con mayor concentración en latitudes del hemisferio norte (zona templada-tropical), coherente con la ubicación de las principales regiones productoras de hidrocarburos a nivel mundial.