0.- Librerias

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

1.- leer datos

variables <- read_csv("C:/Users/CESAR/Downloads/proyecto x/GlobalWeatherRepository.csv", show_col_types = TRUE)

2.- Depuración y selección de la variable

Depuración

variables <- na.omit(variables)

Selección

Humedad <- variables$humidity

3.- Frecuancias

Tabla 1 aplicando sturges

Max y min

n_total <- length(Humedad)
valor_min <- min(Humedad, na.rm = TRUE)
valor_max <- max(Humedad, na.rm = TRUE)
rango <- valor_max - valor_min

Regla de Sturges

K_sturges <- floor(1 + 3.322 * log10(n_total))
K_sturges
## [1] 18
A_sturges <- rango / K_sturges
A_sturges
## [1] 5.444444

Intervalos

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

Bucle para las columnas de la tabla

ni1 <- numeric(length(Li1))

for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(
      Humedad >= Li1[i] &
        Humedad <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      Humedad >= Li1[i] &
        Humedad < Ls1[i],
      na.rm = TRUE
    )
  }
}
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

Tabla simplificada

Li1 <- seq(0, 90, by = 10)
Ls1 <- seq(10, 100, by = 10)

# 3.2 Bucle para el conteo de frecuencias absolutas (ni1)
ni1 <- numeric(length(Li1))

for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(
      Humedad >= Li1[i] & Humedad <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      Humedad >= Li1[i] & Humedad < Ls1[i],
      na.rm = TRUE
    )
  }
}

# Frecuencia relativa (Porcentaje)
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

4.- Tablas de frecuencia

Tabla 1

n_total <- length(Humedad)
valor_min <- min(Humedad, na.rm = TRUE)
valor_max <- max(Humedad, na.rm = TRUE)
rango <- valor_max - valor_min
K_sturges <- floor(1 + 3.322 * log10(n_total))
A_sturges <- rango / K_sturges

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

for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(
      Humedad >= Li1[i] &
        Humedad <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      Humedad >= Li1[i] &
        Humedad < Ls1[i],
      na.rm = TRUE
    )
  }
}
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

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 temperatura en Fahrenheit de los registros meteorológicos en capotales del mundo 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 N.1: Distribución de frecuencias de temperatura en Fahrenheit de los registros meteorológicos en capotales del mundo mediante la regla de Sturges, período 2024-2026
Lim_inf Lim_sup MC ni hi Ni_asc Hi_asc Ni_dsc Hi_dsc
2 7.44 4.72 574 0.41 574 0.41 141703 100
7.44 12.89 10.17 1919 1.35 2493 1.76 141129 99.59
12.89 18.33 15.61 3642 2.57 6135 4.33 139210 98.24
18.33 23.78 21.06 3509 2.48 9644 6.81 135568 95.67
23.78 29.22 26.5 4431 3.13 14075 9.93 132059 93.19
29.22 34.67 31.94 4166 2.94 18241 12.87 127628 90.07
34.67 40.11 37.39 5564 3.93 23805 16.8 123462 87.13
40.11 45.56 42.83 5362 3.78 29167 20.58 117898 83.2
45.56 51 48.28 5786 4.08 34953 24.67 112536 79.42
51 56.44 53.72 8120 5.73 43073 30.4 106750 75.33
56.44 61.89 59.17 7364 5.2 50437 35.59 98630 69.6
61.89 67.33 64.61 10654 7.52 61091 43.11 91266 64.41
67.33 72.78 70.06 10281 7.26 71372 50.37 80612 56.89
72.78 78.22 75.5 15021 10.6 86393 60.97 70331 49.63
78.22 83.67 80.94 14306 10.1 100699 71.06 55310 39.03
83.67 89.11 86.39 17508 12.36 118207 83.42 41004 28.94
89.11 94.56 91.83 13951 9.85 132158 93.26 23496 16.58
94.56 100 97.28 9545 6.74 141703 100 9545 6.74
TOTAL 141703 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.

tabla simplificada

Li1 <- seq(0, 90, by = 10)
Ls1 <- seq(10, 100, by = 10)
ni1 <- numeric(length(Li1))

# 3.2 Bucle para el conteo de frecuencias absolutas (ni1)
ni1 <- numeric(length(Li1))

for(i in 1:length(Li1)){
  if(i == length(Li1)){
    ni1[i] <- sum(
      Humedad >= Li1[i] & Humedad <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      Humedad >= Li1[i] & Humedad < Ls1[i],
      na.rm = TRUE
    )
  }
}

# Frecuencia relativa (Porcentaje)
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
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
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)
)


if (tail(Tabla_Sturges$Hi_asc, 1) != 100.00) {
  Tabla_Sturges$Hi_asc[nrow(Tabla_Sturges)] <- 100.00
}


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 N2: Distribución de frecuencias de NO2 optimizada con rangos de 50 en 50 (0 a 450), 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 N2: Distribución de frecuencias de NO2 optimizada con rangos de 50 en 50 (0 a 450), período 2024-2026
Lim_inf Lim_sup MC ni hi Ni_asc Hi_asc Ni_dsc Hi_dsc
0 10 5 1178 0.83 1178 0.83 141703 100
10 20 15 5653 3.99 6831 4.82 140525 99.17
20 30 25 7244 5.11 14075 9.93 134872 95.18
30 40 35 8782 6.2 22857 16.13 127628 90.07
40 50 45 10873 7.67 33730 23.8 118846 83.87
50 60 55 13664 9.64 47394 33.45 107973 76.2
60 70 65 17239 12.17 64633 45.61 94309 66.55
70 80 75 27253 19.23 91886 64.84 77070 54.39
80 90 85 26321 18.57 118207 83.42 49817 35.16
90 100 95 23496 16.58 141703 100 23496 16.58
TOTAL 141703 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.

5.- Gráficos

5.1.- Histograma ni

cortes_hist <- c(Li1, Ls1[length(Ls1)])
hist(
  Humedad,
  breaks = cortes_hist,
  col = "#FF7F0E",            
  border = "black",             
  main = "Gráfico N°1 :Histograma de Frecuencias absoluta de Humedad %
  para el análisis meteorológico en capitales del mundo",
  sub = "Periodo: Mayo 2024 - Mayo 2026",
  xlab = "Humedad (%)",
  ylab = "Frecuencia Absoluta (ni)", 
  axes = FALSE,                
  xlim = c(0, 100),             
  font.main = 2,
  col.main = "black"
)
axis(
  side = 1, 
  at = cortes_hist, 
  labels = round(cortes_hist, 1), 
  las = 1,                      
  font = 2,                      
  col = "#2C3E50",
  cex.axis = 0.75               
)
axis(
  side = 2, 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

5.2.- Histograma hi

cortes_hist <- c(Li1, Ls1[length(Ls1)])
# Guardamos el objeto histograma sin graficarlo primero para modificar sus alturas
h_rel <- hist(Humedad, breaks = cortes_hist, plot = FALSE)
h_rel$counts <- hi1
h_rel$density <- hi1  
# 3. Graficamos con el mismo diseño exacto
plot(
  h_rel,
  freq = TRUE, # Usamos TRUE para que respete el reemplazo que hicimos en $counts
  col = "#FF7",            
  border = "black",             
  main = "Gráfico N°2: Histograma de Frecuencias Relativas de Humedad %
  para el análisis meteorológico en capitales del mundo",
  sub = "Periodo: Mayo 2024 - Mayo 2026",
  xlab = "Humedad (%)",
  ylab = "Frecuencia Relativa (hi %)", 
  axes = FALSE,                
  xlim = c(0, 100),             
  font.main = 2,
  col.main = "black"
)

# 4. Ejes idénticos al diseño original
axis(
  side = 1, 
  at = cortes_hist, 
  labels = round(cortes_hist, 1), 
  las = 1,                       
  font = 2,                       
  col = "#2C3E50",
  cex.axis = 0.75               
)

axis(
  side = 2, 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

5.3.- Histograma de ni con el tamaño muestral

par(mar = c(5, 5.5, 4, 2) + 0.1)
hist(
  Humedad,
  breaks = cortes_hist,                           
  right = FALSE,                             
  col = "#FF7F0E",                           
  border = "black",                          
  main = "Gráfico N°3 : Histograma de Frecuencia absolutas de humedad (%) 
  para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository",
  xlab = "Humedad (%)",
  ylab = "",                                 
  yaxt = "n",                                
  ylim = c(0, 140000)                         
)

marcas_y <- seq(0, 140000, by = 20000)
axis(side = 2, at = marcas_y, labels = format(marcas_y, big.mark = ","), font = 2, las = 1)

mtext(text = "Frecuencia Absoluta (ni)", side = 2, line = 4.5, font = 2)

5.4.- Histograma de Hi con el tamaño muestral

cortes_hist <- c(Li1, Ls1[length(Ls1)])
h_rel <- hist(Humedad, breaks = cortes_hist, plot = FALSE)
h_rel$counts <- hi1
h_rel$density <- hi1 
plot(
  h_rel,
  freq = TRUE, 
  col = "#FF7",       
  border = "black",              
  main = "Gráfico N°4: Histograma de Frecuencias Relativas de Humedad %\npara el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 - Mayo 2026",
  sub = "Fuente: Global Weather Repository",
  xlab = "Humedad (%)",
  ylab = "Frecuencia Relativa (hi %)", 
  axes = FALSE,                
  xlim = c(0, 100),
  ylim = c(0, 100), 
  font.main = 2,
  col.main = "black"
)
axis(
  side = 1, 
  at = cortes_hist, 
  labels = round(cortes_hist, 1), 
  las = 1,                       
  font = 2,                       
  col = "#2C3E50",
  cex.axis = 0.75               
)

marcas_y <- seq(0, 100, by = 5) 
axis(
  side = 2, 
  at = marcas_y, 
  labels = paste0(marcas_y, "%"), 
  las = 1, 
  font = 2, 
  col = "#2C3E50",
  cex.axis = 0.8
)

5.5.- Poligono de frecuencia Ni

par(mar = c(5, 5.5, 4, 2) + 0.1)
cortes <- c(Li1, Ls1[length(Ls1)])  
marcas_clase <- MC1                

marcas_poligono <- c(marcas_clase[1] - 5, marcas_clase, marcas_clase[length(marcas_clase)] + 5)
ni_poligono <- c(0, Tabla_Sturges$ni, 0)

hist(
  Humedad,
  breaks = cortes,                           
  right = FALSE,                             
  col = "#FF7F0E",                           
  border = "black",                          
  main = "Gráfico N°5 : Poligono de frecuencias, temperatura 
  en Fahrenheit para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository",
  xlab = "Humedad (%)",
  ylab = "",                                 
  yaxt = "n",                                
  ylim = c(0, 30000)                         
)

marcas_y <- seq(0, 30000, by = 10000)
axis(side = 2, at = marcas_y, labels = format(marcas_y, big.mark = ","), font = 2, las = 1)

mtext(text = "Frecuencia Absoluta (ni)", side = 2, line = 4.5, font = 2)


lines(
  x = marcas_poligono, 
  y = ni_poligono, 
  col = "red",            
  lwd = 3,                  
  type = "o",               
  pch = 19                  
)

5.6.- Ojivas ascendente y descendente (ni)

puntos_eje_x <- c(Li1, Ls1[length(Ls1)]) 

ni_asc_ojiva <- c(0, Tabla_Sturges$Ni_asc)
ni_dsc_ojiva <- c(sum(Tabla_Sturges$ni), Tabla_Sturges$Ni_dsc)

limite_max_y <- 150000
marcas_y     <- seq(0, limite_max_y, by = 30000)

plot(
  1, 
  type = "n",
  main = "Gráfico N°6: Ojivas de Frecuencias Absolutas Acumuladas",
  sub = "Fuente: Global Weather Repository",
  xlab = "Humedad (%)",
  ylab = "",                             
  xaxt = "n",                             
  yaxt = "n",                             
  xlim = c(0, 100),                     
  ylim = c(0, limite_max_y),
  xaxs = "i"                             
)

axis(side = 1, at = puntos_eje_x, labels = puntos_eje_x, font = 2)
axis(side = 2, at = marcas_y, labels = format(marcas_y, big.mark = ","), font = 2, las = 1)

mtext(text = "Frecuencia Absoluta Acumulada (Ni)", side = 2, line = 4.5, font = 2)


grid(nx = NULL, ny = NULL, lty = "dashed", col = "lightgray", lwd = 1)

lines(
  x = puntos_eje_x, 
  y = ni_asc_ojiva, 
  col = "#2980b9",                        
  lwd = 3,                                
  type = "o",                             
  pch = 19                                
)
lines(
  x = puntos_eje_x, 
  y = ni_dsc_ojiva, 
  col = "#e74c3c",                        
  lwd = 3, 
  type = "o", 
  pch = 19
)
legend(
  "bottomright",                                                
  legend = c("Ojiva Ascendente (Hi asc)", "Ojiva Descendente (Hi dsc)"),
  col = c("#2980b9", "#e74c3c"),
  lty = 1,
  lwd = 3,
  pch = 19,
  bty = "n",  
  cex = 0.75, # Un tamaño equilibrado para que quepa perfecto abajo
  text.font = 2
)

5.7.- Ojivas ascendente y descendente (hi)

 puntos_eje_x <- c(Li1, Ls1[length(Ls1)]) 

hi_asc_ojiva <- c(0, Tabla_Sturges$Hi_asc)
hi_dsc_ojiva <- c(100, Tabla_Sturges$Hi_dsc)

limite_max_y <- 100
marcas_y     <- seq(0, 100, by = 20)

plot(
  1, 
  type = "n",
  main = "Gráfico N°7: Ojivas de Frecuencias Relativas Acumuladas",
  sub = "Fuente: Global Weather Repository",
  xlab = "Humedad (%)",
  ylab = "",                             
  xaxt = "n",                             
  yaxt = "n",                             
  xlim = c(0, 100),                     
  ylim = c(0, limite_max_y),
  xaxs = "i"                              
)

axis(side = 1, at = puntos_eje_x, labels = puntos_eje_x, font = 2)
axis(side = 2, at = marcas_y, labels = paste0(marcas_y, "%"), font = 2, las = 1)

mtext(text = "Frecuencia Relativa Acumulada (%)", side = 2, line = 4.5, font = 2)

grid(nx = NULL, ny = NULL, lty = "dashed", col = "lightgray", lwd = 1)

lines(
  x = puntos_eje_x, 
  y = hi_asc_ojiva, 
  col = "#2980b9",                        
  lwd = 3,                                
  type = "o",                             
  pch = 19                                
)

lines(
  x = puntos_eje_x, 
  y = hi_dsc_ojiva, 
  col = "#e74c3c",                        
  lwd = 3, 
  type = "o", 
  pch = 19
)

legend(
  "bottomright",                                                
  legend = c("Ojiva Ascendente (Hi asc)", "Ojiva Descendente (Hi dsc)"),
  col = c("#2980b9", "#e74c3c"),
  lty = 1,
  lwd = 3,
  pch = 19,
  bty = "n",  
  cex = 0.75, # Un tamaño equilibrado para que quepa perfecto abajo
  text.font = 2
)

5.8.- Diagrama de caja y bigotes

datos_reconstruidos <- rep(MC1, times = ni1)

marcas_x <- seq(0, 100, by = 10)

boxplot(
  datos_reconstruidos,
  horizontal = TRUE,                      
  col = "skyblue",                        
  border = "black",                      
  main = "Gráfico N°8: Diagrama de Caja y Bigotes (Boxplot)",
  sub = "Fuente: Global Weather Repository",
  xaxt = "n",                             
  yaxt = "n",                             
  lwd = 1.8,                              
  outcol = "red",                         
  outpch = 19,                            
  outcex = 0.8                            
)
axis(
  side = 1, 
  at = marcas_x,       
  labels = paste0(marcas_x, "°F"), 
  font = 2,            
  las = 1                              
)

mtext(text = "Humedad (%)", side = 1, line = 3.0, font = 2, cex = 1)

grid(nx = NULL, ny = NA, lty = "dashed", col = "lightgray", lwd = 1)

6.- Indicadores Estadisticos

Tendencia central

Humedad_reconst <- rep(MC1, times = ni1)

media    <- mean(Humedad_reconst)
mediana  <- median(Humedad_reconst)
moda     <- MC1[which.max(ni1)]

Medidas de Dispersión

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

Medidas de Forma

asim <- skewness(Humedad_reconst)
kurt <- kurtosis(Humedad_reconst)

valores atípicos

Q1  <- quantile(Humedad_reconst, 0.25)
Q3  <- quantile(Humedad_reconst, 0.75)
RIC <- Q3 - Q1

lim_inf <- Q1 - 1.5 * RIC
lim_sup <- Q3 + 1.5 * RIC

# Conteo automatizado de observaciones que caen fuera de los bigotes
n_atipicos <- sum(Humedad_reconst < lim_inf | Humedad_reconst > lim_sup)

# Formatear el rango de las marcas de clase como texto descriptivo
rango_valores <- paste0("[", min(Li1), "% ; ", max(Ls1), "%]")

Tabla de indicadores

tabla_indicadores <- data.frame(
  Variable         = "Humedad (%)",
  Rango            = rango_valores,
  X                = round(media, 2),
  Me               = round(mediana, 2),
  Mo               = round(moda, 2),
  V                = round(varianza, 2),
  Sd               = round(desv_est, 2),
  CV               = paste0(round(cv, 2), "%"),
  As               = round(asim, 2),
  K                = round(kurt, 2),
  Valores_Atipicos = n_atipicos
)
kable(
  tabla_indicadores, 
  align   = "c", 
  caption = "Tabla N°3: Indicadores estadísticos descriptivos de la variable Humedad (%) basados en la distribución de frecuencias, período 2024-2026"
) |>
  kableExtra::kable_styling(
    full_width        = FALSE, 
    position          = "center", 
    bootstrap_options = c("striped", "hover", "condensed", "responsive")
  ) |>
  kableExtra::row_spec(
    0, 
    bold = TRUE, 
    color = "white", 
    background = "#2C3E50"  
  )
Tabla N°3: Indicadores estadísticos descriptivos de la variable Humedad (%) basados en la distribución de frecuencias, período 2024-2026
Variable Rango X Me Mo V Sd CV As K Valores_Atipicos
Humedad (%) [0% ; 100%] 66.72 75 75 547.39 23.4 35.07% -0.71 2.57 1178

7.- Conclusiones

El comportamiento de la Humedad (%) fluctúa en un rango de \(0.00\%\) a \(100.00\%\), y sus valores giran en torno a una mediana y moda de \(75.00\%\), con una media aritmética de \(66.72\%\). Presenta una desviación estándar de \(23.40\%\) y un coeficiente de variación de \(35.07\%\), lo que constituye un conjunto de datos con dispersión moderada. La distribución muestra una concentración moderadamente alta alrededor del centro (curtosis leptocúrtica de \(2.57\)) y una mayor acumulación de registros en los valores altos, con una cola extendida hacia los valores bajos que genera una asimetría negativa de \(-0.71\), identificándose además \(1178\) valores atípicos en la parte inferior.