Na última seção, introduzi vocês
a um conjunto de derivações matemáticas
cujo uso visa produzir
um modelo de máxima entropia
do que era essencialmente
um "toy problem", que era:
como podemos modelar a distribuição
do tempo de chegada de táxis em Nova York,
baseado num pequeno conjunto de dados?
E esse é um problema que pode
ser de interesse pessoal
mas certamente não possui
interesse científico profundo.
Na próxima seção, o que farei é
apresentar a vocês um problema
razoavelmente interessante e científico
e mostrar como o método de máxima entropia
pode ilustrar algumas propriedades
interessantes deste sistema.
O sistema particular que temos em mente
é o que pessoas costumam chamar de
ecossistema open source.
É uma comunidade grande de pessoas
dedicadas a escrever código de tal forma
que ele seja aberto,
acessível, e "debugável",
e, em geral,
produzido não por um indivíduo,
nem por uma corporação,
com proteções de copyright e
controle sobre a origem,
mas por uma comunidade de pessoas editando
e compartilhando código uns dos outros.
O ecossistema open source é algo
que domina uma grande fração
do código de computador que rodamos hoje,
incluindo não só macOS X,
mas também, claro, Linux.
É uma ótima história de sucesso,
e queremos estudá-la cientificamente.
Usei a palavra "ecossistema" de propósito,
em parte porque muito do que falarei
é um conjunto de ferramentas e derivações
que aprendi com John Harte
e pessoas que trabalharam com John Harte
na abordagem de máxima entropia
aplicada não a sistemas sociais,
mas sistemas biológicos,
e, em particular, ecossistemas.
Recomendo o livro de John Harte,
"Maximum Entropy and Ecology",
como fonte de muito mais informações
das ferramentas que irei mostrar agora.
Meu objetivo aqui é mostrar que até mesmo
argumentos simples de máxima entropia
podem nos dar insights científicos
bem profundos.
O que tomarei como minha fonte de dados —
pois vou estudar o mundo empírico agora —,
o que tomarei como fonte de dados
foi obtido do SourceForge.
SourceForge não é mais...
o repositório mais popular
de softwares open source —
talvez o Github tenha superado-o nisso —,
mas, por muito tempo, talvez desde 1999,
(e pegamos dados até 2011),
ele tem um arquivo enorme de projetos
abrangendo desde vários tipos
de jogos de computador
até editores de texto e
softwares de negócios e de matemática.
Parte do código que utilizei
na minha pesquisa está no SourceForge.
Em particular, é ótimo para estudar
o uso de linguagens de computador.
Então, o que plotei aqui
é uma distribuição
de linguagens usadas
na comunidade open source
e encontradas no SourceForge.
No eixo x está o log do número de projetos
escritos em uma linguagem particular.
Esse "0" quer dizer 1
[escala log: 10⁰ = 1].
Na database há cerca de 12 linguagens
que possuem algo na ordem de 1 projeto.
Ou seja, são linguagens extremamente raras
no movimento open source.
No outro lado dessa escala logarítmica,
em 4, então 10⁴ = 10.000,
vemos um pequeno número
de linguagens extremamente populares,
Estas são as linguagens mais comuns
de se encontrar no SourceForge,
elas possuem uma popularidade maior.
E se você souber um pouquinho
sobre programação,
não será surpresa que são principalmente
linguagens derivadas de C,
como C, C++, Java.
Ali no meio destas
"aves extremamente raras"
e destes bem comuns –
que são algo como bactérias
do ecossistema open source –,
ali no meio, há um grande número
de linguagens moderadamente populares.
Então essa distribuição de linguagens
é o que vamos tentar explicar
usando métodos de máxima entropia.
Há um pequeno número
de linguagens raras,
um número maior de
moderadamente populares,
e, de novo, um número pequeno
de linguagens extremamente populares.
Plotei isso como
uma distribuição de probabilidade,
P(n), onde n é o número de projetos,
na comunidade open source,
que usa essa linguagem,
e esta é a probabilidade que
sua linguagem tenha n projetos
na comunidade open source.
Queremos criar um modelo
de máxima entropia
desta distribuição aqui.
Representei os mesmos dados
de forma diferente agora,
assim é como tendem a representá-lo,
esta é uma distribuição de
ranking de abundância,
e o que ecologistas chamam de
distribuição de abundância de uma espécie.
Então a linguagem com maior ranking,
o ranking 1 aqui,
é a linguagem com
o maior número de projetos,
e não surpreenderá ninguém aqui
que esta linguagem é Java:
há cerca de 20.000 projetos
escritos em Java.
A segunda maior linguagem é C++,
logo depois vem C,
e então PHP,
e as linguagens mais raras, aqui embaixo,
possuem rankings bem menores,
números maiores têm menores rankings,
como 2º lugar, 3º, etc.
Então o 100º lugar,
aqui embaixo, no 100º lugar
está uma linguagem bem desafortunada
chamada Turing,
que possui, até então,
até onde achei arquivado,
somente 2 projetos escritos em Turing.
Vemos também que algumas
das minhas favoritas, como Ruby,
estão aqui no meio
numa zona de popularidade moderada.
Então representamos estes dados –
são os mesmos dados –,
mas agora o que plotei aqui
é a log-abundância
neste eixo [y],
e aqui o ranking,
mas agora linear,
ao contrário daqui,
onde ele estava em escala log.
Este é um plot log-log,
este é um plot log-linear agora,
então temos os dados de fato.
A primeira coisa que tentaremos
é uma distribuição de máxima entropia
para abundância de linguagens,
ou seja, para a probabilidade
de achar uma linguagem com n projetos.
E o que vamos fazer é
restringir uma coisa somente:
a popularidade média de uma linguagem.
Essa será nossa única restrição
do problema de máxima entropia,
e vamos pegar
a distribuição de probabilidade P(n)
que maximize a entropia P log P
soma negativa, de 0 a ထ,
de P log P,
onde vamos maximizar essa quantidade
sujeita a essa restrição,
e, claro, sempre sujeita
à restrição de normalização,
que [a soma de] P(n) seja igual a 1,
essa é minha outra restrição.
Claro, já sabemos como
resolver esse problema,
sabemos sua forma funcional,
este é exatamente o mesmo problema
que vocês aprenderam a resolver
quando modelamos o tempo de espera
de táxis em Nova York,
com um modelo da mesma forma
então, assim como restringimos
somente o tempo de espera médio,
aqui vamos restringir
a popularidade média de uma linguagem,
popularidade sendo o número de projetos
arquivados, naquela linguagem.
Então sabemos como essa forma funcional é.
Ela é algo como exp(-𝜆 n)
tudo sobre Z,
e então o que precisamos fazer
é ajustar 𝜆 e Z,
para reproduzir a abundância correta
que vemos nos dados.
Então essa é a distribuição
de máxima entropia.
Ela é, claro, um modelo exponencial,
possui uma forma exponencial,
e, se acharmos 𝜆 e Z
que melhor reproduzam os dados,
ou seja, que melhor satisfaçam
essa restrição,
e que tenha, ademais, máxima entropia,
então achamos isso aqui.
Essas barras vermelhas aqui são
desvios de 1 e 2 sigmas
para a distribuição de
ranking de abundância,
e o que quero que vejam
nesse gráfico
é que isso é um péssimo ajuste
a estes dados!
A distribuição de máxima entropia,
com esta restrição,
não reproduz os dados,
não é capaz de explicar,
ou de modelar, estes dados
em uma maneira razoável.
Ele subestima radicalmente
estas linguagens extremamente populares.
Ou seja, é incapaz de reproduzir o fato
de que existam linguagens como C e Python,
que são extremamente populares.
Ela sobrestima este regime "mesoscópico",
ela sobrestima as linguagens
moderadamente populares.
E também sobrestima estas "aves raras",
linguagens de baixo ranking,
as que possuem bem poucos
exemplos arquivados.
Então ok, isso não deu muito certo.