itle: “Estadística Descriptiva: Variables Discretas.”
ate: “2025-11-10”
utput:
html_document:
toc: true
toc_depth: 2
toc_float: true
number_sections: true
theme: united # Puedes usar: journal
highlight: tango
code_folding: none
fontsize: 8pt

Instalación y Carga de Librerías

install.packages(c("janitor", "readxl", "tidyverse", "skimr", "GGally", "rstatix", "dplyr"))
install.packages("e1071")

library(tidyverse)
library(janitor)
library(readxl)
library(dplyr)
library(e1071)
# library(skimr) # No se usa explícitamente en el código, pero estaba en install
# library(GGally) # No se usa explícitamente en el código, pero estaba en install
# library(rstatix) # No se usa explícitamente en el código, pero estaba en install

# 2. Carga y Preparación de Datos
# Asegúrate de que el archivo 'Derrames.xlsx' esté en tu directorio de trabajo.
# Usamos tryCatch para manejar el error si el archivo no existe
tryCatch({
  df <- read_excel("Derrames.xlsx", sheet = 1) %>%
    clean_names()
  
  # Exploración inicial (Opcional, pero útil)
  cat("Dimensiones del data frame (filas, columnas):\n")
  print(dim(df))
  cat("\nPrimeras filas del data frame:\n")
  print(head(df))
  cat("Estructura del data frame:\n")
  print(glimpse(df))
}, error = function(e) {
  cat("\nERROR CRÍTICO: No se pudo encontrar o leer el archivo 'Derrames.xlsx'.\n")
  cat("Por favor, asegúrate de que el archivo xlsx esté en la misma carpeta que este archivo Rmd.\n")
  cat("Detalles del error:", conditionMessage(e), "\n")
  knitr::knit_exit() # Detiene la ejecución si no hay datos
})
## Dimensiones del data frame (filas, columnas):
## [1] 3550   23
## 
## Primeras filas del data frame:
## # A tibble: 6 × 23
##      id   dia   mes ano   nombre   ubicacion latitud longuitud amenaza etiquetas
##   <dbl> <dbl> <dbl> <chr> <chr>    <chr>       <dbl>     <dbl> <chr>   <chr>    
## 1  6786    19     1 A     Arabian… Persian …    29.5     48    Oil     <NA>     
## 2  6250     3     6 1979  IXTOC I… Bahia de…    19.4    -92.3  Oil     Collision
## 3  8220    21     4 2010  Deepwat… Gulf of …    28.7    -88.4  Oil     <NA>     
## 4  6241    16     3 1978  Amoco C… Brittany…    48.6     -4.72 Oil     Grounding
## 5  6216    19    12 1972  Sea Sta… Gulf of …    25.3     57.6  Unknown <NA>     
## 6  6620     7    10 1988  M/V JAH… Delaware…    39.8    -75.4  Unknown <NA>     
## # ℹ 13 more variables: tipo_de_crudo <chr>,
## #   cantidad_recuperada_superficie <dbl>, cantidad_recuperada_costas <dbl>,
## #   cantidad_tratada_biologicamente <dbl>,
## #   cantidad_dispersada_quimicamente <dbl>, cantidad_quemada <dbl>,
## #   maximo_liberacion_galones <dbl>, barreras_de_contencion_flotantes <dbl>,
## #   causa_principal <chr>, volumen_derramados_galones <chr>,
## #   respuesta_actual_galones <dbl>, fuente_respuesta <chr>, …
## Estructura del data frame:
## Rows: 3,550
## Columns: 23
## $ id                               <dbl> 6786, 6250, 8220, 6241, 6216, 6620, 6…
## $ dia                              <dbl> 19, 3, 21, 16, 19, 7, 10, 12, 18, 29,…
## $ mes                              <dbl> 1, 6, 4, 3, 12, 10, 2, 5, 3, 1, 12, 6…
## $ ano                              <chr> "A", "1979", "2010", "1978", "1972", …
## $ nombre                           <chr> "Arabian Gulf Spills; Persian Gulf, K…
## $ ubicacion                        <chr> "Persian Gulf, Kuwait", "Bahia de Cam…
## $ latitud                          <dbl> 29.50000, 19.40830, 28.73670, 48.5833…
## $ longuitud                        <dbl> 48.00000, -92.32500, -88.38720, -4.71…
## $ amenaza                          <chr> "Oil", "Oil", "Oil", "Oil", "Unknown"…
## $ etiquetas                        <chr> NA, "Collision", NA, "Grounding", NA,…
## $ tipo_de_crudo                    <chr> "Kuwait crude oil", "IXTOC I crude oi…
## $ cantidad_recuperada_superficie   <dbl> NA, NA, 1, NA, NA, NA, NA, NA, NA, NA…
## $ cantidad_recuperada_costas       <dbl> NA, NA, 1, NA, NA, NA, NA, NA, NA, NA…
## $ cantidad_tratada_biologicamente  <dbl> 1, NA, 1, 1, NA, NA, NA, NA, NA, NA, …
## $ cantidad_dispersada_quimicamente <dbl> NA, 1, 1, 1, NA, NA, NA, 1, 1, 1, 1, …
## $ cantidad_quemada                 <dbl> NA, 1, 1, NA, NA, NA, NA, 1, 1, 1, NA…
## $ maximo_liberacion_galones        <dbl> 336000009, -1, 205000000, 68000017, -…
## $ barreras_de_contencion_flotantes <dbl> 35, 12, 182, 17, 3, 3, 7, 8, 5, 6, 7,…
## $ causa_principal                  <chr> "Daño del tanque", "Incendio y explos…
## $ volumen_derramados_galones       <chr> "336000000", "365000000", "600000000"…
## $ respuesta_actual_galones         <dbl> 336000000, 252000000, 168000000, 6870…
## $ fuente_respuesta                 <chr> "description and posts", "posts", "de…
## $ etiqueta_actualizacion           <chr> "RA updated", "RA newly acquired", "R…
## # A tibble: 3,550 × 23
##       id   dia   mes ano   nombre  ubicacion latitud longuitud amenaza etiquetas
##    <dbl> <dbl> <dbl> <chr> <chr>   <chr>       <dbl>     <dbl> <chr>   <chr>    
##  1  6786    19     1 A     Arabia… Persian …    29.5     48    Oil     <NA>     
##  2  6250     3     6 1979  IXTOC … Bahia de…    19.4    -92.3  Oil     Collision
##  3  8220    21     4 2010  Deepwa… Gulf of …    28.7    -88.4  Oil     <NA>     
##  4  6241    16     3 1978  Amoco … Brittany…    48.6     -4.72 Oil     Grounding
##  5  6216    19    12 1972  Sea St… Gulf of …    25.3     57.6  Unknown <NA>     
##  6  6620     7    10 1988  M/V JA… Delaware…    39.8    -75.4  Unknown <NA>     
##  7  6262    10     2 1983  Nowruz… Persian …    29.5     49.6  Unknown <NA>     
##  8  6229    12     5 1976  Urquio… La Coru€…    43.4     -8.38 Oil     Collision
##  9  6201    18     3 1967  Torrey… Lands En…    50.0     -4.73 Unknown <NA>     
## 10  6221    29     1 1975  Jakob … Leixoes,…    41.2     -8.83 Unknown <NA>     
## # ℹ 3,540 more rows
## # ℹ 13 more variables: tipo_de_crudo <chr>,
## #   cantidad_recuperada_superficie <dbl>, cantidad_recuperada_costas <dbl>,
## #   cantidad_tratada_biologicamente <dbl>,
## #   cantidad_dispersada_quimicamente <dbl>, cantidad_quemada <dbl>,
## #   maximo_liberacion_galones <dbl>, barreras_de_contencion_flotantes <dbl>,
## #   causa_principal <chr>, volumen_derramados_galones <chr>, …

1.Variable Mes

# Conversión y limpieza de la variable mes
mes <- as.numeric(df$mes)
mes <- na.omit(mes) # Elimina NA

1.1 Indicadores Descriptivos para mes

cat("\n## Indicadores de Posición, Dispersión y Forma - MES\n")
## 
## ## Indicadores de Posición, Dispersión y Forma - MES
# Indicadores de Posición
media_mes <- mean(mes)
mediana_mes <- median(mes)
# La moda es el valor más frecuente
moda_mes <- as.numeric(names(sort(table(mes), decreasing = TRUE)[1])) 

cuartiles_mes <- quantile(mes, probs = c(0.25, 0.50, 0.75))
percentil_90_mes <- quantile(mes, probs = 0.90)
deciles_mes <- quantile(mes, probs = seq(0.1, 0.9, 0.1))
quintiles_mes <- quantile(mes, probs = seq(0.2, 0.8, 0.2))


cat("\n### Indicadores de Posición\n")
## 
## ### Indicadores de Posición
cat("Media:", round(media_mes, 2), "\n")
## Media: 6.49
cat("Mediana:", mediana_mes, "\n")
## Mediana: 7
cat("Moda:", moda_mes, "\n")
## Moda: 7
cat("Cuartiles (Q1, Q2, Q3):\n")
## Cuartiles (Q1, Q2, Q3):
print(cuartiles_mes)
## 25% 50% 75% 
##   3   7  10
cat("Percentil 90 (P90):", round(percentil_90_mes, 2), "\n")
## Percentil 90 (P90): 11
# cat("Deciles:\n"); print(deciles_mes)
# cat("Quintiles:\n"); print(quintiles_mes)


# Indicadores de Dispersión
varianza_mes <- var(mes)
desv_estandar_mes <- sd(mes)
coef_variacion_mes <- (desv_estandar_mes / media_mes) * 100

cat("\n### Indicadores de Dispersión\n")
## 
## ### Indicadores de Dispersión
cat("Varianza:", round(varianza_mes, 2), "\n")
## Varianza: 12.09
cat("Desviación estándar:", round(desv_estandar_mes, 2), "\n")
## Desviación estándar: 3.48
cat("Coeficiente de variación (CV):", round(coef_variacion_mes, 2), "%\n")
## Coeficiente de variación (CV): 53.56 %
# Indicadores de Forma
asimetria_mes <- skewness(mes)
curtosis_mes <- kurtosis(mes)

cat("\n### Indicadores de Forma\n")
## 
## ### Indicadores de Forma
cat("Coeficiente de asimetría (Sesgo):", round(asimetria_mes, 2), "\n")
## Coeficiente de asimetría (Sesgo): -0.02
cat("Curtosis:", round(curtosis_mes, 2), "\n")
## Curtosis: -1.23
# Cálculo de la Tabla de Frecuencias
TDF_mes <- table(mes)
Tabla_mes <- as.data.frame(TDF_mes)
names(Tabla_mes) <- c("mes", "Freq")

hi_mes <- (Tabla_mes$Freq / sum(Tabla_mes$Freq) * 100)
Ni_asc <- cumsum(Tabla_mes$Freq)
Hi_asc <- cumsum(hi_mes)
Ni_dsc <- rev(cumsum(rev(Tabla_mes$Freq)))
Hi_dsc <- rev(cumsum(rev(hi_mes)))

Tabla_mes_Final <- data.frame(
  Mes = as.numeric(as.character(Tabla_mes$mes)),
  ni = Tabla_mes$Freq,
  hi = round(hi_mes, 2),
  Ni_asc = Ni_asc,
  Hi_asc = round(Hi_asc, 2),
  Ni_dsc = Ni_dsc,
  Hi_dsc = round(Hi_dsc, 2)
)
cat("\n### Tabla de Frecuencias - Mes\n")
## 
## ### Tabla de Frecuencias - Mes
print(Tabla_mes_Final)
##    Mes  ni   hi Ni_asc Hi_asc Ni_dsc Hi_dsc
## 1    1 308 8.68    308   8.68   3550 100.00
## 2    2 324 9.13    632  17.80   3242  91.32
## 3    3 292 8.23    924  26.03   2918  82.20
## 4    4 263 7.41   1187  33.44   2626  73.97
## 5    5 263 7.41   1450  40.85   2363  66.56
## 6    6 287 8.08   1737  48.93   2100  59.15
## 7    7 326 9.18   2063  58.11   1813  51.07
## 8    8 323 9.10   2386  67.21   1487  41.89
## 9    9 267 7.52   2653  74.73   1164  32.79
## 10  10 312 8.79   2965  83.52    897  25.27
## 11  11 285 8.03   3250  91.55    585  16.48
## 12  12 300 8.45   3550 100.00    300   8.45

1.2 Gráfico de Barras

cat("\n### 1.1 Gráfico de Barras - Mes\n")
## 
## ### 1.1 Gráfico de Barras - Mes
nombres_meses <- c("Enero","Febrero","Marzo","Abril","Mayo","Junio",
                   "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre")

# Asegurar que ylim no falle si la tabla está vacía (aunque improbable aquí)
ylim_max <- if(nrow(Tabla_mes_Final) > 0) max(Tabla_mes_Final$ni) * 1.1 else 10

barplot(
  Tabla_mes_Final$ni,
  main = "Diagrama de barras: Gráfica de Distribución de meses",
  xlab = "Meses del año",
  ylab = "Cantidad",
  col  = "blue",
  names.arg = nombres_meses,
  ylim = c(0, ylim_max),
  las = 2, # Rotar etiquetas del eje x
  cex.names = 0.7 # Tamaño de las etiquetas
)

1.3 Diagrama de Caja

cat("\n### 1.2 Diagrama de Caja - Mes\n")
## 
## ### 1.2 Diagrama de Caja - Mes
boxplot(mes,
        horizontal=T,
        col="darkblue",
        main="Gráfica de Distribución de meses de meses en los que ocurre los derrames",
        xlab = "Meses del año")

1.4 Ojivas

cat("\n### 1.3 Ojivas - Mes\n")
## 
## ### 1.3 Ojivas - Mes
x_vals <- 1:12
ymax <- if(nrow(Tabla_mes_Final) > 0) max(Tabla_mes_Final$Ni_asc) * 1.1 else 10

1.4.1 Ojivas ascendente

plot(x_vals, Tabla_mes_Final$Ni_asc,
     type = "p",
     pch = 19,
     col = "blue",
     xaxt = "n",
     ylim = c(0, ymax),
     main = "Gráfica de Ojiva ascendente de meses",
     xlab = "Meses (1=Enero, 12=Diciembre)",
     ylab = "Cantidad")
axis(1, at = 1:12, labels = 1:12, las = 2)

1.4.2 Ojiva descendete

x_ni_dsc <- 1:12
y_ni_dsc <- Tabla_mes_Final$Ni_dsc
plot(x_ni_dsc,
     y_ni_dsc,
     type = "p",
     main = "Gráfica de Ojivas descendentes de meses en los que ocurren los derrames",
     ylab = "Cantidad",
     xlab = "Meses (1=Enero, 12=Diciembre)",
     col = "red",
     pch = 19,
     xaxt = "n",
     ylim = c(0, ymax)) # Agregado ylim para consistencia
axis(1, at = 1:12, labels = 1:12, las = 2)

1.4.3 OJjivas asc y dsc

plot(x_vals, Tabla_mes_Final$Ni_asc,
     type = "p",
     main = "Gráfica de Ojivas de meses",
     ylab = "Cantidad",
     xlab = "Meses (1=Enero, 12=Diciembre)",
     col = "blue",
     xaxt = "n",
     pch = 19,
     ylim = c(0, ymax))
axis(1, at = 1:12, labels = 1:12, las = 2)
points(x_vals, Tabla_mes_Final$Ni_dsc, col = "red", pch = 19)
legend("topright",
       legend = c("Ascendente", "Descendente"),
       col = c("blue", "red"),
       pch = 19)

1.5 Conclusión

cat("\n### 1.4 Conclusión - Mes\n")
## 
## ### 1.4 Conclusión - Mes
cat("El comportamiento de la variable de los meses fluctúa entre [1-12] y los valores se encuentran en torno a la mediana de 7 , con una desviación estándar de 3.48 , siendo un conjunto con un coeficiente de variación heterogéneo (53.56%) y tiene un sesgo levemente negativo (-0.02) , sin presencia significativa de valores atípicos dado su comportamiento uniforme.\n")
## El comportamiento de la variable de los meses fluctúa entre [1-12] y los valores se encuentran en torno a la mediana de 7 , con una desviación estándar de 3.48 , siendo un conjunto con un coeficiente de variación heterogéneo (53.56%) y tiene un sesgo levemente negativo (-0.02) , sin presencia significativa de valores atípicos dado su comportamiento uniforme.

2. Variable Año

cat("\n--- Análisis de la variable 'ano' (Continua/Agrupada) ---\n")
## 
## --- Análisis de la variable 'ano' (Continua/Agrupada) ---
# Conversión y limpieza de la variable Año
ano <- as.numeric(df$ano)
ano <- na.omit(ano)

2.1 Indicadores Descriptivos para Año

cat("\n## Indicadores de Posición, Dispersión y Forma - AÑO\n")
## 
## ## Indicadores de Posición, Dispersión y Forma - AÑO
# Indicadores de Posición
media_ano <- mean(ano)
mediana_ano <- median(ano)
moda_ano_calc <- as.numeric(names(sort(table(ano), decreasing = TRUE)[1]))

cuartiles_ano <- quantile(ano, probs = c(0.25, 0.50, 0.75))
percentil_90_ano <- quantile(ano, probs = 0.90)

cat("\n### Indicadores de Posición\n")
## 
## ### Indicadores de Posición
cat("Media:", round(media_ano, 2), "\n")
## Media: 2006.43
cat("Mediana:", mediana_ano, "\n")
## Mediana: 2009
# La moda puede ser irrelevante o difícil de interpretar en datos agrupados o continuos, 
# pero se calcula la moda de los datos crudos para referencia.
cat("Moda (datos crudos):", moda_ano_calc, "\n")
## Moda (datos crudos): 2016
cat("Cuartiles (Q1, Q2, Q3):\n")
## Cuartiles (Q1, Q2, Q3):
print(cuartiles_ano)
##  25%  50%  75% 
## 1997 2009 2017
cat("Percentil 90 (P90):", round(percentil_90_ano, 2), "\n")
## Percentil 90 (P90): 2021
# Indicadores de Dispersión
varianza_ano <- var(ano)
desv_estandar_ano <- sd(ano)
coef_variacion_ano <- (desv_estandar_ano / media_ano) * 100

cat("\n### Indicadores de Dispersión\n")
## 
## ### Indicadores de Dispersión
cat("Varianza:", round(varianza_ano, 2), "\n")
## Varianza: 154.11
cat("Desviación estándar:", round(desv_estandar_ano, 2), "\n")
## Desviación estándar: 12.41
cat("Coeficiente de variación (CV):", round(coef_variacion_ano, 2), "%\n")
## Coeficiente de variación (CV): 0.62 %
# Indicadores de Forma
asimetria_ano <- skewness(ano)
curtosis_ano <- kurtosis(ano)

cat("\n### Indicadores de Forma\n")
## 
## ### Indicadores de Forma
cat("Coeficiente de asimetría (Sesgo):", round(asimetria_ano, 2), "\n")
## Coeficiente de asimetría (Sesgo): -0.57
cat("Curtosis:", round(curtosis_ano, 2), "\n")
## Curtosis: -0.7
# Definición de Intervalos de 6 años
min_ano <- min(ano)
max_ano <- max(ano)
# Se ajustan los breaks para asegurar que se incluye el máximo.
# Al usar right=FALSE [a, b), necesitamos que el último break sea > max_ano.
breaks <- seq(min_ano, max_ano + 6, by = 6)

# Creación de etiquetas
labels_intervalos <- paste(breaks[-length(breaks)],
                           breaks[-1] - 1,
                           sep = "-")
ano_intervalos <- cut(ano,
                      breaks = breaks,
                      labels = labels_intervalos,
                      include.lowest = TRUE,
                      right = FALSE) # intervalos [a, b)

TDF_ano <- table(ano_intervalos)
Tabla_ano <- as.data.frame(TDF_ano)
names(Tabla_ano) <- c("ano_intervalos", "Freq")

# Eliminar intervalos vacíos si los hay por el ajuste de breaks
Tabla_ano <- Tabla_ano[Tabla_ano$Freq > 0, ]


hi_ano <- (Tabla_ano$Freq / sum(Tabla_ano$Freq) * 100)
Ni_asc <- cumsum(Tabla_ano$Freq)
Hi_asc <- cumsum(hi_ano)
Ni_dsc <- rev(cumsum(rev(Tabla_ano$Freq)))
Hi_dsc <- rev(cumsum(rev(hi_ano)))

Tabla_ano_Final <- data.frame(
  Intervalo = Tabla_ano$ano_intervalos,
  ni = Tabla_ano$Freq,
  hi = round(hi_ano, 2),
  Ni_asc = Ni_asc,
  Hi_asc = round(Hi_asc, 2),
  Ni_dsc = Ni_dsc,
  Hi_dsc = round(Hi_dsc, 2)
)
cat("\n### Tabla de Frecuencias - Año (Intervalos de 6 años)\n")
## 
## ### Tabla de Frecuencias - Año (Intervalos de 6 años)
print(Tabla_ano_Final)
##    Intervalo  ni    hi Ni_asc Hi_asc Ni_dsc Hi_dsc
## 1  1957-1962   1  0.03      1   0.03   3549 100.00
## 2  1963-1968   5  0.14      6   0.17   3548  99.97
## 3  1969-1974  15  0.42     21   0.59   3543  99.83
## 4  1975-1980  37  1.04     58   1.63   3528  99.41
## 5  1981-1986 244  6.88    302   8.51   3491  98.37
## 6  1987-1992 353  9.95    655  18.46   3247  91.49
## 7  1993-1998 349  9.83   1004  28.29   2894  81.54
## 8  1999-2004 343  9.66   1347  37.95   2545  71.71
## 9  2005-2010 625 17.61   1972  55.56   2202  62.05
## 10 2011-2016 587 16.54   2559  72.10   1577  44.44
## 11 2017-2022 867 24.43   3426  96.53    990  27.90
## 12 2023-2028 123  3.47   3549 100.00    123   3.47

2.2 Gráfico de Barras

cat("\n### 2.1 Diagrama de Barras (Histograma) - Año\n")
## 
## ### 2.1 Diagrama de Barras (Histograma) - Año
barplot(Tabla_ano_Final$ni,
        names.arg = Tabla_ano_Final$Intervalo,
        col = "blue",
        main = "Diagrama de Barras: Distribución de derrames por intervalos de 6 años",
        xlab = "Intervalos de años",
        ylab = "Cantidad",
        las = 2,
        cex.names= 0.7) # Aumentado un poco el tamaño

## 2.3 Diagrama de Caja

cat("\n### 2.2 Diagrama de Caja - Año\n")
## 
## ### 2.2 Diagrama de Caja - Año
boxplot(ano,
        horizontal = TRUE,
        col = "darkblue",
        main = "Distribución de años en los que ocurren los derrames",
        xlab = "Años")

2.4 Ojivas

cat("\n### 2.3 Ojivas - Año\n")
## 
## ### 2.3 Ojivas - Año
x_vals <- 1:nrow(Tabla_ano_Final)
ymax <- if(nrow(Tabla_ano_Final) > 0) max(Tabla_ano_Final$Ni_asc) * 1.1 else 10

2.4.1 Ojiva ascendente

plot(x_vals, Tabla_ano_Final$Ni_asc,
     type = "p",
     pch = 19,
     col = "blue",
     xaxt = "n",
     ylim = c(0, ymax),
     main = "Gráfica de Ojiva ascendente de intervalos de años",
     xlab = "Intervalos de años",
     ylab = "Cantidad")
axis(1, at = 1:nrow(Tabla_ano_Final),
     labels = Tabla_ano_Final$Intervalo,
     las = 2,
     cex.axis = 0.7)

2.4.2 Ojiva descendente

x_vals_dsc <- 1:nrow(Tabla_ano_Final)
plot(x_vals_dsc, Tabla_ano_Final$Ni_dsc,
     type = "p",
     pch = 19,
     col = "red",
     xaxt = "n",
     ylim = c(0, ymax),
     main = "Gráfica de Ojiva descendente de intervalos de años",
     xlab = "Intervalos de años",
     ylab = "Cantidad")
axis(1, at = 1:nrow(Tabla_ano_Final),
     labels = Tabla_ano_Final$Intervalo,
     las = 2,
     cex.axis = 0.7)

2.4.3 Ojivas asc y dsc

plot(1:nrow(Tabla_ano_Final), Tabla_ano_Final$Ni_asc,
     type = "p",
     pch = 19,
     col = "blue",
     xaxt = "n",
     ylim = c(0, ymax),
     main = "Gráfica de Ojivas de intervalos de años",
     xlab = "Intervalos de años",
     ylab = "Cantidad")
axis(1, at = 1:nrow(Tabla_ano_Final),
     labels = Tabla_ano_Final$Intervalo,
     las = 2,
     cex.axis = 0.7)
points(1:nrow(Tabla_ano_Final), Tabla_ano_Final$Ni_dsc,
       col = "red", pch = 19)
legend("topright",
       legend = c("Ascendente", "Descendente"),
       col = c("blue", "red"),
       pch = 19)

2.5 Conclusión

cat("\n### 2.5 Conclusión - Año\n")
## 
## ### 2.5 Conclusión - Año
cat("El comportamiento de la variable de los años fluctúa entre [1957-2022] y los valores se encuentran en torno a la mediana de 2009 , con una desviación estándar de 12.41 , siendo un conjunto con un coeficiente de variación homogéneo (0.62%) y tiene un sesgo negativo (-0.57) con existencia de valores atípicos en el extremo inferior (años más antiguos).\n")
## El comportamiento de la variable de los años fluctúa entre [1957-2022] y los valores se encuentran en torno a la mediana de 2009 , con una desviación estándar de 12.41 , siendo un conjunto con un coeficiente de variación homogéneo (0.62%) y tiene un sesgo negativo (-0.57) con existencia de valores atípicos en el extremo inferior (años más antiguos).

3.Variable Barreras de contención flotante

cat("\n--- Análisis de la variable 'barreras_de_contencion_flotantes' (Continua/Agrupada) ---\n")
## 
## --- Análisis de la variable 'barreras_de_contencion_flotantes' (Continua/Agrupada) ---
# Aseguramos que la columna existe antes de acceder
if("barreras_de_contencion_flotantes" %in% names(df)){
  barreras <- as.numeric(df$barreras_de_contencion_flotantes)
  barreras <- na.omit(barreras)
} else {
  barreras <- numeric(0)
  cat("ADVERTENCIA: La columna 'barreras_de_contencion_flotantes' no se encontró en el Excel.\n")
}

3.1 Indicadores Descriptivos para Barreras

if(length(barreras) > 0){
cat("\n## Indicadores de Posición, Dispersión y Forma - BARRERAS\n")

# Indicadores de Posición
media_barreras <- mean(barreras)
mediana_barreras <- median(barreras)
moda_barreras_calc <- as.numeric(names(sort(table(barreras), decreasing = TRUE)[1]))

cuartiles_barreras <- quantile(barreras, probs = c(0.25, 0.50, 0.75))
percentil_90_barreras <- quantile(barreras, probs = 0.90)

cat("\n### Indicadores de Posición\n")
cat("Media:", round(media_barreras, 2), "\n")
cat("Mediana:", mediana_barreras, "\n")
cat("Moda (datos crudos):", moda_barreras_calc, "\n")
cat("Cuartiles (Q1, Q2, Q3):\n")
print(cuartiles_barreras)
cat("Percentil 90 (P90):", round(percentil_90_barreras, 2), "\n")


# Indicadores de Dispersión
varianza_barreras <- var(barreras)
desv_estandar_barreras <- sd(barreras)
coef_variacion_barreras <- (desv_estandar_barreras / media_barreras) * 100

cat("\n### Indicadores de Dispersión\n")
cat("Varianza:", round(varianza_barreras, 2), "\n")
cat("Desviación estándar:", round(desv_estandar_barreras, 2), "\n")
cat("Coeficiente de variación (CV):", round(coef_variacion_barreras, 2), "%\n")


# Indicadores de Forma
asimetria_barreras <- skewness(barreras)
curtosis_barreras <- kurtosis(barreras)

cat("\n### Indicadores de Forma\n")
cat("Coeficiente de asimetría (Sesgo):", round(asimetria_barreras, 2), "\n")
cat("Curtosis:", round(curtosis_barreras, 2), "\n")
} else {
  cat("No hay datos disponibles para calcular indicadores de barreras.\n")
}
## 
## ## Indicadores de Posición, Dispersión y Forma - BARRERAS
## 
## ### Indicadores de Posición
## Media: 6.18 
## Mediana: 1 
## Moda (datos crudos): 0 
## Cuartiles (Q1, Q2, Q3):
## 25% 50% 75% 
##   0   1   6 
## Percentil 90 (P90): 12 
## 
## ### Indicadores de Dispersión
## Varianza: 382.65 
## Desviación estándar: 19.56 
## Coeficiente de variación (CV): 316.6 %
## 
## ### Indicadores de Forma
## Coeficiente de asimetría (Sesgo): 9.99 
## Curtosis: 134.37

3.2 Rango 1: 0 a 30

cat("\n## 3.1 Rango 1: 0 a 30\n")
## 
## ## 3.1 Rango 1: 0 a 30
if(length(barreras) > 0){
barreras_r1 <- barreras[barreras >= 0 & barreras <= 30]
breaks_1 <- seq(0, 30, by = 2)

cut_1 <- cut(barreras_r1, breaks = breaks_1, right = TRUE, include.lowest = TRUE)
TDF_1 <- table(cut_1)
Tabla_1 <- as.data.frame(TDF_1)
names(Tabla_1) <- c("cut_1", "Freq")

hi_1 <- (Tabla_1$Freq / sum(Tabla_1$Freq)) * 100
Ni_asc_1 <- cumsum(Tabla_1$Freq)
Hi_asc_1 <- cumsum(hi_1)
Ni_dsc_1 <- rev(cumsum(rev(Tabla_1$Freq)))
Hi_dsc_1 <- rev(cumsum(rev(hi_1)))

Tabla_Final_1 <- data.frame(
  Intervalo = Tabla_1$cut_1,
  ni = Tabla_1$Freq,
  hi = round(hi_1, 2),
  Ni_asc = Ni_asc_1,
  Hi_asc = round(Hi_asc_1, 2),
  Ni_dsc = Ni_dsc_1,
  Hi_dsc = round(Hi_dsc_1, 2)
)
cat("\n### Tabla de Frecuencias - Barreras (Rango 0-30)\n")
print(Tabla_Final_1)
}
## 
## ### Tabla de Frecuencias - Barreras (Rango 0-30)
##    Intervalo   ni    hi Ni_asc Hi_asc Ni_dsc Hi_dsc
## 1      [0,2] 1949 56.74   1949  56.74   3435 100.00
## 2      (2,4]  507 14.76   2456  71.50   1486  43.26
## 3      (4,6]  262  7.63   2718  79.13    979  28.50
## 4      (6,8]  267  7.77   2985  86.90    717  20.87
## 5     (8,10]  127  3.70   3112  90.60    450  13.10
## 6    (10,12]   86  2.50   3198  93.10    323   9.40
## 7    (12,14]   53  1.54   3251  94.64    237   6.90
## 8    (14,16]   32  0.93   3283  95.57    184   5.36
## 9    (16,18]   32  0.93   3315  96.51    152   4.43
## 10   (18,20]   26  0.76   3341  97.26    120   3.49
## 11   (20,22]   28  0.82   3369  98.08     94   2.74
## 12   (22,24]   14  0.41   3383  98.49     66   1.92
## 13   (24,26]   19  0.55   3402  99.04     52   1.51
## 14   (26,28]   14  0.41   3416  99.45     33   0.96
## 15   (28,30]   19  0.55   3435 100.00     19   0.55

3.2.1 Gráfico de Barras

if(exists("Tabla_Final_1") && nrow(Tabla_Final_1) > 0){
cat("\n### 3.1.1 Gráfico de Barras - Barreras (0-30)\n")
barplot(Tabla_Final_1$ni,
        names.arg = Tabla_Final_1$Intervalo,
        col = "blue",
        main = "Gráfica de Barras (0 a 30)",
        xlab = "Intervalos",
        ylab = "Cantidad",
        las = 2,
        cex.names = 0.7)
}
## 
## ### 3.1.1 Gráfico de Barras - Barreras (0-30)

3.2.2 Diagram de Caja

if(exists("barreras_r1") && length(barreras_r1) > 0){
cat("\n### 3.1.2 Diagrama de Caja - Barreras (0-30)\n")
boxplot(barreras_r1,
        horizontal = TRUE,
        col = "darkblue",
        main = "Boxplot de barreras (0 a 30)",
        xlab = "Número de barreras")
}
## 
## ### 3.1.2 Diagrama de Caja - Barreras (0-30)

3.2.3 Ojivas

cat("\n### 3.1.3 Ojivas - Barreras (0-30)\n")
## 
## ### 3.1.3 Ojivas - Barreras (0-30)
if(exists("Tabla_Final_1") && nrow(Tabla_Final_1) > 0){
x_vals_1 <- seq_along(Tabla_Final_1$Intervalo)
ymax_1 <- max(Tabla_Final_1$Ni_asc) * 1.1
}

3.2.3.1 Ojiva ascendente

if(exists("Tabla_Final_1") && nrow(Tabla_Final_1) > 0){
plot(x_vals_1, Tabla_Final_1$Ni_asc,
     type = "p", pch = 19, col = "blue",
     ylim = c(0, ymax_1),
     xaxt = "n",
     main = "Ojiva ascendente (0 a 30)",
     xlab = "Intervalos", ylab = "Cantidad")
axis(1, at = x_vals_1, labels = Tabla_Final_1$Intervalo, las = 2,cex.axis = 0.7)
}

3.2.3.2 Ojiva descendente

if(exists("Tabla_Final_1") && nrow(Tabla_Final_1) > 0){
plot(x_vals_1, Tabla_Final_1$Ni_dsc,
     type = "p", pch = 19, col = "red",
     ylim = c(0, ymax_1),
     xaxt = "n",
     main = "Ojiva descendente (0 a 30)",
     xlab = "Intervalos", ylab = "Cantidad")
axis(1, at = x_vals_1, labels = Tabla_Final_1$Intervalo, las = 2, cex.axis = 0.7)
}

3.2.3.3 Ojivas asc y dsc

if(exists("Tabla_Final_1") && nrow(Tabla_Final_1) > 0){
plot(x_vals_1, Tabla_Final_1$Ni_asc,
     type = "p", pch = 19, col = "blue",
     ylim = c(0, ymax_1),
     xaxt = "n",
     main = "Ojivas (0 a 30)",
     xlab = "Intervalos", ylab = "Cantidad")
points(x_vals_1, Tabla_Final_1$Ni_dsc, col = "red", pch = 19)
axis(1, at = x_vals_1, labels = Tabla_Final_1$Intervalo, las = 2, cex.axis = 0.7)
legend("topright", legend = c("Ascendente", "Descendente"), col = c("blue", "red"), pch = 19)
}

3.3 RANGO 2: 31 a 380

# --- CORRECCIÓN PRINCIPAL AQUÍ ---
# Faltaban las tres comillas invertidas de cierre (```) al final de este bloque en tu código original.
cat("\n## 3.2 Rango 2: 31 a 380\n")
## 
## ## 3.2 Rango 2: 31 a 380
if(length(barreras) > 0){
  barreras_r2 <- barreras[barreras >= 31 & barreras <= 380]
  
  # Verificamos si hay datos en este rango antes de continuar
  if(length(barreras_r2) > 0){
    breaks_2 <- seq(31, 380, by = 35)
    # Ajuste por si el último valor excede 380 exactos en la secuencia
    if(max(breaks_2) < 380) breaks_2 <- c(breaks_2, 380)

    cut_2 <- cut(barreras_r2, breaks = breaks_2, right = TRUE, include.lowest = TRUE)
    TDF_2 <- table(cut_2)
    Tabla_2 <- as.data.frame(TDF_2)
    names(Tabla_2) <- c("cut_2", "Freq")

    hi_2 <- (Tabla_2$Freq / sum(Tabla_2$Freq)) * 100
    Ni_asc_2 <- cumsum(Tabla_2$Freq)
    Hi_asc_2 <- cumsum(hi_2)
    Ni_dsc_2 <- rev(cumsum(rev(Tabla_2$Freq)))
    Hi_dsc_2 <- rev(cumsum(rev(hi_2)))

    Tabla_Final_2 <- data.frame(
      Intervalo = Tabla_2$cut_2,
      ni = Tabla_2$Freq,
      hi = round(hi_2, 2),
      Ni_asc = Ni_asc_2,
      Hi_asc = round(Hi_asc_2, 2),
      Ni_dsc = Ni_dsc_2,
      Hi_dsc = round(Hi_dsc_2, 2)
    )
    cat("\n### Tabla de Frecuencias - Barreras (Rango 31-380)\n")
    print(Tabla_Final_2)
  } else {
    cat("No hay datos de barreras en el rango 31-380.\n")
  }
}
## 
## ### Tabla de Frecuencias - Barreras (Rango 31-380)
##    Intervalo ni    hi Ni_asc Hi_asc Ni_dsc Hi_dsc
## 1    [31,66] 68 59.13     68  59.13    115 100.00
## 2   (66,101] 20 17.39     88  76.52     47  40.87
## 3  (101,136] 10  8.70     98  85.22     27  23.48
## 4  (136,171]  7  6.09    105  91.30     17  14.78
## 5  (171,206]  2  1.74    107  93.04     10   8.70
## 6  (206,241]  2  1.74    109  94.78      8   6.96
## 7  (241,276]  1  0.87    110  95.65      6   5.22
## 8  (276,311]  2  1.74    112  97.39      5   4.35
## 9  (311,346]  1  0.87    113  98.26      3   2.61
## 10 (346,380]  2  1.74    115 100.00      2   1.74

3.3.1 Gráfico de Barras

# Se verifica si la tabla existe antes de graficar para evitar el error de la imagen
if(exists("Tabla_Final_2") && nrow(Tabla_Final_2) > 0){
  cat("\n### 3.2.1 Gráfico de Barras - Barreras (31-380)\n")
  barplot(Tabla_Final_2$ni,
          names.arg = Tabla_Final_2$Intervalo,
          col = "blue",
          main = "Gráfica de Barras (31 a 380)",
          xlab = "Intervalos",
          ylab = "Cantidad",
          las = 2,
          cex.names = 0.7)
} else {
  cat("No se puede generar el gráfico de barras (Rango 2) por falta de datos.\n")
}
## 
## ### 3.2.1 Gráfico de Barras - Barreras (31-380)

### 3.3.2 Diagrama de Caja

if(exists("barreras_r2") && length(barreras_r2) > 0){
cat("\n### 3.2.2 Diagrama de Caja - Barreras (31-380)\n")
boxplot(barreras_r2,
        horizontal = TRUE,
        col = "darkred",
        main = "Boxplot de barreras (31 a 380)",
        xlab = "Número de barreras")
}
## 
## ### 3.2.2 Diagrama de Caja - Barreras (31-380)

3.3.3 Ojivas

cat("\n### 3.2.3 Ojivas - Barreras (31-380)\n")
## 
## ### 3.2.3 Ojivas - Barreras (31-380)
if(exists("Tabla_Final_2") && nrow(Tabla_Final_2) > 0){
  x_vals_2 <- seq_along(Tabla_Final_2$Intervalo)
  ymax_2 <- max(Tabla_Final_2$Ni_asc) * 1.1
}

3.3.3.1 Ojiva ascendente

if(exists("Tabla_Final_2") && nrow(Tabla_Final_2) > 0){
plot(x_vals_2, Tabla_Final_2$Ni_asc,
     type = "p", pch = 19, col = "blue",
     ylim = c(0, ymax_2),
     xaxt = "n",
     main = "Ojiva ascendente (31 a 380, ancho 35)",
     xlab = "Intervalos", ylab = "Cantidad")
axis(1, at = x_vals_2, labels = Tabla_Final_2$Intervalo, las = 2,cex.axis = 0.6)
}

#### 3.3.3.2 Ojiva descendente

if(exists("Tabla_Final_2") && nrow(Tabla_Final_2) > 0){
plot(x_vals_2, Tabla_Final_2$Ni_dsc,
     type = "p", pch = 19, col = "red",
     ylim = c(0, ymax_2),
     xaxt = "n",
     main = "Ojiva descendente (31 a 380)",
     xlab = "Intervalos", ylab = "Cantidad")
axis(1, at = x_vals_2, labels = Tabla_Final_2$Intervalo, las = 2,cex.axis = 0.6)
}

#### 3.3.3.3 Ojivas asc y dsc

if(exists("Tabla_Final_2") && nrow(Tabla_Final_2) > 0){
plot(x_vals_2, Tabla_Final_2$Ni_asc,
     type = "p", pch = 19, col = "blue",
     ylim = c(0, ymax_2),
     xaxt = "n",
     main = "Ojivas (31 a 380, ancho 35)",
     xlab = "Intervalos", ylab = "Cantidad")
points(x_vals_2, Tabla_Final_2$Ni_dsc, col = "red", pch = 19)
axis(1, at = x_vals_2, labels = Tabla_Final_2$Intervalo, las = 2, cex.axis = 0.6)
legend("topright", legend = c("Ascendente", "Descendente"), col = c("blue", "red"), pch = 19)
}

3.4 Conclusión

cat("\n### 3.3 Conclusión - Barreras\n")
## 
## ### 3.3 Conclusión - Barreras
cat("El comportamiento de la variable de las barreras de contención fluctúa entre [0-346] y los valores se encuentran en torno a la mediana de 1 , con una separación estándar de 19.56 , siendo un conjunto con un coeficiente de variación altamente heterogéneo (316.6%) y tiene un sesgo positivo muy marcado (9.99) con existencia de múltiples valores atípicos a partir de 15 barreras.\n")
## El comportamiento de la variable de las barreras de contención fluctúa entre [0-346] y los valores se encuentran en torno a la mediana de 1 , con una separación estándar de 19.56 , siendo un conjunto con un coeficiente de variación altamente heterogéneo (316.6%) y tiene un sesgo positivo muy marcado (9.99) con existencia de múltiples valores atípicos a partir de 15 barreras.