Comparar dados e modelo em um gráfico

Colocar no mesmo gráfico as frequências observadas e as probabilidades de um modelo, pontual e acumulada.
Na prova · apoio Pode aparecer como comparação entre as frequências observadas e o modelo. Guia da prova

Os códigos desta página rodam no navegador, mas não sozinhos: clique em Run Code em cada bloco, de cima para baixo.

DicaEm uma frase

Para saber se um modelo probabilístico descreve bem os dados, desenhamos no mesmo gráfico a frequência relativa observada de cada valor e a probabilidade que o modelo dá a esse valor; se os pontos ficam próximos, o modelo se ajusta.

A ideia

Este é o gráfico das Aulas 11 e 13, e é onde os dois lados do mapa se encontram. Do lado da análise exploratória vem a tabela de frequências; do lado da probabilidade vem a distribuição de um modelo, como a binomial ou a Poisson. Se o modelo é bom, a frequência relativa de cada valor deve ficar perto da probabilidade teórica, porque frequência relativa é uma estimativa de probabilidade.

O exemplo é o da Aula 11: a base Carros.txt tem 3.000 carros vistoriados pelo Detran. A variável Quantidade conta quantos dos 14 itens vistoriados estavam em não conformidade. O modelo proposto é \(Y \sim Bin(n = 14;\ p = 0{,}1)\).

Há duas versões do gráfico:

  • Pontual: para cada \(y\), frequência relativa de \(y\) contra \(P(Y = y)\), calculada com stats.binom.pmf.
  • Acumulada: para cada \(y\), frequência relativa acumulada até \(y\) contra \(P(Y \leq y)\), calculada com stats.binom.cdf. A curva acumulada é mais estável e mostra desvios que se somam ao longo dos valores.

No código

1. A tabela de frequências relativas dos dados. O value_counts ordena do valor mais frequente para o menos frequente; o .sort_index() coloca os valores em ordem (0, 1, 2, …).

Repare: a tabela vai só até 8. Nenhum carro teve 9 ou mais itens em não conformidade, então esses valores não aparecem. Mas o modelo dá probabilidade (pequena) para todos os valores de 0 a 14. Para comparar valor com valor, completamos a tabela com zeros usando .reindex.

2. Gráfico pontual. Pontos redondos para os dados, losangos para o modelo. Não ligamos os pontos com linhas, porque a variável é discreta.

3. Gráfico acumulado. .cumsum() acumula as frequências relativas; stats.binom.cdf acumula as probabilidades.

Como julgar o ajuste. Olhe os valores com mais massa (aqui, de 0 a 4) e pergunte:

  • A diferença entre ponto e losango é pequena perto do tamanho do próprio valor? Por exemplo, em \(y = 0\) os dados dão 0,288 e o modelo dá 0,2288.
  • As diferenças vão sempre para o mesmo lado em uma região (dados acima do modelo nos valores baixos e abaixo nos do meio)? Desvio sistemático é pior do que desvio que ora vai para cima, ora para baixo.
  • A média dos dados bate com a esperança do modelo, \(E(Y) = np\)? E a variância, com \(np(1-p)\)? Veja Binomial com dados.

A conclusão sobre este modelo é sua: é o Exercício 5 da atividade da Aula 11.

Armadilhas comuns

  • Eixos desalinhados. Se a tabela dos dados não tem todos os valores, plt.plot(range(len(fr)), fr) só funciona por sorte (quando os valores observados são 0, 1, 2, … sem buracos). Complete com .reindex(range(n + 1), fill_value=0) e use os próprios valores no eixo x.
  • range(n) deixa o último valor de fora. No notebook da aula, stats.binom.cdf(range(n), n=n, p=p) calcula de 0 a 13: o range para antes de n. Para ir de 0 a 14, use range(n + 1).
  • Esquecer o .sort_index(). Sem ele, o value_counts fica ordenado por frequência, e os pontos vão para os valores errados.
  • Comparar contagens com probabilidades. A contagem de carros com 1 item em não conformidade é 950; a probabilidade é um número entre 0 e 1. Use normalize=True.
  • Ligar os pontos com linha. Para variável discreta, a linha sugere valores intermediários (como 1,5 itens) que não existem.

Na Aula 13, a comparação é a mesma com erupções por ano e \(X \sim Poisson(\mu = 10)\): troque stats.binom.pmf(valores, n, p) por stats.poisson.pmf(valores, 10). A diferença é que a Poisson não tem valor máximo, então você escolhe até onde vai o eixo x (por exemplo, de 0 a 25).

Exercícios aqui na página

Complete os ______ e clique em Run Code: a correção aparece logo abaixo. Use Show Hint para uma dica e Show Solution para ver uma resolução. O Python roda no seu navegador; na primeira vez ele leva alguns segundos para carregar.

Exercício 1

Compare dados e modelo no valor zero: a proporção de carros sem nenhum item em não conformidade contra \(P(Y = 0)\) do modelo \(Bin(14;\ 0{,}1)\). Guarde a diferença (dados menos modelo).

Diferença positiva quer dizer que os dados têm mais carros sem problema do que o modelo prevê.

fr = carros['Quantidade'].value_counts(normalize=True).sort_index()
pr = stats.binom.pmf(valores, n, p)
plt.plot(fr.index, fr.values, 'o', label='dados')
plt.plot(valores, pr, 'D', alpha=0.6, label='modelo')
plt.legend()
plt.show()
diferenca_zero = fr[0] - stats.binom.pmf(0, n, p)
diferenca_zero

Exercício 2

Na versão acumulada, compare a frequência relativa acumulada (.cumsum()) com \(P(Y \leq y)\) (stats.binom.cdf). Complete a tabela com zeros até 14 e guarde a maior distância entre as duas curvas, em valor absoluto.

Curvas acumuladas deixam as diferenças mais fáceis de enxergar.

fr_completa = carros['Quantidade'].value_counts(normalize=True).reindex(valores, fill_value=0)
fra = fr_completa.cumsum()
fda = stats.binom.cdf(valores, n, p)
plt.plot(valores, fra, 'o', label='dados')
plt.plot(valores, fda, 'D', alpha=0.6, label='modelo')
plt.legend(loc='lower right')
plt.show()
maior_distancia = (fra - fda).abs().max()
maior_distancia

Exercício 3

Por que completamos a tabela de frequências com .reindex(valores, fill_value=0) antes de comparar com o modelo? Escreva uma frase que use a palavra zero.

O value_counts só lista os valores que aparecem nos dados.

resposta = 'Porque os valores que nenhum carro teve (de 9 a 14) não aparecem no value_counts; o reindex coloca frequência zero neles para alinhar cada valor com a sua probabilidade no modelo.'
resposta

Comandos e documentação oficial

Pontes com o outro lado do mapa

Este tópico aparece nestas paradas da revisão guiada, em que cada ponte vira um exercício resolvido pelos dois caminhos:

Pratique

As listas novas de revisão abrem no Google Colab (use Arquivo → Salvar uma cópia no Drive). As listas das aulas estão no Blackboard, na pasta de cada aula.