0.- Carga de librerias

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

1.- Leer datos

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

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

Depuración

variables <- na.omit(variables)

Selección Devido a que nuestro data set la variable mes tiene fecha y hora extraemos solo los meses que se an registrado dicho datos

Fecha_Hora <- as.POSIXct(variables$last_updated, format="%Y-%m-%d %H:%M")
variables$Meses <- format(Fecha_Hora, "%B")

# Configurar el factor para que la columna "Meses" muestre ÚNICAMENTE el número
variables$Meses <- factor(variables$Meses, 
                          levels = c("enero", "febrero", "marzo", "abril", "mayo", "junio", 
                                     "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"),
                          labels = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))

3.- Frecuencias

TDF_mes <- data.frame(table(variables$Meses))

ni <- TDF_mes$Freq
N  <- sum(ni)

hi <- round((ni / N) * 100, 2)
hi[length(hi)] <- 100 - sum(hi[-length(hi)]) # Ajuste para cerrar en 100% exacto

Ni_asc  <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))

Hi_asc  <- round(cumsum(hi), 2)
Hi_asc[length(Hi_asc)] <- 100  

Hi_desc <- round(rev(cumsum(rev(hi))), 2)
Hi_desc[1] <- 100  

4.- Tabla de frecuencia

Cuerpo_Tabla <- data.frame(
  Meses        = as.character(TDF_mes$Var1),
  ni           = ni,
  "hi(%)"      = hi,
  "Ni asc"     = as.character(Ni_asc),
  "Ni desc"    = as.character(Ni_desc),
  "Hi asc(%)"  = as.character(Hi_asc),
  "Hi desc(%)" = as.character(Hi_desc),
  check.names  = FALSE
)

# Fila inferior de Totales
Fila_Total <- data.frame(
  Meses        = "TOTAL",
  ni           = N,
  "hi(%)"      = 100,
  "Ni asc"     = "",
  "Ni desc"    = "",
  "Hi asc(%)"  = "",
  "Hi desc(%)" = "",
  check.names  = FALSE
)
Tabla_Final <- rbind(Cuerpo_Tabla, Fila_Total)

kable(Tabla_Final, align = "c",
      caption = "Tabla N°1: Distribución de frecuencia de paìses del mundo para el análisis meteorológico del periodo mayo del 2024 a mayo del 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_Final), bold = TRUE, background = "#EAEDED") |> 
  footnote(general = "Fuente:GlobalWeatherRepository, https://www.kaggle.com/datasets/nelgiriyewithana/global-weather-repository\n.",
           general_title = "Grupo 2: ",
           footnote_as_chunk = TRUE,
           title_format = c("italic", "bold"))
Tabla N°1: Distribución de frecuencia de paìses del mundo para el análisis meteorológico del periodo mayo del 2024 a mayo del 2026
Meses ni hi(%) Ni asc Ni desc Hi asc(%) Hi desc(%)
1 11845 8.36 11845 141703 8.36 100
2 10916 7.70 22761 129858 16.06 91.64
3 11908 8.40 34669 118942 24.46 83.94
4 11700 8.26 46369 107034 32.72 75.54
5 12444 8.78 58813 95334 41.5 67.28
6 11653 8.22 70466 82890 49.72 58.5
7 11623 8.20 82089 71237 57.92 50.28
8 12089 8.53 94178 59614 66.45 42.08
9 11703 8.26 105881 47525 74.71 33.55
10 12064 8.51 117945 35822 83.22 25.29
11 11668 8.23 129613 23758 91.45 16.78
12 12090 8.55 141703 12090 100 8.55
TOTAL 141703 100.00
Grupo 2: Fuente:GlobalWeatherRepository, https://www.kaggle.com/datasets/nelgiriyewithana/global-weather-repository
.

5.- Gráficas

5.1.- Diagrama de barras

df_grafico <- Tabla_Final[Tabla_Final$Meses != "TOTAL", ]

df_grafico$Meses <- factor(df_grafico$Meses, levels = 1:12)
df_grafico$ni    <- as.numeric(df_grafico$ni)
df_grafico$`hi(%)` <- as.numeric(df_grafico$`hi(%)`)



ggplot(data = df_grafico, aes(x = Meses, y = ni)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "navy", width = 0.7) +
  geom_text(aes(label = ni), vjust = -0.5, size = 3.5) +
  labs(title = "Gráfica N°1: Frecuencia absoluta de registros meteorológicos 
                 en capitales del mundo, por meses ",
       x = "Meses", y = "ni") +
  theme_minimal() +
  ylim(0, 15000)

5.2.- Diagrama de barras porcentual

ggplot(data = df_grafico, aes(x = Meses, y = `hi(%)`)) +
  geom_bar(stat = "identity", fill = "orange", color = "indianred", width = 0.7) +
  geom_text(aes(label = paste0(`hi(%)`, "%")), vjust = -0.5, size = 3.5) +
  labs(title = "Gráfica N°2: Frecuencia relativa de registros meteorológicos 
                 en capitales del mundo, por mesess", x = "Meses", y = "Porcentaje %") +
  theme_minimal() +
  ylim(0, 10)

5.3.- Diagrama de barras general

options(scipen = 999)
ggplot(data = df_grafico, aes(x = Meses, y = ni)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "navy", width = 0.7) +
  geom_text(aes(label = ni), vjust = -0.5, size = 3.5) +
  labs(title = "Gráfica N°3: Frecuencia absoluta con respecto al total de 
  registros meteorológicos en capitales del mundo, por meses", x = "Meses", y = "ni") +
  theme_minimal() +
  scale_y_continuous(limits = c(0, 140000), breaks = seq(0, 140000, by = 20000))

5.4.- Diagrama de barras porcentual general

ggplot(data = df_grafico, aes(x = Meses, y = `hi(%)`)) +
  geom_bar(stat = "identity", fill = "orange", color = "indianred", width = 0.7) +
  geom_text(aes(label = paste0(`hi(%)`, "%")), vjust = -0.5, size = 3.5) +
  labs(title = "Gráfica N°4: Frecuencia relativa con respecto al 100% de 
  registros meteorológicos en capitales del mundo, por meses", x = "Meses", y = "Porcentaje %") +
  theme_minimal() +
  ylim(0, 100)

5.5.- Diagrama de caja y bigotes

par(mar = c(5, 5, 4, 3))

# Dibujamos el boxplot basándonos en la escala continua de los 12 meses
boxplot(
  1:12, 
  horizontal = TRUE,
  main = "Gráfica N°5: Distribución de Frecuencias Simples y Acumuladas\ndel Mes de Eventos Meteorológicos en capitales del mundo",
  xlab = "Mes",
  col = "darkred",     
  pch = 1,             
  boxwex = 1,        # Ajustado a 0.5 para que mantenga proporciones estilizadas
  ylim = c(1, 12),     # Asegura la escala del mes 1 al 12
  las = 1              
)

5.6.- Ojivas

5.6.1.- Ojivas frecuenacias absolutas

par(mfrow = c(1, 1), mar = c(5, 7, 6, 3))

meses_etiquetas <- sprintf("%02d", 1:12)

plot(
  1:12, Ni_asc, 
  type = "p",                  
  col = "skyblue",               
  bg = "skyblue",                
  pch = 21,                    
  lwd = 2,                     
  main ="Gráfica N°6: Distribución de frecuencias absolutas acumuladas 
  ascendientes y descendentes del Mes de eventos 
  meteorológicos en capitales del mundo",
  
  xlab = "Mes", 
  ylab = "",
  ylim = c(0, N),              
  xaxt = "n",                  
  las = 1 ,
)
title(ylab = "Cantidad", mgp = c(5.2, 1, 0))
points(1:12, Ni_desc, type = "p", col = "navy", bg = "navy", pch = 21, lwd = 2)
axis(1, at = 1:12, labels = meses_etiquetas)

# Dibujar la leyenda por encima del recuadro sin obstruir nada
legend(
  "top", 
  legend = c("Ojiva descendente", "Ojiva ascendente"), 
  col = c("navy", "skyblue"), 
  pch = c(2, 2),               
  ncol = 2,                    
  bty = "o",                   
  bg = "white",
  inset = c(0, -0.07),        
  xpd = TRUE                   
) 

5.6.2.- Ojivas Frecuencias relativas

plot(
  1:12, Hi_asc, 
  type = "p", 
  col = "indianred", 
  bg = "indianred", 
  pch = 21, 
  lwd = 2,
  main = "Gráfica N°7: Distribución de frecuencias relativas acumuladas 
  ascendientes y descendentes del Mes de eventos  meteorológicos 
  en capitales del mundo",
  xlab = "Mes",                
  ylab = "porcentaje %",                 
  ylim = c(0, 100),            
  xaxt = "n", 
  las = 1
)
title(ylab = "Porcentaje (%)", mgp = c(5.2, 1, 0))
points(1:12, Hi_desc, type = "p", col = "orange", bg = "orange", pch = 21, lwd = 2)
axis(1, at = 1:12, labels = meses_etiquetas)
legend(
  "top", 
  legend = c("Ojiva descendente %", "Ojiva ascendente %"), 
  col = c("orange", "indianred"), 
  pch = c(2, 2), 
  ncol = 2, 
  bty = "o", 
  bg = "white",
  inset = c(0, -0.02),         
  xpd = TRUE                   
)

6.- Indicadores de frecuencia

Indicadores de posicisión

Mes_num <- as.numeric(as.character(TDF_mes$Var1))


media     <- round(sum(Mes_num * ni) / N, 1)

max_frec  <- max(TDF_mes$Freq)
moda_mes  <- as.character(TDF_mes$Var1[TDF_mes$Freq == max_frec])

mediana   <- median(1:12)

Indicadores de disperción

varianza  <- round(var(1:12), 2)

sd_mes    <- round(sd(1:12), 2)

cv        <- round((sd_mes / mean(1:12)) * 100, 2)

Indicadores de Forma

asimetria <- round(skewness(1:12, type = 2), 2)

curtosis  <- round(kurtosis(1:12), 2)

Tabla de indicadores

tabla_indicadores <- data.frame(
  Variable         = "Mes",
  Rango            = "[1 ; 12]",
  X                = media,     
  Me               = mediana,
  Mo               = moda_mes,
  V                = varianza,
  Sd               = sd_mes,
  Cv               = cv,
  As               = asimetria,
  K                = curtosis,
  Valores_Atipicos = "Ausencia de valores atipicos"
)


kable(tabla_indicadores, align = "c",
      caption = "Tabla N°2: Indicadores de tendencia central, dispersión y forma para la variable Mes") |> 
  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_indicadores), bold = TRUE, background = "#EAEDED") |> 
  footnote(general = "Fuente:GlobalWeatherRepository",
           general_title = "Grupo 2: ",
           footnote_as_chunk = TRUE,
           title_format = c("italic", "bold")
           )
Tabla N°2: Indicadores de tendencia central, dispersión y forma para la variable Mes
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Mes [1 ; 12] 6.5 6.5 5 13 3.61 55.54 0 -1.5 Ausencia de valores atipicos
Grupo 2: Fuente:GlobalWeatherRepository

7.- Conclusiones

La variable Mes se encuentra en 1 y 12, y sus valores se concentran alrededor de 6.5, lo que indica que los datos se distribuyen de manera equilibrada a lo largo del año. La desviación estándar de 3.61 evidencia un conjunto de valores heterogéneo, con una dispersión relativamente alta (coeficiente de variación de 55.54%), coherente con la amplitud natural de la escala mensual. La distribución es perfectamente simétrica (asimetría igual a 0), presenta una baja concentración en la parte central debido a su comportamiento platicúrtico (curtosis de -1.5) y no muestra presencia de valores atípicos. En consecuencia, el comportamiento de la variable Mes resulta adecuado para el análisis, ya que permite una representación temporal completa y uniforme del año.