gdleds commited on
Commit
b2f3e99
·
1 Parent(s): 72debe9

app modif1

Browse files
Files changed (1) hide show
  1. app.py +116 -11
app.py CHANGED
@@ -1,20 +1,125 @@
1
  import streamlit as st
 
 
2
 
3
- st.set_page_config(page_title="Getaround Dashboard", layout="wide")
 
4
 
5
- st.title("🚗 Getaround - Dashboard")
6
- st.markdown("Bienvenue sur le tableau de bord des retards et optimisations de prix.")
 
 
 
 
 
 
 
7
 
8
- st.header("Section test")
9
- st.write("Ici on affichera les graphiques issus de l’EDA.")
 
10
 
 
 
11
 
12
- import pandas as pd
13
- import plotly.express as px
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
 
 
 
 
 
15
 
16
- df_pricing = pd.read_csv("data/get_around_pricing_project.csv")
 
 
 
 
17
 
18
- st.subheader("Répartition des prix")
19
- fig = px.histogram(df_pricing, x="rental_price_per_day", nbins=50, title="Distribution des prix")
20
- st.plotly_chart(fig)
 
1
  import streamlit as st
2
+ import pandas as pd
3
+ import plotly.express as px
4
 
5
+ # === CONFIG STREAMLIT ===
6
+ st.set_page_config(page_title="Getaround – Dashboard Analyse", layout="wide")
7
 
8
+ st.title("🚗 Dashboard Analyse – Getaround")
9
+ st.markdown("""
10
+ Bienvenue sur le dashboard interactif de l’étude Getaround.
11
+ Nous allons explorer :
12
+ 1. Les retards et annulations
13
+ 2. L’impact d’un buffer entre deux locations
14
+ 3. L’analyse des prix des véhicules
15
+ 4. La conclusion business
16
+ """)
17
 
18
+ # === CHARGEMENT DES DONNÉES ===
19
+ df = pd.read_csv("data/get_around_delay_analysis.csv")
20
+ df_pricing = pd.read_csv("data/pricing_clean.csv")
21
 
22
+ # === SECTION 1 : EDA SUR LES RETARDS ===
23
+ st.header("📊 Analyse des retards et annulations")
24
 
25
+ # Pie chart état
26
+ fig_state = px.pie(df, names="state", title="Répartition par état des locations")
27
+ st.plotly_chart(fig_state, use_container_width=True)
28
+
29
+ st.markdown("""
30
+ 👉 Environ **15 % des transactions sont annulées**.
31
+ La proportion est légèrement plus élevée via **Connect** que via Mobile.
32
+ """)
33
+
34
+ # Histogramme retards
35
+ fig_delay = px.histogram(
36
+ df.query("-150 <= delay_at_checkout_in_minutes <= 150"),
37
+ x="delay_at_checkout_in_minutes",
38
+ nbins=60,
39
+ title="Distribution des retards (fenêtre -150 à 150 min)"
40
+ )
41
+ st.plotly_chart(fig_delay, use_container_width=True)
42
+
43
+ st.markdown("""
44
+ 👉 La majorité des retards est **courte** :
45
+ - 50 % ≤ 9 min
46
+ - 75 % ≤ 67 min
47
+ Mais certains cas extrêmes dépassent plusieurs jours.
48
+ """)
49
+
50
+ # === SECTION 2 : ANALYSE DES ANNULATIONS ===
51
+ st.header("❌ Analyse des annulations liées aux retards")
52
+
53
+ annulation = (df["state"] == "canceled").sum()
54
+ st.metric("Nombre total d'annulations", annulation)
55
+
56
+ st.markdown("""
57
+ 👉 Parmi les **229 annulations liées à une location précédente**,
58
+ seules **37** sont dues à un **retard supérieur à l’heure prévue**.
59
+ Ces retards sont très longs (~4h15 en moyenne).
60
+ """)
61
+
62
+ # === SECTION 3 : IMPACT DES BUFFERS ===
63
+ st.header("⏳ Simulation de buffer entre locations")
64
+
65
+ loc_moyenne = df_pricing["rental_price_per_day"].mean()
66
+ CA_total = (df['state'] == 'ended').sum() * loc_moyenne
67
+
68
+ # Calcul simple
69
+ df_valid = df[df["state"] == "ended"].copy()
70
+ df_valid["ecart"] = df_valid["time_delta_with_previous_rental_in_minutes"] - df_valid["delay_at_checkout_in_minutes"]
71
+
72
+ def count_blocked(df, buffer):
73
+ return (df["ecart"] < buffer).sum()
74
+
75
+ results = []
76
+ for b in [30, 60, 90, 180]:
77
+ blocked = count_blocked(df_valid, b)
78
+ perte_estimee = blocked * loc_moyenne
79
+ results.append({"Buffer (min)": b, "Locations bloquées": blocked, "Perte estimée ($)": round(perte_estimee, 2)})
80
+
81
+ df_results = pd.DataFrame(results)
82
+ st.dataframe(df_results)
83
+
84
+ st.markdown("""
85
+ 👉 Un buffer **de 30 min bloque ~340 locations** → pertes supérieures aux gains.
86
+ 👉 Un buffer de **180 min réduit beaucoup les annulations** mais fait perdre trop de CA.
87
+ **Conclusion : un buffer global n’est pas viable.**
88
+ """)
89
+
90
+ # === SECTION 4 : ANALYSE DU PRICING ===
91
+ st.header("💰 Analyse des prix de location")
92
+
93
+ fig_price = px.histogram(df_pricing, x="rental_price_per_day", nbins=50,
94
+ title="Distribution des prix de location par jour")
95
+ st.plotly_chart(fig_price, use_container_width=True)
96
+
97
+ st.markdown("""
98
+ 👉 Le marché est concentré autour de **100–140 $/jour**.
99
+ Les **SUV, coupés, cabriolets** sont plus chers.
100
+ Les **citadines** et **hatchbacks** moins chers.
101
+ """)
102
+
103
+ # Boxplot prix par fuel
104
+ fig_fuel = px.box(df_pricing, x="fuel", y="rental_price_per_day",
105
+ title="Prix selon le type de carburant")
106
+ st.plotly_chart(fig_fuel, use_container_width=True)
107
+
108
+ # === SECTION 5 : CONCLUSION BUSINESS ===
109
+ st.header("📌 Conclusion business")
110
 
111
+ st.markdown("""
112
+ Nos analyses montrent :
113
+ - Les retards courts sont fréquents, mais les **annulations sont rares (229 cas)**.
114
+ - Les retards extrêmes sont à l’origine de la majorité des conflits.
115
+ - Un buffer global **réduit les annulations mais détruit plus de revenu** qu’il n’en sauve.
116
 
117
+ **Recommandations** :
118
+ - Pas de buffer global.
119
+ - Buffer ciblé (<1h) sur cas à risque.
120
+ - Notifications pour inciter à rendre le véhicule en avance.
121
+ - Eventuellement pénalités pour retards répétés.
122
 
123
+ 👉 L’impact économique du buffer est donc limité,
124
+ mais des mesures ciblées peuvent réduire la friction sans perte majeure de CA.
125
+ """)