Spaces:
Sleeping
Sleeping
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")
|