FelipeRocha13 commited on
Commit
02cfcfa
·
verified ·
1 Parent(s): e5bda07

Upload appp.py

Browse files
Files changed (1) hide show
  1. appp.py +172 -0
appp.py ADDED
@@ -0,0 +1,172 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ================================================
2
+ # Dashboard Interativo - ROI e Simulação de Overbooking
3
+ # ================================================
4
+ # Para rodar: streamlit run app.py
5
+ # ================================================
6
+
7
+ import streamlit as st
8
+ import numpy as np
9
+ import pandas as pd
10
+ import matplotlib.pyplot as plt
11
+
12
+ # ==========================
13
+ # Função para simulação binomial
14
+ # ==========================
15
+ def simulate_binomial_revenue(N, p, r, nsim=10000, random_seed=None):
16
+ rng = np.random.default_rng(random_seed)
17
+ X = rng.binomial(n=N, p=p, size=nsim) # número de sucessos
18
+ return X * r
19
+
20
+ # ==========================
21
+ # Configurações iniciais do dashboard
22
+ # ==========================
23
+ st.set_page_config(page_title="Simulação ROI - Aérea Confiável", layout="wide")
24
+
25
+ st.title("✈️ Simulação de ROI - Sistema de Previsão de Overbooking")
26
+ st.markdown("""
27
+ Este dashboard simula diferentes cenários de desempenho do sistema de previsão
28
+ da **Aérea Confiável**, permitindo analisar **risco** e **retorno esperado**.
29
+ """)
30
+
31
+ # ==========================
32
+ # Sidebar - Entradas do usuário
33
+ # ==========================
34
+ st.sidebar.header("⚙️ Parâmetros da Simulação")
35
+
36
+ # Entradas financeiras
37
+ investimento_inicial = st.sidebar.number_input("Investimento Inicial (R$)", min_value=10000.0, value=50000.0, step=1000.0)
38
+ receita_alvo = st.sidebar.number_input("Receita Alvo (R$)", min_value=10000.0, value=80000.0, step=1000.0)
39
+ custo_operacional = st.sidebar.number_input("Custo Operacional Anual (R$)", min_value=0.0, value=10000.0, step=1000.0)
40
+
41
+ # Entradas do modelo binomial
42
+ N = st.sidebar.slider("Número de Oportunidades (N)", min_value=50, max_value=500, value=200, step=10)
43
+ p0 = st.sidebar.slider("Probabilidade Base de Sucesso (p0)", min_value=0.05, max_value=0.95, value=0.40, step=0.01)
44
+
45
+ # Ajuste de cenários
46
+ delta = st.sidebar.slider("Variação da Probabilidade ±", min_value=0.05, max_value=0.30, value=0.15, step=0.01)
47
+
48
+ # Simulações
49
+ nsim = st.sidebar.slider("Número de Simulações", min_value=1000, max_value=50000, value=20000, step=1000)
50
+
51
+ # Limite de receita mínima
52
+ target_threshold = st.sidebar.number_input("Receita Mínima Desejada (R$)", min_value=0.0, value=60000.0, step=1000.0)
53
+
54
+ st.sidebar.markdown("---")
55
+ st.sidebar.info("Ajuste os parâmetros acima para explorar diferentes cenários.")
56
+
57
+ # ==========================
58
+ # Cálculo do ROI determinístico
59
+ # ==========================
60
+ lucro_investimento = receita_alvo - custo_operacional
61
+ roi_deterministico = (lucro_investimento / investimento_inicial) * 100
62
+
63
+ st.subheader("📊 ROI Determinístico")
64
+ st.metric(label="ROI (%)", value=f"{roi_deterministico:.2f}%")
65
+ st.caption("ROI calculado apenas com os valores fixos, sem considerar incertezas.")
66
+
67
+ # ==========================
68
+ # Configuração dos cenários
69
+ # ==========================
70
+ cenarios = {
71
+ "Pessimista": max(0.01, p0 - delta),
72
+ "Real": p0,
73
+ "Otimista": min(0.99, p0 + delta)
74
+ }
75
+
76
+ # Receita por sucesso
77
+ r = receita_alvo / (N * p0)
78
+
79
+ # ==========================
80
+ # Simulação
81
+ # ==========================
82
+ sim_results = {}
83
+ summary_rows = []
84
+
85
+ for nome, p in cenarios.items():
86
+ receita = simulate_binomial_revenue(N, p, r, nsim=nsim)
87
+ sim_results[nome] = receita
88
+
89
+ # Estatísticas
90
+ media = receita.mean()
91
+ mediana = np.median(receita)
92
+ desvio = receita.std(ddof=1)
93
+ prob_abaixo = (receita < target_threshold).mean()
94
+
95
+ roi_sim = (receita - custo_operacional) / investimento_inicial * 100
96
+ media_roi = roi_sim.mean()
97
+ prob_roi_negativo = (roi_sim < 0).mean()
98
+ pct_10 = np.percentile(roi_sim, 10)
99
+ pct_90 = np.percentile(roi_sim, 90)
100
+
101
+ summary_rows.append({
102
+ "Cenário": nome,
103
+ "p (Prob. Sucesso)": p,
104
+ "Receita Média (R$)": media,
105
+ "Mediana Receita (R$)": mediana,
106
+ "Desvio Padrão (R$)": desvio,
107
+ f"P(Receita < {target_threshold:,.0f})": prob_abaixo,
108
+ "ROI Médio (%)": media_roi,
109
+ "P(ROI < 0%)": prob_roi_negativo,
110
+ "ROI 10%": pct_10,
111
+ "ROI 90%": pct_90
112
+ })
113
+
114
+ summary_df = pd.DataFrame(summary_rows).set_index("Cenário")
115
+
116
+ # ==========================
117
+ # Exibir Tabela
118
+ # ==========================
119
+ st.subheader("📈 Resumo dos Cenários")
120
+ st.dataframe(summary_df.style.format({
121
+ "Receita Média (R$)": "R$ {:,.2f}",
122
+ "Mediana Receita (R$)": "R$ {:,.2f}",
123
+ "Desvio Padrão (R$)": "R$ {:,.2f}",
124
+ f"P(Receita < {target_threshold:,.0f})": "{:.2%}",
125
+ "ROI Médio (%)": "{:.2f}%",
126
+ "P(ROI < 0%)": "{:.2%}",
127
+ "ROI 10%": "{:.2f}%",
128
+ "ROI 90%": "{:.2f}%"
129
+ }))
130
+
131
+ # ==========================
132
+ # Visualização - Gráficos
133
+ # ==========================
134
+ st.subheader("📊 Distribuição da Receita por Cenário")
135
+ fig, ax = plt.subplots(figsize=(10,5))
136
+ for nome, receita in sim_results.items():
137
+ ax.hist(receita, bins=50, alpha=0.6, label=f"{nome} (p={cenarios[nome]:.2f})")
138
+ ax.axvline(target_threshold, color='red', linestyle='--', label='Meta Receita' if nome=="Pessimista" else "")
139
+ ax.set_title("Distribuição da Receita Anual")
140
+ ax.set_xlabel("Receita (R$)")
141
+ ax.set_ylabel("Frequência")
142
+ ax.legend()
143
+ ax.grid(True)
144
+ st.pyplot(fig)
145
+
146
+ # ROI Distribution
147
+ st.subheader("📊 Distribuição do ROI por Cenário")
148
+ fig2, ax2 = plt.subplots(figsize=(10,5))
149
+ for nome, receita in sim_results.items():
150
+ roi_sim = (receita - custo_operacional) / investimento_inicial * 100
151
+ ax2.hist(roi_sim, bins=60, alpha=0.5, label=f"{nome} (p={cenarios[nome]:.2f})", density=True)
152
+ ax2.set_title("Distribuição do ROI (%)")
153
+ ax2.set_xlabel("ROI (%)")
154
+ ax2.set_ylabel("Densidade")
155
+ ax2.legend()
156
+ ax2.grid(True)
157
+ st.pyplot(fig2)
158
+
159
+ # ==========================
160
+ # Conclusão baseada nos resultados
161
+ # ==========================
162
+ st.subheader("💡 Conclusões e Recomendações")
163
+
164
+ st.markdown(f"""
165
+ - **ROI determinístico:** {roi_deterministico:.2f}%
166
+ - Cenário pessimista ainda mostra uma **probabilidade significativa de receita abaixo de R$ {target_threshold:,.0f}**, o que indica risco operacional.
167
+ - No cenário otimista, o ROI médio ultrapassa 200%, com risco quase nulo de perdas.
168
+ - A empresa deve considerar:
169
+ - Ajustar políticas de overbooking por rota ou perfil de cliente.
170
+ - Integrar dados em tempo real para reduzir variabilidade.
171
+ - Explorar precificação dinâmica para maximizar receita.
172
+ """)