```python
from scipy import stats as ss

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

plt.ion()
```

# 1 - Moedas Justa com a Binomial

Vamos explorar a probabilidade de uma moeda ser justa usando estatística e amostragem (conceitos não exclusivos).
Lembrando, temos um espaço amostral:

\begin{align}
\mathcal{S} &= \{h, t\} \\
P(h) &= 0.5 \\
P(t) &= 0.5
\end{align}



```python
p = 0.5 # probabilidade de heads/tails
n = 30  # temos 33 jogadas
```


```python
x = np.arange(0, 31)
x
```




    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
           17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])




```python
p = 0.5 # probabilidade de heads/tails
n = 30  # temos 33 jogadas
x = np.arange(0, 31)
prob_binom = ss.distributions.binom.pmf(x, n, p)
plt.step(x, prob_binom, 'r-')
plt.xlabel('Num Caras - x')
plt.ylabel('P(sair x caras)')
```


```python
ss.distributions.binom.pmf(22, n, p) + \
ss.distributions.binom.pmf(23, n, p) + \
ss.distributions.binom.pmf(24, n, p) + \
ss.distributions.binom.pmf(25, n, p) + \
ss.distributions.binom.pmf(26, n, p) + \
ss.distributions.binom.pmf(27, n, p) + \
ss.distributions.binom.pmf(28, n, p) + \
ss.distributions.binom.pmf(29, n, p) + \
ss.distributions.binom.pmf(30, n, p)
```




    0.0080624008551239308




```python
x_extreme = np.arange(22, 31)
x_extreme
```




    array([22, 23, 24, 25, 26, 27, 28, 29, 30])




```python
ss.distributions.binom.pmf(x_extreme, n, p).sum()
```




    0.0080624008551239291



# 2 - Moedas Justas Simulando

Vamos simular sem se preocupar com uma binomial. Só jogar uma moeda para cima várias vezes.


```python
# Jogando uma única moeda
np.random.randint(2)
```




    0




```python
# Jogando 30 moedas
np.random.randint(2, size=30)
```




    array([0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1,
           1, 0, 1, 1, 0, 1, 1])




```python
NUM_SIMULACOES = 100000
resultados = 0
n = 30
for i in range(NUM_SIMULACOES):
    jogadas = np.random.randint(2, size=n) # joga 30 moedas para cima
    n_caras = (jogadas == 1).sum()         # conta quantas foram == 1, caras
    if n_caras >= 22:
        resultados += 1                    # quantas vezes vi >= 22 caras
print(resultados / NUM_SIMULACOES)
```

    0.00824


## 3 Caso onde Batman está certo


```python
p = 0.9 # probabilidade de heads/tails
n = 30  # temos 33 jogadas
x = np.arange(0, 31)
prob_binom = ss.distributions.binom.pmf(x, n, p)
plt.step(x, prob_binom, 'r-')
plt.xlabel('Num Caras - x')
plt.ylabel('P(sair x caras)')
```


```python
NUM_SIMULACOES = 100000
resultados = 0
n = 30
for i in range(NUM_SIMULACOES):
    jogadas = np.random.rand(30) < 0.9
    n_caras = (jogadas == 1).sum()
    if n_caras >= 22:
        resultados += 1
print(resultados / NUM_SIMULACOES)
```

    0.99784


## 4 Tem vezes que precisamos testar a coroa também


```python
p = 0.2 # probabilidade de heads/tails
n = 30  # temos 33 jogadas
x = np.arange(0, 31)
prob_binom = ss.distributions.binom.pmf(x, n, p)
plt.step(x, prob_binom, 'r-')
plt.xlabel('Num Caras - x')
plt.ylabel('P(sair x caras)')
```


```python

```

c736b28dcd6a7a3fa39b4adefcdf1b7b2a4ed347
ipynb
Jupyter Notebook
01-Moedas.ipynb
flaviovdf/evcomp2018
104db0d7fb8d77cd1d0edaf64c02f149bdda388c
BSD-3-Clause
2018-02-20T01:30:34.000Z
2021-03-04T12:04:37.000Z
01-Moedas.ipynb
flaviovdf/evcomp2018
104db0d7fb8d77cd1d0edaf64c02f149bdda388c
BSD-3-Clause
01-Moedas.ipynb
flaviovdf/evcomp2018
104db0d7fb8d77cd1d0edaf64c02f149bdda388c
BSD-3-Clause
2018-02-24T00:42:49.000Z
2022-03-03T04:17:25.000Z
Qwen/Qwen-72B
1. YES
2. YES