0.- Librerías

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

1.- leer datos

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

2.- Selección de la variables (Causa, Efecto)

Causa y Efecto:

Elegimos estas variables porque a más humedad (Causa) en el aire, hay mayor presencia de nubosidad (Efecto). Es exactamente lo que ocurre en un día de neblina o lluvia: cuando el aire se siente muy pesado y húmedo, es porque está llegando a su límite y se empieza a convertir en nubes o niebla.

y  <- as.numeric(variables$cloud)
x  <- as.numeric(variables$humidity)

TPP <- data.frame(y, x)
n <- nrow(TPP)
cat("Tamaño muestral del modelo = ", n)
## Tamaño muestral del modelo =  141703

3.- Tabla de pares de valores

Antes de realizar la tabla pares de valores, debemos comprobar que estas variables tengan el mismo tamaño muestral para no tener algún error a la hora de hacer la tabla y el gráfico

Depuracion de datos

limpiar_columna <- function(df, cols) {
  for (col in cols) {
    df[[col]] <- as.numeric(as.character(df[[col]]))
  }
  return(df)
}

# Aplicar la función a tus variables climáticas
datos <- limpiar_columna(variables, c("humidity", "cloud"))

# Filtrar filas completas (eliminar los NA)
datos_limpios <- datos %>% filter(!is.na(humidity) & !is.na(cloud))

# Asignar variables para el análisis
y  <- datos_limpios$cloud
x  <- datos_limpios$humidity


TPP <- data.frame(y, x)
n <- nrow(TPP)
cat("Tamaño muestral del modelo = ", n)
## Tamaño muestral del modelo =  141703
# Creamos el data frame con tus variables limpias
tabla_pares_valores <- head(data.frame(
 `Humedad %` = datos_limpios$humidity,
  `Nubosidad %` = datos_limpios$cloud,
 check.names = FALSE
), 100)

# 2. Generar la tabla con tu estilo personalizado
kable(
  tabla_pares_valores,    
  align = "c",      
  booktabs = TRUE,
  caption = "Tabla N.1: Pares de valores entre humedad y nubosidad para el análisis
  meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026 "
) %>%
  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.",
    general_title = "Nota: ", 
    footnote_as_chunk = TRUE
  )%>%
  scroll_box(height = "400px", width = "100%") 
Tabla N.1: Pares de valores entre humedad y nubosidad para el análisis meteorológico en capitales del mundo Periodo: Mayo 2024 a Mayo 2026
Humedad % Nubosidad %
24 30
94 75
29 0
61 100
89 50
84 25
93 0
40 25
87 0
63 75
68 50
89 50
33 0
31 30
74 50
29 0
94 50
89 94
79 75
50 77
77 10
64 25
43 0
98 100
84 75
77 100
67 50
66 86
44 5
69 75
45 50
78 25
71 50
60 7
27 2
93 0
22 0
62 100
73 70
66 14
100 75
82 75
84 0
39 25
49 0
67 15
55 0
68 6
78 70
94 50
92 76
32 0
94 50
89 50
42 80
43 0
39 2
48 72
89 75
33 0
72 50
75 25
83 0
68 100
38 0
84 25
38 25
79 25
88 100
94 100
89 75
100 50
88 18
57 0
78 37
43 75
93 75
13 0
63 50
25 25
17 50
94 75
54 25
57 0
84 84
47 25
29 0
34 0
61 75
75 66
44 50
59 79
74 80
48 0
65 25
52 0
94 75
63 75
72 25
39 0
Nota: Fuente: Global Weather Repository.

4.- Gráfica de dispersión

plot(
  x, y, 
  main = "Gráfico N°1: Relación entre humedad y nubosidad para el análisis
  meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  xlab = "Humedad (%)", 
  ylab = "NUbosidad (%)",
  pch = 19,            # Tipo de punto sólido
  col = "green",     # Color corporativo
  grid = TRUE          # Opcional si usas librerías adicionales
)

5.- Conjetura

Dado de se observa una distribución heterogenea no podemos definir como tal certesa un modelo de regresión, aplicamos alguna estratejia para asi lograr conjeturar, procedemos hacer el tratamiento de datos

Tratamiento de datos

Estrategia calculamos la media del porcentaje de nubosidad para cada porcentaje de humedad

datos_n <- aggregate(cloud ~ humidity, data = datos_limpios, FUN = mean)
nrow(datos_n)
## [1] 99
colnames(datos_n) <- c("Humedad", "Nubosidad")
x <- datos_n$Humedad
y <- datos_n$Nubosidad

plot(
  x, 
  y, 
  type = "p",               
  pch = 16,                  
  col = "green",           
  main = "Gráfico N°2: Promedio de Nubosidad según Humedad para el análisis
  meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026 ",
  xlab = "Humedad (%)", 
  ylab = "Nubosidad (%)"
)

se evidencia una relación directamente proporcional entre estas variables asi que podemos conjeturar que es un modelo de regresión >lineal simple basandonos de la ecuación:

Y = a + bX

Siendo asi porcedemos a cálcular sus parametros para este modelo

6.- Cálculo de parametros

regresion_lineal <- lm(y~x)
a <- round(regresion_lineal$coefficients[1], 2)
a
## (Intercept) 
##       -7.47
b <- round(regresion_lineal$coefficients[2], 2)
b
##    x 
## 0.73
ecuacion_texto <- paste0("Y = ", a, " + ", b, "X ")

# Imprimir el resultado 

para comprobar si la ecuación tiene coerencia aplicamos las formulas de minimos cuadrados para cumprobar si coinciden los valores de los coeficientes

n <- length(x)

# 2. Calcular las sumatorias necesarias
sum_x <- sum(x)
sum_y <- sum(y)
sum_xy <- sum(x * y)
sum_x2 <- sum(x^2)

# 3. Calcular la pendiente (b) y el intercepto (a) manualmente
b_manual <- (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x^2)
a_manual <- mean(y) - b_manual * mean(x)

# 4. Mostrar los resultados calculados manualmente
cat("Cálculo por Mínimos Cuadrados:\n")
## Cálculo por Mínimos Cuadrados:
cat("Pendiente (b):", b_manual, "\n")
## Pendiente (b): 0.7301304
cat("Intercepto (a):", a_manual, "\n")
## Intercepto (a): -7.47288

evidentemente los coeficientes calculados por minimos cuardrados coincide con las parametros calculados antes

7.- Sobreponer la realidad con el modelo

plot(
  x, y, 
  type = "p",                
  pch = 16,                  
  col = "green",           
  main = "Gráfico N°3: Modelo de Regresión Lineal: Nubosidad según Humedad 
  para el análisis meteorológico en capitales del mundo
  Periodo: Mayo 2024 a Mayo 2026",
  xlab = "Humedad (%)", 
  ylab = "Nubosidad (%)"
)
# 1. PLASMAR LA ECUACIÓN EN LA GRÁFICA
abline(regresion_lineal, col = "red", lwd = 2)

# 2. Opcional: Agregar la leyenda con la ecuación en el gráfico
a <- round(regresion_lineal$coefficients[1], 2)
b <- round(regresion_lineal$coefficients[2], 2)
ecuacion_texto <- paste0("Y = ", a, " + ", b, "X")
legend("topleft", legend = ecuacion_texto, col = "red", lty = 1, lwd = 2)

8.- Test de Bondad

correlación de pearson

r <- cor(y, x)
r
## [1] 0.9659315

coeficiente de determinación

r2 <- round(r^2, 2)*100
r2
## [1] 93

*# 9.- restricciones

Humedad:D = {x ∈ ℝ | 0 ≤ x ≤ 100}

Nubosidad:D = {y ∈ ℝ | 0 ≤ y ≤ 100}

Error del modelo: ¿Existe un valor de humedad que reemplazado en la ecuación del modelo genere un valor fuera del dominio de nubosidad?

Si hay restricción pero cuando el valor de nubosidad sea cero para determinar donde se interseca con el eje x así que despejamos en la ecuación

“0 = -7.47 + 0.73X”

“x = 7.47/0.73

“x = 10.67 %

Asi que el modelo solo funciona en valores mayores de humedad a 10.67% si se selecciona un porcentaje menor a este el modelo tiende a fallar

10.- Estimaciones

¿Que valor de porcentaje de nubosidad se espera cuando la humedad sea un 65%?

Humedad_input <- 65 
Nubosidad_esperada <- a + b * Humedad_input

# Mostrar el resultado
cat("Para una humedad del 65%, se estima una nubosidad del:", Nubosidad_esperada, "%")
## Para una humedad del 65%, se estima una nubosidad del: 39.98 %
# 2. Graficar el modelo (sin puntos)
plot(
  x, y, 
  type = "n",                
  main = "Modelo de Regresión: Nubosidad según Humedad",
  xlab = "Humedad (%)", 
  ylab = "Nubosidad Estimada (%)",
  ylim = c(0, 85) # Ajustamos el límite para que se vean bien las líneas
)

# 3. Plasmar la recta de regresión
abline(regresion_lineal, col = "red", lwd = 2)

# 4. Líneas entrecortadas hacia los ejes
segments(x0 = Humedad_input, y0 = 0, x1 = Humedad_input, y1 = Nubosidad_esperada, col = "blue", lty = 2) 
segments(x0 = 0, y0 = Nubosidad_esperada, x1 = Humedad_input, y1 = Nubosidad_esperada, col = "blue", lty = 2)

# 5. Punto de la estimación
points(Humedad_input, Nubosidad_esperada, col = "blue", pch = 19, cex = 1.5)

# 6. Agregar valores de texto sobre las líneas entrecortadas
text(Humedad_input, 2, labels = paste(Humedad_input, "%"), pos = 3, col = "blue", font = 2)
text(15, Nubosidad_esperada + 3, labels = paste(Nubosidad_esperada, "%"), pos = 3, col = "blue", font = 2)

# 7. Leyenda final
legend("topleft", legend = c(paste("Y =", a, "+", b, "X"), "Estimación"), 
       col = c("red", "blue"), lty = c(1, NA), pch = c(NA, 19), lwd = 2)

¿Cuantos dias de una semana se espera que tenga una nubosidad del 39.98 %?

Dias <- round(7*0.3998 ,0)
Dias
## [1] 3
# Mostrar el resultado
cat("Para una nubosidad del 39.98%, se estima que ", Dias, "dias de la semana van a tener dicho porcentaje de nubosidad")
## Para una nubosidad del 39.98%, se estima que  3 dias de la semana van a tener dicho porcentaje de nubosidad

11.- Conclusión

Entre la humedad (%) y la nubosidad (%) existe una relación de tipo lineal definida por la ecuación Y = -7.47 + 0.73X, donde la nubosidad está influenciada positivamente por el aumento de la humedad. Se observa una correlación de Pearson de \(0.966\), lo cual indica que son directamente proporcionales. El modelo presenta restricciones claras si se expluye el rango. 0 ≤ x ≤ 10.67 el modelo funciona