Comparar dados e modelo em um gráfico
Os códigos desta página rodam no navegador, mas não sozinhos: clique em Run Code em cada bloco, de cima para baixo.
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: orangepara antes den. Para ir de 0 a 14, userange(n + 1).- Esquecer o
.sort_index(). Sem ele, ovalue_countsfica 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.
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_zeroExercí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_distanciaExercí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.'
respostaComandos e documentação oficial
Pontes com o outro lado do mapa
- Binomial com dados: o modelo se ajusta?: Frequência relativa × P(Y = y): o modelo se ajusta aos dados? (exercício na parada 9)
Este tópico aparece nestas paradas da revisão guiada, em que cada ponte vira um exercício resolvido pelos dois caminhos:
- Parada 9: Da Bernoulli à binomial: dados × modelo exercícios ao vivo · ver no mapa · no Colab
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.
- Revisão B · Pontes: cada conteúdo por dois caminhos (com correção automática) nova (Parte 9)Abrir no ColabBaixar .ipynb
- Aula 11 · Atividade: binomial com dados (vistoria do Detran) (Opções 1 e 2 e Exercícios 5 e 7)Blackboard · conteúdo do curso
- Aula 13 · Atividade: Poisson com dados (erupções em Kabum Prime) (Exercício 10)Blackboard · conteúdo do curso