0. Librerías

library(readr)
library(dplyr)
library(knitr)
library(kableExtra)
library(ggplot2)
library(e1071)

1. Leer Datos

variables <- read.csv("C:/Users/dellh/Downloads/GlobalWeatherRepository.csv")

2. Depuración y Selección de Variables

variables <- na.omit(variables)
Prmm <- variables$precip_mm
n_total <- length(Prmm)

3. Frecuencias

3.1 Max y Min

valor_min <- min(Prmm, na.rm = TRUE)
valor_max <- max(Prmm, na.rm = TRUE)
rango <- valor_max - valor_min

3.2 Regla de Sturges

K_sturges <- floor(1 + 3.322 * log10(n_total))
cat("Número de clases:", K_sturges, "\n")
## Número de clases: 18
A_sturges <- rango / K_sturges
cat("Amplitud Sturges:", A_sturges, "\n")
## Amplitud Sturges: 2.346667

3.3 Intervalos

Li1 <- seq(valor_min, valor_max - A_sturges, by = A_sturges)
Ls1 <- Li1 + A_sturges

3.4 Bucle para las columnas de la tabla

ni1 <- numeric(length(Li1))
for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(Prmm >= Li1[i] & Prmm <= Ls1[i])
  } else {
    ni1[i] <- sum(Prmm >= Li1[i] & Prmm < Ls1[i])
  }
}

hi1 <- (ni1 / sum(ni1)) * 100
Ni_asc1 <- cumsum(ni1)
Hi_asc1 <- cumsum(hi1)
Ni_dsc1 <- rev(cumsum(rev(ni1)))
Hi_dsc1 <- rev(cumsum(rev(hi1)))
MC1 <- (Li1 + Ls1) / 2

3.5. Frecuencia para tabla con amplitud ajustada

# Amplitud fija de 4.5 mm para obtener exactamente 10 intervalos limpios
amplitud <- 4.5
Li2 <- seq(0, ceiling(valor_max/amplitud)*amplitud - amplitud, by = amplitud)
Ls2 <- Li2 + amplitud

ni2 <- numeric(length(Li2))
for(i in 1:length(Li2)){
  if(i == length(Li2)){
    ni2[i] <- sum(Prmm >= Li2[i] & Prmm <= Ls2[i])
  } else {
    ni2[i] <- sum(Prmm >= Li2[i] & Prmm < Ls2[i])
  }
}

hi2 <- (ni2 / sum(ni2)) * 100
Ni_asc2 <- cumsum(ni2)
Hi_asc2 <- cumsum(hi2)
Ni_dsc2 <- rev(cumsum(rev(ni2)))
Hi_dsc2 <- rev(cumsum(rev(hi2)))
MC2 <- (Li2 + Ls2) / 2

4. Tabla de Distribución de Frecuencias

4.1. Tabla según Sturges

Tabla_Sturges <- data.frame(
  Lim_inf = round(Li1, 2),
  Lim_sup = round(Ls1, 2),
  MC = round(MC1, 2),
  ni = ni1,
  hi = round(hi1, 2),
  Ni_asc = Ni_asc1,
  Hi_asc = round(Hi_asc1, 2),
  Ni_dsc = Ni_dsc1,
  Hi_dsc = round(Hi_dsc1, 2)
)

Tabla_Sturges2 <- Tabla_Sturges
Tabla_Sturges2[] <- lapply(Tabla_Sturges2, as.character)

fila_total <- data.frame(
  Lim_inf = "TOTAL", Lim_sup = "", MC = "",
  ni = as.character(sum(ni1)), hi = as.character(round(sum(hi1), 2)),
  Ni_asc = "", Hi_asc = "", Ni_dsc = "", Hi_dsc = ""
)

Tabla_Sturges2 <- rbind(Tabla_Sturges2, fila_total)

kable(Tabla_Sturges2, align = "c",
      caption = "Tabla N°1: Distribución de frecuencias de la Precipitación (mm) mediante la regla de Sturges, período 2024–2026") |> 
  kable_styling(full_width = TRUE, position ="center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) |> 
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") |> 
  row_spec(nrow(Tabla_Sturges2), bold = TRUE, background = "#EAEDED") |> 
  footnote(general = "Elaborado por Grupo N°2.\nFuente: Global Weather Repository.", general_title = "Nota:", footnote_as_chunk = TRUE, title_format = c("italic","bold"))
Tabla N°1: Distribución de frecuencias de la Precipitación (mm) mediante la regla de Sturges, período 2024–2026
Lim_inf Lim_sup MC ni hi Ni_asc Hi_asc Ni_dsc Hi_dsc
0 2.35 1.17 140579 99.21 140579 99.21 141702 100
2.35 4.69 3.52 873 0.62 141452 99.82 1123 0.79
4.69 7.04 5.87 142 0.1 141594 99.92 250 0.18
7.04 9.39 8.21 47 0.03 141641 99.96 108 0.08
9.39 11.73 10.56 21 0.01 141662 99.97 61 0.04
11.73 14.08 12.91 15 0.01 141677 99.98 40 0.03
14.08 16.43 15.25 7 0 141684 99.99 25 0.02
16.43 18.77 17.6 5 0 141689 99.99 18 0.01
18.77 21.12 19.95 4 0 141693 99.99 13 0.01
21.12 23.47 22.29 3 0 141696 100 9 0.01
23.47 25.81 24.64 1 0 141697 100 6 0
25.81 28.16 26.99 5 0 141702 100 5 0
28.16 30.51 29.33 0 0 141702 100 0 0
30.51 32.85 31.68 0 0 141702 100 0 0
32.85 35.2 34.03 0 0 141702 100 0 0
35.2 37.55 36.37 0 0 141702 100 0 0
37.55 39.89 38.72 0 0 141702 100 0 0
39.89 42.24 41.07 0 0 141702 100 0 0
TOTAL 141702 100
Nota: Elaborado por Grupo N°2.
Fuente: Global Weather Repository.

4.2 Tabla agrupada y ajustada

TDF_Prmm <- data.frame(
  Lim_inf = round(Li2, 2), Lim_sup = round(Ls2, 2), MC = round(MC2, 2),
  ni = ni2, hi = round(hi2, 2), Ni_asc = Ni_asc2, Hi_asc = round(Hi_asc2, 2),
  Ni_dsc = Ni_dsc2, Hi_dsc = round(Hi_dsc2, 2)
)

TDF_Prmm_Texto <- TDF_Prmm
TDF_Prmm_Texto[] <- lapply(TDF_Prmm_Texto, as.character)

TDF_Total <- data.frame(
  Lim_inf = "TOTAL", Lim_sup = "", MC = "",
  ni = as.character(sum(ni2)), hi = as.character(round(sum(hi2), 2)),
  Ni_asc = "", Hi_asc = "", Ni_dsc = "", Hi_dsc = "",
  stringsAsFactors = FALSE
)

TDF_Prmm_Final <- rbind(TDF_Prmm_Texto, TDF_Total)
colnames(TDF_Prmm_Final) <- c("Lim. Inf.", "Lim. Sup.", "MC", "ni", "hi (%)", "Ni Asc", "Hi Asc", "Ni Dsc", "Hi Dsc")

kable(TDF_Prmm_Final, align = "c",
      caption = "Tabla N°2: Distribución de frecuencias simplificada de la Precipitación (mm) en 10 intervalos (2024–2026)") |>
  kable_styling(full_width = TRUE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) |>
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") |>
  row_spec(nrow(TDF_Prmm_Final), bold = TRUE, background = "#EAEDED") |>
  footnote(general = "Elaborado por Grupo N°2.\nFuente: Global Weather Repository.", general_title = "Nota: ", footnote_as_chunk = TRUE, title_format = c("italic","bold"))
Tabla N°2: Distribución de frecuencias simplificada de la Precipitación (mm) en 10 intervalos (2024–2026)
Lim. Inf. Lim. Sup. MC ni hi (%) Ni Asc Hi Asc Ni Dsc Hi Dsc
0 4.5 2.25 141423 99.8 141423 99.8 141703 100
4.5 9 6.75 216 0.15 141639 99.95 280 0.2
9 13.5 11.25 34 0.02 141673 99.98 64 0.05
13.5 18 15.75 15 0.01 141688 99.99 30 0.02
18 22.5 20.25 7 0 141695 99.99 15 0.01
22.5 27 24.75 5 0 141700 100 8 0.01
27 31.5 29.25 2 0 141702 100 3 0
31.5 36 33.75 0 0 141702 100 1 0
36 40.5 38.25 0 0 141702 100 1 0
40.5 45 42.75 1 0 141703 100 1 0
TOTAL 141703 100
Nota: Elaborado por Grupo N°2.
Fuente: Global Weather Repository.

5. Gráficos de Distribución de Frecuencias

5.1. Histograma Original (ni)

barplot(ni2, 
        space = 0, 
        names.arg = paste(Li2, Ls2, sep = "-"), 
        main = "Gráfico N°1: Distribución de frecuencias absolutas de la Precipitación (mm)",
        xlab = "Precipitación (mm)", 
        ylab = "Frecuencia Absoluta (ni)", 
        col = "lightgreen", 
        border = "black",
        las = 2)
grid()

5.2. Histograma con relación al todo (ni)

barplot(ni2, 
        space = 0, 
        names.arg = paste(Li2, Ls2, sep = "-"), 
        ylim = c(0, n_total),
        main = "Gráfico N°2: Histograma global de frecuencias absolutas acumuladas respecto al total", 
        xlab = "Precipitación (mm)", 
        ylab = "Frecuencia (ni)", 
        col = "lightgreen", 
        border = "black",
        las = 2)
grid()

5.3. Histograma original (hi)

barplot(hi2, 
        space = 0, 
        names.arg = paste(Li2, Ls2, sep = "-"), 
        ylim = c(0, max(hi2) * 1.15),
        main = "Gráfico N°3: Histograma Local de Frecuencia Relativa (%)",
        xlab = "Intervalos de Precipitación (mm)", 
        ylab = "Frecuencia Relativa (%)", 
        col = "skyblue", 
        border = "black",
        las = 2)
grid()

5.4. Histograma con relación a todo (hi)

barplot(hi2, 
        space = 0, 
        names.arg = paste(Li2, Ls2, sep = "-"), 
        ylim = c(0, 100),
        main = "Gráfico N°4: Histograma Global de Frecuencia Relativa (%)", 
        xlab = "Intervalos de Precipitación (mm)", 
        ylab = "Frecuencia Relativa (%)", 
        col = "lightgreen", 
        border = "black",
        las = 2)
grid()

5.5. Polígono de frecuencias (hi)

bp <- barplot(hi2, 
              space = 0, 
              names.arg = paste(Li2, Ls2, sep = "-"), 
              col = "lightgreen", 
              border = "black",
              ylim = c(0, max(hi2)*1.2), 
              main = "Gráfico N°5: Polígono de frecuencias absolutas de la precipitación (mm)",
              xlab = "Intervalos", 
              ylab = "Frecuencia relativa (%)", 
              las = 2)
x_pol <- c(bp[1] - 0.5, bp, bp[length(bp)] + 0.5)
y_pol <- c(0, hi2, 0)
lines(x_pol, y_pol, type = "o", col = "red", lwd = 2, pch = 16)
grid()

5.6. Ojiva ascendente y descendente (ni)

plot(Ls2, Ni_asc2, 
     type = "o", pch = 16, lwd = 2, col = "blue", ylim = c(0, max(Ni_asc2)),
     main = "Gráfico N°6: Ojivas de Frecuencia Absoluta de la precipitación", 
     xlab = "Precipitación (mm)", 
     ylab = "Frecuencia Acumulada (Ni)")
lines(Li2, Ni_dsc2, type = "o", pch = 17, lwd = 2, col = "red")
legend("right", 
       legend = c("Ojiva Ascendente", "Ojiva Descendente"), 
       col = c("blue", "red"), 
       pch = c(16, 17), 
       lwd = 2, 
       bty = "n")
grid()

5.7. Ojiva ascendente y descendente (hi)

plot(Ls2, Hi_asc2, 
     type = "o", pch = 16, col = "blue", lwd = 2, ylim = c(0, 100),
     xlab = "Precipitación (mm)", 
     ylab = "Frecuencia Relativa Acumulada (%)", 
     main = "Gráfico N°7: Ojivas ascendente y descendente de frecuencias acumuladas (%)")
lines(Li2, Hi_dsc2, type = "o", pch = 17, col = "red", lwd = 2)
legend("right", 
       legend = c("Ojiva Ascendente", "Ojiva Descendente"), 
       col = c("blue", "red"), 
       pch = c(16, 17), 
       lwd = 2, 
       bty = "n")
grid()

5.8. Boxplot

Lim_sup_tukey <- quantile(Prmm, 0.75) + 1.5 * IQR(Prmm)
atipicos <- Prmm[Prmm > Lim_sup_tukey]

boxplot(Prmm, 
        horizontal = TRUE, 
        outline = FALSE, 
        main = "Gráfico N°8: Boxplot de precipitación en milímetros (2024–2026)", 
        xlab = "Prmm", 
        col = "lightblue")

if(length(atipicos) > 0) {
  points(atipicos, rep(1, length(atipicos)), col = "red", pch = 19, cex = 0.8)
}
abline(v = Lim_sup_tukey, col = "blue", lwd = 2, lty = 2)

legend("topright", 
       legend = c("Atipicos", "Limite Tukey Sup"), 
       col = c("red", "blue"), 
       pch = c(19, NA), 
       lty = c(NA, 2), 
       lwd = c(NA, 2), 
       bty = "n")
grid()

6. Indicadores Estadísticos

6.1. Tendencia central

media <- mean(Prmm)
mediana <- median(Prmm)

max_ni <- max(TDF_Prmm$ni)
moda <- TDF_Prmm$MC[TDF_Prmm$ni == max_ni]

6.2. Dispersión

varianza <- var(Prmm)
desv_est <- sd(Prmm)
cv <- (desv_est / media) * 100

6.3. Forma

asimetria <- skewness(Prmm)
curtosis <- kurtosis(Prmm)

6.4. Valores

rango_texto <- paste0("[", round(min(Prmm),2), "; ", round(max(Prmm),2), "]")

6.5. Tabla de indicadores

tabla_indicadores <- data.frame(
  Variable = "Precipitación (mm)",
  Rango = rango_texto,
  Media = round(media, 2),
  Mediana = round(mediana, 2),
  Moda = round(moda[1], 2), 
  Varianza = round(varianza, 2),
  Desv_Est = round(desv_est, 2),
  CV = round(cv, 2),
  Asimetria = round(asimetria, 2),
  Curtosis = round(curtosis, 2),
  N_Atipicos = length(atipicos),
  check.names = FALSE
)

kable(tabla_indicadores, align = "c",
      caption = "Tabla N°3: Indicadores estadísticos descriptivos de la variable precipitación en milímetros (2024–2026)") |>
  kable_styling(full_width = TRUE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) |>
  row_spec(0, bold = TRUE, color = "black", background = "#D4EFDF") |>
  footnote(general = "Fuente: Global Weather Repository. Elaborado por Grupo N°2.",
           general_title = "Nota: ",
           footnote_as_chunk = TRUE,
           title_format = c("italic", "bold"))
Tabla N°3: Indicadores estadísticos descriptivos de la variable precipitación en milímetros (2024–2026)
Variable Rango Media Mediana Moda Varianza Desv_Est CV Asimetria Curtosis N_Atipicos
Precipitación (mm) [0; 42.24] 0.13 0 2.25 0.31 0.56 417.96 17.72 667.62 28747
Nota: Fuente: Global Weather Repository. Elaborado por Grupo N°2.

7. Conclusión

La precipitación presenta un comportamiento predominantemente seco, concentrando su valor central (Mediana) y más frecuente (Moda) en el primer intervalo (\(0\text{ mm}\)), pero con una marcada variabilidad a más de 28,000 valores atípicos que alcanzan hasta \(42.24\text{ mm}\). Este comportamiento resulta perjudicial para la población y la infraestructura, ya que la fuerte dispersión y la irrupción de lluvias torrenciales imprevistas aumentan directamente la probabilidad de inundaciones y desbordamientos urbanos.