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

Upload accc.py

Browse files
Files changed (1) hide show
  1. accc.py +105 -0
accc.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ from math import comb
3
+ import numpy as np
4
+ import pandas as pd
5
+ import matplotlib.pyplot as plt
6
+ import streamlit as st
7
+
8
+ # ----------------- Funções auxiliares -----------------
9
+ def prob_binom(n, k, p):
10
+ if k < 0 or k > n:
11
+ return 0.0
12
+ return comb(n, k) * (p**k) * ((1-p)**(n-k))
13
+
14
+ def prob_overbooking(n, c, p):
15
+ k_vals = np.arange(c+1, n+1)
16
+ if len(k_vals) == 0:
17
+ return 0.0
18
+ probs = [prob_binom(n, int(k), p) for k in k_vals]
19
+ return float(np.sum(probs))
20
+
21
+ def expected_bumped(n, c, p):
22
+ ks = np.arange(c+1, n+1)
23
+ if len(ks) == 0:
24
+ return 0.0
25
+ vals = [(k - c) * prob_binom(n, int(k), p) for k in ks]
26
+ return float(np.sum(vals))
27
+
28
+ def expected_profit(n, c, p, R, C_marg, C_over):
29
+ EX = n * p
30
+ E_bumped = expected_bumped(n, c, p)
31
+ return n*R - EX*C_marg - E_bumped*C_over
32
+
33
+ # ----------------- Interface Streamlit -----------------
34
+ st.title("Análise de Overbooking - Aérea Confiável ✈️")
35
+
36
+ # Parâmetros de entrada
37
+ st.sidebar.header("Parâmetros")
38
+ capacidade = st.sidebar.number_input("Capacidade do avião", min_value=50, max_value=300, value=120)
39
+ vendidas_alvo = st.sidebar.number_input("Passagens vendidas", min_value=capacidade, max_value=capacidade+50, value=130)
40
+ p_comparecer = st.sidebar.slider("Probabilidade de comparecimento (%)", 0.5, 1.0, 0.88, 0.01)
41
+
42
+ R = st.sidebar.number_input("Receita média por bilhete (R$)", min_value=100.0, value=800.0, step=50.0)
43
+ C_marg = st.sidebar.number_input("Custo marginal por passageiro presente (R$)", min_value=50.0, value=150.0, step=10.0)
44
+ C_over = st.sidebar.number_input("Custo médio por passageiro preterido (R$)", min_value=500.0, value=1500.0, step=50.0)
45
+
46
+ # ----------------- Cálculos -----------------
47
+ # Probabilidade para cenário alvo
48
+ prob_over_130 = prob_overbooking(vendidas_alvo, capacidade, p_comparecer)
49
+
50
+ st.subheader("1️⃣ Probabilidade de Overbooking")
51
+ st.write(f"Com **{vendidas_alvo} passagens vendidas**, capacidade de **{capacidade}**, e p={p_comparecer:.2f}, a probabilidade de overbooking é:")
52
+ st.metric("Risco de Overbooking", f"{prob_over_130*100:.2f}%")
53
+
54
+ # ----------------- Variação do risco -----------------
55
+ n_min = capacidade
56
+ n_max = capacidade + 30
57
+ Ns = list(range(n_min, n_max + 1))
58
+ probs = [prob_overbooking(n, capacidade, p_comparecer) for n in Ns]
59
+
60
+ df_risco = pd.DataFrame({
61
+ "Passagens Vendidas": Ns,
62
+ "Probabilidade Overbooking (%)": [p*100 for p in probs]
63
+ })
64
+
65
+ limite = 0.07
66
+ viaveis = df_risco[df_risco["Probabilidade Overbooking (%)"] <= limite*100]
67
+
68
+ st.subheader("2️⃣ Variação do risco por número de passagens vendidas")
69
+ st.dataframe(df_risco)
70
+
71
+ # Gráfico
72
+ fig, ax = plt.subplots()
73
+ ax.plot(df_risco["Passagens Vendidas"], df_risco["Probabilidade Overbooking (%)"])
74
+ ax.axhline(limite*100, linestyle="--", label="Limite 7%")
75
+ ax.set_title("Risco de Overbooking x Passagens Vendidas")
76
+ ax.set_xlabel("Passagens Vendidas")
77
+ ax.set_ylabel("Probabilidade (%)")
78
+ ax.grid(True)
79
+ ax.legend()
80
+ st.pyplot(fig)
81
+
82
+ # ----------------- Análise Financeira -----------------
83
+ st.subheader("3️⃣ Análise Financeira")
84
+
85
+ cenarios = [capacidade + d for d in [0, 5, 10, 15]]
86
+ resultados = []
87
+ for n in cenarios:
88
+ lucro = expected_profit(n, capacidade, p_comparecer, R, C_marg, C_over)
89
+ risco = prob_overbooking(n, capacidade, p_comparecer)
90
+ bumped_esp = expected_bumped(n, capacidade, p_comparecer)
91
+ resultados.append({
92
+ "Passagens Vendidas": n,
93
+ "Probabilidade Overbooking (%)": round(risco*100, 3),
94
+ "Passageiros Preteridos (Esperado)": round(bumped_esp, 2),
95
+ "Lucro Esperado (R$)": round(lucro, 2)
96
+ })
97
+
98
+ df_fin = pd.DataFrame(resultados)
99
+ st.dataframe(df_fin)
100
+
101
+ st.write("""
102
+ - O risco aumenta conforme mais passagens são vendidas.
103
+ - O lucro pode crescer até certo ponto, mas o custo de overbooking pode inviabilizar a estratégia.
104
+ - O objetivo é equilibrar **risco aceitável (<=7%)** e **maximização do lucro**.
105
+ """)