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¶

image.png

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 é:

In [ ]:
from scipy.stats import binom
n = 2
p = 0.5
k = 1
binom.pmf(k, n, p)
Out[ ]:
np.float64(0.5000000000000002)

Ou então para vários ks:¶

In [3]:
n = 2
p = 0.5
ks = [0, 1, 2]
ps = binom.pmf(ks, n, p)
ps
Out[3]:
array([0.25, 0.5 , 0.25])
In [10]:
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()]
Out[10]:
(np.int64(125), np.float64(0.050412213147309655))
No description has been provided for this image
In [29]:
print(pmf_k[pmf_k.qs >= 140].sum())
0.03321057562002166
In [36]:
pmf_k.prob_ge(140) + pmf_k.prob_le(110)
Out[36]:
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

In [52]:
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
No description has been provided for this image

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

In [61]:
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()
Out[61]:
(<Axes: >, <Axes: >)
No description has been provided for this image

Agora fazemos a mesma coisa com a prior nova

In [57]:
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
No description has been provided for this image

É 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

In [60]:
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
No description has been provided for this image

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?

In [ ]:
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
No description has been provided for this image