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.- 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
cat("La ecuación del modelo es:\n", ecuacion_texto)
## La ecuación del modelo es:
##  Y = -7.47 + 0.73X

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

corelació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 si se analiza de mejor manera las variables que tenemos estan en porcentaje asi que no seria coerente tener porcentajes negativos de nubosidad , si se la humedad es cero la nubosidad es -7.47, no existe como tal ese valor, asi que el modelo solo funciona si cumplen los dominios de las dos variables

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, es válido únicamente dentro del dominio físico de [0, 100]%, cualquier estimación fuera de este rango carece de sentido y el modelo falla.