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.
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.
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.
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.
¿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?
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.
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.
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.
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.
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.
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.
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.
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)
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")
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")
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()
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())
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)
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
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"
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"
))
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))
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()
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)))
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)
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)
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)
sigma_opt <- bw.diggle(clubes_ppp)
densidad_kernel <- density(clubes_ppp, sigma = sigma_opt)
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)
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")
}
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)
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")
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
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
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
clubes_por_comuna$cumple_media <- as.factor(clubes_por_comuna$cumple_media)
clubes_por_comuna <- na.omit(clubes_por_comuna)
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, ]
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
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"
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()
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")
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"
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")
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.