| 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 |
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>, …
# Conversión y limpieza de la variable mes
mes <- as.numeric(df$mes)
mes <- na.omit(mes) # Elimina NA
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
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
)
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")
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
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)
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)
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)
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.
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)
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
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")
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
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)
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)
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)
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).
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")
}
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
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
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)
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)
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
}
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)
}
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)
}
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)
}
# --- 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
# 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)
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
}
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)
}
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.