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 (SALLIDA 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
)

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

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

tabla_latitude
Tabla N° 2
Distribución de frecuencias de la variable Latitude (12 clases)
Límite inferior (°) Límite superior (°) Marca de clase (°) Frecuencia absoluta (ni) Frecuencia relativa (%) Frecuencia acumulada (Ni) Ni_dsc Frecuencia relativa acumulada (%) Hi_dsc
-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
Elaborado por: Grupo 2 – Carrera de Geología

9. HISTOGRAMAS

9.1 Histograma local ni

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

9.2. Histograma ni

hist(
  latitude,
  main = "Gráfica Nº 6: Frecuencia de Latitude (Global)",
  ylab = "Cantidad",
  xlab = "Latitude (°)",
  col = "grey",
  ylim = c(0, length(latitude))
)

9.3. Histograma local hi

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

9.4. Histograma global hi

barplot(
  TDF_latitude$hi[TDF_latitude$Li != "TOTAL"],
  space = 0,
  main = "Gráfica Nº 8: Porcentaje de Latitude (Global)",
  ylab = "Porcentaje (%)",
  xlab = "Marca de Clase (°)",
  col = "grey",
  names.arg = TDF_latitude$MC[TDF_latitude$Li != "TOTAL"],
  ylim = c(0, 100)
)

10. DIAGRAMA DE OJIVAS

plot(
  Ls_lat,
  Ni_asc,
  type = "o",
  col = "blue",
  pch = 19,
  main = "Gráfica 7: Ojiva acumulada de 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),
  bty = "n"
)

11. DIAGRAMA DE CAJAS

boxplot(
  latitude,
  horizontal = TRUE,
  col = "grey",
  main = "Gráfica 8: Diagrama de caja de Latitude",
  xlab = "Latitude (°)"
)

12. INDICADORES ESTADÍSTICOS

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

sd_lat <- sd(latitude)
CV <- (sd_lat / x) * 100
As <- mean((latitude - x)^3) / sd_lat^3
K  <- mean((latitude - x)^4) / sd_lat^4 - 3

12.1. Tabla de indicadores

tabla_indicadores <- data.frame(
  Variable = "Latitude",
  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 %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N° 3**"),
    subtitle = md("Indicadores estadísticos de la variable Latitude")
  ) %>%
  tab_source_note(
    source_note = md("Elaborado por: Grupo 2 – Carrera de Geología")
  )
Tabla N° 3
Indicadores estadísticos de la variable Latitude
Variable Media Mediana Moda Desv_Est CV Asimetría Curtosis
Latitude 25.88 30.53 45.6 20.42 78.88 -1.12 1.1
Elaborado por: Grupo 2 – Carrera de Geología

13. DETECCIÓN Y UBICACIÓN DE OULIERS

13.1. Parámetros estadísticos

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

13.2. Definición de Rangos Críticos (Vallas)

lim_inf_valla <- Q1_lat - 1.5 * IQR_lat
lim_sup_valla <- Q3_lat + 1.5 * IQR_lat

13.3. Identificación de Outliers por ubicación

outliers_bajos <- latitude[latitude < lim_inf_valla]
outliers_altos <- latitude[latitude > lim_sup_valla]

13.4. Creación de Tabla Resumen de Rangos

Tabla_Rangos_Outliers <- data.frame(
  Zona = c("Outliers Inferiores (Sur)", "Datos Normales", "Outliers Superiores (Norte)"),
  Rango_Aceptado = c(
    paste("<", round(lim_inf_valla, 4)),
    paste(round(lim_inf_valla, 4), "a", round(lim_sup_valla, 4)),
    paste(">", round(lim_sup_valla, 4))
  ),
  Cantidad_Puntos = c(length(outliers_bajos), n_lat - length(outliers_bajos) - length(outliers_altos), length(outliers_altos))
)

13.5. Formatp GT para los rangos

tabla_outliers_final <- Tabla_Rangos_Outliers %>%
  gt() %>%
  tab_header(
    title = md("Tabla 3"),
    subtitle = md("Ubicación de Outliers y Rangos de Control para Latitude")
  ) %>%
  cols_label(
    Zona = "Zona de Distribución",
    Rango_Aceptado = "Rango Numérico (°)",
    Cantidad_Puntos = "N° de Registros"
  ) %>%
  tab_style(
    style = cell_fill(color = "mistyrose"),
    locations = cells_body(rows = c(1, 3)) # Resalta las zonas de outliers
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo Geología | Método de Tukey (1.5 * IQR)")
  )

tabla_outliers_final
Tabla 3
Ubicación de Outliers y Rangos de Control para Latitude
Zona de Distribución Rango Numérico (°) N° de Registros
Outliers Inferiores (Sur) < -26.5054 287
Datos Normales -26.5054 a 81.2892 10746
Outliers Superiores (Norte) > 81.2892 0
Autor: Grupo Geología | Método de Tukey (1.5 * IQR)