1. CARGA DE DATOS Y LIBRERÍAS

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_deslizamientos.xlsx")

2. EXTRAER LA VARIABLE

latitude <- datos$latitude
latitude <- latitude[!is.na(latitude)]

3. CONTEO

# Número de observaciones
n_lat <- length(latitude)

# Número de clases
k_lat <- 12

# Valores mínimo y máximo
min_lat <- min(latitude)
max_lat <- max(latitude)

# Rango
R_lat <- max_lat - min_lat

# Amplitud real
A_real <- R_lat / k_lat

# Ajuste de amplitud

A_lat <- ifelse(
  A_real <= 2, 2,
  ifelse(
    A_real <= 5, 5,
    ifelse(
      A_real <= 10, 10,
      ceiling(A_real/10)*10
    )
  )
)

# Límites de clase

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)

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

4. TABLA DE FRECUENCIAS

4.1 Cálculo de la tabla de frecuencias

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
)

# Agregar fila de totales

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

4.2 Presentación de la tabla

tabla_latitude <- TDF_latitude %>%
  mutate(
    hi = round(as.numeric(hi),2),
    Hi_asc = round(as.numeric(Hi_asc),2)
  ) %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N° 1**"),
    subtitle = md("Distribución de frecuencias de la variable Latitude")
  ) %>%
  cols_label(
    Li = "Límite inferior (°)",
    Ls = "Límite superior (°)",
    MC = "Marca de clase (°)",
    ni = "Frecuencia absoluta",
    hi = "Frecuencia relativa (%)",
    Ni_asc = "Frecuencia acumulada",
    Ni_dsc = "Frecuencia acumulada descendente",
    Hi_asc = "Frecuencia relativa acumulada (%)",
    Hi_dsc = "Frecuencia relativa acumulada descendente (%)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(rows = Li == "TOTAL")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2 – Carrera de Geología")
  )

tabla_latitude
Tabla N° 1
Distribución de frecuencias de la variable Latitude
Límite inferior (°) Límite superior (°) Marca de clase (°) Frecuencia absoluta Frecuencia relativa (%) Frecuencia acumulada Frecuencia acumulada descendente Frecuencia relativa acumulada (%) Frecuencia relativa acumulada descendente (%)
-50 -40 -45 99 0.90 99 11033 0.90 100
-40 -30 -35 147 1.33 246 10934 2.23 99.1026919242273
-30 -20 -25 257 2.33 503 10787 4.56 97.7703253874739
-20 -10 -15 158 1.43 661 10530 5.99 95.4409498776398
-10 0 -5 498 4.51 1159 10372 10.50 94.0088824435784
0 10 5 1015 9.20 2174 9874 19.70 89.4951509109037
10 20 15 1394 12.63 3568 8859 32.34 80.2954772047494
20 30 25 1842 16.70 5410 7465 49.03 67.6606544004351
30 40 35 2554 23.15 7964 5623 72.18 50.9652859603009
40 50 45 2603 23.59 10567 3069 95.78 27.8165503489531
50 60 55 419 3.80 10986 466 99.57 4.22369255868757
60 70 65 47 0.43 11033 47 100.00 0.425994743043596
TOTAL 11033 100.00 NA
Autor: Grupo 2 – Carrera de Geología

5. GRÁFICAS

5.1 Histograma local de frecuencia absoluta (ni)

hist(
  latitude,
  breaks = k_lat,
  col = "grey",
  border = "black",
  main = "Gráfica 5: Histograma local de frecuencia absoluta de Latitude",
  xlab = "Latitude (°)",
  ylab = "Frecuencia absoluta"
)


5.2 Histograma global de frecuencia absoluta (ni)

hist(
  latitude,
  main = "Gráfica 6: Histograma global de frecuencia absoluta de Latitude",
  xlab = "Latitude (°)",
  ylab = "Cantidad",
  col = "grey",
  border = "black",
  ylim = c(0, length(latitude))
)


5.3 Histograma local de frecuencia relativa (hi)

hist(
  latitude,
  breaks = k_lat,
  freq = FALSE,
  col = "grey",
  border = "black",
  main = "Gráfica 7: Histograma local de frecuencia relativa de Latitude",
  xlab = "Latitude (°)",
  ylab = "Densidad"
)


5.4 Histograma global de frecuencia relativa (hi)

barplot(
  TDF_latitude$hi[TDF_latitude$Li != "TOTAL"],
  space = 0,
  col = "grey",
  border = "black",
  main = "Gráfica 8: Histograma global de frecuencia relativa de Latitude",
  xlab = "Marca de clase (°)",
  ylab = "Frecuencia relativa (%)",
  names.arg = TDF_latitude$MC[TDF_latitude$Li != "TOTAL"],
  ylim = c(0,100)
)


5.5 Diagrama de cajas

boxplot(
  latitude,
  horizontal = TRUE,
  col = "grey",
  border = "black",
  main = "Gráfica 9: Diagrama de caja de Latitude",
  xlab = "Latitude (°)",
  outline = TRUE,
  pch = 19,
  outcol = "red"
)


5.6 Histograma con Boxplot superpuesto

# Guardar configuración gráfica
op <- par(no.readonly = TRUE)

# Dividir la ventana gráfica
layout(matrix(c(1,2), nrow = 2), heights = c(1,4))

# Boxplot superior
par(mar = c(0,4,2,2))

boxplot(
  latitude,
  horizontal = TRUE,
  axes = FALSE,
  col = "lightgray",
  border = "black",
  outline = TRUE,
  pch = 19,
  outcol = "red"
)

# Histograma inferior
par(mar = c(5,4,1,2))

hist(
  latitude,
  breaks = k_lat,
  col = "grey",
  border = "black",
  main = "Gráfica 10: Histograma con Boxplot de Latitude",
  xlab = "Latitude (°)",
  ylab = "Frecuencia"
)

# Restaurar configuración original
layout(1)
par(op)

5.7 Diagrama de ojivas

plot(
  Ls_lat,
  Ni_asc,
  type = "o",
  col = "blue",
  pch = 19,
  ylim = c(0, max(Ni_asc)),
  main = "Gráfica 11: Ojivas de la variable Latitude",
  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),
  lty = 1,
  bty = "n"
)

6. INDICADORES

6.1 Cálculo de los indicadores estadísticos

# Límites teóricos de la variable
ri <- -90
rs <- 90

# Medidas de tendencia central
x <- mean(latitude)
Me <- median(latitude)

Mo <- as.numeric(
  names(
    sort(
      table(round(latitude, 1)),
      decreasing = TRUE
    )[1]
  )
)

# Medidas de dispersión
sd_lat <- sd(latitude)
CV <- (sd_lat / x) * 100

# Medidas de forma
As <- mean((latitude - x)^3) / sd_lat^3
K  <- mean((latitude - x)^4) / sd_lat^4 - 3

6.2 Tabla de indicadores estadísticos

TablaIndicadores_latitude <- data.frame(
  Variable = "Latitude",
  ri = ri,
  rs = rs,
  Media = round(x, 2),
  Mediana = round(Me, 2),
  Moda = round(Mo, 2),
  Desv_Est = round(sd_lat, 2),
  CV = round(CV, 2),
  Asimetría = round(As, 2),
  Curtosis = round(K, 2)
)

tabla_indicadores <- TablaIndicadores_latitude %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N° 2**"),
    subtitle = md("Indicadores estadísticos de la variable Latitude")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2 – Carrera de Geología")
  )

tabla_indicadores
Tabla N° 2
Indicadores estadísticos de la variable Latitude
Variable ri rs Media Mediana Moda Desv_Est CV Asimetría Curtosis
Latitude -90 90 25.88 30.53 45.6 20.42 78.88 -1.12 1.1
Autor: Grupo 2 – Carrera de Geología

6.3 Detección de outliers (Método IQR)

Q1_lat <- quantile(latitude, 0.25)
Q3_lat <- quantile(latitude, 0.75)

IQR_lat <- IQR(latitude)

Limite_inferior <- Q1_lat - 1.5 * IQR_lat
Limite_superior <- Q3_lat + 1.5 * IQR_lat

outliers_bajos <- latitude[latitude < Limite_inferior]
outliers_altos <- latitude[latitude > Limite_superior]

6.4 Tabla de detección de outliers

Tabla_Outliers <- data.frame(
  Zona = c(
    "Outliers inferiores",
    "Datos normales",
    "Outliers superiores"
  ),
  Rango = c(
    paste("<", round(Limite_inferior, 4)),
    paste(round(Limite_inferior, 4), "a", round(Limite_superior, 4)),
    paste(">", round(Limite_superior, 4))
  ),
  Registros = c(
    length(outliers_bajos),
    n_lat - length(outliers_bajos) - length(outliers_altos),
    length(outliers_altos)
  )
)

tabla_outliers <- Tabla_Outliers %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N° 3**"),
    subtitle = md("Detección de outliers mediante el método IQR")
  ) %>%
  cols_label(
    Zona = "Zona",
    Rango = "Rango (°)",
    Registros = "Número de registros"
  ) %>%
  tab_style(
    style = cell_fill(color = "mistyrose"),
    locations = cells_body(rows = c(1,3))
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 2 – Carrera de Geología")
  )

tabla_outliers
Tabla N° 3
Detección de outliers mediante el método IQR
Zona Rango (°) Número de registros
Outliers inferiores < -26.5054 287
Datos normales -26.5054 a 81.2892 10746
Outliers superiores > 81.2892 0
Autor: Grupo 2 – Carrera de Geología