Binomial com dados: o modelo se ajusta?
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
Até aqui a binomial era usada com \(n\) e \(p\) dados no enunciado. Na Aula 11 a pergunta muda: temos uma base de dados real; um modelo binomial descreve bem esses dados? É o encontro dos dois lados do mapa: a tabela de frequências, da análise exploratória, contra a distribuição de probabilidades, da probabilidade.
O caso é o da vistoria do Detran. Cada carro passa por 14 itens (extintor, pneus, buzina, cintos…). Seja \(Y\) o número de itens em não conformidade em um carro. A proposta é \(Y \sim Bin(14;\ 0{,}1)\): \(n = 14\) itens e probabilidade \(p = 0{,}1\) de cada item estar irregular.
Antes de qualquer conta, vale discutir as condições (Exercício 1 da atividade): os 14 itens não são ensaios idênticos, a chance de um pneu gasto não é a mesma de um extintor vencido, e carros velhos tendem a acumular problemas (dependência). O modelo é uma simplificação. Os dados vão dizer se ela é boa o bastante.
O roteiro tem quatro passos:
- calcular as probabilidades do modelo, \(P(Y = y)\) para \(y = 0, \dots, 14\);
- calcular as frequências relativas dos dados, \(fr(y)\);
- comparar as duas em um gráfico e comparar médias e variâncias;
- se o ajuste for ruim, estimar \(p\) pelos dados: como \(E(Y) = np\), usamos \(\hat p = \bar y / n\).
No código
Passo 1: o modelo.
Passo 2: os dados. Carros.txt tem 3.000 carros, com o tipo (1: popular, 2: não popular) e a quantidade de itens em não conformidade.
O .sort_index() é essencial: sem ele, a tabela sai ordenada da maior para a menor frequência, e o gráfico do passo 3 fica embaralhado.
Passo 3: comparar. Os pontos são os dados; os losangos, o modelo.
A média dos dados (1,37) está perto de \(E(Y) = 1{,}4\), mas o formato não bate tão bem: há mais carros sem nenhum problema do que o modelo prevê (28,8% contra 22,9%) e menos com exatamente um (31,7% contra 35,6%). A variância também denuncia: 1,58 nos dados contra 1,26 no modelo. Dados mais espalhados do que a binomial prevê são um sinal de que misturamos grupos com \(p\) diferentes.
Passo 4: estimar \(p\) para cada grupo. Se \(E(Y) = np\), então \(p = E(Y)/n\), e a estimativa pelos dados é \(\hat p = \bar y / 14\). Para os carros populares:
Com \(\hat p = 0{,}131\), as colunas ficam próximas (por exemplo, 29,5% contra 29,0% em \(y = 2\)). Fazendo o mesmo para os não populares, \(\hat p = 0{,}048\). Os dois tipos de carro têm probabilidades bem diferentes, e é por isso que o modelo único, com \(p = 0{,}1\), ajustava mal a base inteira.
Por que um modelo, se já temos os dados?
Os 3.000 carros são uma amostra. O modelo descreve a população de carros que ainda vão passar pela vistoria: com ele calculamos probabilidades de valores que nem apareceram na amostra (10 itens irregulares, por exemplo), fazemos previsões e resumimos tudo em dois números, \(n\) e \(p\).
Armadilhas comuns
- Esquecer
.sort_index()depois devalue_counts(). A tabela sai ordenada pela frequência, não pelo valor de \(y\). - Comparar contagens com probabilidades. Use
normalize=True: probabilidades somam 1, contagens somam 3.000. - Estimar \(p\) com a média. A média dos populares é 1,83 itens por carro; \(p\) é a probabilidade por item, \(1{,}83/14 = 0{,}131\).
- Usar
range(len(fr))no eixo x. Funciona aqui porque os valores observados vão de 0 a 8 sem buracos. Se faltar um valor no meio (ou o zero), os pontos se deslocam. Usefr.index. - Olhar só a média. Médias parecidas não garantem bom ajuste; compare o formato no gráfico e a variância.
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
Divida os 890 primeiros passageiros em 89 grupos de 10 (em ordem, com titanic10.index // 10) e conte os sobreviventes de cada grupo. Qual é a média de sobreviventes por grupo?
Como Survived é 0/1, a soma de cada grupo é o número de sobreviventes.
contagens = titanic10['Survived'].groupby(titanic10.index // 10).sum()
media_grupos = contagens.mean()
media_gruposExercício 2
Se cada grupo segue \(Bin(10;\ p)\), então \(E(Y) = 10p\). Estime \(p\) a partir da média dos grupos.
\(\hat{p} = \bar{y} / n\), como no Exercício 7 da atividade da Aula 11.
p_hat = media_grupos / 10
p_hatExercício 3
Compare a frequência relativa de grupos com exatamente 4 sobreviventes com \(P(Y = 4)\) do modelo \(Bin(10;\ \hat{p})\). Os dois números estão próximos (diferença menor que 0,05)? Responda 'sim' ou 'nao'.
É a comparação dados × modelo da Aula 11, valor a valor.
fr = contagens.value_counts(normalize=True).sort_index()
print('dados:', fr[4], ' modelo:', stats.binom.pmf(4, 10, p_hat))
resposta = 'sim'
respostaComandos e documentação oficial
formulário o comando está no formulário que você pode consultar na prova.
Pontes com o outro lado do mapa
- Comparar dados e modelo em um gráfico: 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) (Exercícios 1 a 7)Blackboard · conteúdo do curso