library(readxl)
library(dplyr)
library(tidyr)
library(gt)
library(ggplot2)
library(scales)
library(forcats)
library(MASS) # Fundamental para el ajuste de distribuciones (fitdistr)
datos <- read_excel("dataset_mundial_petro.xlsx")
cat("Número de registros:", nrow(datos), "\n")
## Número de registros: 49212
cat("Número de variables:", ncol(datos), "\n")
## Número de variables: 32
La variable Latitude indica la coordenada geográfica de latitud de cada yacimiento. Es una variable cuantitativa continua, cuyos valores van desde coordenadas negativas (Hemisferio Sur) hasta positivas (Hemisferio Norte). Por su naturaleza bimodal ligada al hemisferio, se le aplica un tratamiento analítico segmentado.
n_total <- nrow(datos)
Variable <- na.omit(as.numeric(datos$Latitude))
n <- length(Variable)
cat("Número de registros (n):", n, "\n")
## Número de registros (n): 7537
cat("Valor mínimo:", round(min(Variable), 3), "\n")
## Valor mínimo: -53.971
cat("Valor máximo:", round(max(Variable), 3), "\n")
## Valor máximo: 73.434
n_sur <- sum(Variable <= 0)
n_norte <- sum(Variable > 0)
cat("Registros en Hemisferio Sur (<= 0°):", n_sur,
"(", round(n_sur / n * 100, 2), "%)\n")
## Registros en Hemisferio Sur (<= 0°): 636 ( 8.44 %)
cat("Registros en Hemisferio Norte (> 0°):", n_norte,
"(", round(n_norte / n * 100, 2), "%)\n")
## Registros en Hemisferio Norte (> 0°): 6901 ( 91.56 %)
Se aplica la Regla de Sturges para determinar el número óptimo de intervalos de clase, ajustando los límites a múltiplos de 10 para facilitar la lectura.
BASE <- 10
min_int <- floor(min(Variable) / BASE) * BASE
max_int <- ceiling(max(Variable) / BASE) * BASE
k_sug <- floor(1 + 3.322 * log10(n))
Rango_int <- max_int - min_int
Amplitud_int <- ceiling((Rango_int / k_sug) / 10) * 10
if (Amplitud_int == 0) Amplitud_int <- 10
cortes_int <- seq(from = min_int, by = Amplitud_int, length.out = k_sug + 1)
if (max(cortes_int) < max(Variable)) cortes_int <- c(cortes_int, max(cortes_int) + Amplitud_int)
while (length(cortes_int) > 2 && cortes_int[length(cortes_int) - 1] >= max(Variable)) {
cortes_int <- cortes_int[-length(cortes_int)]
}
k <- length(cortes_int) - 1
inter_int <- cut(Variable, breaks = cortes_int, include.lowest = TRUE, right = FALSE)
ni_int <- as.vector(table(inter_int))
conteo <- data.frame(
Li = cortes_int[1:k],
Ls = cortes_int[2:(k + 1)],
MC = (cortes_int[1:k] + cortes_int[2:(k + 1)]) / 2,
ni = ni_int
) %>%
mutate(
hi = round(ni / n, 4),
hi_pct = round(ni / n * 100, 2)
)
cat("Total de intervalos de clase:", k, "\n")
## Total de intervalos de clase: 7
cat("Amplitud de clase:", Amplitud_int, "\n")
## Amplitud de clase: 20
cat("Intervalo más frecuente: [", conteo$Li[which.max(conteo$ni)], ",",
conteo$Ls[which.max(conteo$ni)], ") con", max(conteo$ni), "registros\n")
## Intervalo más frecuente: [ 20 , 40 ) con 2971 registros
fila_total <- tibble(
Li = NA, Ls = NA, MC = NA,
ni = sum(conteo$ni),
hi = sum(conteo$hi),
hi_pct = sum(conteo$hi_pct)
)
tdf_final <- bind_rows(conteo, fila_total)
tdf_final %>%
gt() %>%
tab_header(
title = md("**Tabla N° 1**"),
subtitle = md("Distribución de yacimientos según Latitud Geográfica")
) %>%
cols_label(
Li = "Lím. Inf (°)",
Ls = "Lím. Sup (°)",
MC = "Marca de Clase",
ni = "Frecuencia (ni)",
hi = "Proporción (hi)",
hi_pct = "Porcentaje (hi%)"
) %>%
fmt_number(columns = MC, decimals = 1) %>%
fmt_number(columns = hi, decimals = 4) %>%
fmt_number(columns = hi_pct, decimals = 2) %>%
sub_missing(columns = c(Li, Ls, MC), missing_text = "TOTAL") %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_align(align = "center", columns = everything()) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
table.border.top.style = "solid",
table.border.bottom.style = "solid",
column_labels.font.weight = "bold",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "grey",
table_body.border.bottom.color = "black"
)
| Tabla N° 1 | |||||
| Distribución de yacimientos según Latitud Geográfica | |||||
| Lím. Inf (°) | Lím. Sup (°) | Marca de Clase | Frecuencia (ni) | Proporción (hi) | Porcentaje (hi%) |
|---|---|---|---|---|---|
| -60 | -40 | −50.0 | 79 | 0.0105 | 1.05 |
| -40 | -20 | −30.0 | 248 | 0.0329 | 3.29 |
| -20 | 0 | −10.0 | 309 | 0.0410 | 4.10 |
| 0 | 20 | 10.0 | 956 | 0.1268 | 12.68 |
| 20 | 40 | 30.0 | 2971 | 0.3942 | 39.42 |
| 40 | 60 | 50.0 | 2666 | 0.3537 | 35.37 |
| 60 | 80 | 70.0 | 308 | 0.0409 | 4.09 |
| TOTAL | TOTAL | TOTAL | 7537 | 1.0000 | 100.00 |
| Autor: Grupo 5 | |||||
colores <- colorRampPalette(c("#2E86C1", "#AED6F1"))(k)
ggplot(conteo, aes(x = factor(MC), y = ni, fill = factor(MC))) +
geom_col(width = 0.85, color = "white") +
geom_text(aes(label = ni), vjust = -0.4, size = 3, fontface = "bold") +
scale_fill_manual(values = colores) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N°1: Frecuencia Absoluta por Intervalo de Latitud",
x = "Marca de Clase — Latitud (°)",
y = "Frecuencia (ni)",
caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(conteo, aes(x = factor(MC), y = hi_pct, fill = factor(MC))) +
geom_col(width = 0.85, color = "white") +
geom_text(aes(label = paste0(hi_pct, "%")), vjust = -0.4, size = 3, fontface = "bold") +
scale_fill_manual(values = colores) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
labs(
title = "Gráfica N°2: Frecuencia Relativa (Pi) por Intervalo de Latitud",
x = "Marca de Clase — Latitud (°)",
y = "Frecuencia Relativa (%)",
caption = paste0("n = ", format(n, big.mark = ","), " | Fuente: GOGET")
) +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
axis.title = element_text(face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1))
La distribución de la Latitud no responde a un solo patrón: los yacimientos del planeta se concentran mayoritariamente en el Hemisferio Norte (donde se ubica el histórico “cinturón petrolero” entre Medio Oriente, Rusia y Norteamérica), mientras que el Hemisferio Sur está mucho menos representado. Ambos segmentos muestran un comportamiento razonablemente simétrico en torno a su media, por lo que se conjetura un modelo híbrido Normal-Normal segmentado por hemisferio.
z1 <- Variable[Variable <= 0]
mu1 <- mean(z1, na.rm = TRUE)
sd1 <- sd(z1, na.rm = TRUE)
h1 <- hist(z1, breaks = 15, plot = FALSE)
df_z1 <- data.frame(x = h1$mids, y = (h1$counts / length(z1)) * 100)
cat("Media (mu):", round(mu1, 3), " | Desv. Estándar (sd):", round(sd1, 3), "\n")
## Media (mu): -21.4 | Desv. Estándar (sd): 16.299
ggplot(df_z1, aes(x = x, y = y)) +
geom_bar(stat = "identity", fill = "#AED6F1", color = "white", width = diff(h1$breaks)[1]) +
stat_function(fun = function(x) dnorm(x, mean = mu1, sd = sd1) * 100 * diff(h1$breaks)[1],
color = "#2E4053", linewidth = 1.5) +
labs(title = "Gráfica N°3: Ajuste Normal — Hemisferio Sur (Latitudes ≤ 0°)",
x = "Latitud (°)", y = "Densidad Porcentual (%)",
caption = "Fuente: GOGET") +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold"))
z2 <- Variable[Variable > 0]
mu2 <- mean(z2, na.rm = TRUE)
sd2 <- sd(z2, na.rm = TRUE)
h2 <- hist(z2, breaks = 15, plot = FALSE)
df_z2 <- data.frame(x = h2$mids, y = (h2$counts / length(z2)) * 100)
cat("Media (mu):", round(mu2, 3), " | Desv. Estándar (sd):", round(sd2, 3), "\n")
## Media (mu): 37.199 | Desv. Estándar (sd): 15.967
ggplot(df_z2, aes(x = x, y = y)) +
geom_bar(stat = "identity", fill = "#2E86C1", color = "white", width = diff(h2$breaks)[1]) +
stat_function(fun = function(x) dnorm(x, mean = mu2, sd = sd2) * 100 * diff(h2$breaks)[1],
color = "#C0392B", linewidth = 1.5) +
labs(title = "Gráfica N°4: Ajuste Normal — Hemisferio Norte (Latitudes > 0°)",
x = "Latitud (°)", y = "Densidad Porcentual (%)",
caption = "Fuente: GOGET") +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold"))
# Sur: se trabaja con proporciones (Fo, Fe), no conteos absolutos
Fo1 <- h1$counts / sum(h1$counts)
Fe1 <- dnorm(h1$mids, mu1, sd1)
Fe1 <- Fe1 / sum(Fe1)
r_pearson1 <- cor(Fo1, Fe1) * 100
cat("Correlación de Pearson Sur (%):", round(r_pearson1, 4), "\n")
## Correlación de Pearson Sur (%): 2.3118
plot(Fo1, Fe1,
main = "Gráfica N°5: Correlación Modelo Observado y Esperado — Sur",
xlab = "Frecuencia Observada (hi)", ylab = "Frecuencia Esperada (hi modelo)",
pch = 19, col = "#2E4053")
abline(lm(Fe1 ~ 0 + Fo1), col = "red", lwd = 2)
legend("topleft", legend = paste0("r = ", round(r_pearson1, 2), "%"), bty = "n")
# Norte: se trabaja con proporciones (Fo, Fe), no conteos absolutos
Fo2 <- h2$counts / sum(h2$counts)
Fe2 <- dnorm(h2$mids, mu2, sd2)
Fe2 <- Fe2 / sum(Fe2)
r_pearson2 <- cor(Fo2, Fe2) * 100
cat("Correlación de Pearson Norte (%):", round(r_pearson2, 4), "\n")
## Correlación de Pearson Norte (%): 60.1517
plot(Fo2, Fe2,
main = "Gráfica N°6: Correlación Modelo Observado y Esperado — Norte",
xlab = "Frecuencia Observada (hi)", ylab = "Frecuencia Esperada (hi modelo)",
pch = 19, col = "#2E86C1")
abline(lm(Fe2 ~ 0 + Fo2), col = "red", lwd = 2)
legend("topleft", legend = paste0("r = ", round(r_pearson2, 2), "%"), bty = "n")
# Sur
chi2_calc1 <- sum(((Fo1 - Fe1)^2) / Fe1)
gl1 <- length(Fo1) - 2
chi2_crit1 <- qchisq(0.95, gl1)
cat("Chi-Cuadrado:", round(chi2_calc1, 4), "\n")
## Chi-Cuadrado: 0.7853
cat("Valor Crítico:", round(chi2_crit1, 4), "\n")
## Valor Crítico: 16.919
cat("¿El modelo Normal (Sur) es aceptado?:", chi2_calc1 < chi2_crit1, "\n")
## ¿El modelo Normal (Sur) es aceptado?: TRUE
# Norte
chi2_calc2 <- sum(((Fo2 - Fe2)^2) / Fe2)
gl2 <- length(Fo2) - 2
chi2_crit2 <- qchisq(0.95, gl2)
cat("Chi-Cuadrado:", round(chi2_calc2, 4), "\n")
## Chi-Cuadrado: 0.4839
cat("Valor Crítico:", round(chi2_crit2, 4), "\n")
## Valor Crítico: 22.362
cat("¿El modelo Normal (Norte) es aceptado?:", chi2_calc2 < chi2_crit2, "\n")
## ¿El modelo Normal (Norte) es aceptado?: TRUE
resumen_ajuste <- data.frame(
Segmento = c("Hemisferio Sur", "Hemisferio Norte"),
Modelo = c("Normal", "Normal"),
`Test Pearson (%)` = round(c(r_pearson1, r_pearson2), 2),
`Chi Cuadrado` = round(c(chi2_calc1, chi2_calc2), 4),
`Umbral de Aceptación` = round(c(chi2_crit1, chi2_crit2), 4),
check.names = FALSE
) %>%
mutate(Resultado = ifelse(`Chi Cuadrado` < `Umbral de Aceptación`,
"Modelo Aceptado", "Modelo Rechazado"))
resumen_ajuste %>%
gt() %>%
tab_header(
title = md("**Tabla N°2: Resumen del Test de Bondad al Modelo Híbrido**")
) %>%
tab_source_note(source_note = "Autor: Grupo 5") %>%
cols_align(align = "center", columns = everything()) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
table_body.border.bottom.color = "black"
)
| Tabla N°2: Resumen del Test de Bondad al Modelo Híbrido | |||||
| Segmento | Modelo | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación | Resultado |
|---|---|---|---|---|---|
| Hemisferio Sur | Normal | 2.31 | 0.7853 | 16.919 | Modelo Aceptado |
| Hemisferio Norte | Normal | 60.15 | 0.4839 | 22.362 | Modelo Aceptado |
| Autor: Grupo 5 | |||||
A partir del modelo Normal validado para el Hemisferio Norte, se calcula la probabilidad teórica de que un yacimiento se ubique en la franja del “cinturón petrolero” clásico (entre los paralelos 30° y 60° Norte).
prob_cinturon <- (pnorm(60, mu2, sd2) - pnorm(30, mu2, sd2)) * 100
cat("Probabilidad de ubicarse entre 30° y 60° de latitud Norte (cinturón petrolero):",
round(prob_cinturon, 2), "%\n")
## Probabilidad de ubicarse entre 30° y 60° de latitud Norte (cinturón petrolero): 59.73 %
pozos_sur <- n_sur
cat("Pozos ubicados en el Hemisferio Sur:", pozos_sur,
"(", round(pozos_sur / n * 100, 2), "%)\n")
## Pozos ubicados en el Hemisferio Sur: 636 ( 8.44 %)
Por el Teorema del Límite Central (TLC), se calcula el intervalo de confianza al 95% para la media poblacional de la Latitud a nivel mundial (Z = 1.96).
x_bar <- mean(Variable, na.rm = TRUE)
sigma <- sd(Variable, na.rm = TRUE)
z <- qnorm(0.975)
margen <- z * (sigma / sqrt(n))
ic_inf <- x_bar - margen
ic_sup <- x_bar + margen
cat("Media muestral (centro de masa latitudinal):", round(x_bar, 3), "\n")
## Media muestral (centro de masa latitudinal): 32.254
cat("Intervalo de confianza al 95%: (", round(ic_inf, 3), "° ,", round(ic_sup, 3), "° )\n")
## Intervalo de confianza al 95%: ( 31.738 ° , 32.769 ° )
La variable Latitud exhibe un comportamiento bimodal ligado al hemisferio: el Hemisferio Sur (8.44% de los registros) se ajusta a un modelo Normal (μ = -21.4°, σ = 16.3°) con una correlación de Pearson del 2.31% y un Chi-cuadrado de 0.7853 frente a un valor crítico de 16.919 (modelo aceptado). El Hemisferio Norte (91.56% de los registros) se ajusta a un modelo Normal (μ = 37.2°, σ = 15.97°) con una correlación de Pearson del 60.15% y un Chi-cuadrado de 0.4839 frente a un valor crítico de 22.362 (modelo aceptado). Bajo el modelo Normal del Hemisferio Norte, la probabilidad de que un yacimiento se ubique en el cinturón petrolero clásico (30°-60° Norte) es del 59.73%. Finalmente, el intervalo de confianza al 95% para la media poblacional de la Latitud se ubica entre 31.738° y 32.769°, lo que confirma la marcada concentración de la industria petrolera y gasífera en el Hemisferio Norte.