4 - Estimating Proportions¶
- Neste capítulo:
- Lidar com escolha de priors e usar probabilidades para representar o desconhecido
When spun on edge 250 times, a Belgian one-euro coin came up heads 140 times and tails “It looks very suspicious to me,” said Barry Blight, a statistics lecturer at the London School of Economics. “If the coin were unbiased, the chance of getting a result as extreme as that would be less than 7%
Qual a chance de ser uma moeda justa?
Distribuição Binomial¶
Diz a probabilidade de ter k eventos dado n iterações, sendo p a chance de k ocorrer em cada iteração
Se jogarmos uma moeda n=2 vezes, com uma chance de dar cara p=0.5, as chances de ter k=1 caras é:
from scipy.stats import binom
n = 2
p = 0.5
k = 1
binom.pmf(k, n, p)
np.float64(0.5000000000000002)
Ou então para vários ks:¶
n = 2
p = 0.5
ks = [0, 1, 2]
ps = binom.pmf(ks, n, p)
ps
array([0.25, 0.5 , 0.25])
from empiricaldist import Pmf
import numpy as np
def make_binomial(n, p):
"""Make a binomial Pmf."""
ks = np.arange(n+1)
ps = binom.pmf(ks, n, p)
return Pmf(ps, ks)
pmf_k = make_binomial(n=250, p=0.5)
pmf_k.plot()
pmf_k.max_prob(), pmf_k[pmf_k.max_prob()]
(np.int64(125), np.float64(0.050412213147309655))
print(pmf_k[pmf_k.qs >= 140].sum())
0.03321057562002166
pmf_k.prob_ge(140) + pmf_k.prob_le(110)
np.float64(0.06642115124004333)
Agora vamos abordar o problema de forma Bayesiana¶
Se a moeda for justa, a chance de cara será 50%
Vamos presumir uma hipótese para cada probabilidade
from numpy import linspace
from empiricaldist import Pmf
hypos = linspace(0, 1, 101)
uniform_prior = Pmf(1, hypos, name='uniform')
likelihood = {
'H': hypos,
'T': 1 - hypos
}
dataset = 'H' * 140 + 'T' * 110
posterior = uniform_prior.copy()
for coin_toss in dataset:
posterior *= likelihood[coin_toss]
posterior.normalize()
posterior.plot()
print('Valor mais provável: ', posterior.max_prob())
print('Probabilidade deste valor: ', posterior[posterior.max_prob()])
Valor mais provável: 0.56 Probabilidade deste valor: 0.12745318058391109
Mas uma prior uniforme (todos os valores igualmente prováveis), como estamos usando, é a melhor escolha?
Vamos fazer uma prior triangular
A escolha da prior acaba sendo em algum grau subjetiva.
Portanto, a posterior também
import numpy as np
ramp_up = np.arange(50)
ramp_down = np.arange(50, -1, -1)
a = np.append(ramp_up, ramp_down)
triangle_prior = Pmf(a, hypos, name='triangle')
triangle_prior.normalize(),uniform_prior.normalize()
uniform_prior.plot(), triangle_prior.plot()
(<Axes: >, <Axes: >)
Agora fazemos a mesma coisa com a prior nova
posterior = triangle_prior.copy()
for coin_toss in dataset:
posterior *= likelihood[coin_toss]
posterior.normalize()
posterior.plot()
print('Valor mais provável: ', posterior.max_prob())
print('Probabilidade deste valor: ', posterior[posterior.max_prob()])
Valor mais provável: 0.56 Probabilidade deste valor: 0.127509727518035
É quase igual à posterior obtida anteriormente.
Neste caso, prior pouco importa, dada uma amostra suficientemente grande
Função Likelihood Binomial¶
Em vez de iterar n vezes, podemos fazer o cálculo de uma vez só usando uma likelihood que considere a chance de cada resultado utilizando a função binomial
from empiricaldist import Pmf
from scipy.stats import binom
hypos = linspace(0, 1, 101)
prior = Pmf(1, hypos, name='uniform_2')
likelihood = binom.pmf(k=140, n=250, p=hypos)
posterior = prior * likelihood
posterior.normalize()
posterior.plot()
print('Valor mais provável: ', posterior.max_prob())
print('Probabilidade deste valor: ', posterior[posterior.max_prob()])
Valor mais provável: 0.56 Probabilidade deste valor: 0.12745318058391034
Que é igual ao primeiro resultado que encontramos
Estatística Bayesiana¶
Prior representa as nossas crenças
Tratamos mesmo propriedades físicas como a de uma moeda como se fosse uma variável aleatória
Teorema de Bayes é uma tautologia objetiva
Estatística Bayesiana é cheia de subjetividades e controversias
Exercício 4.1¶
In Major League Baseball (MLB), most players have a batting average between .200 and .330, which means that their probability of getting a hit is between 0.2 and 0.33.
Suppose a player appearing in their first game gets 3 hits out of 3 attempts. What is the posterior distribution for their probability of getting a hit?
from empiricaldist import Pmf
from numpy import arange
from scipy.stats import binom
hypos = [n/100 for n in range(20, 34)]
prior = Pmf(1, hypos, name='batting')
likelihood = binom.pmf(k=3, n=3, p=hypos)
posterior = prior * likelihood
posterior.normalize()
posterior.plot()
print('Valor mais provável: ', posterior.max_prob())
print('Probabilidade deste valor: ', posterior[posterior.max_prob()])
Valor mais provável: 0.33 Probabilidade deste valor: 0.12898166326299884