EmilySouza021 commited on
Commit
3b9af2a
·
verified ·
1 Parent(s): 67f7474

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +214 -0
app.py ADDED
@@ -0,0 +1,214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import numpy as np
3
+ import matplotlib.pyplot as plt
4
+ import seaborn as sns
5
+ from scipy.stats import binom
6
+ import pandas as pd
7
+ import plotly.graph_objects as go
8
+ from plotly.subplots import make_subplots
9
+
10
+ # Configuração da página
11
+ st.set_page_config(
12
+ page_title="Aérea Confiável - Simulador",
13
+ page_icon="✈️",
14
+ layout="wide"
15
+ )
16
+
17
+ # Título principal
18
+ st.title("✈️ Aérea Confiável - Simulador de Overbooking e ROI")
19
+ st.markdown("---")
20
+
21
+ # Sidebar com controles
22
+ st.sidebar.header("Configurações")
23
+
24
+ # Abas para organização
25
+ tab1, tab2, tab3 = st.tabs(["Análise de Overbooking", "Simulação de ROI", "Relatório Executivo"])
26
+
27
+ with tab1:
28
+ st.header("Análise de Overbooking")
29
+
30
+ # Controles interativos
31
+ col1, col2, col3 = st.columns(3)
32
+ with col1:
33
+ capacidade = st.slider("Capacidade da Aeronave", 100, 200, 120)
34
+ with col2:
35
+ passagens_vendidas = st.slider("Passagens Vendidas", capacidade, capacidade+30, 130)
36
+ with col3:
37
+ taxa_comparecimento = st.slider("Taxa de Comparecimento (%)", 70, 100, 88) / 100
38
+
39
+ # Cálculos
40
+ prob_overbooking = 1 - binom.cdf(capacidade, passagens_vendidas, taxa_comparecimento)
41
+
42
+ # Métricas
43
+ col1, col2, col3 = st.columns(3)
44
+ col1.metric("Probabilidade de Overbooking", f"{prob_overbooking*100:.2f}%")
45
+ col2.metric("Passageiros Esperados", f"{passagens_vendidas * taxa_comparecimento:.1f}")
46
+ col3.metric("Assentos Excedentes Esperados",
47
+ f"{(passagens_vendidas * taxa_comparecimento) - capacidade:.1f}")
48
+
49
+ # Gráficos
50
+ fig = make_subplots(
51
+ rows=1, cols=2,
52
+ subplot_titles=(
53
+ f"Probabilidade de Overbooking vs Passagens Vendidas",
54
+ f"Distribuição de Comparecimento para {passagens_vendidas} Passagens"
55
+ )
56
+ )
57
+
58
+ # Gráfico 1
59
+ passagens_range = np.arange(capacidade, capacidade+30)
60
+ probabilidades = [1 - binom.cdf(capacidade, n, taxa_comparecimento) for n in passagens_range]
61
+
62
+ fig.add_trace(
63
+ go.Scatter(x=passagens_range, y=probabilidades, mode='lines+markers', name='Probabilidade'),
64
+ row=1, col=1
65
+ )
66
+
67
+ # Linha de limite de risco
68
+ fig.add_hline(y=0.07, line_dash="dash", line_color="red",
69
+ annotation_text="Limite de Risco 7%", row=1, col=1)
70
+
71
+ # Gráfico 2
72
+ x = np.arange(max(0, capacidade-20), min(passagens_vendidas+1, capacidade+30))
73
+ prob_dist = binom.pmf(x, passagens_vendidas, taxa_comparecimento)
74
+
75
+ fig.add_trace(
76
+ go.Bar(x=x, y=prob_dist, name='Distribuição', marker_color='orange'),
77
+ row=1, col=2
78
+ )
79
+
80
+ # Linha de capacidade
81
+ fig.add_vline(x=capacidade, line_dash="dash", line_color="red",
82
+ annotation_text=f"Capacidade: {capacidade}", row=1, col=2)
83
+
84
+ fig.update_layout(height=500, showlegend=False)
85
+ st.plotly_chart(fig, use_container_width=True)
86
+
87
+ # Análise de viabilidade
88
+ st.subheader("Análise de Viabilidade Financeira")
89
+
90
+ col1, col2 = st.columns(2)
91
+ with col1:
92
+ lucro_passagem = st.number_input("Lucro por Passagem (R$)", value=400)
93
+ with col2:
94
+ custo_indenizacao = st.number_input("Custo por Indenização (R$)", value=800)
95
+
96
+ # Cálculo do lucro esperado
97
+ lucro_esperado = 0
98
+ for comparecem in range(0, passagens_vendidas + 1):
99
+ prob = binom.pmf(comparecem, passagens_vendidas, taxa_comparecimento)
100
+
101
+ if comparecem <= capacidade:
102
+ lucro = comparecem * lucro_passagem
103
+ else:
104
+ excedentes = comparecem - capacidade
105
+ lucro = capacidade * lucro_passagem - excedentes * custo_indenizacao
106
+
107
+ lucro_esperado += lucro * prob
108
+
109
+ lucro_120 = 120 * lucro_passagem * taxa_comparecimento
110
+
111
+ col1, col2 = st.columns(2)
112
+ col1.metric("Lucro Esperado (120 passagens)", f"R$ {lucro_120:,.2f}")
113
+ col2.metric("Lucro Esperado ( estratégia atual)", f"R$ {lucro_esperado:,.2f}")
114
+
115
+ if lucro_esperado > lucro_120:
116
+ st.success("✅ ESTRATÉGIA VIÁVEL: A venda adicional traz lucro esperado positivo")
117
+ else:
118
+ st.error("❌ ESTRATÉGIA NÃO VIÁVEL: O risco supera o lucro esperado")
119
+
120
+ with tab2:
121
+ st.header("Simulação de ROI do Sistema de Informação")
122
+
123
+ col1, col2, col3 = st.columns(3)
124
+ with col1:
125
+ investimento = st.number_input("Investimento Inicial (R$)", value=50000)
126
+ with col2:
127
+ receita_esperada = st.number_input("Receita Adicional Esperada (R$)", value=80000)
128
+ with col3:
129
+ custo_operacional = st.number_input("Custo Operacional Anual (R$)", value=10000)
130
+
131
+ # Simulação
132
+ n_simulacoes = st.slider("Número de Simulações", 1000, 10000, 5000)
133
+ variabilidade = st.slider("Variabilidade do Sistema (%)", 10, 50, 30) / 100
134
+
135
+ if st.button("Executar Simulação de ROI"):
136
+ with st.spinner("Simulando..."):
137
+ # Simulação de Monte Carlo
138
+ receitas_simuladas = np.random.normal(
139
+ receita_esperada,
140
+ receita_esperada * variabilidade,
141
+ n_simulacoes
142
+ )
143
+
144
+ rois_simulados = []
145
+ for receita in receitas_simuladas:
146
+ lucro = receita - custo_operacional
147
+ roi = (lucro / investimento) * 100
148
+ rois_simulados.append(roi)
149
+
150
+ rois_simulados = np.array(rois_simulados)
151
+
152
+ # Métricas
153
+ roi_medio = np.mean(rois_simulados)
154
+ prob_negativo = np.mean(rois_simulados < 0)
155
+ prob_alto = np.mean(rois_simulados > 50)
156
+
157
+ col1, col2, col3 = st.columns(3)
158
+ col1.metric("ROI Médio Esperado", f"{roi_medio:.2f}%")
159
+ col2.metric("Probabilidade de ROI Negativo", f"{prob_negativo*100:.2f}%")
160
+ col3.metric("Probabilidade de ROI > 50%", f"{prob_alto*100:.2f}%")
161
+
162
+ # Gráficos
163
+ fig = make_subplots(rows=1, cols=2, subplot_titles=("Distribuição do ROI", "Probabilidade Acumulada"))
164
+
165
+ fig.add_trace(go.Histogram(x=rois_simulados, nbinsx=50, name="ROI"), row=1, col=1)
166
+ fig.add_vline(x=0, line_dash="dash", line_color="red", row=1, col=1)
167
+
168
+ sorted_rois = np.sort(rois_simulados)
169
+ cdf = np.arange(1, len(sorted_rois) + 1) / len(sorted_rois)
170
+ fig.add_trace(go.Scatter(x=sorted_rois, y=cdf, mode='lines', name="CDF"), row=1, col=2)
171
+ fig.add_hline(y=0.5, line_dash="dash", line_color="green", row=1, col=2)
172
+
173
+ fig.update_layout(height=400, showlegend=False)
174
+ st.plotly_chart(fig, use_container_width=True)
175
+
176
+ # Recomendação
177
+ if prob_negativo < 0.1 and roi_medio > 30:
178
+ st.success("✅ RECOMENDA-SE O INVESTIMENTO: Bom retorno com risco controlado")
179
+ elif prob_negativo < 0.25 and roi_medio > 20:
180
+ st.warning("⚠️ INVESTIMENTO MODERADAMENTE RECOMENDADO: Retorno aceitável com risco moderado")
181
+ else:
182
+ st.error("❌ NÃO RECOMENDA-SE O INVESTIMENTO: Risco muito alto ou retorno insuficiente")
183
+
184
+ with tab3:
185
+ st.header("Relatório Executivo")
186
+
187
+ st.subheader("Principais Conclusões")
188
+
189
+ st.info("""
190
+ **Sobre a Estratégia de Overbooking:**
191
+ - A venda de 130 passagens para um voo de 120 assentos apresenta risco calculado
192
+ - É essencial equilibrar o lucro adicional com o risco de indenizações
193
+ - Recomenda-se implementar protocolos para gestão de situações de overbooking
194
+ """)
195
+
196
+ st.info("""
197
+ **Sobre o Sistema de Informação:**
198
+ - O investimento em sistema de gestão mostra ROI potencialmente positivo
199
+ - A automatização pode reduzir significativamente os riscos de overbooking
200
+ - Recomenda-se implementação faseada com monitoramento contínuo
201
+ """)
202
+
203
+ st.subheader("Próximos Passos Recomendados")
204
+ st.write("""
205
+ 1. Implementar política de overbooking com limite máximo de 125 passagens
206
+ 2. Adquirir sistema de informação com módulo de previsão de demanda
207
+ 3. Desenvolver programa de compensação para passageiros afetados
208
+ 4. Estabelecer métricas de acompanhamento contínuo
209
+ 5. Realizar revisão trimestral da estratégia
210
+ """)
211
+
212
+ # Rodapé
213
+ st.markdown("---")
214
+ st.caption("Simulador desenvolvido para Aérea Confiável - Análise de Dados e Tomada de Decisão")