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 moonset indicando que hay lugares que simplemente no hay puesta de la luna asi que depuramos esta variable sin estos registros teniendo al principio un tamaño muestral de

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

la depuramos y el tamaño muestral cambia

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

Selección

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

3.- Frecuencias

Min y max

valor_min <- min(Luna_P, na.rm = TRUE)
valor_max <- max(Luna_P, 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_P >= Li1[i] & Luna_P <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      Luna_P >= Li1[i] & Luna_P < 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 puesta 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 puesta 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 7802 5.69 7802 5.69 137011 100
1.33 2.66 2 7677 5.6 15479 11.3 129209 94.31
2.66 4 3.33 7707 5.63 23186 16.92 121532 88.7
4 5.33 4.66 7597 5.54 30783 22.47 113825 83.08
5.33 6.66 6 7591 5.54 38374 28.01 106228 77.53
6.66 7.99 7.33 7507 5.48 45881 33.49 98637 71.99
7.99 9.33 8.66 7555 5.51 53436 39 91130 66.51
9.33 10.66 9.99 7618 5.56 61054 44.56 83575 61
10.66 11.99 11.33 7639 5.58 68693 50.14 75957 55.44
11.99 13.32 12.66 7764 5.67 76457 55.8 68318 49.86
13.32 14.66 13.99 7867 5.74 84324 61.55 60554 44.2
14.66 15.99 15.32 7619 5.56 91943 67.11 52687 38.45
15.99 17.32 16.66 7572 5.53 99515 72.63 45068 32.89
17.32 18.65 17.99 7517 5.49 107032 78.12 37496 27.37
18.65 19.99 19.32 7435 5.43 114467 83.55 29979 21.88
19.99 21.32 20.65 7578 5.53 122045 89.08 22544 16.45
21.32 22.65 21.98 7537 5.5 129582 94.58 14966 10.92
22.65 23.98 23.32 7429 5.42 137011 100 7429 5.42
TOTAL 137011 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.

Devido a la complejidad y los datos propuestos por la regla de sturges , creamos la tabla simplificada, modificando su amplitud para asi que nos de una tabla mas facil y entendible para el expectador.

Tabla simplificada

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_P >= Li1[i] & Luna_P <= Ls1[i],
      na.rm = TRUE
    )
  } else {
    ni1[i] <- sum(
      Luna_P >= Li1[i] & Luna_P < 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 puesta 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 puesta 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 17376 12.68 17376 12.68 137011 100
3 6 4.5 17181 12.54 34557 25.22 119635 87.32
6 9 7.5 16987 12.4 51544 37.62 102454 74.78
9 12 10.5 17149 12.52 68693 50.14 85467 62.38
12 15 13.5 17550 12.81 86243 62.95 68318 49.86
15 18 16.5 17041 12.44 103284 75.38 50768 37.05
18 21 19.5 16931 12.36 120215 87.74 33727 24.62
21 24 22.5 16796 12.26 137011 100 16796 12.26
TOTAL 137011 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_P,
  breaks = cortes_hist,                           
  right = FALSE,                                             
  col = "green",                            
  border = "black",                          
  main = "Gráfico N°1: Histograma de Frecuencias Absolutas de la puesta 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 = "Puesta 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_P,
  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 = "Puesta de la Luna (Horas)",
  ylab = "",
  main = "Gráfico N°2: Histograma de Frecuencias Relativas de la puesta 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_P,
  breaks = cortes_hist,                           
  right = FALSE,                                             
  col = "green",                            
  border = "black",                          
  main = "Gráfico N°3: Histograma de Frecuencias Absolutas de la puesta 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 = "Puesta 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_P,
  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 = "Puesta de la Luna (Horas)",
  ylab = "",
  main = "Gráfico N°4: Histograma de Frecuencias Relativas de la puesta 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_P,
  breaks = cortes,                           
  right = FALSE,                             
  col = "green",                           
  border = "black",                          
  main = "Gráfico N°5 : Poligono de frecuencias, Puesta 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 = "Puesta de la Luna (Horas)",
  ylab = "",                                 
  yaxt = "n",
  ylim = c(0, 20000)                         
)

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)


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 puesta
  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 = "Puesta 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.65, 
  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 Puesta 
  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 = "Puesta 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_P,
  horizontal = TRUE,  
  col = "green",
  border = "black",
  main = "Gráfico N°8: Diagrama de Caja y bigotes, Puesta de la Luna en Horas ",
  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_P_reconst <- rep(MC1, times = ni1)

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

Dispersión

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

Forma

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

Valores atipicos

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

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

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

Tabla de indicadores

tabla_indicadores <- data.frame(
  Variable         = "Puesta 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 Puesta 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 Puesta 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
Puesta de la Luna (Horas) [0 h ; 24 h] 11.95 10.5 13.5 47.1 6.86 57.44% 0.01 -1.23 0

7.- conclusión

El comportamiento de la Puesta 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 \(13.50\text{ h}\), con una media aritmética de \(11.95\text{ h}\). Presenta una desviación estándar de \(6.86\text{ h}\) y un coeficiente de variación de \(57.44\%\), 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.23\)) 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.01\), no identificándose valores atípicos en la distribución.