0.Librerias

library(knitr)
library(kableExtra)
library(e1071)

1.Leer Datos

variables <- read.csv("C:/Users/WAN/Downloads/GlobalWeatherRepository.csv")

2. Extracción y Depuración de la Variable

Longuitud <- na.omit(variables$longitude)

# Total de datos

n_total <- length(Longuitud)

3. Frecuencias

3.1 Max y Min

valor_min <- min(Longuitud)
valor_max <- max(Longuitud)

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: 19.69

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(
      Longuitud >= Li1[i] &
        Longuitud <= Ls1[i]
    )
    
  } else {
    
    ni1[i] <- sum(
      Longuitud >= Li1[i] &
        Longuitud < Ls1[i]
    )
  }
}

# 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 <- 50

# Intervalos
Li2 <- seq(
  floor(valor_min/50)*50,
  ceiling(valor_max/50)*50 - 50,
  by = 50
)

Ls2 <- Li2 + 50

#Frecuencias

ni2 <- numeric(length(Li2))

for(i in 1:length(Li2)){
  
  if(i == length(Li2)){
    
    ni2[i] <- sum(
      Longuitud >= Li2[i] &
        Longuitud <= Ls2[i]
    )
    
  } else {
    
    ni2[i] <- sum(
      Longuitud >= Li2[i] &
        Longuitud < Ls2[i]
    )
  }
}

# Frecuencia relativa
hi2 <- (ni2 / sum(ni2)) * 100

# Acumuladas
Ni_asc2 <- cumsum(ni2)
Hi_asc2 <- cumsum(hi2)

Ni_dsc2 <- rev(cumsum(rev(ni2)))
Hi_dsc2 <- rev(cumsum(rev(hi2)))

# Marca de clase
MC2 <- (Li2 + Ls2)/2

4.Tabla de Distribución de Frecuencias

4.1. Tabla según Sturges

# Convertir a caracteres para poder mezclar números y texto

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

Tabla_Sturges2 <- rbind(Tabla_Sturges2, fila_total)


kable(
  Tabla_Sturges2,
  align = "c",
  caption = "Tabla N1: Distribución de frecuencias de Longuitudes 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. 
    Fuente: Global Weather Repository.",
    general_title = "Nota: ",
    footnote_as_chunk = TRUE,
    title_format = c("italic","bold")
  )
Tabla N1: Distribución de frecuencias de Longuitudes 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
-175.2 -155.51 -165.35 1448 1.02 1448 1.02 141564 100
-155.51 -135.82 -145.66 0 0 1448 1.02 140116 98.98
-135.82 -116.13 -125.97 719 0.51 2167 1.53 140116 98.98
-116.13 -96.44 -106.28 725 0.51 2892 2.04 139397 98.47
-96.44 -76.75 -86.6 8640 6.1 11532 8.15 138672 97.96
-76.75 -57.06 -66.9 13812 9.76 25344 17.9 130032 91.85
-57.06 -37.37 -47.22 1453 1.03 26797 18.93 116220 82.1
-37.37 -17.68 -27.53 1454 1.03 28251 19.96 114767 81.07
-17.68 2.01 -7.84 12169 8.6 40420 28.55 113313 80.04
2.01 21.7 11.85 30318 21.42 70738 49.97 101144 71.45
21.7 41.39 31.54 26403 18.65 97141 68.62 70826 50.03
41.39 61.08 51.23 14972 10.58 112113 79.2 44423 31.38
61.08 80.77 70.92 6545 4.62 118658 83.82 29451 20.8
80.77 100.46 90.61 2950 2.08 121608 85.9 22906 16.18
100.46 120.15 110.3 8456 5.97 130064 91.88 19956 14.1
120.15 139.84 129.99 4362 3.08 134426 94.96 11500 8.12
139.84 159.53 149.68 2182 1.54 136608 96.5 7138 5.04
159.53 179.22 169.37 4956 3.5 141564 100 4956 3.5
TOTAL 141564 100
Nota: Elaborado por Grupo 2.
Fuente: Global Weather Repository.

4.2. Tabla agrupada y ajustada

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

# Convertir todo a texto
TDF_Longuitud[] <- lapply(TDF_Longuitud, as.character)

# Fila TOTAL
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
  
)

# Agregar fila total
TDF_Longuitud <- rbind(TDF_Longuitud, TDF_Total)

# Renombrar columnas
colnames(TDF_Longuitud) <- c(
  
  "Lim. Inf.",
  
  "Lim. Sup.",
  
  "MC",
  
  "ni",
  
  "hi (%)",
  
  "Ni Asc",
  
  "Hi Asc",
  
  "Ni Dsc",
  
  "Hi Dsc"
  
)

# Mostrar tabla

kable(
  TDF_Longuitud,
  align = "c",
  caption = "Tabla N2: Distribución de frecuencias Longuitudes de los registros meteorológicos mundiales con amplitud 
  de clase de 15°, 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_Longuitud),
    bold = TRUE,
    background = "#EAEDED"
  ) |>
  
  footnote(
    general = "Elaborado por Grupo 2. 
    Fuente: Global Weather Repository.",
    general_title = "Nota: ",
    footnote_as_chunk = TRUE,
    title_format = c("italic","bold")
  )
Tabla N2: Distribución de frecuencias Longuitudes de los registros meteorológicos mundiales con amplitud de clase de 15°, período 2024–2026
Lim. Inf. Lim. Sup. MC ni hi (%) Ni Asc Hi Asc Ni Dsc Hi Dsc
-200 -150 -175 1448 1.02 1448 1.02 141703 100
-150 -100 -125 721 0.51 2169 1.53 140255 98.98
-100 -50 -75 24627 17.38 26796 18.91 139534 98.47
-50 0 -25 12627 8.91 39423 27.82 114907 81.09
0 50 25 66873 47.19 106296 75.01 102280 72.18
50 100 75 15312 10.81 121608 85.82 35407 24.99
100 150 125 14274 10.07 135882 95.89 20095 14.18
150 200 175 5821 4.11 141703 100 5821 4.11
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(
  Longuitud,
  
  main = "Gráfico N°1. Distribución de frecuencias absolutas de 
  Longuitudes de los registros meteorológicos mundiales agrupados
  en intervalos de 50°, período 2024–2026",
  
  xlab = "Longuitud",
  
  ylab = "Frecuencia",
  
  col = "lightgreen",
  
  border = "black"
)

grid()

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

hist(
  Longuitud,
  
  breaks = c(Li2, max(Ls2)),
  
  ylim = c(0, n_total),
  
  main = "Gráfico N°2. Histograma y polígono de frecuencias 
  absolutas de Longuitudes de los registros meteorológicos mundiales, 
  período 2024–2026",
  
  xlab = "Longuitud",
  
  ylab = "Frecuencia",
  
  col = "lightgreen",
  
  border = "black"
)

grid()

5.3. Histograma original (hi)

barplot(
  hi2,
  
  names.arg = paste(Li2, Ls2, sep = " a "),
  
  
  main = "Gráfico N°3. Distribución de frecuencias relativas de Longuitudes
  de los registros meteorológicos mundiales agrupados en 
  intervalos de 15°, período 2024–2026",
  
  xlab = "Longuitud",
  
  ylab = "Frecuencia Relativa (%)",
  
  col = "skyblue",
  
  las = 2
)

5.4.Histograma con relacion a todo (hi)

barplot(
  hi2,
  
  names.arg = paste(Li2, Ls2, sep = " a "),
  
  ylim = c(0, 100),
  
  main = "Gráfico N°4. Histograma y polígono de frecuencias relativas 
  de Longuitudes de los registros meteorológicos mundiales, período 
  2024–2026",
  
  xlab = "Longuitud",
  
  ylab = "Frecuencia Relativa (%)",
  
  col = "lightgreen",
  
  las = 2
)

5.5.Polígono de frecuencias (ni)

bp <- barplot(
  hi2,
  names.arg = paste(Li2, Ls2, sep = "-"),
  col = "lightgreen",
  border = "black",
  ylim = c(0, max(hi2)*1.2),
  main = "Gráfico N°5. Polígono de frecuencias absolutas de longuitudes de los registros meteorológicos mundiales, período 2024–2026",
  xlab = "Longuitud",
  ylab = "Frecuencia relativa (%)"
)

# Polígono cerrado desde el límite inferior hasta el límite superior

x_pol <- c(
  bp[1] - 1,   # inicio del primer intervalo (-45)
  bp,            # centros de barras
  bp[length(bp)] + 0.5  # final del último intervalo (75)
)

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 = "Gráfico N°6. Polígono de frecuencias relativas de Longuitudes de los registros meteorológicos mundiales, período 2024–2026",
  
  xlab = "Longuitud",
  
  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 ascentende y descendente (hi)

# Ascendente: inicia en 0
x_asc <- c(Li2[1], MC2)
y_asc <- c(0, Ni_asc2)

# Descendente: termina en 0
x_dsc <- c(MC2, Ls2[length(Ls2)])
y_dsc <- c(Ni_dsc2, 0)

# Crear gráfico vacío
plot(
  x_asc,
  y_asc,
  type = "o",
  pch = 16,
  col = "blue",
  lwd = 2,
  ylim = c(0, n_total),
  xlab = "Celsius",
  ylab = "Frecuencia Acumulada (Ni)",
  main = "Gráfico N°7: Ojivas ascendente y descendente de frecuencias absolutas acumuladas de Longuitudes de los registros meteorológicos mundiales, período 2024–2026"
)

# Agregar ojiva descendente
lines(
  x_dsc,
  y_dsc,
  type = "o",
  pch = 17,
  col = "red",
  lwd = 2
)

# Cuadrícula
grid()

# Leyenda
legend(
  "right",
  legend = c(
    "Ojiva Ascendente",
    "Ojiva Descendente"
  ),
  col = c("blue", "red"),
  pch = c(16, 17),
  lwd = 2,
  bty = "n"
)

5.8. Bloxplot

Q1 <- quantile(Longuitud, 0.25)

Q3 <- quantile(Longuitud, 0.75)

RIC <- Q3 - Q1

Lim_inf <- Q1 - 1.5 * RIC

Lim_sup <- Q3 + 1.5 * RIC
bp <- boxplot(
  Longuitud,
  horizontal = TRUE,
  outline = FALSE,
  main = "Gráfico N°8: Ojivas ascendente y descendente de frecuencias relativas acumuladas de Longuitudes de los registros meteorológicos mundiales, período 2024–2026",
  xlab = "Longuitud",
  col = "lightblue"
)

atipicos <- Longuitud[
  Longuitud < Lim_inf |
    Longuitud > Lim_sup
]

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)

#Outliers

Lim_inf2 <- Q1 - 1.0 * RIC
Lim_sup2 <- Q3 + 1.0 * RIC

atipicos2 <- Longuitud[
  Longuitud < Lim_inf2 |
    Longuitud > Lim_sup2
]

length(atipicos2)
## [1] 31961
legend(
  "topright",
  legend = c(
    "Atípicos",
    "Límites 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(Longuitud)

mediana <- median(Longuitud)

# Moda aproximada usando la clase modal

tabla_moda <- TDF_Longuitud[
  TDF_Longuitud$`Lim. Inf.` != "TOTAL",
]

ni_num <- as.numeric(tabla_moda$ni)

max_ni <- max(ni_num)

moda <- as.numeric(
  tabla_moda$MC[
    ni_num == max_ni
  ]
)

6.2.Dispersión

varianza <- var(Longuitud)

desv_est <- sd(Longuitud)

cv <- (desv_est / media) * 100

6.3.Forma

asimetria <- skewness(Longuitud)

curtosis <- kurtosis(Longuitud)

6.4.Valores atípicos

Q1 <- quantile(Longuitud, 0.25)

Q3 <- quantile(Longuitud, 0.75)

RIC <- Q3 - Q1

lim_inf <- Q1 - 1.5 * RIC

lim_sup <- Q3 + 1.5 * RIC

atipicos <- Longuitud[
  Longuitud < lim_inf |
    Longuitud > lim_sup
]

n_atipicos <- length(atipicos)

intervalo_atipicos <- paste0(
  "[",
  round(lim_inf,2),
  "; ",
  round(lim_sup,2),
  "]"
)

# Rango

rango_texto <- paste0(
  "[",
  round(min(Longuitud),2),
  "; ",
  round(max(Longuitud),2),
  "]"
)

6.5. Tabla de indicadores

tabla_indicadores <- data.frame(
  
  Variable = "Longuitud",
  
  Rango = rango_texto,
  
  Media = round(media,2),
  
  Mediana = round(mediana,2),
  
  Moda = round(moda,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
)

# Mostrar tabla

kable(
  tabla_indicadores,
  align = "c",
  caption = " Indicadores estadísticos descriptivos de la variable 
Longuitud en registros meteorológicos mundiales, período 2024–2026 en 
  registros meteorológicos mundiales, período 2024–2026"
) |>
  kable_styling(
    full_width = FALSE,
    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 Longuitud en registros meteorológicos mundiales, período 2024–2026 en registros meteorológicos mundiales, período 2024–2026
Variable Rango Media Mediana Moda Varianza Desv_Est CV Asimetria Curtosis N_Atipicos
Longuitud [-175.2; 179.22] 21.94 23.24 25 4327.43 65.78 299.87 0.01 0.34 10898
tabla_indicadores

7. Conclusiones

El comportamiento de la temperatura en grados Celsius fluctúa entre -29.8 °C y 79.3 °C, y sus valores giran en torno a la mediana de 23.7 °C, debido a la presencia de 1989 valores atípicos que pueden influir en la media aritmética de 21.24 °C. Presenta una desviación estándar de 9.64 °C y un coeficiente de variación de 45.41 %, por lo que constituye un conjunto de datos heterogéneo. La distribución muestra una concentración moderada de los datos alrededor de la media (curtosis ligeramente leptocúrtica de 0.76 y una mayor acumulación de observaciones en los valores altos de temperatura, con una cola extendida hacia los valores bajos asimetría negativa de -0.83. Por todo lo anterior, el comportamiento de la temperatura mundial durante el período 2024–2026 se caracteriza por una predominancia de temperaturas templadas a cálidas, aunque existen registros extremos tanto de frío como de calor que generan una amplia variabilidad en los datos analizados.