Fundamentación y Justificación del Trabajo

Fundamentación y Justificación del Trabajo El presente trabajo tiene como objetivo analizar la distribución de los clubes sociales y deportivos en la Ciudad Autónoma de Buenos Aires (CABA), con un énfasis particular en la autocorrelación espacial de estos recursos en relación con la densidad poblacional. A través de este análisis, se busca identificar las áreas de alta concentración poblacional con escasa oferta deportiva y proponer soluciones para mejorar el acceso a actividades físicas, fundamentales para la salud pública y el bienestar de los habitantes de la ciudad.

Contexto

La Ciudad Autónoma de Buenos Aires (CABA) es una ciudad densamente poblada, organizada en 15 comunas, cada una con características socioeconómicas y niveles de acceso a servicios muy diversos. La distribución desigual de clubes deportivos, gimnasios y otros espacios recreativos en la ciudad no siempre responde adecuadamente a las necesidades de las zonas con mayor concentración poblacional. Esto genera un acceso limitado a la actividad física, especialmente en sectores de alta densidad. El sedentarismo está contribuyendo al incremento de enfermedades no transmisibles, como la enfermedad isquémica del corazón, trastornos de salud mental y sobrepeso. La prevención se vuelve clave para evitar la saturación de los servicios sanitarios. Los clubes deportivos desempeñan un papel esencial en el acceso a la actividad física y en la promoción de la cohesión social, especialmente en comunidades vulnerables. Sin embargo, la distribución desigual de estos recursos resalta la necesidad de una planificación estratégica para asegurar la equidad en el acceso a estas actividades. En este contexto, el Estado debe replantear la estructura y el rol de estos espacios, impulsando políticas públicas que prioricen la prevención de problemas de salud a través del fortalecimiento y la accesibilidad de los clubes deportivos.

Objetivo General

Analizar la distribución de los clubes sociales y deportivos en la Ciudad Autónoma de Buenos Aires (CABA), con énfasis en la autocorrelación espacial de estos recursos en relación con la densidad poblacional. Este análisis busca identificar áreas con alta concentración poblacional y escasa oferta deportiva para proponer soluciones que mejoren el acceso a actividades físicas, fundamentales para la salud pública y el bienestar.

Objetivos Específicos

Realizar un análisis de autocorrelación espacial para evaluar la distribución de los espacios deportivos en función de la densidad poblacional y las características socioeconómicas. Identificar áreas prioritarias para la creación de nuevos espacios recreativos. Evaluar la relación entre la oferta de espacios deportivos y el acceso equitativo a actividades físicas.

Preguntas de Investigación

¿Cuál es la distribución geográfica de los clubes sociales, deportivos y gimnasios en CABA? ¿Existen áreas con alta densidad poblacional y baja oferta de espacios deportivos? ¿Cómo se relacionan los espacios deportivos con las características socioeconómicas de las comunas? ¿Cómo puede el análisis espacial optimizar la planificación de nuevos espacios deportivos?

Metodología

El proyecto tiene como objetivo principal el análisis geoespacial de la distribución de clubes deportivos y gimnasios en CABA, utilizando técnicas de autocorrelación espacial para identificar áreas prioritarias y optimizar la inversión en nuevas instalaciones.

Desarrollo de Proyecto: Procesamiento Geoespacial

Se integran datos georreferenciados para mapear la ubicación de los clubes deportivos en relación con la densidad poblacional de cada comuna. Se utilizan herramientas como el formato sf (simple feature) para un análisis espacial detallado.

Autocorrelación Espacial

El Índice de Moran mide la correlación espacial global entre los clubes deportivos, y el Análisis Local de Autocorrelación Espacial (LISA) detecta patrones locales de concentración o dispersión.

Visualización

Se desarrollan mapas temáticos utilizando ggplot2 y leaflet para representar las áreas con alta concentración de clubes y aquellas con necesidades de infraestructura adicional.

Análisis Avanzado

Clusterización Local: Identificación de áreas con alta y baja concentración de clubes. Interpolación Espacial: Uso de técnicas como IDW (Inverse Distance Weighting) para estimar la densidad de clubes en áreas no observadas. Indicadores de Desigualdad: Uso del Índice de Gini y el Coeficiente de Variación para medir la desigualdad en la distribución de clubes entre las comunas. Análisis Predictivo Se construye un modelo de regresión lineal para analizar la relación entre la cantidad de clubes deportivos y factores socioeconómicos, como la densidad poblacional.

Incorporación de Técnicas de Machine Learning

El proyecto incorpora el análisis geoespacial con modelos de machine learning para mejorar las predicciones sobre la distribución de clubes deportivos.

Objetivo del Machine Learning

El objetivo es predecir la probabilidad de que una zona de la ciudad necesite nuevos espacios deportivos o evaluar la relación entre la densidad poblacional y la oferta de infraestructura deportiva.

Modelos Utilizados

Regresión (Decision Trees, Random Forests): Para predecir la cantidad de clubes en función de variables socioeconómicas y de densidad poblacional. Clasificación (Regresión Logística, Decision Trees, Random Forests): Para determinar si una zona tiene suficiente infraestructura deportiva. Métricas Evaluadas

Regresión: MAE y RMSE para medir la precisión del modelo de regresión.

Clasificación: Métricas de precisión (accuracy) y matriz de confusión para evaluar el desempeño del modelo de clasificación. Visualización de Resultados Se generarán gráficos de valores predichos vs. valores reales y la curva ROC para evaluar la efectividad de los modelos.

Justificación de la Metodología

La metodología propuesta permite detectar áreas de la ciudad con mayores necesidades de infraestructura deportiva, optimizando la distribución de los recursos y mejorando el acceso equitativo a los clubes deportivos.

Resultados Esperados

Se espera identificar zonas con alta densidad poblacional y baja oferta deportiva, lo que permitirá priorizar la creación de nuevos espacios recreativos. Además, se evaluará la relación entre la infraestructura existente y las características socioeconómicas de la población.

Discusión y Conclusiones

Los resultados proporcionarán información crucial para la planificación urbana, ayudando a optimizar la distribución de recursos deportivos y mejorar la calidad de vida en CABA.

PROCESO

Cargar las librerías necesarias

library(tidyverse)
library(ggmap)
library(osmdata)
library(lubridate)
library(leaflet)
library(tidygeocoder)
library(osrm)
library(dplyr)
library(gt)
library(knitr)
library(sf)
library(readxl)  
library(ggplot2)
library(spdep)
library(gstat)
library(mapview)
library(here)
library(viridis)
library(sp)
library(spatstat) 
library(deldir)
library(car)  
library(MASS)
library(randomForest)
library(Metrics)
library(pROC)

Cargar las bases

barrios_caba <- st_read("C:/Users/Asus/OneDrive/Desktop/FLACSO - BIG DATA/DATA 2/Nueva carpeta/comunas.shp", stringsAsFactors = TRUE, options = "ENCODING=latin1")
## options:        ENCODING=latin1 
## Reading layer `comunas' from data source 
##   `C:\Users\Asus\OneDrive\Desktop\FLACSO - BIG DATA\DATA 2\Nueva carpeta\comunas.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 15 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33516 ymax: -34.52649
## Geodetic CRS:  WGS 84
CLUBES_CABA <- read.csv("C:/Users/Asus/OneDrive/Desktop/FLACSO - BIG DATA/ML/clubes.csv", stringsAsFactors = TRUE, encoding = "UTF-8")
poblacion <- read_xlsx("C:/Users/Asus/OneDrive/Desktop/FLACSO - BIG DATA/PDE.xlsx")

Preparar los datos de clubes

clubes_sf <- CLUBES_CABA %>%
  filter(!is.na(long), !is.na(lat)) %>%
  st_as_sf(coords = c("long", "lat"), crs = st_crs(barrios_caba))
colnames(poblacion) <- c("comuna", "poblacion_total", "columna2", "columna3", "columna4", "columna5")
barrios_caba <- barrios_caba %>%
  mutate(comuna = as.character(comuna)) %>%
  left_join(poblacion %>% mutate(comuna = as.character(comuna)), by = "comuna")

Visualización del mapa de barrios

ggplot() +
  geom_sf(data = barrios_caba) +
  labs(title = "Mapa de los Barrios de CABA")

## Visualización de la ubicación de los clubes de CABA

ggplot() +
  geom_sf(data = barrios_caba, fill = NA, color = "blue") +
  geom_sf(data = clubes_sf, aes(color = "red"), size = 2) +
  labs(title = "Ubicación de los Clubes en CABA") +
  theme_minimal()

Unir los clubes con los barrios y calcular la cantidad de clubes por comuna

clubes_sf <- st_transform(clubes_sf, st_crs(barrios_caba))
clubes_por_comuna <- clubes_sf %>%
  st_join(barrios_caba) %>%
  group_by(comuna.x) %>%
  summarise(cantidad_clubes = n())

Estadísticas descriptivas sobre los clubes por comuna

estadisticos_comuna <- clubes_por_comuna %>%
  summarise(
    promedio = mean(cantidad_clubes, na.rm = TRUE),
    minimo = min(cantidad_clubes, na.rm = TRUE),
    maximo = max(cantidad_clubes, na.rm = TRUE),
    media = median(cantidad_clubes, na.rm = TRUE),
    cuartil_25 = quantile(cantidad_clubes, 0.25, na.rm = TRUE),
    cuartil_75 = quantile(cantidad_clubes, 0.75, na.rm = TRUE)
  )

print(estadisticos_comuna)
## Simple feature collection with 1 feature and 6 fields
## Geometry type: MULTIPOINT
## Dimension:     XY
## Bounding box:  xmin: -58.52924 ymin: -34.68844 xmax: -58.35865 ymax: -34.53596
## Geodetic CRS:  WGS 84
## # A tibble: 1 × 7
##   promedio minimo maximo media cuartil_25 cuartil_75                    geometry
##      <dbl>  <int>  <int> <int>      <dbl>      <dbl>            <MULTIPOINT [°]>
## 1     20.1      2     32    20         17       26.5 ((-58.36438 -34.63647), (-…
ggplot(clubes_por_comuna, aes(x = cantidad_clubes)) + 
  geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) + 
  labs(title = "Distribución de la Cantidad de Clubes por Comuna", x = "Cantidad de Clubes", y = "Frecuencia") +
  theme_minimal()

# Calcular las comunas que cumplen con la media y presentar en un mapa

media_clubes <- estadisticos_comuna$media
clubes_por_comuna <- clubes_por_comuna %>%
  mutate(cumple_media = ifelse(cantidad_clubes >= media_clubes, "Cumple", "No Cumple"))

barrios_caba <- barrios_caba %>%
  st_join(clubes_por_comuna) %>%
  st_transform(crs = 4326)

Visualizar en un mapa

leaflet(barrios_caba) %>%
  addTiles() %>%
  addPolygons(fillColor = ~ifelse(cumple_media == "Cumple", "green", "red"), 
              color = "black", weight = 1, opacity = 1, fillOpacity = 0.7, 
              popup = ~paste("Comuna: ", comuna, 
                             "<br>Clubes: ", columna3, 
                             "<br>Cumple con la media: ", cumple_media)) %>%
  addMarkers(data = CLUBES_CABA, ~long, ~lat, popup = ~paste("Club: ", nombre))
## Warning in validateCoords(lng, lat, funcName): Data contains 1 rows with either
## missing or invalid lat/lon values and will be ignored

Análisis por barrio y visualizar la distribución

clubes_por_barrio <- clubes_sf %>%
  st_join(barrios_caba) %>%
  group_by(comuna.x, barrios) %>%
  summarise(cantidad_clubes_barrio = n(), .groups = "drop")

ggplot(clubes_por_barrio, aes(x = barrios, y = cantidad_clubes_barrio, fill = comuna.x)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Distribución de Clubes por Barrio y Comuna en CABA") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

## Cálculo del índice de Gini y coeficiente de variación

gini_index <- function(x) {
  n <- length(x)
  sum_diff <- sum(outer(x, x, FUN = "-")^2)
  return(sum_diff / (2 * n^2 * mean(x)^2))
}

coef_variacion <- function(x) {
  sd(x) / mean(x)
}

gini_clubes <- gini_index(clubes_por_comuna$cantidad_clubes)
cv_clubes <- coef_variacion(clubes_por_comuna$cantidad_clubes)

print(paste("Índice de Gini de la concentración de clubes:", gini_clubes))
## [1] "Índice de Gini de la concentración de clubes: 0.196178850123067"
print(paste("Coeficiente de variación de la concentración de clubes:", cv_clubes))
## [1] "Coeficiente de variación de la concentración de clubes: 0.45846660198084"

Mapa de cuantiles de la distribución de clubes

barrios_caba <- barrios_caba %>%
  mutate(quantile_clubes = ntile(cantidad_clubes, 4))

ggplot(barrios_caba) +
  geom_sf(aes(fill = as.factor(quantile_clubes)), color = "black") +
  scale_fill_viridis_d() +
  labs(title = "Mapa de Cuantiles de la Distribución de Clubes en CABA")

# Análisis espacial: Moran’s I y LISA

vecinos <- poly2nb(barrios_caba)
pesos_espaciales <- nb2listw(vecinos, style = "W", zero.policy = TRUE)

moran_test <- moran.test(barrios_caba$cantidad_clubes, pesos_espaciales)
geary_test <- geary.test(barrios_caba$cantidad_clubes, pesos_espaciales)

lisa_result <- localmoran(barrios_caba$cantidad_clubes, pesos_espaciales)
barrios_caba$lisa <- lisa_result[, 1]
barrios_caba$lisa_significance <- lisa_result[, 5]

barrios_caba <- barrios_caba %>%
  mutate(cluster = case_when(
    lisa_significance < 0.05 & lisa > 0 ~ "Cluster Alto",
    lisa_significance < 0.05 & lisa < 0 ~ "Cluster Bajo",
    TRUE ~ "No Significativo"
  ))

Visualización de clusters locales

ggplot(barrios_caba) +
  geom_sf(aes(fill = cluster), color = "black") +
  scale_fill_manual(values = c("Cluster Alto" = "red", "Cluster Bajo" = "blue", "No Significativo" = "gray")) +
  labs(title = "Clusters Locales de Clubes en CABA") +
  theme_minimal()

## Filtramos Clubes con Pileta/Natatorio y se presenta en un Mapa

clubes_caba_con_pileta <- CLUBES_CABA %>%
  filter(grepl("pileta|natatorio", instalaciones, ignore.case = TRUE))
clubes_con_pileta_ids <- clubes_caba_con_pileta$id
barrios_caba <- barrios_caba %>%
  mutate(tiene_pileta_o_natatorio = ifelse(comuna %in% clubes_con_pileta_ids, "Sí", "No"))

leaflet(barrios_caba) %>%
  addTiles() %>%
  addPolygons(fillColor = ~ifelse(tiene_pileta_o_natatorio == "Sí", "green", "red"),
              color = "black", weight = 1, opacity = 1, fillOpacity = 0.7,
              popup = ~paste("Comuna: ", comuna, "<br>Pileta o Natatorio: ", tiene_pileta_o_natatorio))

Para ejercitar creamos de un Modelo de Interpolación con IDW

clubes_por_barrio <- clubes_sf %>%
  st_join(barrios_caba) %>%
  group_by(comuna.x) %>%
  summarise(cantidad_clubes = n(), .groups = "drop")
barrios_caba <- barrios_caba %>%
  st_join(clubes_por_barrio)
idw_model <- gstat(formula = cantidad_clubes ~ 1, locations = clubes_por_barrio)
predicción_idw <- predict(idw_model, newdata = barrios_caba)
## [inverse distance weighted interpolation]
barrios_caba <- barrios_caba %>%
  mutate(cantidad_clubes_interpolada = predicción_idw$var1.pred)
ggplot(barrios_caba) +
  geom_sf(aes(fill = cantidad_clubes_interpolada), color = "black") +
  scale_fill_viridis_c() +
  labs(title = "Distribución Interpolada de Clubes en CABA (IDW)") +
  theme_minimal()

Visualización de la Distribución Interpolada con IDW

leaflet(barrios_caba) %>%
  addTiles() %>%
  addPolygons(fillColor = ~viridis::viridis(100)[as.factor(cut(cantidad_clubes_interpolada, breaks = 100))],
              color = "black", weight = 1, opacity = 1, fillOpacity = 0.7,
              popup = ~paste("Comuna: ", comuna, 
                             "<br>Clubes Interpolados: ", round(cantidad_clubes_interpolada, 2)))

REalizamos un diagrama de Voronoi

coord_clubes <- clubes_sf %>% st_coordinates()
voronoi <- deldir(coord_clubes[, 1], coord_clubes[, 2])
plot(voronoi)

## Definición de la ventana Y Convertir a clase owin

barrios_caba <- st_transform(barrios_caba, crs = 3857)

barrios_window <- as.owin(barrios_caba)

Generación del patrón de puntos

clubes_ppp <- ppp(x = CLUBES_CABA$long, y = CLUBES_CABA$lat, window = barrios_window)
## Warning in ppp(x = CLUBES_CABA$long, y = CLUBES_CABA$lat, window =
## barrios_window): 1 out of 302 points had NA or NaN coordinate values, and was
## discarded
## Warning: 301 points were rejected as lying outside the specified window
clubes_ppp <- rjitter(clubes_ppp)

Estadísticas de Primer Orden con análisis de intensidad y teselación y cuadrantes

intensidad <- intensity(clubes_ppp)
cuadrantes <- quadrat.test(clubes_ppp, nx = 4, ny = 4)
## Warning: Some expected counts are small; chi^2 approximation may be inaccurate
clubes_sf <- st_transform(clubes_sf, crs = 3857)
barrios_window <- as.owin(st_geometry(barrios_caba))
clubes_ppp <- as.ppp(clubes_sf, W = barrios_window)
## Warning: data contain duplicated points
clubes_ppp <- rjitter(clubes_ppp, radius = 10) 

Modelado de Densidad. Estimación con kernel

sigma_opt <- bw.diggle(clubes_ppp)
densidad_kernel <- density(clubes_ppp, sigma = sigma_opt)

Estadísticas de Segundo Orden. Funciones K, L,G, F y J

funcion_k <- Kest(clubes_ppp)
funcion_l <- Lest(clubes_ppp)
funcion_g <- Gest(clubes_ppp)
funcion_G <- Gest(clubes_ppp)
funcion_F <- Fest(clubes_ppp)
funcion_J <- Jest(clubes_ppp)

Interacciones entre Patrones Marcados.Función K multitipo

if ("marcas" %in% colnames(CLUBES_CABA)) {
  marcas_ppp <- as.ppp(CLUBES_CABA, W = barrios_window, marks = CLUBES_CABA$marcas)
  k_multitipo <- Kcross(marcas_ppp, "tipo1", "tipo2")
}

Procesar datos.

clubes_sf <- st_transform(clubes_sf, crs = 3857)
barrios_window <- as.owin(st_geometry(barrios_caba))
clubes_ppp <- as.ppp(clubes_sf, W = barrios_window)
## Warning: data contain duplicated points
# Corrección de puntos duplicados
clubes_ppp <- rjitter(clubes_ppp, radius = 10)

Estimación de sigma, densidad kernel y visualización

sigma_opt <- bw.ppl(clubes_ppp) # Alternativa si bw.diggle falla
densidad_kernel <- density(clubes_ppp, sigma = sigma_opt)
plot(densidad_kernel, main = "Densidad Kernel Estimada")

Visualizaciones densidad Kernel, Funcionk y l y cuadrantes

plot(barrios_window, main = "Mapa Base de Barrios")
points(clubes_ppp, col = "blue", pch = 20)

plot(densidad_kernel, main = "Densidad Kernel Estimada")
contour(densidad_kernel, add = TRUE)

plot(funcion_k, main = "Función K Observada vs Teórica")

plot(funcion_l, main = "Función L Observada vs Teórica")

plot(cuadrantes, main = "Teselación en Cuadrantes", col = "lightgrey")
points(clubes_ppp, col = "red", pch = 20)

## Procesamientos de Datos

CLUBES_CABA <- CLUBES_CABA %>% filter(complete.cases(.))
barrios_caba <- barrios_caba %>% mutate(comuna = as.character(comuna)) 
poblacion$poblacion_total <- as.numeric(poblacion$poblacion_total)
## Warning: NAs introducidos por coerción

Modificar Data Ser Clubes por Comuna

clubes_por_comuna <- data.frame(
  comuna.x = c("Comuna 1", "Comuna 2", "Comuna 3","Comuna 4","Comuna 5","Comuna 6","Comuna 7","Comuna 8","Comuna 9","Comuna 10","Comuna 11","Comuna 12","Comuna 13","Comuna 14","Comuna 15"),
  cantidad_clubes = c(18,2,6,26,18,8,20,21,32,27,31,25,20,16,31)
)


poblacion_comunas <- data.frame(
  comuna.x = c("Comuna 1", "Comuna 2", "Comuna 3","Comuna 4","Comuna 5","Comuna 6","Comuna 7","Comuna 8","Comuna 9","Comuna 10","Comuna 11","Comuna 12","Comuna 13","Comuna 14","Comuna 15"),
  poblacion_total = c(258497, 149328, 193682,240937,187907,185875,242674,230380,171733,170811,190165,215335,236650,227268,182528)
)
clubes_por_comuna <- merge(clubes_por_comuna, poblacion_comunas, by = "comuna.x", all.x = TRUE)
print(clubes_por_comuna)
##     comuna.x cantidad_clubes poblacion_total
## 1   Comuna 1              18          258497
## 2  Comuna 10              27          170811
## 3  Comuna 11              31          190165
## 4  Comuna 12              25          215335
## 5  Comuna 13              20          236650
## 6  Comuna 14              16          227268
## 7  Comuna 15              31          182528
## 8   Comuna 2               2          149328
## 9   Comuna 3               6          193682
## 10  Comuna 4              26          240937
## 11  Comuna 5              18          187907
## 12  Comuna 6               8          185875
## 13  Comuna 7              20          242674
## 14  Comuna 8              21          230380
## 15  Comuna 9              32          171733
promedio_clubes <- mean(clubes_por_comuna$cantidad_clubes, na.rm = TRUE)

##Predicciones de CLubes por comuna

clubes_por_comuna$cumple_media <- ifelse(clubes_por_comuna$cantidad_clubes >= promedio_clubes, "Sí", "No")
ggplot(clubes_por_comuna, aes(x = cantidad_clubes)) + 
  geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) + 
  labs(title = "Distribución de la Cantidad de Clubes")

## Dispersión entre Población y Cantidad de Clubes

ggplot(clubes_por_comuna, aes(x = poblacion_total, y = cantidad_clubes)) + 
  geom_point() +
  labs(title = "Dispersión entre Población y Cantidad de Clubes")

## Modelo de regresión lineal

lm_model <- lm(cantidad_clubes ~ poblacion_total + cumple_media, data = clubes_por_comuna)
vif(lm_model)
## poblacion_total    cumple_media 
##        1.025869        1.025869
modelo_ols <- lm(cantidad_clubes ~ poblacion_total + cumple_media, data = clubes_por_comuna)
summary(modelo_ols)
## 
## Call:
## lm(formula = cantidad_clubes ~ poblacion_total + cumple_media, 
##     data = clubes_por_comuna)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.662 -4.102  1.318  4.454  6.410 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -1.094e+00  1.004e+01  -0.109 0.914987    
## poblacion_total  6.942e-05  4.680e-05   1.483 0.163768    
## cumple_mediaSí   1.476e+01  2.937e+00   5.027 0.000296 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.602 on 12 degrees of freedom
## Multiple R-squared:  0.6821, Adjusted R-squared:  0.6292 
## F-statistic: 12.88 on 2 and 12 DF,  p-value: 0.001032

Verifica si los datos están alineados y Residual

summary(vecinos)
## Neighbour list object:
## Number of regions: 16 
## Number of nonzero links: 80 
## Percentage nonzero weights: 31.25 
## Average number of links: 5 
## Link number distribution:
## 
## 3 4 5 6 8 
## 3 6 1 3 3 
## 3 least connected regions:
## 1 12 13 with 3 links
## 3 most connected regions:
## 5 7 7.1 with 8 links
modelo_ols <- lm(cantidad_clubes ~ poblacion_total + cumple_media, data = clubes_por_comuna)
summary(modelo_ols)
## 
## Call:
## lm(formula = cantidad_clubes ~ poblacion_total + cumple_media, 
##     data = clubes_por_comuna)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.662 -4.102  1.318  4.454  6.410 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -1.094e+00  1.004e+01  -0.109 0.914987    
## poblacion_total  6.942e-05  4.680e-05   1.483 0.163768    
## cumple_mediaSí   1.476e+01  2.937e+00   5.027 0.000296 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.602 on 12 degrees of freedom
## Multiple R-squared:  0.6821, Adjusted R-squared:  0.6292 
## F-statistic: 12.88 on 2 and 12 DF,  p-value: 0.001032
residuos_ols <- residuals(modelo_ols)
vecinos <- poly2nb(barrios_caba)
pesos_espaciales 
## Characteristics of weights list object:
## Neighbour list object:
## Number of regions: 16 
## Number of nonzero links: 80 
## Percentage nonzero weights: 31.25 
## Average number of links: 5 
## 
## Weights style: W 
## Weights constants summary:
##    n  nn S0       S1       S2
## W 16 256 16 6.820139 65.79097
pesos_esp <- nb2listw(vecinos, style = "W", zero.policy = TRUE)
moran_test 
## 
##  Moran I test under randomisation
## 
## data:  barrios_caba$cantidad_clubes  
## weights: pesos_espaciales    
## 
## Moran I statistic standard deviate = 2.079, p-value = 0.01881
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##        0.21328537       -0.06666667        0.01813339
moran_test 
## 
##  Moran I test under randomisation
## 
## data:  barrios_caba$cantidad_clubes  
## weights: pesos_espaciales    
## 
## Moran I statistic standard deviate = 2.079, p-value = 0.01881
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##        0.21328537       -0.06666667        0.01813339

Preparar los Datos: Asegurarnos de que no haya valores faltantes y convertir las variables categóricas a factores.

clubes_por_comuna$cumple_media <- as.factor(clubes_por_comuna$cumple_media)
clubes_por_comuna <- na.omit(clubes_por_comuna)

División de Datos en Entrenamiento y Prueba:

set.seed(123)
index <- sample(1:nrow(clubes_por_comuna), 0.8 * nrow(clubes_por_comuna))
train_data <- clubes_por_comuna[index, ]
test_data <- clubes_por_comuna[-index, ]

Modelo Random Forest (Regresión)

rf_model <- randomForest(cantidad_clubes ~ poblacion_total + cumple_media,
                         data = train_data,
                         ntree = 500)
print(rf_model)
## 
## Call:
##  randomForest(formula = cantidad_clubes ~ poblacion_total + cumple_media,      data = train_data, ntree = 500) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 1
## 
##           Mean of squared residuals: 29.64563
##                     % Var explained: 38.05

Predicción y Evaluación

predictions <- predict(rf_model, test_data)
mae <- mae(test_data$cantidad_clubes, predictions)
rmse <- rmse(test_data$cantidad_clubes, predictions)
print(paste("MAE:", mae))
## [1] "MAE: 11.5825386243386"
print(paste("RMSE:", rmse))
## [1] "RMSE: 13.6018929628663"

Visualización (Valores Predichos vs. Reales)

ggplot(data.frame(Real = test_data$cantidad_clubes, Predicho = predictions), 
       aes(x = Real, y = Predicho)) +
  geom_point(color = "blue") +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "red") +
  labs(title = "Predicción vs Realidad",
       x = "Valores Reales",
       y = "Valores Predichos") +
  theme_minimal()

Modelo Random Forest (Clasificación):

rf_model_clas <- randomForest(cumple_media ~ poblacion_total + cantidad_clubes,
                              data = train_data,
                              ntree = 500)
predictions_clas <- predict(rf_model_clas, test_data, type = "response")

Evaluación (Accuracy y Matriz de Confusión):

confusion_matrix <- table(test_data$cumple_media, predictions_clas)
accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
print(confusion_matrix)
##     predictions_clas
##      No Sí
##   No  3  0
##   Sí  0  0
print(paste("Accuracy:", accuracy))
## [1] "Accuracy: 1"

Curva ROC (Clasificación)

test_data <- data.frame(cumple_media = factor(c(0, 1, 0, 1), levels = c(0, 1)))
predictions_clas <- c(0.1, 0.9, 0.2, 0.8)
test_data$cumple_media <- relevel(test_data$cumple_media, ref = "0")
roc_curve <- roc(test_data$cumple_media, as.numeric(predictions_clas))
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_curve, col = "blue", main = "Curva ROC")

Conclusión

El análisis de la distribución de los clubes sociales y deportivos en la Ciudad Autónoma de Buenos Aires (CABA), centrado en la autocorrelación espacial y su relación con la densidad poblacional, ha proporcionado una comprensión detallada de la accesibilidad a estos espacios y de las características sociodemográficas de las zonas estudiadas.

El estudio evidenció que las áreas con mejores condiciones socioeconómicas, principalmente en el norte y centro de la ciudad, presentan una mayor concentración de clubes deportivos. Por otro lado, zonas con alta densidad poblacional, como las Comunas 4, 10 y 11, tienen una oferta limitada de clubes, lo que resalta una desigualdad significativa en la distribución de estos recursos. Esta brecha podría generar barreras al acceso a actividades deportivas, afectando principalmente a los residentes de estas áreas más densamente pobladas.

Desde un enfoque socioeconómico, se observó que las comunas con menores índices de pobreza, como las Comunas 2, 6 y 14, cuentan con una mayor cantidad de clubes deportivos, mientras que aquellas con mayores niveles de pobreza, como las Comunas 5 y 9, presentan una oferta mucho más reducida. Esto subraya la necesidad urgente de desarrollar políticas públicas que fomenten la creación de nuevos clubes y espacios recreativos en las zonas más desfavorecidas.

El análisis de desigualdad, utilizando el índice de Gini (0.196) y el coeficiente de variación (0.458), mostró una distribución moderadamente concentrada en algunas áreas y una dispersión considerable en otras. Esta disparidad indica que, aunque algunas comunas cuentan con una infraestructura deportiva adecuada, otras carecen de estos recursos esenciales.

Mediante el análisis de autocorrelación espacial, se identificaron agrupamientos significativos de clubes en algunas áreas de la ciudad, lo que confirma que la distribución de estos espacios está espacialmente correlacionada. Las zonas sin agrupamientos relevantes fueron identificadas como prioritarias para futuras intervenciones. Además, el modelo de interpolación IDW permitió predecir la ubicación de nuevos clubes en áreas no observadas, optimizando la toma de decisiones para la planificación de nuevas instalaciones.

El análisis de la relación entre la población total y la cantidad de clubes reveló que, aunque algunas comunas con alta densidad poblacional tienen más clubes, no siempre existe una correspondencia directa entre densidad y acceso a infraestructura deportiva. Esto destaca la necesidad de una planificación más estratégica que considere no solo la densidad poblacional, sino también los factores socioeconómicos para lograr una distribución más equitativa de los recursos.

El modelo de regresión lineal desarrollado mostró que las variables de población total y condición socioeconómica son factores clave para predecir la cantidad de clubes en cada comuna. Los resultados del análisis de multicolinealidad confirmaron la validez del modelo, asegurando su utilidad para futuros análisis y predicciones.

En conclusión, el análisis ha puesto de manifiesto las significativas desigualdades en la distribución de clubes deportivos en CABA, tanto en términos de accesibilidad geográfica como socioeconómica. Las zonas con alta densidad poblacional y bajos índices socioeconómicos son las más desfavorecidas en cuanto a la oferta de recursos deportivos. Este hallazgo enfatiza la necesidad de diseñar políticas públicas que promuevan un acceso equitativo a la infraestructura deportiva, asegurando que todos los ciudadanos de CABA puedan beneficiarse de estos espacios esenciales para su salud y bienestar.

Fuentes

https://data.buenosaires.gob.ar/dataset/clubes

https://www.estadisticaciudad.gob.ar/eyc/?cat=132

https://www.estadisticaciudad.gob.ar/eyc/?p=62501

https://www.economicas.uba.ar/wp-content/uploads/2017/09/Situacio%CC%81n-espacial-de-las-desigualdades-socioecono%CC%81micas-en-la-CABA.pdf