1. Introducción

El presente trabajo está motivado por la siguiente pregunta: ¿Qué tipo de distribución espacial agrupada existe referente a espacios culturales existe en la Ciudad de Buenos Aires?

Esta pregunta recupera la preocupación acerca la concentración espacial de la oferta cultural en la Ciudad de Buenos Aires, ya que en el paradigma actual de la democratización de la cultura concerniente a su oferta, acceso y producción, no puede omitir la cuestión espacial como uno de sus variante que afecta a las y los vecinos de esta ciudad.

Metodología

Sobre las unidades de análisis, serán centros culturales agrupados en el espacio, de tipo privados como públicos.

Será un corte transversal ya que no indagará sobre cómo variaron en el tiempo

Se trabajará con los data sets pertenecientes al portal de https://data.buenosaires.gob.ar/dataset/, portal de datos públicos generado por el gobierno porteño, así como los pertenecientes al último censo para conocer datos demográficos. Serán 3 data sets: i) Los espacios culturales, ii) Los polígonos de las comunas de la Ciudad Autónoma de Buenos Aires (CABA), y iii) Censo 2010

3. Carga de librerías

library(tidyverse)
library(sf)
library(tmap)
library(spatstat)
library(spdep)
# Data sets

#Comunas
comunas <- read_sf("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/comunas/CABA_comunas.geojson")

# Espacios              
espacios <- read_sf("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/ministerio-de-cultura/espacios-culturales/espacios-culturales.geojson")

# Radios censales
censo <- read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/informacion-censal-por-radio/caba_radios_censales.geojson")

4. Limpieza de datos

# 4.1 calculos de cantidad 

# 4.1.1 Calcular cantidad de habitantes por Comuna

# Primero pasamos a numérica

censo$TOTAL_POB <- as.numeric(censo$TOTAL_POB)

hab_com <- censo %>%
  select(COMUNA,TOTAL_POB) %>%
  group_by(COMUNA) %>%
  summarise(c_hab=sum(TOTAL_POB))  %>%
  st_drop_geometry()

hab_com$COMUNA <- as.numeric(hab_com$COMUNA)

hab_com <- rename(hab_com, comuna=COMUNA)


# 4.1.2 Calculo cantidad de espacios culturales por Comuna

esp_com <- espacios %>%
  group_by(COMUNA) %>%
  summarise(c_espacios=n()) %>%
  filter(!COMUNA=="COMUNA 5")  %>%
  st_drop_geometry()

# Modifico nombres
esp_com <- rename(esp_com, comuna=COMUNA)

esp_com <- esp_com %>%
mutate(comuna=case_when(comuna=="COMUNA 01"~1,
                        comuna== "COMUNA 02"~2,
                        comuna== "COMUNA 03"~3,
                        comuna== "COMUNA 04"~4,
                        comuna== "COMUNA 05"~5,
                        comuna== "COMUNA 06"~6,
                        comuna== "COMUNA 07"~7,
                        comuna== "COMUNA 08"~8,
                        comuna== "COMUNA 09"~9,
                        comuna== "COMUNA 10"~10,
                        comuna== "COMUNA 11"~11,
                        comuna== "COMUNA 12"~12,
                        comuna== "COMUNA 13"~13,
                        comuna== "COMUNA 14"~14,
                        comuna== "COMUNA 15"~15))


# 4.1.3 Incorporamos las unidades administrativas 

comunas <- comunas %>%
  rename(comuna=COMUNAS)  %>%
  mutate(comuna=as.numeric(comuna))  %>%
  select(comuna,geometry) 



# 4.2 Unir data de datos espaciales y calcular espacios cada 1000 hab


esp_hab <- left_join(esp_com, hab_com, by = "comuna") %>% 
  mutate(prop_espacios = 1000*c_espacios/c_hab)

# 4.3 Los incorporamos a la geometria de las unidades administrativas

esp_hab <- left_join(comunas, esp_hab, by="comuna")

# 4.4 Observamos en el espacio



ggplot(esp_hab, aes(fill=prop_espacios)) +
  geom_sf() +
  scale_fill_viridis_c(option="magma")+
  geom_sf_label(aes(label=comuna), col="red") +
  theme_void() +
  labs(title = "Proporción de espacios culturales cada 1000 habitantes",
       subtitle = "Ciudad de Buenos Aires",
       fill="Proporción de espacios cada 1000 habitantes")

En un principio observamos que la cantidad de espacios culturales según cada 1000 habitantes está concentrada en el centro en la Comuna 1 (Retiro-San Nicolás), que es este de la ciudad, en el centro (Almagro-Caballito) y al norte (Palermo-Recoleta). En esta zona, los valores oscilan de 3 a 5 espacios culturales cada 1000 personas.

Por otro lado, observamos que en la zona más cercana al conurbano (región oeste-suroeste de la ciudad) disminuyen notoriamente esta proporción, ¿a qué se podrá deber? ¿A la dificulta del transporte para su acceso? ¿A la poca concentración de otras actividades que fomenten su aparición por allí? Por ahora continuémos indagando sobre su distribución en la ciudad.

5. Diseño de vecinos

# 5. Vecinos e Indice de Moran
w <- poly2nb(esp_hab, row.names = "comuna")


# 5.1 Ploteamos vecinos

plot(st_geometry(esp_hab), border="grey")
plot(w, coordinates(as(esp_hab, "Spatial")), add=TRUE, col="red")

# 5.2 Diseñemos una matriz de pesos vecinos en estilo Binarios

wmatb <- nb2mat(w, style='B')
wmatb
##    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## 1     0    0    0    0    0    1    0    0    0     1     0     1     0     0
## 2     0    0    0    1    0    0    1    0    0     1     1     0     0     0
## 3     0    0    0    1    0    0    0    0    0     0     1     0     1     0
## 4     0    1    1    0    1    0    1    0    0     0     1     0     0     0
## 5     0    0    0    1    0    0    1    1    0     0     0     0     0     0
## 6     1    0    0    0    0    0    1    1    0     1     0     0     0     0
## 7     0    1    0    1    1    1    0    1    0     1     0     0     0     0
## 8     0    0    0    0    1    1    1    0    0     0     0     0     0     0
## 9     0    0    0    0    0    0    0    0    0     1     1     1     0     1
## 10    1    1    0    0    0    1    1    0    1     0     1     1     0     0
## 11    0    1    1    1    0    0    0    0    1     1     0     0     1     1
## 12    1    0    0    0    0    0    0    0    1     1     0     0     0     0
## 13    0    0    1    0    0    0    0    0    0     0     1     0     0     1
## 14    0    0    0    0    0    0    0    0    1     0     1     0     1     0
## 15    1    0    0    0    0    0    0    0    1     0     0     1     0     0
##    [,15]
## 1      1
## 2      0
## 3      0
## 4      0
## 5      0
## 6      0
## 7      0
## 8      0
## 9      1
## 10     0
## 11     0
## 12     1
## 13     0
## 14     0
## 15     0
## attr(,"call")
## nb2mat(neighbours = w, style = "B")
# Lo hacemos tipo lista para que pueda realizar los cálculos
lwb <-  nb2listw(w, style='B')
lwb
## Characteristics of weights list object:
## Neighbour list object:
## Number of regions: 15 
## Number of nonzero links: 64 
## Percentage nonzero weights: 28.44444 
## Average number of links: 4.266667 
## 
## Weights style: B 
## Weights constants summary:
##    n  nn S0  S1   S2
## B 15 225 64 128 1208
# 5.3 Indice de Moran I GLOBAL


moran.test(esp_hab$c_espacios, lwb)
## 
##  Moran I test under randomisation
## 
## data:  esp_hab$c_espacios  
## weights: lwb    
## 
## Moran I statistic standard deviate = 2.8814, p-value = 0.00198
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       0.207294017      -0.071428571       0.009357077
moran.test(esp_hab$prop_espacios, lwb)
## 
##  Moran I test under randomisation
## 
## data:  esp_hab$prop_espacios  
## weights: lwb    
## 
## Moran I statistic standard deviate = 3.0939, p-value = 0.0009879
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##        0.25336578       -0.07142857        0.01102086

Si nos atenemos al p-valor, y tomáramos como referencia un registro menor 0.5 como estadísticamente significativo, entonces aquí pareciera que lo es. Por lo tanto, si nuestra hipótesis nula fuera que la distribución espacial es aleatoria, entonces rechazaríamos esta como tal y estaríamos en condición de acercarnos más a nuestra hipótesis alternativa.

Asi mismo, al tener en cuenta el signo, observamos que es levemente positiva la significación.

En otro aspecto, si tomamos tanto la cantidad de espacios como la proporción, es estadísticamente significativo el resultado. Pero si acentuamos más, comprobamos que en la proporción se hace más notable.

# 5.1 Correlograma 

Icorr3 <-sp.correlogram(neighbours=w,var=esp_hab$prop_espacios,order=3,method="I",zero.policy=TRUE)
plot(Icorr3) # hasta el tercer vecino

Es curioso que si nos extendemos hasta el tecer orden de vecinos, la proporción de casos disminuye notoriamente. Esto podria ayudarnos a comenzar a comprender tanto la forma del agrupamiento.

### 5.2 Dispersion de Moran

mp <- moran.plot(esp_hab$prop_espacios, lwb, zero.policy=TRUE, labels=as.numeric(esp_hab$comuna))

mp
##            x       wx is_inf labels       dfb.1_         dfb.x       dffit
## 1  2.0465446 8.188194  FALSE      2  0.020869514  0.3717128755  0.53424176
## 2  0.5395397 2.883273  FALSE      6 -0.093605397  0.0405846398 -0.09933680
## 3  0.3192348 1.013626  FALSE     10 -0.339835595  0.1892839958 -0.34557925
## 4  0.3213368 2.742604  FALSE     11 -0.100493272  0.0558693824 -0.10221796
## 5  0.3497971 2.211346  FALSE     12 -0.171416454  0.0928546417 -0.17500811
## 6  1.3541621 4.964458  FALSE     14  0.027668980  0.0174663225  0.05763869
## 7  1.1940364 4.288712  FALSE     15 -0.001431257 -0.0003945157 -0.00238823
## 8  0.6959724 2.897996  FALSE     13 -0.096827957  0.0312677421 -0.10861599
## 9  0.7835231 7.280844  FALSE      4  0.341498566 -0.0852974802  0.39990732
## 10 1.0279042 7.558878  FALSE      5  0.283885011  0.0045067083  0.39681213
## 11 0.3399957 3.450648  FALSE      7 -0.010210397  0.0055815429 -0.01041044
## 12 1.3010766 8.363023  FALSE      3  0.258328805  0.1286856770  0.49695681
## 13 0.3522933 0.766047  FALSE      9 -0.373765485  0.2019895143 -0.38173001
## 14 0.1068165 1.475812  FALSE      8 -0.280449029  0.1824425260 -0.28087740
## 15 4.5050512 4.131144   TRUE      1  3.588491681 -7.6357164564 -7.98285786
##        cov.r       cook.d        hat
## 1  1.0011522 1.332443e-01 0.12922526
## 2  1.2519158 5.295001e-03 0.08002413
## 3  1.0827401 5.910093e-02 0.09523915
## 4  1.2756702 5.613087e-03 0.09506697
## 5  1.2314175 1.618615e-02 0.09278694
## 6  1.2577820 1.793268e-03 0.07340753
## 7  1.2599490 3.089453e-06 0.06853692
## 8  1.2344510 6.311125e-03 0.07269065
## 9  0.9100333 7.356906e-02 0.06984415
## 10 0.8974793 7.205572e-02 0.06667527
## 11 1.2945231 5.869921e-05 0.09356139
## 12 0.7868225 1.055471e-01 0.07145821
## 13 1.0328988 7.053634e-02 0.09259152
## 14 1.2022680 4.068149e-02 0.11532205
## 15 0.8911136 1.399304e+01 0.78356986

¿Cómo lo interpretamos?

En principio que al estar la pendiente de recta de regresión en esa posición, hay una autocorrelación espacial positiva, es decir que hay proporción de espacios culturales similar en áreas vecinas.

Si observamos el cuadrante izquierdo inferior, comprobamos que hay promedio similar de espacios pero con valores bajos.

Si observamos el cuadrante derecho inferior, comprobamos que hay un valor relevante (comuna 1), con una proporción de 4 espacios culturales cada 1000 habitantes con un promedio de vecinos similares.

Si volvemos al p-valor de la proporción de casos cada 1000 habitantes (0.0009879), podríamos afirmar que sí hay dependencia espacial de nuestras unidades de análisis.

6. Indice de Moran Local

# 6. 
propc_lm_lwb <- localmoran(esp_hab$prop_espacios, lwb)
view(propc_lm_lwb)

Esta grilla es útil para conocer qué polígono es significativo. Si vemos el valor P observamos que tienen el polígono 1, 11 y 15 (Comuna 1, 11 y 15 respectivamente ) observamos que están rodeados de comunas con valores similares.

# 6.1  Macheo esta matriz con la base de datos de CABA


moran_map_propcasos <- cbind(esp_hab, propc_lm_lwb)

head(moran_map_propcasos)
## Simple feature collection with 6 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -58.53152 ymin: -34.64582 xmax: -58.3707 ymax: -34.53863
## Geodetic CRS:  WGS 84
##   comuna c_espacios  c_hab prop_espacios        Ii       E.Ii   Var.Ii
## 1      2        323 157827     2.0465446 3.7553503 -0.2857143 2.005313
## 2      6         95 176076     0.5395397 0.4964056 -0.2857143 2.005313
## 3     10         53 166022     0.3192348 1.2513550 -0.2142857 1.507309
## 4     11         61 189832     0.3213368 1.4332346 -0.3571429 2.501099
## 5     12         70 200116     0.3497971 0.4918635 -0.2142857 1.507309
## 6     14        306 225970     1.3541621 0.2693157 -0.2857143 2.005313
##        Z.Ii   Pr.z...0.                       geometry
## 1 2.8536766 0.002160825 MULTIPOLYGON (((-58.38 -34....
## 2 0.5523092 0.290368255 MULTIPOLYGON (((-58.43061 -...
## 3 1.1937855 0.116280945 MULTIPOLYGON (((-58.48834 -...
## 4 1.1320853 0.128799287 MULTIPOLYGON (((-58.49838 -...
## 5 0.5751688 0.282588587 MULTIPOLYGON (((-58.50331 -...
## 6 0.3919453 0.347549322 MULTIPOLYGON (((-58.42676 -...
# 6.1.1 Cambio nombres

moran_map_propcasos <- moran_map_propcasos %>%
  mutate(ppp= moran_map_propcasos$Pr.z...0.)

head(moran_map_propcasos)
## Simple feature collection with 6 features and 10 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -58.53152 ymin: -34.64582 xmax: -58.3707 ymax: -34.53863
## Geodetic CRS:  WGS 84
##   comuna c_espacios  c_hab prop_espacios        Ii       E.Ii   Var.Ii
## 1      2        323 157827     2.0465446 3.7553503 -0.2857143 2.005313
## 2      6         95 176076     0.5395397 0.4964056 -0.2857143 2.005313
## 3     10         53 166022     0.3192348 1.2513550 -0.2142857 1.507309
## 4     11         61 189832     0.3213368 1.4332346 -0.3571429 2.501099
## 5     12         70 200116     0.3497971 0.4918635 -0.2142857 1.507309
## 6     14        306 225970     1.3541621 0.2693157 -0.2857143 2.005313
##        Z.Ii   Pr.z...0.                       geometry         ppp
## 1 2.8536766 0.002160825 MULTIPOLYGON (((-58.38 -34.... 0.002160825
## 2 0.5523092 0.290368255 MULTIPOLYGON (((-58.43061 -... 0.290368255
## 3 1.1937855 0.116280945 MULTIPOLYGON (((-58.48834 -... 0.116280945
## 4 1.1320853 0.128799287 MULTIPOLYGON (((-58.49838 -... 0.128799287
## 5 0.5751688 0.282588587 MULTIPOLYGON (((-58.50331 -... 0.282588587
## 6 0.3919453 0.347549322 MULTIPOLYGON (((-58.42676 -... 0.347549322
# 6.3 Asigno valores Z

z_propcasos <- moran_map_propcasos$prop_espacios - mean(moran_map_propcasos$prop_espacios) # Z propcasos

lag_propcasos <- lag.listw(lwb, moran_map_propcasos$prop_espacios)#lag de propcasos
z_lag_propcasos <-lag_propcasos - mean(lag_propcasos) # Z de lag de propcasos


quad <- vector(mode="numeric",length=nrow(moran_map_propcasos))
quad[z_propcasos > 0 & z_lag_propcasos > 0] <- 1 #alto-alto HH rojo
quad[z_propcasos > 0 & z_lag_propcasos < 0] <- 2 #alto-bajo HL rosado
quad[z_propcasos < 0 & z_lag_propcasos > 0] <- 3 #bajo-alto LH celeste
quad[z_propcasos < 0 & z_lag_propcasos < 0] <- 4 #bajo-bajo LL azul
quad[moran_map_propcasos$p > 0.05] <- 5 #No Signif blanco



moran_map_propcasos$quad <- quad


LISA <- c("red", "lightpink","skyblue2","blue", "white")


 #  tm_shape(moran_map_propcasos) + 
  # tm_fill(col="quad", palette = LISA,  style = "fixed", breaks = c(1,2,3,4,5,6),
  #        labels = c("HH", "LH", "HL","LL", "no signif"),title="Agrupamientos LISA") +
  # tm_legend(outside=TRUE)+
  # tm_borders(col = "Grey") +
  # tm_text("comuna")

El análisis tipo LISA nos deja observar lo siguiente:

  1. Que hay una autocorrelación espacial positiva entre comunas ya que hay valores (promedio de espacios culturales cada 1000 habitantes) rodeados de valor similares

  2. Mientras que la autocorrelación con valores bajos se mantienen en la región sur y suroeste de la Ciudad, en la región centro y norte hay mayormente valores altos rodeados de tales.