1. CARGA DE LIBRERIAS Y DATOS
library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(gt)
datos <- read_excel("datos_nuevoartes.xlsx")
2. DEFINICIÓN DE LA VARIABLE
latitude <- datos$latitude
latitude <- latitude[!is.na(latitude)]
n_lat <- length(latitude)
3. PARÁMETROS DE CLASIFICACIÓN
k_lat <- 12
min_lat <- min(latitude)
max_lat <- max(latitude)
R_lat <- max_lat - min_lat
A_real <- R_lat / k_lat
4. AJUSTE DE AMPLITUD DE CLASE
A_lat <- ifelse(
A_real <= 2, 2,
ifelse(
A_real <= 5, 5,
ifelse(A_real <= 10, 10, ceiling(A_real / 10) * 10)
)
)
5. DEFINICIÓN DE CLASES
Li0 <- floor(min_lat / A_lat) * A_lat
Li_lat <- seq(Li0, by = A_lat, length.out = k_lat)
Ls_lat <- Li_lat + A_lat
MC_lat <- round((Li_lat + Ls_lat) / 2, 2)
6. CÁLCULO DE FRECUENCIAS
ni_lat <- numeric(k_lat)
for (i in 1:k_lat) {
if (i < k_lat) {
ni_lat[i] <- sum(latitude >= Li_lat[i] & latitude < Ls_lat[i])
} else {
ni_lat[i] <- sum(latitude >= Li_lat[i] & latitude <= max_lat)
}
}
hi_lat <- (ni_lat / sum(ni_lat)) * 100
Ni_asc <- cumsum(ni_lat)
Ni_dsc <- rev(cumsum(rev(ni_lat)))
Hi_asc <- cumsum(hi_lat)
Hi_dsc <- rev(cumsum(rev(hi_lat)))
7. TABLA DE FRECUENCIAS (SALIDA SIMPLE)
TDF_latitude <- data.frame(
Li = Li_lat,
Ls = Ls_lat,
MC = MC_lat,
ni = ni_lat,
hi = hi_lat,
Ni_asc = Ni_asc,
Ni_dsc = Ni_dsc,
Hi_asc = Hi_asc,
Hi_dsc = Hi_dsc
)
# Agregamos la fila de TOTAL
TDF_latitude <- rbind(
TDF_latitude,
data.frame(
Li = "TOTAL",
Ls = "",
MC = "",
ni = sum(ni_lat),
hi = 100,
Ni_asc = "",
Ni_dsc = "",
Hi_asc = "",
Hi_dsc = ""
)
)
# Mostramos la tabla (aquí R mostrará decimales por defecto según la sesión)
TDF_latitude
## Li Ls MC ni hi Ni_asc Ni_dsc Hi_asc
## 1 -50 -40 -45 99 0.8973081 99 11033 0.897308075772682
## 2 -40 -30 -35 147 1.3323665 246 10934 2.22967461252606
## 3 -30 -20 -25 257 2.3293755 503 10787 4.55905012236019
## 4 -20 -10 -15 158 1.4320674 661 10530 5.99111755642164
## 5 -10 0 -5 498 4.5137315 1159 10372 10.5048490890963
## 6 0 10 5 1015 9.1996737 2174 9874 19.7045227952506
## 7 10 20 15 1394 12.6348228 3568 8859 32.3393455995649
## 8 20 30 25 1842 16.6953684 5410 7465 49.0347140396991
## 9 30 40 35 2554 23.1487356 7964 5623 72.1834496510469
## 10 40 50 45 2603 23.5928578 10567 3069 95.7763074413124
## 11 50 60 55 419 3.7976978 10986 466 99.5740052569564
## 12 60 70 65 47 0.4259947 11033 47 100
## 13 TOTAL 11033 100.0000000
## Hi_dsc
## 1 100
## 2 99.1026919242273
## 3 97.7703253874739
## 4 95.4409498776398
## 5 94.0088824435784
## 6 89.4951509109037
## 7 80.2954772047494
## 8 67.6606544004351
## 9 50.9652859603009
## 10 27.8165503489531
## 11 4.22369255868757
## 12 0.425994743043596
## 13
8. TABLA DE PRESENTACIÓN
tabla_latitude <- TDF_latitude %>%
# Aseguramos que todas las columnas sean tratadas como numéricas
mutate(across(c(ni, hi, Ni_asc, Ni_dsc, Hi_asc, Hi_dsc, MC), as.numeric)) %>%
gt() %>%
tab_header(
title = md("**Tabla N° 21**"),
subtitle = md("Distribución de frecuencias de la variable Latitud (°) de los eventos a nivel mundial")
) %>%
# 1. Formato de 2 decimales para todas las columnas relativas y marcas de clase
fmt_number(
columns = c(hi, Hi_asc, Hi_dsc, MC),
decimals = 2
) %>%
# 2. Formato de 0 decimales para todas las frecuencias absolutas (asc y desc)
fmt_number(
columns = c(ni, Ni_asc, Ni_dsc),
decimals = 0
) %>%
# 3. Etiquetas de columna (agregando las que faltaban)
cols_label(
Li = "Límite inferior (°)",
Ls = "Límite superior (°)",
MC = "Marca de clase (°)",
ni = "ni",
hi = "hi (%)",
Ni_asc = "Ni (asc)",
Ni_dsc = "Ni (desc)",
Hi_asc = "Hi (asc %)",
Hi_dsc = "Hi (desc %)"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(rows = Li == "TOTAL")
) %>%
# 4. Limpieza de celdas vacías en la fila TOTAL
sub_missing(columns = everything(), missing_text = "") %>%
tab_source_note(
source_note = md("Elaborado por: Grupo 2 – Carrera de Geología")
)
tabla_latitude
| Tabla N° 21 |
| Distribución de frecuencias de la variable Latitud (°) de los eventos a nivel mundial |
| Límite inferior (°) |
Límite superior (°) |
Marca de clase (°) |
ni |
hi (%) |
Ni (asc) |
Ni (desc) |
Hi (asc %) |
Hi (desc %) |
| -50 |
-40 |
−45.00 |
99 |
0.90 |
99 |
11,033 |
0.90 |
100.00 |
| -40 |
-30 |
−35.00 |
147 |
1.33 |
246 |
10,934 |
2.23 |
99.10 |
| -30 |
-20 |
−25.00 |
257 |
2.33 |
503 |
10,787 |
4.56 |
97.77 |
| -20 |
-10 |
−15.00 |
158 |
1.43 |
661 |
10,530 |
5.99 |
95.44 |
| -10 |
0 |
−5.00 |
498 |
4.51 |
1,159 |
10,372 |
10.50 |
94.01 |
| 0 |
10 |
5.00 |
1,015 |
9.20 |
2,174 |
9,874 |
19.70 |
89.50 |
| 10 |
20 |
15.00 |
1,394 |
12.63 |
3,568 |
8,859 |
32.34 |
80.30 |
| 20 |
30 |
25.00 |
1,842 |
16.70 |
5,410 |
7,465 |
49.03 |
67.66 |
| 30 |
40 |
35.00 |
2,554 |
23.15 |
7,964 |
5,623 |
72.18 |
50.97 |
| 40 |
50 |
45.00 |
2,603 |
23.59 |
10,567 |
3,069 |
95.78 |
27.82 |
| 50 |
60 |
55.00 |
419 |
3.80 |
10,986 |
466 |
99.57 |
4.22 |
| 60 |
70 |
65.00 |
47 |
0.43 |
11,033 |
47 |
100.00 |
0.43 |
| TOTAL |
|
|
11,033 |
100.00 |
|
|
|
|
| Elaborado por: Grupo 2 – Carrera de Geología |
9. HISTOGRAMAS
9.1 Histograma local de (ni)
# Configuración de márgenes
par(mar=c(5, 4, 4, 2))
# 1. Identificamos el máximo real de ni_lat
max_ni_lat_local <- max(ni_lat)
# 2. Graficamos Local (ni) sin ejes automáticos
pos_x <- barplot(ni_lat,
col = "grey",
border = "black",
space = 0,
las = 1,
ylim = c(0, max_ni_lat_local),
yaxt = "n",
main = "Gráfica 37: Distribución local de la frecuencia absoluta\nde la variable Latitud (°) de los eventos a nivel mundial",
xlab = "Latitud (°)",
ylab = "Frecuencia absoluta (ni)")
# 3. Eje Y manual (sin decimales)
ticks_y_l <- round(seq(0, max_ni_lat_local, length.out = 5), 0)
axis(side = 2, at = ticks_y_l, labels = ticks_y_l, las = 1)
# 4. Eje X en las intersecciones (Límites de clase)
# Usamos Li_lat y el último Ls_lat
axis(side = 1, at = 0:length(ni_lat), labels = c(Li_lat, max(Ls_lat)), cex.axis = 0.7)

9.2. Histograma Global de (ni)
# Margen izquierdo ajustado para legibilidad del 11033
par(mar=c(5, 5, 4, 2))
n_total_dataset <- 11033
# 1. Ploteo Global (Eje Y hasta 11033)
barplot(ni_lat,
col = "grey",
border = "black",
space = 0,
las = 1,
ylim = c(0, n_total_dataset),
yaxt = "n",
main = "Gráfica 38: Distribución global de la frecuencia absoluta\nde la variable Latitud (°) de los eventos a nivel mundial",
xlab = " Latitud (°)",
ylab = "Frecuencia absoluta (ni)")
# 2. Eje Y manual con el tope 11033
ticks_y_g <- c(0, 2000, 4000, 6000, 8000, 10000, n_total_dataset)
axis(side = 2, at = ticks_y_g, labels = ticks_y_g, las = 1)
# 3. Eje X en las intersecciones
axis(side = 1, at = 0:length(ni_lat), labels = c(Li_lat, max(Ls_lat)), cex.axis = 0.7)
# Línea de referencia del tope global
abline(h = n_total_dataset, col = "red", lty = 2)

9.3. Histograma local de (hi)
par(mar=c(5, 5, 4, 2))
max_hi_lat_local <- max(hi_lat)
# 1. Ploteo Local de hi
barplot(hi_lat,
col = "#CDB79E",
border = "black",
space = 0,
las = 1,
ylim = c(0, max_hi_lat_local),
yaxt = "n",
main = "Gráfica 39: Distribución local de la frecuencia relativa\nde la variable Latitud (°) de los eventos a nivel mundial",
xlab = "Latitud (°)",
ylab = "Porcentaje (%)")
# 2. Eje Y manual redondeado
ticks_y_hi <- seq(0, max_hi_lat_local, length.out = 5)
axis(side = 2, at = ticks_y_hi, labels = round(ticks_y_hi, 2), las = 1)
# 3. Eje X en las intersecciones
axis(side = 1, at = 0:length(hi_lat), labels = c(Li_lat, max(Ls_lat)), cex.axis = 0.7)

9.4. Histograma global hi
par(mar=c(5, 5, 4, 2))
# 1. Ploteo Global de hi (Tope 100%)
barplot(hi_lat,
col = "#CDB79E",
border = "black",
space = 0,
las = 1,
ylim = c(0, 100),
yaxt = "n",
main = "Gráfica 40: Distribución global de la frecuencia relativa\nde la variable Latitud (°) de los eventos a nivel mundial",
xlab = "Latitud (°)",
ylab = "Porcentaje (%)")
# 2. Eje Y manual (0% a 100%)
ticks_hi_global <- seq(0, 100, by = 20)
axis(side = 2, at = ticks_hi_global, labels = paste0(ticks_hi_global, "%"), las = 1)
# 3. Eje X en las intersecciones
axis(side = 1, at = 0:length(hi_lat), labels = c(Li_lat, max(Ls_lat)), cex.axis = 0.7)
# Línea de referencia 100%
abline(h = 100, col = "blue", lty = 2, lwd = 1.5)

10. DIAGRAMA DE OJIVAS
plot(
Ls_lat,
Ni_asc,
type = "o",
col = "blue",
pch = 19,
main = "Gráfica 41: Ojiva combinada de la variable Latitud (°) (°) de los eventos a nivel mundial",
xlab = "Límites de clase (°)",
ylab = "Frecuencia acumulada"
)
lines(
Li_lat,
Ni_dsc,
type = "o",
col = "red",
pch = 17
)
legend(
"right",
legend = c("Ojiva ascendente (≤)", "Ojiva descendente (≥)"),
col = c("blue", "red"),
pch = c(19, 17),
bty = "n"
)

11. DIAGRAMA DE CAJAS
boxplot(
latitude,
horizontal = TRUE,
col = "grey",
main = "Gráfica 42: Diagrama de caja de la varieble Latitud(°)
de los eventos a nivel mundial",
xlab = "Latitude (°)"
)

12. INDICADORES ESTADÍSTICOS
# Cargamos la librería por si acaso
library(e1071)
# 1. Cálculos de los indicadores (Usando el operador :: para evitar errores)
x_bar_lat <- mean(latitude)
Me_lat <- median(latitude)
Mo_lat <- as.numeric(names(sort(table(round(latitude, 1)), decreasing = TRUE)[1]))
SD_lat <- sd(latitude)
CV_lat <- (SD_lat / x_bar_lat) * 100
# Llamada directa a la librería para evitar el error "function not found"
As_lat <- e1071::skewness(latitude)
K_lat <- e1071::kurtosis(latitude)
# 2. Creación del dataframe
tabla_indicadores <- data.frame(
Variable = "Latitud (°)",
Min = min(latitude),
Max = max(latitude),
Media = x_bar_lat,
Mediana = Me_lat,
Moda = Mo_lat,
SD = SD_lat,
CV = CV_lat,
Asimetria = As_lat,
Curtosis = K_lat
)
# 3. Construcción de la tabla gt
tabla_indicadores_gt <- tabla_indicadores %>%
gt() %>%
tab_header(
title = md("**Tabla N° 22**"),
subtitle = md("Indicadores Estadísticos de la variable Latitud (°) de los eventos a nivel mundial")
) %>%
fmt_number(
columns = everything(),
decimals = 2
) %>%
cols_label(
Min = "Mínimo", Max = "Máximo", SD = "Desv. Est.",
CV = "CV (%)", Asimetria = "Asimetría"
) %>%
tab_source_note(source_note = md("Elaborado por: Grupo 2 – Carrera de Geología"))
tabla_indicadores_gt
| Tabla N° 22 |
| Indicadores Estadísticos de la variable Latitud (°) de los eventos a nivel mundial |
| Variable |
Mínimo |
Máximo |
Media |
Mediana |
Moda |
Desv. Est. |
CV (%) |
Asimetría |
Curtosis |
| Latitud (°) |
−46.77 |
72.63 |
25.88 |
30.53 |
45.60 |
20.42 |
78.88 |
−1.12 |
1.10 |
| Elaborado por: Grupo 2 – Carrera de Geología |
13. DETECCIÓN Y UBICACIÓN DE OULIERS
# 1. Cálculos de los umbrales (Método de Tukey)
Q1_lat <- quantile(latitude, 0.25)
Q3_lat <- quantile(latitude, 0.75)
IQR_lat <- Q3_lat - Q1_lat
lim_inf_lat <- Q1_lat - 1.5 * IQR_lat
lim_sup_lat <- Q3_lat + 1.5 * IQR_lat
# 2. Identificación
outliers_lat_vec <- latitude[latitude < lim_inf_lat | latitude > lim_sup_lat]
# 3. Creación del dataframe (Basado en el estilo solicitado)
tabla_outliers <- data.frame(
Variable = "Latitud (°)",
Outliers_Detectados = length(outliers_lat_vec),
Limite_Inferior = lim_inf_lat,
Limite_Superior = lim_sup_lat,
Q1 = Q1_lat,
Q3 = Q3_lat
)
# 4. Construcción de la tabla gt
tabla_outliers_gt <- tabla_outliers %>%
gt() %>%
tab_header(
title = md("**Tabla N° 23**"),
subtitle = md("Detección de valores atípicos (Outliers) en la variable Latitud (°) de los eventos a nivel mundial")
) %>%
fmt_number(columns = c(Limite_Inferior, Limite_Superior, Q1, Q3), decimals = 2) %>%
fmt_number(columns = c(Outliers_Detectados), decimals = 0) %>%
cols_label(
Outliers_Detectados = "N° de Outliers",
Limite_Inferior = "Límite Inf.", Limite_Superior = "Límite Sup.",
Q1 = "Cuartil 1 (Q1)", Q3 = "Cuartil 3 (Q3)"
) %>%
tab_source_note(source_note = md("Elaborado por: Grupo 2 – Carrera de Geología"))
tabla_outliers_gt
| Tabla N° 23 |
| Detección de valores atípicos (Outliers) en la variable Latitud (°) de los eventos a nivel mundial |
| Variable |
N° de Outliers |
Límite Inf. |
Límite Sup. |
Cuartil 1 (Q1) |
Cuartil 3 (Q3) |
| Latitud (°) |
287 |
−26.51 |
81.29 |
13.92 |
40.87 |
| Elaborado por: Grupo 2 – Carrera de Geología |
14. CONCLUSIÓN
La variable Latitud (°) fluctúa desde -46.77° hasta 72.63°, sus
valores están en torno a 25.88°, con una desviación estándar de 20.42
siendo un conjunto de valores muy heterogeneo, cuyos valores se
presentan en la parte media alta de la variable con sesgos hacia la
izquierda, a excepcion de 287 valores atípicos que van desde -46.77°
hasta -26.51°.