1 Carga y Exploración Inicial de Datos

1.1 Procesamiento y Limpieza de Datos

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
cat("Rango de años:", min(Variable_Exacta), "–", max(Variable_Exacta), "\n")
## Rango de años: 1922 – 2017

2 Distribución de Frecuencias

2.1 Cálculo de Frecuencias por Década

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

2.2 Tabla de Distribución por Décadas

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

3 Análisis Gráfico

3.1 Gráficos de Barras — Frecuencia Absoluta

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

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

3.2 Gráficos de Barras — Frecuencia Porcentual

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

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

3.3 Diagrama de Caja (Boxplot)

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.

3.4 Ojivas Acumuladas

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


4 Estadísticos Descriptivos

4.1 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), "]")

4.2 Tabla de Estadísticos Descriptivos

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*