0.- Librerías

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

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 Esta variable contienen registros de No moonrise indicando que hay lugares que simplemente no sale la luna

variables <- variables %>%
  # Quitamos la palabra "No moonrise" y la dejamos vacía
  mutate(moonrise = na_if(moonrise, "No moonrise")) %>%
  # Convertimos el texto a un formato de hora que R entienda
  mutate(hora_formato = parse_date_time(moonrise, orders = "HM p")) %>%
  # CAMBIO AQUÍ: Calculamos las horas totales de forma continua (Hora + Minutos/60)
  mutate(moonrise_horas = hour(hora_formato) + (minute(hora_formato) / 60))

n_original <- nrow(variables)
n_original
## [1] 141703

Selección

# Paso 3: Extraer solo los números (eliminando los vacíos) para tu tabla
Luna_S <- na.omit(variables$moonrise_horas)
n_total <- length(Luna_S)
n_total
## [1] 136839

3.- Frecuencias

Min y max

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

# Regla de Sturges para determinar el número de intervalos
K_sturges <- floor(1 + 3.322 * log10(n_total))
K_sturges
## [1] 18
A_sturges <- rango / K_sturges
A_sturges
## [1] 1.332407

Intervalos

cortes <- seq(valor_min, by = A_sturges, length.out = K_sturges + 1)
cortes[length(cortes)] <- valor_max 

Li1 <- cortes[1:K_sturges]
Ls1 <- cortes[2:(K_sturges + 1)]

Bucle para columnas

ni1 <- numeric(length(Li1))

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

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

# Frecuencias 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 distribución de frecuencia

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

# Convertir a caracteres para poder mezclar números y texto con la fila TOTAL
Tabla_Sturges2 <- Tabla_Sturges
Tabla_Sturges2[] <- lapply(Tabla_Sturges2, as.character)

# Fila de totales
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 = ""
)

# Agregar fila de totales
Tabla_Sturges2 <- rbind(Tabla_Sturges2, fila_total)

# ==============================================================================
# 5. RENDERIZADO ESTÉTICO CON KABLEEXTRA
# ==============================================================================
kable(
  Tabla_Sturges2,
  align = "c",
  caption = "Tabla N°1: Distribución de frecuencias de la hora de salida de la luna (en horas desde la medianoche) 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"
  ) |>  
  kableExtra::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 la hora de salida de la luna (en horas desde la medianoche) 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 1.33 0.67 8006 5.85 8006 5.85 136839 100
1.33 2.66 2 7990 5.84 15996 11.69 128833 94.15
2.66 4 3.33 7957 5.81 23953 17.5 120843 88.31
4 5.33 4.66 7824 5.72 31777 23.22 112886 82.5
5.33 6.66 6 7618 5.57 39395 28.79 105062 76.78
6.66 7.99 7.33 7333 5.36 46728 34.15 97444 71.21
7.99 9.33 8.66 7444 5.44 54172 39.59 90111 65.85
9.33 10.66 9.99 7619 5.57 61791 45.16 82667 60.41
10.66 11.99 11.33 7531 5.5 69322 50.66 75048 54.84
11.99 13.32 12.66 7655 5.59 76977 56.25 67517 49.34
13.32 14.66 13.99 7737 5.65 84714 61.91 59862 43.75
14.66 15.99 15.32 7473 5.46 92187 67.37 52125 38.09
15.99 17.32 16.66 7273 5.32 99460 72.68 44652 32.63
17.32 18.65 17.99 7423 5.42 106883 78.11 37379 27.32
18.65 19.99 19.32 7298 5.33 114181 83.44 29956 21.89
19.99 21.32 20.65 7420 5.42 121601 88.86 22658 16.56
21.32 22.65 21.98 7526 5.5 129127 94.36 15238 11.14
22.65 23.98 23.32 7712 5.64 136839 100 7712 5.64
TOTAL 136839 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.
Li1 <- seq(0, 21, by = 3) 
Ls1 <- seq(3, 24, by = 3)

ni1 <- numeric(length(Li1))

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

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

# Frecuencias 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_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 = ""
)

# Agregar fila de totales
Tabla_Sturges2 <- rbind(Tabla_Sturges2, fila_total)

kable(
  Tabla_Sturges2,
  align = "c",
  caption = "Tabla N°2: Distribución de frecuencias de la de salida de la luna (en horas desde la medianoche) para el análisis meteorológico en capitales del mundo, 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"
  ) |>  
  kableExtra::footnote(
    general = "Elaborado por Grupo 2.\nFuente: Global Weather Repository.",
    general_title = "Nota: ",
    footnote_as_chunk = TRUE,
    title_format = c("italic", "bold")
  )
Tabla N°2: Distribución de frecuencias de la de salida de la luna (en horas desde la medianoche) para el análisis meteorológico en capitales del mundo, Período 2024-2026
Lim_inf Lim_sup MC ni hi Ni_asc Hi_asc Ni_dsc Hi_dsc
0 3 1.5 17981 13.14 17981 13.14 136839 100
3 6 4.5 17648 12.9 35629 26.04 118858 86.86
6 9 7.5 16695 12.2 52324 38.24 101210 73.96
9 12 10.5 16998 12.42 69322 50.66 84515 61.76
12 15 13.5 17292 12.64 86614 63.3 67517 49.34
15 18 16.5 16566 12.11 103180 75.4 50225 36.7
18 21 19.5 16535 12.08 119715 87.49 33659 24.6
21 24 22.5 17124 12.51 136839 100 17124 12.51
TOTAL 136839 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.

5.- Gráficos de Distribución de Frecuencias

5.1.- histograma Ni

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

hist(
  Luna_S,
  breaks = cortes_hist,                           
  right = FALSE,                                             
  col = "#2ef",                            
  border = "black",                          
  main = "Gráfico N°1: Histograma de Frecuencias Absolutas de la Salida de 
  la Luna para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository",
  xlab = "Salida de la Luna (Horas)",
  ylab = "",                                                 
  xaxt = "n",  # <-- CAMBIO AQUÍ: Desactivamos el eje X automático de R
  yaxt = "n",                                               
  ylim = c(0, 20000)  
)

# CORRECCIÓN PARA EL EJE X: Pintamos exactamente todos los cortes desde 0 hasta 24
axis(side = 1, at = cortes_hist, labels = cortes_hist, font = 2)

# Eje Y (El que ya tenías corregido para los miles)
marcas_y <- seq(0, 20000, by = 5000)
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.2.- Histograma hi

par(mar = c(5, 5.5, 4, 2) + 0.1)

# 1. Crear el lienzo vacío con plot fijando el eje Y de 0 a 100 de forma directa
plot(
  Luna_S,
  type = "n",
  xlim = c(0, 24),
  ylim = c(0, 15),  # ESTANDARIZADO: Va de 0 a 100% automáticamente
  xaxt = "n",
  yaxt = "n",
  bty = "n",
  xlab = "Salida de la Luna (Horas)",
  ylab = "",
  main = "Gráfico N°2: Histograma de Frecuencias Relativas de la Salida de
  la Luna para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository"
)
rect(
  xleft = Li1, 
  ybottom = 0, 
  xright = Ls1, 
  ytop = hi1, 
  col = "#4A90E2", 
  border = "black"
)

# 3. Eje X completo con todas las horas (0 a 24)
axis(side = 1, at = c(Li1, 24), labels = c(Li1, 24), font = 2)

# 4. Eje Y estandarizado en porcentajes reales de 20 en 20 sin fórmulas
marcas_y <- seq(0, 15, by = 5)
axis(side = 2, at = marcas_y, labels = paste0(marcas_y, "%"), font = 2, las = 1)

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

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

par(mar = c(5, 5.5, 4, 2) + 0.1)
hist(
  Luna_S,
  breaks = cortes_hist,                           
  right = FALSE,                                             
  col = "#2ef",                            
  border = "black",                          
  main = "Gráfico N°3: Histograma de Frecuencias Absolutas de la Salida de 
  la Luna para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository",
  xlab = "Salida de la Luna (Horas)",
  ylab = "",                                                 
  xaxt = "n",  # <-- CAMBIO AQUÍ: Desactivamos el eje X automático de R
  yaxt = "n",                                               
  ylim = c(0, 140000)  
)

# CORRECCIÓN PARA EL EJE X: Pintamos exactamente todos los cortes desde 0 hasta 24
axis(side = 1, at = cortes_hist, labels = cortes_hist, font = 2)

# Eje Y (El que ya tenías corregido para los miles)
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

par(mar = c(5, 5.5, 4, 2) + 0.1)

# 1. Crear el lienzo vacío con plot fijando el eje Y de 0 a 100 de forma directa
plot(
  Luna_S,
  type = "n",
  xlim = c(0, 24),
  ylim = c(0, 100),  # ESTANDARIZADO: Va de 0 a 100% automáticamente
  xaxt = "n",
  yaxt = "n",
  bty = "n",
  xlab = "Salida de la Luna (Horas)",
  ylab = "",
  main = "Gráfico N°4: Histograma de Frecuencias Relativas de la Salida de
  la Luna para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository"
)
rect(
  xleft = Li1, 
  ybottom = 0, 
  xright = Ls1, 
  ytop = hi1, 
  col = "#4A90E2", 
  border = "black"
)

# 3. Eje X completo con todas las horas (0 a 24)
axis(side = 1, at = c(Li1, 24), labels = c(Li1, 24), font = 2)

# 4. Eje Y estandarizado en porcentajes reales de 20 en 20 sin fórmulas
marcas_y <- seq(0, 100, by = 20)
axis(side = 2, at = marcas_y, labels = paste0(marcas_y, "%"), font = 2, las = 1)

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

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] - 1.5, marcas_clase, marcas_clase[length(marcas_clase)] + 1.5)
ni_poligono <- c(0, Tabla_Sturges$ni, 0)

hist(
  Luna_S,
  breaks = cortes,                           
  right = FALSE,                             
  col = "#2ef",                           
  border = "black",                          
  main = "Gráfico N°5 : Poligono de frecuencias, Salida de
  la Luna para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository",
  xlab = "Salida de la Luna (Horas)",
  ylab = "",                                 
  yaxt = "n",                                
  ylim = c(0, 25000)                         
)

marcas_y <- seq(0, 25000, by = 5000)
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)]) 

# Configuración correcta de los vectores de la ojiva para que inicien y cierren bien
ni_asc_ojiva <- c(0, Tabla_Sturges$Ni_asc)
ni_dsc_ojiva <- c(Tabla_Sturges$Ni_dsc, 0) # Empieza en el total y termina en 0

# Ajustamos el límite máximo del eje Y al total real de tus datos válidos (aprox 141,000)
limite_max_y <- 150000
marcas_y     <- seq(0, limite_max_y, by = 30000)

par(mar = c(5, 5.5, 4, 2) + 0.1)

plot(
  1, 
  type = "n",
  main = "Gráfico N°6:Ojivas de Frecuencias Absolutas Ac. de la Salida
  de la Luna para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository",
  xlab = "Salida de la Luna (Horas)",
  ylab = "",                                             
  xaxt = "n",                                             
  yaxt = "n",                                             
  bty = "n",   # Remueve el cuadro exterior para que quede limpio igual que el histograma
  xlim = c(0, 24),                     
  ylim = c(0, limite_max_y),
  xaxs = "i"                                             
)
# Ejes con todas las marcas correspondientes
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)
# Cuadrícula de fondo
grid(nx = NULL, ny = NULL, lty = "dashed", col = "lightgray", lwd = 1)

# Línea de la Ojiva Ascendente
lines(
  x = puntos_eje_x, 
  y = ni_asc_ojiva, 
  col = "#2980b9",                        
  lwd = 3,                                 
  type = "o",                             
  pch = 19                                 
)
# Línea de la Ojiva Descendente
lines(
  x = puntos_eje_x, 
  y = ni_dsc_ojiva, 
  col = "#e74c3c",                        
  lwd = 3, 
  type = "o", 
  pch = 19
)
# Leyenda explicativa ajustada para frecuencias absolutas (Ni)
legend(
  "topleft", # <-- CAMBIO AQUÍ: Movida a la izquierda
  legend = c("Ojiva Ascendente (Ni asc)", "Ojiva Descendente (Ni dsc)"),
  col = c("#2980b9", "#e74c3c"),
  lty = 1,
  lwd = 3,
  pch = 19,
  bty = "n",  
  cex = 0.75, 
  text.font = 2
)

5.7.- Ojivas ascendente y descendente (hi)

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

# Configuración de los vectores usando los porcentajes acumulados de tu tabla
hi_asc_ojiva <- c(0, Tabla_Sturges$Hi_asc)
hi_dsc_ojiva <- c(Tabla_Sturges$Hi_dsc, 0) # Empieza en 100% y termina en 0%

# SOLUCIÓN PARA LA LEYENDA: Subimos el techo a 120 para ganar espacio libre arriba
limite_max_y <- 120
marcas_y     <- seq(0, 100, by = 20) # El eje Y se muestra limpio hasta 100%

par(mar = c(5, 5.5, 4, 2) + 0.1)

plot(
  1, 
  type = "n",
  main = "Gráfico N°7:Ojivas de Frecuencias Relativas Ac. de la Salida 
  de la Luna para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  sub = "Fuente: Global Weather Repository",
  xlab = "Salida de la Luna (Horas)",
  ylab = "",                                             
  xaxt = "n",                                             
  yaxt = "n",                                             
  bty = "n",   
  xlim = c(0, 24),                     
  ylim = c(0, limite_max_y), # Aplica el techo de 120
  xaxs = "i"                                             
)

# Ejes con sus marcas
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 (Hi %)", side = 2, line = 4.5, font = 2)

# Cuadrícula de fondo
grid(nx = NULL, ny = NULL, lty = "dashed", col = "lightgray", lwd = 1)

# Línea de la Ojiva Ascendente (Azul)
lines(x = puntos_eje_x, y = hi_asc_ojiva, col = "#2980b9", lwd = 3, type = "o", pch = 19)

# Línea de la Ojiva Descendente (Roja)
lines(x = puntos_eje_x, y = hi_dsc_ojiva, col = "#e74c3c", lwd = 3, type = "o", pch = 19)

# Leyenda ubicada arriba a la izquierda sin tocar ninguna línea
legend(
  "topleft", 
  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, 
  text.font = 2
)

5.8.- Diagrama de caja y bigotes

par(mar = c(5.5, 4, 4, 2) + 0.1) # Ajustamos márgenes inferiores para el título de abajo

boxplot(
  Luna_S,
  horizontal = TRUE,  
  col = "#2ef",
  border = "black",
  main = "Gráfico N°8: Diagrama de Caja y bigotes la Hora de 
  Salida de la Luna",
  sub = "Fuente: Global Weather Repository",
  xlab = "",          
  xaxt = "n",         
  yaxt = "n",        
  frame.plot = FALSE, 
  xlim = c(0.5, 1.5), 
  ylim = c(0, 24)     
)

# CORRECCIÓN: Pintamos todas las horas de 3 en 3 en el eje X (side = 1)
marcas_horas <- seq(0, 24, by = 3)
axis(side = 1, at = marcas_horas, labels = marcas_horas, font = 2)

# CORRECCIÓN: Ponemos el título del eje abajo (side = 1)
mtext(text = "Salida de la Luna (Horas)", side = 1, line = 3, font = 2)

6.- Indicadores Estadisticos

Tendencia central

Luna_S_reconst <- rep(MC1, times = ni1)

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

Dispersión

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

Forma

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

Valores atipicos

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

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

n_atipicos <- sum(Luna_S_reconst < lim_inf | Luna_S_reconst > lim_sup)
rango_valores <- paste0("[", min(Li1), " h ; ", max(Ls1), " h]")

Tabla de indicadores

tabla_indicadores <- data.frame(
  Variable         = "Salida de la Luna (Horas)",
  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 Hora de Salida de la Luna basados en la distribución de frecuencias, período Mayo 2024 a Mayo 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 Hora de Salida de la Luna basados en la distribución de frecuencias, período Mayo 2024 a Mayo 2026
Variable Rango X Me Mo V Sd CV As K Valores_Atipicos
Salida de la Luna (Horas) [0 h ; 24 h] 11.87 10.5 1.5 47.81 6.91 58.24% 0.02 -1.25 0

7.- Conclusión

El comportamiento de la Salida de la Luna (Horas) fluctúa en un rango de \(0\text{ h}\) a \(24\text{ h}\), y sus valores giran en torno a una mediana de \(10.50\text{ h}\) y una moda de \(1.50\text{ h}\), con una media aritmética de \(11.87\text{ h}\). Presenta una desviación estándar de \(6.91\text{ h}\) y un coeficiente de variación de \(58.24\%\), lo que constituye un conjunto de datos con una dispersión alta. La distribución muestra una concentración baja alrededor del centro (curtosis platicúrtica de \(-1.25\)) y una acumulación de registros bastante uniforme, con una cola ligeramente extendida hacia la derecha que genera una asimetría positiva muy leve de \(0.02\), no identificándose valores atípicos en la distribución.