INTRODUCCIÓN
Este estudio analiza la evolución temporal de los pozos petrolíferos en Brasil. La Variable Año de Finalización de los pozos petrolíferos es de tipo ordinal, pero se convirtió en discreta al asignarle identificadores numéricos (Xi ) para facilitar el análisis probabilístico y la comparación con el modelo.
Carga de paquetes
Importación del archivo
Filtrado de fechas
Datos <- Datos_Brutos %>%
mutate(
Fecha_Limpieza = trimws(as.character(TERMINO)),
Fecha_Obj = if_else(
grepl("-", Fecha_Limpieza),
as.Date(Fecha_Limpieza, format = "%Y-%m-%d"),
as.Date(Fecha_Limpieza, format = "%d/%m/%Y")
),
Anio_Exacto = year(Fecha_Obj)
) %>%
filter(!is.na(Anio_Exacto) & Anio_Exacto > 1900) %>%
mutate(
Decada_Termino = floor(Anio_Exacto / 10) * 10,
Periodo = paste0(Decada_Termino, " - ", Decada_Termino + 9)
)
Variable_Exacta <- Datos$Anio_Exacto
Variable_Clases <- Datos$Periodo
Variable_Orden <- Datos$Decada_Termino
if(length(Variable_Exacta) == 0) {
stop("ERROR: No hay datos válidos. Revisa si la columna en el CSV se llama exactamente 'TERMINO'.")
}## Rango de años: 1922 – 2017
df_calc <- data.frame(Periodo = Variable_Clases, Orden = Variable_Orden)
TDF_Raw <- df_calc %>%
group_by(Orden, Periodo) %>%
summarise(ni = n(), .groups = "drop") %>%
arrange(Orden)
# Cálculo de todas las frecuencias
ni <- TDF_Raw$ni
N <- sum(ni)
hi <- (ni / N) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
# Tabla consolidada
TDF_Decadas <- data.frame(
Periodo = TDF_Raw$Periodo,
ni = ni,
hi = round(hi, 2),
Ni_asc = Ni_asc,
Ni_desc = Ni_desc,
Hi_asc = round(Hi_asc, 2),
Hi_desc = round(Hi_desc, 2)
)Tabla de Distribución por Décadas
# 1. Convertimos todo TDF_Decadas a texto (character) para que acepte los guiones "—"
totales <- c("TOTAL", sum(ni), round(sum(hi), 2), "—", "—", "—", "—")
TDF_Char <- TDF_Decadas %>% mutate(across(everything(), as.character))
TDF_Show <- rbind(TDF_Char, totales)
TDF_Show %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN DE FRECUENCIAS POR DÉCADAS**"),
subtitle = md("Variable: **Año de Término de Perforación** | Fuente: Tabela de Poços 2018")
) %>%
tab_source_note(source_note = "Autor: Ashly Alzate") %>%
cols_label(
Periodo = "Período (Década)",
ni = md("Frec. Abs. (*n*ᵢ)"),
hi = md("Frec. Rel. (*h*ᵢ %)"),
Ni_asc = md("Frec. Acum. Asc. (*N*ᵢ↑)"),
Ni_desc = md("Frec. Acum. Desc. (*N*ᵢ↓)"),
Hi_asc = md("% Acum. Asc. (*H*ᵢ↑)"),
Hi_desc = md("% Acum. Desc. (*H*ᵢ↓)")
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_title()
) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_column_labels()
) %>%
tab_style(
style = list(cell_fill(color = "#D5D8DC"), cell_text(weight = "bold")),
locations = cells_body(rows = nrow(TDF_Show)) # Fila TOTAL
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(6)
)| DISTRIBUCIÓN DE FRECUENCIAS POR DÉCADAS | ||||||
| Variable: Año de Término de Perforación | Fuente: Tabela de Poços 2018 | ||||||
| Período (Década) | Frec. Abs. (nᵢ) | Frec. Rel. (hᵢ %) | Frec. Acum. Asc. (Nᵢ↑) | Frec. Acum. Desc. (Nᵢ↓) | % Acum. Asc. (Hᵢ↑) | % Acum. Desc. (Hᵢ↓) |
|---|---|---|---|---|---|---|
| 1920 - 1929 | 2 | 0.01 | 2 | 27729 | 0.01 | 100 |
| 1930 - 1939 | 4 | 0.01 | 6 | 27727 | 0.02 | 99.99 |
| 1940 - 1949 | 188 | 0.68 | 194 | 27723 | 0.7 | 99.98 |
| 1950 - 1959 | 818 | 2.95 | 1012 | 27535 | 3.65 | 99.3 |
| 1960 - 1969 | 2427 | 8.75 | 3439 | 26717 | 12.4 | 96.35 |
| 1970 - 1979 | 2523 | 9.1 | 5962 | 24290 | 21.5 | 87.6 |
| 1980 - 1989 | 9538 | 34.4 | 15500 | 21767 | 55.9 | 78.5 |
| 1990 - 1999 | 3663 | 13.21 | 19163 | 12229 | 69.11 | 44.1 |
| 2000 - 2009 | 3941 | 14.21 | 23104 | 8566 | 83.32 | 30.89 |
| 2010 - 2019 | 4625 | 16.68 | 27729 | 4625 | 100 | 16.68 |
| TOTAL | 27729 | 100 | — | — | — | — |
| Autor: Ashly Alzate | ||||||
Análisis Gráfico
#Gráficos de Barras — Frecuencia Absoluta
#Escala Local
par(mar = c(10, 5, 4, 2))
bp <- barplot(
vals_y,
main = "Gráfica N°1: Distribución de Fecha de Término de Pozos Petroleros de Brasil\n(Escala local — máximo ajustado a los datos)",
cex.main = 0.78,
ylab = "Cantidad de Pozos Finalizados",
col = col_barra,
border = "white",
axes = FALSE,
ylim = c(0, max(vals_y) * 1.1),
axisnames = FALSE
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = bp, labels = vals_x, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Década", line = 8)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)Escala Global
par(mar = c(10, 5, 4, 2))
bp2 <- barplot(
vals_y,
main = "Gráfica N°2: Distribución de Fecha de Término de Pozos Petroleros de Brasil\n(Escala global — eje Y hasta el total N)",
cex.main = 0.78,
ylab = "Cantidad de Pozos Finalizados",
col = col_barra,
border = "white",
axes = FALSE,
ylim = c(0, N),
axisnames = FALSE
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = bp2, labels = vals_x, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
title(xlab = "Década", line = 8)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)Análisis Gráfico
#Gráficos de Barras — Frecuencia Porcentual
#Escala Loca
par(mar = c(10, 5, 4, 2))
bp3 <- barplot(
vals_y_pct,
main = "Gráfica N°3: Distribución Porcentual de Fecha de Término de Pozos Petroleros de Brasil\n(Escala local — máximo ajustado al porcentaje mayor)",
cex.main = 0.78,
ylab = "Porcentaje del Total (%)",
col = col_barra,
border = "white",
axes = FALSE,
ylim = c(0, max(vals_y_pct) * 1.2),
axisnames = FALSE
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = bp3, labels = vals_x, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
text(x = bp3, y = vals_y_pct, label = paste0(round(vals_y_pct, 1), "%"),
pos = 3, cex = 0.7, col = col_ejes)
title(xlab = "Década", line = 8)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)Escala Global
par(mar = c(10, 5, 4, 2))
bp4 <- barplot(
vals_y_pct,
main = "Gráfica N°4: Distribución Porcentual de Fecha de Término de Pozos Petroleros de Brasil\n(Escala global — eje Y de 0% a 100%)",
cex.main = 0.78,
ylab = "Porcentaje del Total (%)",
col = col_barra,
border = "white",
axes = FALSE,
ylim = c(0, 100),
axisnames = FALSE
)
axis(2, col = col_ejes, col.axis = col_ejes)
axis(1, at = bp4, labels = vals_x, col = col_ejes, col.axis = col_ejes, las = 2, cex.axis = 0.8)
text(x = bp4, y = vals_y_pct, label = paste0(round(vals_y_pct, 1), "%"),
pos = 3, cex = 0.7, col = col_ejes)
title(xlab = "Década", line = 8)
abline(h = seq(0, 100, 20), col = "#D7DBDD", lty = "dotted")
box(bty = "l", col = col_ejes)Diagrama de Caja
par(mar = c(7, 5, 5, 2))
boxplot(
Variable_Exacta,
horizontal = TRUE,
col = col_barra,
main = "Gráfica N°5: Diagrama de Caja — Año Exacto de Término\nPozos Petroleros de Brasil",
cex.main = 0.82,
xlab = "",
outline = TRUE,
outpch = 19,
outcol = col_rojo,
boxwex = 0.5,
frame.plot = FALSE,
xaxt = "n"
)
eje_x <- pretty(Variable_Exacta, n = 8)
axis(1, at = eje_x, labels = format(eje_x, scientific = FALSE),
cex.axis = 0.8, col = col_ejes, col.axis = col_ejes)
title(xlab = "Año Exacto de Término", line = 4)
grid(nx = NULL, ny = NA, col = "lightgray", lty = "dotted")Lectura del boxplot: La caja concentra el 50% central de los datos (entre el Q1 y Q3). La línea interior marca la mediana. Los puntos rojos representan valores atípicos —pozos finalizados entre 1922 y mediados de los años 1940— que pertenecen al período pionero de la industria petrolera brasileña y no son errores de datos, sino observaciones históricamente válidas.
Ojivas Acomuladas
par(mar = c(10, 5, 4, 8), xpd = TRUE)
y_asc <- TDF_Decadas$Ni_asc
y_desc <- TDF_Decadas$Ni_desc
plot(
vals_x_num, y_asc,
type = "o",
col = col_azul,
lwd = 2,
pch = 19,
main = "Gráfica N°6: Ojivas Ascendente y Descendente Acumuladas por Décadas\nFecha de Término — Pozos Petroleros de Brasil",
cex.main = 0.75,
ylab = "Frecuencia Acumulada (Nᵢ)",
xlab = "",
axes = FALSE,
frame.plot = FALSE
)
lines(vals_x_num, y_desc, type = "o", col = col_rojo, lwd = 2, pch = 19)
axis(1, at = vals_x_num, labels = TDF_Decadas$Periodo,
las = 2, cex.axis = 0.8, col = col_ejes, col.axis = col_ejes)
axis(2, col = col_ejes, col.axis = col_ejes)
title(xlab = "Década", line = 8)
legend(
"right",
legend = c("Ojiva Ascendente", "Ojiva Descendente"),
col = c(col_azul, col_rojo),
lty = 1, pch = 19, cex = 0.75, lwd = 2,
inset = c(-0.18, 0), bty = "n"
)
grid()Cálculo de Medidas Resumen
media_val <- mean(Variable_Exacta)
mediana_val <- median(Variable_Exacta)
t_moda <- table(Variable_Exacta)
freq_max <- max(t_moda)
modas_calc <- as.numeric(names(t_moda)[t_moda == freq_max])
moda_txt <- paste(modas_calc, collapse = ", ")
varianza_val <- var(Variable_Exacta)
sd_val <- sd(Variable_Exacta)
cv_val <- (sd_val / abs(media_val)) * 100
# Asimetría: type = 2 → fórmula de Fisher (estándar académico)
# Negativa → cola izquierda (años más antiguos)
asimetria_val <- skewness(Variable_Exacta, type = 2)
# Curtosis: type = 2 → exceso de curtosis (0 = normal)
# Positivo = leptocúrtica; Negativo = platicúrtica
curtosis_val <- kurtosis(Variable_Exacta, type = 2)
# Outliers por criterio de Tukey
vals_atipicos <- boxplot.stats(Variable_Exacta)$out
num_atipicos <- length(vals_atipicos)
rango_atipicos <- if (num_atipicos > 0) {
paste0(num_atipicos, " valores [",
min(vals_atipicos), " – ", max(vals_atipicos), "]")
} else {
"0 (Sin atípicos)"
}
rango_txt <- paste0("[", min(Variable_Exacta), "; ", max(Variable_Exacta), "]")df_resumen <- data.frame(
Variable = "Año de Término (Exacto)",
Rango = rango_txt,
Media = media_val,
Mediana = mediana_val,
Moda = moda_txt,
Varianza = varianza_val,
Desv_Std = sd_val,
CV_Porc = cv_val,
Asimetria = asimetria_val,
Curtosis = curtosis_val,
Atipicos = rango_atipicos
)
df_resumen %>%
gt() %>%
tab_header(
title = md("**CONCLUSIONES Y ESTADISTICOS**"),
subtitle = md("Resumen de Indicadores del Año Exacto de Termino de los Pozos Petrolíferos en Brasil")
) %>%
tab_source_note(source_note = "Autor: Ashly Alzate") %>%
fmt_number(
columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc),
decimals = 2
) %>%
fmt_number(
columns = c(Asimetria, Curtosis),
decimals = 4
) %>%
cols_label(
Variable = "Variable",
Rango = "Rango [Mín; Máx]",
Media = md("Media (X̄)"),
Mediana = "Mediana (Me)",
Moda = "Moda (Mo)",
Varianza = md("Varianza (S²)"),
Desv_Std = "Desv. Est. (S)",
CV_Porc = "C.V. (%)",
Asimetria = md("Asimetría (As)"),
Curtosis = "Curtosis (K)",
Atipicos = "Outliers"
) %>%
tab_spanner(
label = "Tendencia Central",
columns = c(Media, Mediana, Moda)
) %>%
tab_spanner(
label = "Forma",
columns = c(Asimetria, Curtosis)
) %>%
tab_options(
column_labels.background.color = "#2E4053",
table.border.top.color = "black",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(8)
) %>%
tab_style(
style = list(cell_text(weight = "bold", color = "white")),
locations = cells_column_labels()
) %>%
tab_style(
style = list(cell_text(weight = "bold", color = "white")),
locations = cells_column_spanners()
)| CONCLUSIONES Y ESTADISTICOS | ||||||||||
| Resumen de Indicadores del Año Exacto de Termino de los Pozos Petrolíferos en Brasil | ||||||||||
| Variable | Rango [Mín; Máx] |
Tendencia Central
|
Varianza (S²) | Desv. Est. (S) | C.V. (%) |
Forma
|
Outliers | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Media (X̄) | Mediana (Me) | Moda (Mo) | Asimetría (As) | Curtosis (K) | ||||||
| Año de Término (Exacto) | [1922; 2017] | 1,989.81 | 1,987.00 | 1986 | 265.42 | 16.29 | 0.82 | −0.2143 | −0.5453 | 54 valores [1922 – 1943] |
| Autor: Ashly Alzate | ||||||||||
Los valores de la variable Año de Término fluctúan entre 1922 y 2017 y giran en torno a la media de 1,989.81 (coincidente con la mediana de 1,987.00), con una desviación estándar de 16.29, con 54 valores atípicos identificados, siendo un conjunto de datos heterogéneo (C.V. = 0.82%), cuyos valores se agrupan fuertemente en la parte alta de la variable. Por lo anterior, el comportamiento es perjudicial.