EmilyPSP02 / app.py
EmilySouza021's picture
Create app.py
3b9af2a verified
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import binom
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Configuração da página
st.set_page_config(
page_title="Aérea Confiável - Simulador",
page_icon="✈️",
layout="wide"
)
# Título principal
st.title("✈️ Aérea Confiável - Simulador de Overbooking e ROI")
st.markdown("---")
# Sidebar com controles
st.sidebar.header("Configurações")
# Abas para organização
tab1, tab2, tab3 = st.tabs(["Análise de Overbooking", "Simulação de ROI", "Relatório Executivo"])
with tab1:
st.header("Análise de Overbooking")
# Controles interativos
col1, col2, col3 = st.columns(3)
with col1:
capacidade = st.slider("Capacidade da Aeronave", 100, 200, 120)
with col2:
passagens_vendidas = st.slider("Passagens Vendidas", capacidade, capacidade+30, 130)
with col3:
taxa_comparecimento = st.slider("Taxa de Comparecimento (%)", 70, 100, 88) / 100
# Cálculos
prob_overbooking = 1 - binom.cdf(capacidade, passagens_vendidas, taxa_comparecimento)
# Métricas
col1, col2, col3 = st.columns(3)
col1.metric("Probabilidade de Overbooking", f"{prob_overbooking*100:.2f}%")
col2.metric("Passageiros Esperados", f"{passagens_vendidas * taxa_comparecimento:.1f}")
col3.metric("Assentos Excedentes Esperados",
f"{(passagens_vendidas * taxa_comparecimento) - capacidade:.1f}")
# Gráficos
fig = make_subplots(
rows=1, cols=2,
subplot_titles=(
f"Probabilidade de Overbooking vs Passagens Vendidas",
f"Distribuição de Comparecimento para {passagens_vendidas} Passagens"
)
)
# Gráfico 1
passagens_range = np.arange(capacidade, capacidade+30)
probabilidades = [1 - binom.cdf(capacidade, n, taxa_comparecimento) for n in passagens_range]
fig.add_trace(
go.Scatter(x=passagens_range, y=probabilidades, mode='lines+markers', name='Probabilidade'),
row=1, col=1
)
# Linha de limite de risco
fig.add_hline(y=0.07, line_dash="dash", line_color="red",
annotation_text="Limite de Risco 7%", row=1, col=1)
# Gráfico 2
x = np.arange(max(0, capacidade-20), min(passagens_vendidas+1, capacidade+30))
prob_dist = binom.pmf(x, passagens_vendidas, taxa_comparecimento)
fig.add_trace(
go.Bar(x=x, y=prob_dist, name='Distribuição', marker_color='orange'),
row=1, col=2
)
# Linha de capacidade
fig.add_vline(x=capacidade, line_dash="dash", line_color="red",
annotation_text=f"Capacidade: {capacidade}", row=1, col=2)
fig.update_layout(height=500, showlegend=False)
st.plotly_chart(fig, use_container_width=True)
# Análise de viabilidade
st.subheader("Análise de Viabilidade Financeira")
col1, col2 = st.columns(2)
with col1:
lucro_passagem = st.number_input("Lucro por Passagem (R$)", value=400)
with col2:
custo_indenizacao = st.number_input("Custo por Indenização (R$)", value=800)
# Cálculo do lucro esperado
lucro_esperado = 0
for comparecem in range(0, passagens_vendidas + 1):
prob = binom.pmf(comparecem, passagens_vendidas, taxa_comparecimento)
if comparecem <= capacidade:
lucro = comparecem * lucro_passagem
else:
excedentes = comparecem - capacidade
lucro = capacidade * lucro_passagem - excedentes * custo_indenizacao
lucro_esperado += lucro * prob
lucro_120 = 120 * lucro_passagem * taxa_comparecimento
col1, col2 = st.columns(2)
col1.metric("Lucro Esperado (120 passagens)", f"R$ {lucro_120:,.2f}")
col2.metric("Lucro Esperado ( estratégia atual)", f"R$ {lucro_esperado:,.2f}")
if lucro_esperado > lucro_120:
st.success("✅ ESTRATÉGIA VIÁVEL: A venda adicional traz lucro esperado positivo")
else:
st.error("❌ ESTRATÉGIA NÃO VIÁVEL: O risco supera o lucro esperado")
with tab2:
st.header("Simulação de ROI do Sistema de Informação")
col1, col2, col3 = st.columns(3)
with col1:
investimento = st.number_input("Investimento Inicial (R$)", value=50000)
with col2:
receita_esperada = st.number_input("Receita Adicional Esperada (R$)", value=80000)
with col3:
custo_operacional = st.number_input("Custo Operacional Anual (R$)", value=10000)
# Simulação
n_simulacoes = st.slider("Número de Simulações", 1000, 10000, 5000)
variabilidade = st.slider("Variabilidade do Sistema (%)", 10, 50, 30) / 100
if st.button("Executar Simulação de ROI"):
with st.spinner("Simulando..."):
# Simulação de Monte Carlo
receitas_simuladas = np.random.normal(
receita_esperada,
receita_esperada * variabilidade,
n_simulacoes
)
rois_simulados = []
for receita in receitas_simuladas:
lucro = receita - custo_operacional
roi = (lucro / investimento) * 100
rois_simulados.append(roi)
rois_simulados = np.array(rois_simulados)
# Métricas
roi_medio = np.mean(rois_simulados)
prob_negativo = np.mean(rois_simulados < 0)
prob_alto = np.mean(rois_simulados > 50)
col1, col2, col3 = st.columns(3)
col1.metric("ROI Médio Esperado", f"{roi_medio:.2f}%")
col2.metric("Probabilidade de ROI Negativo", f"{prob_negativo*100:.2f}%")
col3.metric("Probabilidade de ROI > 50%", f"{prob_alto*100:.2f}%")
# Gráficos
fig = make_subplots(rows=1, cols=2, subplot_titles=("Distribuição do ROI", "Probabilidade Acumulada"))
fig.add_trace(go.Histogram(x=rois_simulados, nbinsx=50, name="ROI"), row=1, col=1)
fig.add_vline(x=0, line_dash="dash", line_color="red", row=1, col=1)
sorted_rois = np.sort(rois_simulados)
cdf = np.arange(1, len(sorted_rois) + 1) / len(sorted_rois)
fig.add_trace(go.Scatter(x=sorted_rois, y=cdf, mode='lines', name="CDF"), row=1, col=2)
fig.add_hline(y=0.5, line_dash="dash", line_color="green", row=1, col=2)
fig.update_layout(height=400, showlegend=False)
st.plotly_chart(fig, use_container_width=True)
# Recomendação
if prob_negativo < 0.1 and roi_medio > 30:
st.success("✅ RECOMENDA-SE O INVESTIMENTO: Bom retorno com risco controlado")
elif prob_negativo < 0.25 and roi_medio > 20:
st.warning("⚠️ INVESTIMENTO MODERADAMENTE RECOMENDADO: Retorno aceitável com risco moderado")
else:
st.error("❌ NÃO RECOMENDA-SE O INVESTIMENTO: Risco muito alto ou retorno insuficiente")
with tab3:
st.header("Relatório Executivo")
st.subheader("Principais Conclusões")
st.info("""
**Sobre a Estratégia de Overbooking:**
- A venda de 130 passagens para um voo de 120 assentos apresenta risco calculado
- É essencial equilibrar o lucro adicional com o risco de indenizações
- Recomenda-se implementar protocolos para gestão de situações de overbooking
""")
st.info("""
**Sobre o Sistema de Informação:**
- O investimento em sistema de gestão mostra ROI potencialmente positivo
- A automatização pode reduzir significativamente os riscos de overbooking
- Recomenda-se implementação faseada com monitoramento contínuo
""")
st.subheader("Próximos Passos Recomendados")
st.write("""
1. Implementar política de overbooking com limite máximo de 125 passagens
2. Adquirir sistema de informação com módulo de previsão de demanda
3. Desenvolver programa de compensação para passageiros afetados
4. Estabelecer métricas de acompanhamento contínuo
5. Realizar revisão trimestral da estratégia
""")
# Rodapé
st.markdown("---")
st.caption("Simulador desenvolvido para Aérea Confiável - Análise de Dados e Tomada de Decisão")