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°.