Simulando a segregação racial: o modelo de Schelling (ABM – Parte 4)

Quarto post da série. Veja os outros: Parte 1, Parte 2, Parte 3 e Parte 5.


 

Não faz muito tempo, fomos surpreendidos pela produção e divulgação desses excelentes mapas, produzidos por um aplicativo on-line e interativo:

raca

São mapas da distribuição espacial dos indivíduos por raça. No exemplo acima, trata-se da Região Metropolitana de São Paulo. Cada indivíduo é repesentado por um ponto e colorido de acordo com sua raça. São dados baseados no Censo Demográfico de 2010. Os criadores do aplicativo tiveram a nobreza de disponibilizar os códigos e todos os procedimentos que estão nos bastidores desse empreendimento. Está tudo no GitHub.

O que interessa aqui desta vez é discutir sobre como agent-based models podem ajudar a compreender a formação desses padrões espaciais, que evidenciam uma clara e bem delimitada separação dos grupos. O propósito não será discutir desigualdades raciais, mas sim a noção de emergência (sobre o que já falei brevemente no post anterior): ações individuais isoladas podem gerar padrões macrossociais não previstos e que não poderiam ser deduzidos a partir da observação de indivíduos ou grupos específicos.

Imagine a seguinte situação: uma sociedade cujos indivíduos podem ser classificados em dois grupos raciais, azul e vermelho. Com excessão da raça, todos são iguais, em termos de recursos, oportunidades etc. A princípio, nessa situação abstrata, qualquer pessoa poderia comprar uma casa e se mudar para absolutamente qualquer lugar daquela localidade, desde que o local de destino estivesse desocupado. Numa situação como essa, haveria segregação racial? A princípio não, a não ser que os indivíduos tivessem algum grau de racismo. E é exatamente isso que vamos modelar desta vez: quanto racismo é necessário para que um padrão claramente segregado se forme?

Obviamente, o padrão que observamos em São Paulo na figura acima não se deve somente ao racismo. Há uma sobreposição de inúmeros processos: pobreza, desigualdades de renda, dinâmicas do mercado imobiliário, além de um path dependence com relação à colonização, ocupação do espaço e história social dos bairros. Mas não sejamos ingênuos, os pobres não são negros por “coincidência”. Além disso, mesmo controlando pela situação socioeconômica, encontramos segregação por cor; como evidenciou o meu caro amigo Danilo França em sua dissertação de mestrado e também num capítulo mais recente, publicado no livro A metrópole de São Paulo no século XXI, organizado por Eduardo Marques.

Thomas Schelling, prêmio Nobel de Economia em 2005, elaborou seu modelo de simulação fundando-se numa situação abstrata semelhante àquela exposta acima. Ele propôs o seguinte (sério, vejam o artigo): suponha que os indivíduos tenham preferência por residir próximos a certa quantidade de pessoas da mesma raça que eles — por exemplo, no mínimo 20%. Assim, uma pessoa olha ao seu redor, conta quantos vizinhos têm a sua cor e, se houver menos do que gostaria, muda-se para outro lugar (sorteado aleatoriamente, mas que estava previamente vazio, não ocupado por alguém). Assumindo, que todas as pessoas compartilhem de um mesmo grau de “racismo” ou “tolerância” (nessa acepção absurdamente simplificada), qual é o valor mínimo desse parâmetro para que obtenhamos delimitações raciais muito claras no espaço? A resposta é: aproximadamente 30%.

F4.large.jpg

Provavelmente o leitor já se deparou com diagramas como esse aí acima, que mostram o resultado do modelo de segregação de Schelling, assumindo diversos graus de tolerância e fazendo variar o número de espaços vazios para onde os indivíduos “infelizes” podem se mudar. É exatamente isso que vamos simular.


Desta vez, apelei à comodidade. Ao invés de programar eu mesmo os códigos para a implementação do modelo, resolvi copiar e modificar um exemplo muito bom que encontrei no blog R Snippets. Em time que está ganhando não se mexe, hehe. Fiz modificações mínimas para tornar mais fácil a modificação dos parâmetros. O exemplo, no entanto, segue uma estratégia muito distinta da apresentada nos três posts anteriores desta série sobre ABM aqui no Sociais & Métodos. Ele não usa Reference Classes. Os agentes, segundo essa representação, não são objetos com atributos e capacidades de ação… Podemos indagar se de fato, da maneira como foi construída, a implementação desse modelo se constitui num verdadeiro ABM. Conceitualmente talvez sim. Mas como eu disse no primeiro post, replicando meu amigo Davoud, “it’s all about ontology”. Com isso, quero frisar que a forma de implementação deve refletir o modelo conceitual: se “agentes agem”, é desejável que exista um objeto computacional que operacionalize os agentes e suas ações. Não é só o resultado o que importa.

Tudo se passa numa matriz. Aleatoriamente, distribui-se os valores 2, 4 e 0, que representarão, respectivamente, as cores vermelho (raça 1), azul (raça 2) e branco (espaços vazios). Para cada célula, avaliamos se há X% de células da mesma cor (vermelho ou azul) ao redor. Mapeamos então esses “infelizes”. Em ordem aleatória, os re-alocamos para espaços vazios. Simples assim.

A execução do código abaixo produz, ao final, um GIF animado. Mas para que tudo funcione direitinho, é necessário instalar um software a mais, que gera esses GIFs, o ImageMagik (gratuito), além do pacote animation, no R.

Os parâmetros serão os seguintes:

tam = 50          # dimensao da matriz

tolerancia = .5   # nivel de tolerância/racismo

perc_ocupado = .9 # proporção de células ocupadas
                  # não vazias
raio = 1          # raio dentro do qual o indivíduo
                  # observa a vizinhança (1 célula em
                  # todas as direções: cima, baixo, 
                  # esquerda, direita e diagonais)

max_rep           # número máximo de iterações

Trago agora todo o código em bloco, sem muito me delongar ou explicar suas partes. O autor do post original já trabalhou nisso, e os mais curiosos podem dar uma passada lá pra conferir detalhes adicionais.

# 0 - empty
# 2 - first agent type color
# 4 - second agent type color
# initialize simulation
# size      - square size
# perc.full - percentage of lots to be occupied


init = function(side, perc.full) {
  size = floor(side ^ 2 * perc.full / 2)
  state = matrix(0, side, side)
  occupied = sample(side ^ 2, 2 * size)
  state[occupied] = c(2,4)
  return(state)
}


# plot simulation state
# state - simulation state
# i     - simulation iteration
do.plot = function(state, i) {
  side = dim(state)[1]
  x = rep(1:side, side)
  y = rep(1:side, each = side)
  par(fin=c(6,6), fig=c(0,1,0,1))
  plot(x , y, axes = F, xlab="", ylab="", col = state,
       main = paste("Rodada", i), pch = 19, cex = 40 / side)
}


# perform one step of simulation
# state     - simulation state
# threshold - percent of required agents of the same color
#             in neighborhood
# radius    - neighborhood radius

sim.step = function(state, threshold, radius) {
  mod.1 = function(a, b) { 1 + ((a - 1) %% b) }
  div.1 = function(a, b) { 1 + ((a - 1) %/% b) }
  unhappy = rep(NA, length(state))
  side = dim(state)[1]
  check = (-radius):(radius)
  
  #find unhappy agents
  for (n in which(state > 0)) {
    x = div.1(n, side)
    y = mod.1(n, side)
    x.radius = mod.1(check + x, side)
    y.radius = mod.1(check + y, side)
    region = state[y.radius, x.radius]
    similar = sum(region == state[n]) - 1
    total = sum(region > 0) - 1
    unhappy[n] = (similar < total * threshold)
  }
  vunhappy = which(unhappy)
  # move unhappy agents
  vunhappy = vunhappy[sample.int(length(vunhappy))]
  empty = which(state == 0)
  for (n in vunhappy) {
    move.idx = sample.int(length(empty), 1)
    state[empty[move.idx]] = state[n]
    state[n] = 0
    empty[move.idx] = n
  }
  return(state)
}

library(animation)
# simple wrapper for animation plotting
go = function() {
  s = init(tam, perc_ocupado)
  for (i in 1:max_rep) {
    do.plot(s, i)
    last.s = s
    s = sim.step(s, tolerancia, raio)
    if (identical(last.s, s)) { break }
  }
  for (j in 1:20) {
    do.plot(s, i)
  }
  ani.options(interval = 3 / (i + 2))
}
saveGIF(go())

Os resultados serão salvos num arquivo .gif no seu diretório de trabalho. Abaixo seguem alguns exemplos. Esse aqui abaixo é fruto de uma simulação em que a tolerância foi ajustada para 0.10 (10 %). Observa-se que a convergência é atingida rapidamente, em duas rodadas apenas. Depois disso, todos os indivíduos estão “felizes” e ninguém mais muda:

tol 0.10

Tolerância = 0,1

Nos dois casos a seguir, a tolerância foi ajustada para 0.2 e 0.3 . De fato, ajustando para 30%, é possível ver “ilhas” bem delineadas, obtidas ao longo de 16 rodadas. Ou seja, quanto maior a intolerância à indivíduos de outra cor, mais bem delineada a segregação e maior o tempo necessário para obter equilíbrio.

tol 0.20

Tolerância = 0,2

 

tol 0.30

Tolerância = 0,3

Veja que é possível obter padrões ainda mais segregados. Abaixo apesento dois outros diagramas. Um em que o nível de tolerância está em 0.5 e outro em 0.7 (esse último ficou parecendo um dinossauro ou é só viagem minha?).

tol 0.50

Tolerância = 0,5

 

Notem que no caso abaixo, entre vermelhos e brancos há espaços vazios!

tol 0.70

Tolerância = 0,7

Por fim, um caso extremo: tolerância em 0.9. É um grau de exigência tão alto que simplesmente não gera equilíbrio.

tol 0.90

Tolerância = 0,9


Conveniente rodar tantas simulações só mudando os parâmetros e apertando o play novamente né? Pois é… parece que o Schelling, no artigo original, fez tudo na mão — e usou lançamento de moedas para fazer o sorteio. Isso mesmo: fez um (quase?) ABM na mão! Isso é que é força. Há vários modos de implementar ABMs.

Anúncios

4 respostas em “Simulando a segregação racial: o modelo de Schelling (ABM – Parte 4)

  1. Pingback: Sociedade, caos e complexidade (ABM – Parte 5, final) | SOCIAIS & MÉTODOS

  2. Meninos, o blog é muito bom. Vi que é antigo, mas só descobri hoje. Em uma rápida passada me ajudou bastante em coisas do R e deu alguns insights. Parabéns pelo empenho e ualidade dos posts.

  3. Pingback: Simulando o trânsito e os limites de velocidade | SOCIAIS & MÉTODOS

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s