# Carga de librerias
library(readxl)
library(dplyr)
library(gt)
library(e1071)
library(lubridate)
# Datos
setwd("C:/Users/majke/Downloads/Proyecto Estadistica/RMARKDOWN")
Datos_Brutos <- read.csv(
"Pozos brasil 2.csv",
header = TRUE,
sep = ";",
dec = "/",
fileEncoding = "Latin1"
)
# Extraer variable de interés
Datos <- Datos_Brutos %>%
mutate(
Fecha_Obj = as.Date(TERMINO, 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)
)
# Variables de trabajo
Variable_Exacta <- Datos$Anio_Exacto
Variable_Clases <- Datos$Periodo
Variable_Orden <- Datos$Decada_Termino
# Verificación: detener el proceso si no hay datos válidos
if (length(Variable_Exacta) == 0) {
stop("ERROR: No hay datos válidos en la columna TERMINO.")
}
cat("Total de registros válidos:", length(Variable_Exacta), "\n")## Total de registros válidos: 27729
## 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)
)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 = "Elaboración: Grupo 3") %>%
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 | — | — | — | — |
| Elaboración: Grupo 3 | ||||||
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)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)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)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)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.
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()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 (muy cercana a la mediana de 1,987.00), con una desviación estándar de 16.29, con 54 valores atípicos correspondientes al rango [1922 – 1943], 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, ya que la concentración de términos en las décadas recientes con valores atípicos históricos evidencia una industria con un ciclo de vida prolongado que reduce su actividad en el tiempo.