0. Librerias

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], na.rm = TRUE)
  } else {
    ni1[i] <- sum(Prmm >= Li1[i] & Prmm < Ls1[i], na.rm = TRUE)
  }
}

# Frecuencia relativa
hi1 <- (ni1 / sum(ni1)) * 100

# Acumuladas
Ni_asc1 <- cumsum(ni1)
Hi_asc1 <- cumsum(hi1)
Ni_dsc1 <- rev(cumsum(rev(ni1)))
Hi_dsc1 <- rev(cumsum(rev(hi1)))

# Marca de clase
MC1 <- (Li1 + Ls1) / 2

3.5. Frecuencia para tabla con amplitud ajustada

amplitud <- 15
Li2 <- seq(floor(valor_min/15)*15, ceiling(valor_max/15)*15 - 15, by = 15)
Ls2 <- Li2 + 15

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 N1: Distribución de frecuencias de la Precipitación en milímetros de los 
  registros meteorológicos mundiales mediante la regla de Sturges, 
  período 2024–2026 "
)|> 
  kableExtra::kable_styling(full_width = TRUE, position ="center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) |> 
  kableExtra::row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") |> 
  kableExtra::row_spec(nrow(Tabla_Sturges2), bold = TRUE, background = "#EAEDED") |> 
  footnote(general = "Elaborado por Grupo 2.\nFuente: Global Weather Repository.", general_title = "Nota:", footnote_as_chunk = TRUE, title_format = c("italic","bold"))
Tabla N1: Distribución de frecuencias de la Precipitación en milímetros de los registros meteorológicos mundiales 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 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 N2: Distribución de frecuencias de la Precipitación en milímetros 
  en los registros meteorológicos mundiales del 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(TDF_Prmm_Final), bold = TRUE, background = "#EAEDED") |>
  footnote(general = "Elaborado por Grupo 2.\nFuente: Global Weather Repository.", general_title = "Nota: ", footnote_as_chunk = TRUE, title_format = c("italic","bold"))
Tabla N2: Distribución de frecuencias de la Precipitación en milímetros en los registros meteorológicos mundiales del período 2024–2026
Lim. Inf. Lim. Sup. MC ni hi (%) Ni Asc Hi Asc Ni Dsc Hi Dsc
0 15 7.5 141683 99.99 141683 99.99 141703 100
15 30 22.5 19 0.01 141702 100 20 0.01
30 45 37.5 1 0 141703 100 1 0
TOTAL 141703 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.

5. Gráficos de Distribución de Frecuencias

5.1. Histograma Original (ni)

hist(
  Prmm, 
     main = "Grafico Nro 1. Distribución de frecuencias absolutas de la precipitacion Pluvial
     (mm) del años 2024 hasta el 2026",
     xlab = "Precipitacion (mm)", 
     ylab = "Frecuencia", 
     col = "lightgreen", 
     border = "black"
     )
     
grid()

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

hist(
  Prmm, 
     breaks = c(Li2, max(Ls2)), 
     ylim = c(0, n_total),
     main = "Grafico Nro 2: Histograma y polígono de frecuencias 
  absolutas de la Precipitación de los registros 
  meteorológicos mundiales, período 2024–2026", 
     xlab = "Precipitación (mm)", 
     ylab = "Frecuencia", 
     col = "lightgreen", 
     border = "black"
     )
grid()

5.3. Histograma original (hi)

barplot(hi2, 
        names.arg = paste(Li2, Ls2, sep = " a "), 
        main = "Grafico Nro 3: Histograma Local de Frecuencia
        Relativa ,periodo 2024 -2026",
        xlab = "Intervalos de Prmm", 
        ylab = "Frecuencia Relativa (%)", 
        col = "skyblue", 
        las = 2)

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

barplot(hi2, 
        names.arg = paste(Li2, Ls2, sep = " a "), 
        ylim = c(0, 100),
        main = "Grafico Nro 4: Histograma Global de Frecuencia Relativa del registrado
        meteorológicos ,perído 2024-2026 ", 
        xlab = "Intervalos de Prmm", 
        ylab = "Frecuencia Relativa (%)", 
        col = "lightgreen", 
        las = 2)

5.5. Polígono de frecuencias (hi)

bp <- barplot(hi2, 
              names.arg = paste(Li2, Ls2, sep = "-"), 
              col = "lightgreen", 
              border = "black",
              ylim = c(0, max(hi2)*1.2), 
              main = "Grafico Nro 5. Polígono de frecuencias absolutas de la precipitación
              en milímetros de los registros meteorológicos mundiales, período 2024–2026",
              xlab = "Intervalos", 
              ylab = "Frecuencia relativa (%)", 
              las = 2)
x_pol <- c(bp[1] - (bp[2]-bp[1]), bp, bp[length(bp)] + (bp[2]-bp[1]))
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 = "Grafico Nro 6: Ojivas de Frecuencia Absoluta de la precipitación,
     período 2024-2026 ", 
     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 = "Grafico Nro 7: Ojivas ascendente y descendente de frecuencias 
     absolutas acumuladas de la precipitación milímetros de los registros
     meteorológicos mundiales, período 2024–2026
")
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

Q1 <- quantile(Prmm, 0.25)
Q3 <- quantile(Prmm, 0.75)
RIC <- Q3 - Q1
Lim_inf <- Q1 - 1.5 * RIC
Lim_sup <- Q3 + 1.5 * RIC

boxplot(Prmm, 
        horizontal = TRUE, 
        outline = FALSE, 
        main = "Gráfico Nro 8: Boxplot de precipitación milímetros 
        del año 2024 hasta 2026", 
        xlab = "Prmm", 
        col = "lightblue")

atipicos <- Prmm[Prmm < Lim_inf | Prmm > Lim_sup]
if(length(atipicos) > 0) {
  points(atipicos, rep(1, length(atipicos)), col = "red", pch = 19, cex = 0.8)
}
abline(v = Lim_inf, col = "blue", lwd = 2, lty = 2)
abline(v = Lim_sup, col = "blue", lwd = 2, lty = 2)

legend("topright", 
       legend = c("Atipicos", "Limites de Tukey"), 
       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)

# Moda corregida apuntando a la matriz numerica original sin texto
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

n_atipicos <- length(atipicos)
intervalo_atipicos <- paste0("[", round(Lim_inf,2), "; ", round(Lim_sup,2), "]")
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 = n_atipicos
)

kable(tabla_indicadores, align = "c",
      caption = " Indicadores estadísticos descriptivos de la variable precipitación en milímetros mediante los  registros meteorológicos mundiales, 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")
Indicadores estadísticos descriptivos de la variable precipitación en milímetros mediante los registros meteorológicos mundiales, período 2024–2026
Variable Rango Media Mediana Moda Varianza Desv_Est CV Asimetria Curtosis N_Atipicos
Precipitación (mm) [0; 42.24] 0.13 0 7.5 0.31 0.56 417.96 17.72 667.62 28747
print(tabla_indicadores)
##             Variable      Rango Media Mediana Moda Varianza Desv_Est     CV
## 1 Precipitación (mm) [0; 42.24]  0.13       0  7.5     0.31     0.56 417.96
##   Asimetria Curtosis N_Atipicos
## 1     17.72   667.62      28747

7. Conclusiones

#El comportamiento de la Precipitación (mm) sigue la siguiente manera: fluctúa entre 0 y 42.24 mm y sus valores giran en torno a la mediana (0 mm) por la presencia de outliers, con una desviación estándar de 0.56 mm, siendo un conjunto de datos muy heterogéneo. #El conjunto de valores se concentra de forma leptocúrtica (667.62) en la parte baja (asimetría positiva de 17.72). Por todo lo anterior, el comportamiento de la variable es perjudicial, ya que la enorme dispersión y los más de 28,000 valores atípicos reflejan lluvias extremas e impredecibles que elevan el riesgo de inundaciones de impacto