File size: 4,635 Bytes
08adf7e
e2290bd
08adf7e
b094c92
b11e2c4
08adf7e
f17e98d
38163b3
 
 
78066af
08adf7e
38163b3
3396459
b11e2c4
9ab9ce2
cf5658e
2e7d8ee
3396459
cf5658e
38163b3
3396459
cf5658e
2e7362a
3b3ab50
cf5658e
06e586b
3396459
 
b5dcff2
3396459
a6e8729
 
 
3396459
3b3ab50
08adf7e
 
a27bba4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b8d769b
 
1c07537
fb12e9f
 
 
609213c
 
fb12e9f
 
 
 
 
78066af
08adf7e
 
 
78066af
08adf7e
 
 
 
 
 
 
 
 
 
 
 
e2290bd
78066af
4069b86
 
b5dcff2
f17e98d
4069b86
9ab9ce2
4069b86
 
 
 
 
 
 
 
 
b5dcff2
4069b86
 
 
 
 
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import streamlit as st
import numpy as np
import plotly.graph_objects as go
import pandas as pd
from PIL import Image

#Criei uma função para repetir o HTML
def html(conteudo):
    st.markdown(conteudo, unsafe_allow_html=True)

st.markdown("### Simulação de Gols por Partida")

html('<p>Um técnico de futebol quer entender a estatística por trás do campo e aumentar a efetividade do seu time</p>')
html('<p>Para variar o esquema tático ele desenvolveu uma ferramenta para saber se precisa colocar em campo jogadores que vão conseguir produzir mais volume de jogo <b>(mais chutes ao gol)</b> ou um atacante mais efetivo, que aumentaria a <b> probabilidade de fazer o gol</b> </p>')
html('<p>Com isso, desenvolveu a ferramenta utilizando a Distribuição Binomial. Ele já sabe que o seu time tem a probabilidade de fazer um gol por chute de 14%, ele quer saber qual esquema tático utilizar, enquanto o jogo acontece, variando os parâmetros que ele pode controlar; Como a quantidade de chutes que está dada ao gol.</p>')

html('<p><li>Este parâmetro define o valor do número de chutes da partida</li></p>')
numero_chutes_partida = st.slider("Chutes na Partida", 0, 30, 6) 

html('<p><li>Esta é a taxa de sucesso desse time fazer um gol</li></p>')
probabilidade_gol = st.slider("Probabilidade de um Chute virar Gol em %", 0, 100, 14)

html('<p><li>Quantas Simulações serão feitas</li></p>')
simulacoes_monte_carlo = st.slider("Quantidade de Simulações - Monte Carlo", 1000, 100000, 5000)

imagem = Image.open("src/binomial.png")
st.image(imagem)
html('<p>X = o número de Gols ou a variável aleatória; k = seria o valor de gols; n = o número total de chutes na partida; p a probabilidade desse chute virar gol;</p>') 
html('<p>(1-p) = probabilidade de errar o gol; (n/k) = numero de combinações possíveis de escolher (k) gols em (n) tentativas </p>') 
html('<p> Exemplo: n = 5, p = 0.2 e k = 2, o resultado é: 20,48% de chance de fazer exatamente 2 gols em 5 chutes</p>') 

html('<p>Por que usar a Binomial?</p>')
html('<p>Com a simulação monte carlo e utilizando a Distribuição Binomial, o técnico vai saber a distribuição, tendo a ideia de quantos gols fará variando o seu esquema tático (afetando chutes e a probabilidade de fazer o gol)</p>') 


probabilidade_gol = (probabilidade_gol/100)
simulacoes = np.random.binomial(numero_chutes_partida, probabilidade_gol, simulacoes_monte_carlo)

if "params" not in st.session_state or st.session_state.params != (
    numero_chutes_partida,
    probabilidade_gol,
    simulacoes_monte_carlo,
):
    st.session_state.simulacoes = np.random.binomial(
        numero_chutes_partida, probabilidade_gol, simulacoes_monte_carlo
    )
    st.session_state.params = (
        numero_chutes_partida,
        probabilidade_gol,
        simulacoes_monte_carlo,
    )

# Recupera as simulações salvas
simulacoes = st.session_state.simulacoes

html('<li>Abaixo uma tabela das distribuições com os parâmetros inseridos acima</li>')
gols, numero_partidas = np.unique(simulacoes, return_counts=True)
df = pd.DataFrame(
    {
        "Gols": [f"`{gol}`" for gol in gols],
        "Partidas": [f"**{partida}**" for partida in numero_partidas]
    }
)

st.table(df)

# Gráfico
fig = go.Figure()
fig.add_trace(go.Histogram(
    x=simulacoes,
    nbinsx=numero_chutes_partida+1,
    name='Distribuição de Gols',
    marker_color='green',
    opacity=0.75
))

fig.update_layout(
    title="Distribuição Simulada de Gols por Jogo",
    xaxis_title="Número de Gols em um Jogo",
    yaxis_title="Frequência",
    plot_bgcolor="white",
    bargap=0.05
)

st.plotly_chart(fig, use_container_width=True)


html('<h4>Quantos chutes preciso fazer para vencer a partida.</h4>')

#Outra simulação para descobrir quantos gols preciso fazer
meta_gol = st.number_input("A Quantidade de Gols que você precisa",min_value=1,max_value=10,value=2)
meta_gol = int(meta_gol)
chutes_para_gol = meta_gol / probabilidade_gol

numeros_possiveis = False ## Uma Flag para ver se é possível fazer essa quantidade gol com a probabilidade informada.
for numero_chutes in range(1, 50):
    simulacoes2 = np.random.binomial(numero_chutes, probabilidade_gol, simulacoes_monte_carlo)
    media_total_gols = np.mean(simulacoes2)
    
    if media_total_gols >= meta_gol:
        st.write(f"Com {numero_chutes} chutes e probabilidade de {probabilidade_gol}%, você atinge em média {media_total_gols:.2f} gols.")
        numeros_possiveis = True
        break

if numeros_possiveis == False:
    st.write("Não foi possível calcular a quantidade de gols necessárias, aumente a probabilidade")