0.- Librerías

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

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 variables (Causa, Efecto)

Depuración

variables <- na.omit(variables)

Temperatura°C (Causa)

Celsius <- variables$temperature_celsius

Humedad % (Efecto)

Humedad <- variables$humidity

la relación entre temperatura y humedad varía mucho de una capital a otra. Las ciudades ubicadas en zonas tropicales suelen tener temperaturas cálidas y altos niveles de humedad, mientras que las capitales en regiones frías suelen tener aire más seco, sin importar el calor.

3.- Tabla de pares de valores

Primero para poder cálcular los pares de valores visulaizamos la gráfica de temperatura frente a humedad

datos_sel <- data.frame(Celsius, Humedad)
plot(
  Celsius,
  Humedad,
  main = "Gráfica N°1: Relación entre Temperatura y Humedad para el 
  análisis meteorológico en capitales del mundo 
  Periodo: Mayo 2024 - Mayo 2026 ",
  xlab = "Temperatura (°C)",
  ylab = "Humedad (%)",
  pch = 19,
  col = "green"
)

Dado de se observa una distribución heterogenea aplicamos algun criterio lógico para asi poder conjeturar en la siguente sección

Tratamiento de datos

Usaremos los cuartiles del diagrama de caja y bigotes sin valores atipocos para así observar la mayor concetracion de datos de estas variables aleatorias

datos_sel <- na.omit(datos_sel)

limites_temp <- boxplot.stats(datos_sel$Celsius)$stats
limites_temp
## [1] -3.0 15.6 23.7 28.0 46.6
limites_hum  <- boxplot.stats(datos_sel$Humedad)$stats
limites_hum
## [1]   2  51  72  86 100

Conservar solo la mayor concentración de datos (sin outliers) con sus respectivos diagrama de caja y la gráfica de temperatura frente humedad

datos_limpios <- subset(datos_sel, 
                        Celsius >= limites_temp[1] & Celsius <= limites_temp[5] &
                          Humedad >= limites_hum[1]  & Humedad <= limites_hum[5])
par(mfrow = c(1, 2))
#DIAGRAMA DE CAJA 1: Temperatura 

boxplot(datos_limpios$Celsius, 
        main = "Distribución de Temperatura", 
        ylab = "Temperatura (°C)", 
        col = "lightblue", 
        outline = FALSE) 
# DIAGRAMA DE CAJA 2: Humedad depurada
boxplot(datos_limpios$Humedad, 
        main = "Distribución de Humedad", 
        ylab = "Humedad (%)", 
        col = "lightgreen", 
        outline = FALSE)

Procedemos a cálcular la media aritmetica de la humedad para una cierta temperatura asi obtenemos los pares de puntos

datos_limpios$Celsius_entero <- round(datos_limpios$Celsius)
# Calcular la media de Humedad para cada temperatura entera única

tabla_pares <- aggregate(Humedad ~ round(Celsius), data = datos_limpios, FUN = mean)
colnames(tabla_pares) <- c("Temperatura (°C)", "Humedad  (%)")
tabla_pares <- tabla_pares[order(tabla_pares$`Temperatura (°C)`), ]

N_pares <- nrow(tabla_pares)
cat("El tamaño muestral para este análisis es de N =", N_pares, "pares de datos promediados.\n")
## El tamaño muestral para este análisis es de N = 51 pares de datos promediados.
kable(
  tabla_pares,   
  digits = 0,             
  align = "c",            
  booktabs = TRUE,
  caption = "Tabla N.1: Pares de valores: Temperatura frente a Humedad "
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"), 
    full_width = FALSE,                                       
    position = "center"                                      
  ) %>%
  row_spec(
    0, 
    bold = TRUE, 
    color = "white",       
    background = "#1F4E79" 
  ) %>%
  footnote(
    general = "Fuente: Global Weather Repository. Elaborado por: Grupo 2.",
    general_title = "Nota: ", 
    footnote_as_chunk = TRUE
  ) %>%
  scroll_box(height = "400px", width = "100%")
Tabla N.1: Pares de valores: Temperatura frente a Humedad
Temperatura (°C) Humedad (%)
-3 80
-2 81
-1 83
0 84
1 83
2 81
3 81
4 78
5 79
6 77
7 76
8 75
9 75
10 74
11 74
12 71
13 71
14 70
15 69
16 68
17 67
18 67
19 66
20 66
21 65
22 68
23 70
24 73
25 73
26 71
27 69
28 67
29 64
30 58
31 53
32 48
33 43
34 37
35 34
36 31
37 29
38 26
39 24
40 19
41 19
42 16
43 13
44 11
45 11
46 10
47 6
Nota: Fuente: Global Weather Repository. Elaborado por: Grupo 2.

4.- Gráfica de disperción

Gráficamos según los pares de valores de la Tabla 1

plot(
  x = tabla_pares$`Temperatura (°C)`, 
  y = tabla_pares$`Humedad  (%)`,
  xlab = "Temperatura (°C)", 
  ylab = "Humedad (%)",
  main = "Gráfica Nº 2: Relación entre Temperatura y Humedad para el 
  análisis meteorológico en capitales del mundo 
  Periodo: Mayo 2024 - Mayo 2026",
  col = "green",         
  pch = 19,                  
  cex = 1.3,                 
  las = 1                    
)

5.- Conjetura

Aunque haya curvas pequeñas en el medio, el comportamiento general de los datos va de la esquina superior izquierda (frío/húmedo) a la esquina inferior derecha (caliente/seco). Teniendo un comportamiento de un modelo de regresion lineal simple asi que procedemos a cálcular sus parametros

6.- Cálculo de parametros

modelo_lineal <- lm(`Humedad  (%)` ~ `Temperatura (°C)`, data = tabla_pares)

Pendiente

a <- as.numeric(coef(modelo_lineal)[2]) 
a
## [1] -1.512524

Intercepto

b <- as.numeric(coef(modelo_lineal)[1])
b
## [1] 90.24256
cat("Ecuación del modelo: y =", round(a, 2), "x +", round(b, 2), "\n")
## Ecuación del modelo: y = -1.51 x + 90.24

7.- Comparación de la realidad con el modelo

 plot(
  x = tabla_pares$`Temperatura (°C)`, 
  y = tabla_pares$`Humedad  (%)`,
  xlab = "Temperatura (°C)", 
  ylab = "Humedad (%)",
  main = "Gráfica Nº 3: Comparacion del modelo con la realidad para el 
  análisis meteorológico en capitales del mundo 
  Periodo: Mayo 2024 - Mayo 2026",
  col = "green",         
  pch = 19,                  
  cex = 1.3,                
  las = 1                  
)
abline(modelo_lineal, col = "red", lwd = 3)

legend(
  x = -9,                             
  y = -10,                             
  legend = c("Medianas observadas", paste0("Modelo: y = ", round(a, 2), "x +", round(b, 2))),
  col = c("green", "red"), 
  lty = c(0, 1),       
  pch = c(16, NA),                     
  lwd = c(NA, 2), 
  bty = "o",                           
  bg = "white",
  xpd = TRUE  
)

8.- Test de bondad

Correlación de pearson

r_pearson <- cor(tabla_pares$`Temperatura (°C)`, tabla_pares$`Humedad  (%)`, method = "pearson")
pearson_valido <- (r_pearson >= -1 & r_pearson <= 1)
cat("Correlación de Pearson:", round(r_pearson, 4), "\n")
## Correlación de Pearson: -0.9151
cat("¿Pearson está en el rango válido [-1, 1]?:", pearson_valido, "\n\n")
## ¿Pearson está en el rango válido [-1, 1]?: TRUE

Coeficiente de determinación

r2 <- r_pearson^2 * 100
r2_valido      <- (r2 >= 70 & r2 <= 100) 
cat("Coeficiente de determinación (R²):", round(r2, 2), "%\n")
## Coeficiente de determinación (R²): 83.74 %
cat("¿El R² supera el umbral del 70%?:", r2_valido, "\n")
## ¿El R² supera el umbral del 70%?: TRUE

9.- Posibles Restricciones del modelo

1.- Temperatura °C:El dominio de la variable aleatoria son los reales, ya que puede tomar cualquier valor de ella incluyendo el cero

2.- Humedad %: la variable aleatoria no puede salirse de ese rango real que va desde 0 % a 100 %.

3.- Modelo: Hay valores que al sustituir en la ecuación del modelo de regresión lineal, tiende a fallar superando el dominio de la variable dependiente ya que la recta se extiende indefinidamente a los dos lados, pasando de lo positivo a lo negativo. asi que calculamos esa restricción del modelo

x_inf <- round((100 - b)/a, 0)
x_inf
## [1] -6
x_sup <- round((0 - b)/a, 0)
x_sup
## [1] 60

El modelo de regresion lineal simple se cumple si va desde -6 °C hasta 60 °C, antes o despues del intervalo del modelo, los valores estimados no tienen sentido.

10.- Estimaciónes

¿Que valor de humedad se estima para una temperatura de 20 °C?

temp_evaluar <- 20

humedad_estimada <- (a * temp_evaluar) + b

cat("Para una temperatura de", temp_evaluar, "°C, la humedad estimada es de:", round(humedad_estimada, 1), "%\n")
## Para una temperatura de 20 °C, la humedad estimada es de: 60 %

Estimación en la gráfica

plot(
  x = tabla_pares$`Temperatura (°C)`, 
  y = tabla_pares$`Humedad  (%)`,
  type = "n",                                
  xlab = "Temperatura (°C)", 
  ylab = "Humedad (%)",
  main = "Gráfica Nº 4: visualización de la estimació de humedad a una
  temperatura de 20°C 
  Periodo: Mayo 2024 - Mayo 2026",
  las = 1                  
)

abline(modelo_lineal, col = "red", lwd = 3)

temp_evaluar <- 20
humedad_estimada <- (a * temp_evaluar) + b

segments(x0 = temp_evaluar, y0 = -10, x1 = temp_evaluar, y1 = humedad_estimada, 
         col = "blue", lty = 2, lwd = 2)

segments(x0 = -20, y0 = humedad_estimada, x1 = temp_evaluar, y1 = humedad_estimada, 
         col = "blue", lty = 2, lwd = 2)

points(x = temp_evaluar, y = humedad_estimada, col = "blue", pch = 19, cex = 1.8)

text(
  x = temp_evaluar + 1.2, 
  y = humedad_estimada / 2, 
  labels = paste(temp_evaluar, "°C"), 
  col = "blue", font = 2, cex = 0.9, srt = 90
)

text(
  x = (min(tabla_pares$`Temperatura (°C)`) + temp_evaluar) / 2, 
  y = humedad_estimada + 2.5, 
  labels = paste(round(humedad_estimada, 1), "%"), 
  col = "blue", font = 2, cex = 0.9
)

legend(
  "topright",                                            
  legend = c(paste0("Modelo: y = ", round(a, 2), "x + ", round(b, 2)),
             paste0("Estimación a ", temp_evaluar, "°C (", round(humedad_estimada, 0), "%)")),
  col = c("red", "blue"), 
  lty = c(1, 2),        
  pch = c(NA, 19),                      
  lwd = c(3, 2), 
  bty = "o",                            
  bg = "white"
)

11.- Conclusión

Existe una relacion significativa entre la temperatura (°C) y humedad (%) dando asi un modelo de regresión lineal, representada por la ecuación Y = -1.51X + 90.24, al cual X viene sindo la variable independiente temperatura (causa), Y es la variable dependiente humedad (efecto), con una correlacion de pearson del -0.91 ya que tiende a -1 lo cual es muy aseptable, la relacion es inversa si hay aumento de temperatura y humedad disminuye , el modelo cumple con una restricción que si va de -6°C a 60 °C cualquier valore estimado fuera de este rango carece de sentido físico, ya que superan el dominio de la variable dependiente.