# Carga de ibrerías
# ================================

if (!require(dplyr)) install.packages("dplyr")
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(gt)) install.packages("gt")
if (!require(readr)) install.packages("readr")
if (!require(sf)) install.packages("sf")

library(dplyr)
library(ggplot2)
library(gt)
library(readr)
library(sf)

1 Carga de datos

datos <- read.csv("C:/Users/Usuario/OneDrive/Escritorio/Mundo/Conjunto.csv", sep = ";")
datos$longitude <- as.numeric(datos$longitude)
datos$latitude <- as.numeric(datos$latitude)

2 Seleccionar variables con causalidad

# Se estudia si la latitud influye en la longitud máxima.

3 Establecer variable dependiente e independiente

# Independiente: Latitud (x)
# Dependiente: Longitud máxima por bin de latitud (y)

4 Gráfica de nube de puntos

# (datos filtrados)
datos <- datos[!is.na(datos$longitude) & !is.na(datos$latitude), ]
puntos_sf <- st_as_sf(datos, coords = c("longitude", "latitude"), crs = 3857)
puntos_wgs84 <- st_transform(puntos_sf, crs = 4326)
coord_grados <- st_coordinates(puntos_wgs84)

resultado <- data.frame(
  longitude_deg = coord_grados[, 1],
  latitude_deg = coord_grados[, 2]
)

5 Conjeturar un modelo y filtrar outliers

Q1_lat <- quantile(resultado$latitude_deg, 0.25)
Q3_lat <- quantile(resultado$latitude_deg, 0.75)
IQR_lat <- Q3_lat - Q1_lat
lat_no_outliers <- resultado$latitude_deg >= (Q1_lat - 1.5 * IQR_lat) & resultado$latitude_deg <= (Q3_lat + 1.5 * IQR_lat)

Q1_lon <- quantile(resultado$longitude_deg, 0.25)
Q3_lon <- quantile(resultado$longitude_deg, 0.75)
IQR_lon <- Q3_lon - Q1_lon
lon_no_outliers <- resultado$longitude_deg >= (Q1_lon - 1.5 * IQR_lon) & resultado$longitude_deg <= (Q3_lon + 1.5 * IQR_lon)

resultado_filtrado <- resultado[lat_no_outliers & lon_no_outliers, ]

6 Cálculo de parámetros

resultado_filtrado <- resultado_filtrado %>%
  filter(latitude_deg <= 20) %>%
  mutate(lat_bin = cut(latitude_deg,
                       breaks = seq(min(latitude_deg), 20, by = 0.1),
                       include.lowest = TRUE))

maximos_por_lat_bin <- resultado_filtrado %>%
  group_by(lat_bin) %>%
  summarise(
    latitude_prom = mean(latitude_deg),
    longitude_max = max(longitude_deg)
  ) %>%
  ungroup() %>%
  arrange(latitude_prom)

x <- maximos_por_lat_bin$latitude_prom
y <- maximos_por_lat_bin$longitude_max

modelo_lineal <- lm(y ~ x)
modelo_lineal
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##      -5.598       -3.407
beta0 <- coef(modelo_lineal)[1]
beta1 <- coef(modelo_lineal)[2]

7 Sobreponer la curva del modelo

plot(x, y, col = "blue", pch = 19,
     main = "Modelo lineal: Longitud vs Latitud (hasta 20°)",
     xlab = "Latitud promedio del bin (°)",
     ylab = "Máximo de longitud (°)")
abline(modelo_lineal, col = "red", lwd = 2)

# La linea se observa en color rojo

8 Test

cor_pearson <- cor.test(x, y, method = "pearson")
r <- cor_pearson$estimate
r
##        cor 
## -0.7041756
r2 <- r*r*100
r2
##      cor 
## 49.58632

9 Restricciones (puntos donde el modelo falla)

# Solo aplica si se quiere encontrar el punto donde Y = 0

10 Cálculo de predicciones

# Calculo para una latitud de 17.5
y_tec <- (-5.598-3.407*17.5)
y_tec
## [1] -65.2205

11. Conclusiones

Entre la latitud promedio y la longitud máxima existe una relación que puede modelarse mediante un modelo lineal, cuya ecuación es y = (-5.598-3.407x) donde 𝑦 representa la longitud máxima (en grados) y 𝑥 la latitud promedio (en grados). El coeficiente de determinación 49.58632 indica que casi la mitad de la variabilidad en la longitud máxima se explica por la latitud promedio, mientras que el resto se debe a otros factores no considerados en el modelo. Por otro lado, la coorelaccion lineal es fuerte siendo del 70% Además, la relación presenta una pendiente negativa, lo que indica que a medida que la latitud promedio aumenta, la longitud máxima tiende a disminuir.*