Marcel0123 commited on
Commit
41763e1
·
verified ·
1 Parent(s): 13f7ecd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -35
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # app.py — Titanic Data Adventure (met uitlegpaneel onder modeltraining)
2
 
3
  import gradio as gr
4
  import pandas as pd
@@ -98,6 +98,9 @@ def train_and_embed_solid():
98
  dvis["Leeftijd"] = df["age"].values
99
  dvis["Fare (£)"] = df["fare"].values
100
  dvis["Familie"] = df["family_size"].values
 
 
 
101
 
102
  fig = px.scatter(
103
  dvis, x="x", y="y",
@@ -113,45 +116,27 @@ def train_and_embed_solid():
113
  return status, fig
114
 
115
  # ======================================================
116
- # EXTRA TEKSTBLOK: UITLEG
117
  # ======================================================
118
- EXPLAIN_MD = """
119
- ### 📘 Wat je hier ziet
120
- Wanneer de applicatie start, traint de computer een **RandomForest-model**.
121
- Dat model probeert te begrijpen wie op de Titanic **overleefde** en wie niet.
122
-
123
- Het doet dit door patronen te leren uit de gegevens van de passagiers:
124
- - **Klasse:** 1e, 2e of 3e klasse.
125
- - **Geslacht:** Man of vrouw.
126
- - **Leeftijd** en **familieomvang**.
127
- - **Ticketprijs** en **haven van vertrek**.
128
-
129
- De nauwkeurigheid (bijv. *74%*) betekent dat het model in 74 van de 100 gevallen goed voorspelt of iemand overleefde.
130
 
131
  ---
132
 
133
- ### 🗺️ De 2D-projectie
134
- De grafiek hierboven toont een **landkaart van passagiers**.
135
- Elk **bolletje** is één persoon aan boord.
136
- Omdat mensen veel eigenschappen hebben, gebruiken we **PCA** om die terug te brengen tot **twee dimensies** — zodat we alles in één beeld kunnen zien.
137
-
138
- - **Blauwe bolletjes:** overleefden de ramp.
139
- - **Grijze bolletjes:** overleefden niet.
140
- - **Verschillende symbolen:** geven de klasse weer.
141
-
142
- Hoe dichter twee bolletjes bij elkaar liggen,
143
- hoe meer hun gegevens op elkaar lijken.
144
- Beweeg met de muis over een bolletje om meer over die passagier te weten te komen.
145
 
146
  ---
147
 
148
- ### 💬 Wat betekent dit voor jou?
149
- Je kunt verderop jouw **eigen scenario** invullen
150
- hoe oud je zou zijn, in welke klasse, met wie je reisde —
151
- en ontdekken wat jouw **overlevingskans** zou zijn geweest.
152
-
153
- Het is geen waarzeggerij, maar een manier om te begrijpen
154
- hoe omstandigheden en keuzes invloed hadden in één van de bekendste rampen ooit.
155
  """
156
 
157
  # ======================================================
@@ -242,6 +227,7 @@ h1, h2, h3, h4 { color:#1B4B91; }
242
  """
243
 
244
  with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as demo:
 
245
  with gr.Row():
246
  with gr.Column(scale=2, min_width=420):
247
  gr.Markdown(INTRO_MD, elem_classes=["intro-card"])
@@ -250,18 +236,24 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
250
  if hp: gr.Image(value=hp, interactive=False, show_label=False, elem_classes=["hero-img"])
251
  else: gr.Markdown("⚠️ **Geen afbeelding gevonden.** Plaats `titanic_bg.png` of `titanic_bg.jpg` in de root.")
252
 
 
253
  with gr.Column(elem_classes=["panel"]):
254
  gr.Markdown("## 🔧 Initialisatie & Modeltraining")
255
  status_md = gr.Markdown("⏳ Initialiseren…")
256
- train_plot = gr.Plot(label="2D-projectie — elk bolletje is een passagier")
257
- gr.Markdown(EXPLAIN_MD, elem_classes=["explain-card"])
 
 
 
258
 
 
259
  with gr.Row():
260
  gr.HTML(f"<div class='kpi'><div class='value'>{len(df):,}</div><div class='label'>Totaal passagiers</div></div>")
261
  gr.HTML(f"<div class='kpi'><div class='value'>{int(df['survived'].sum()):,}</div><div class='label'>Overlevenden</div></div>")
262
  gr.HTML(f"<div class='kpi'><div class='value'>{df['survived'].mean()*100:.1f}%</div><div class='label'>% Overleefd</div></div>")
263
  gr.HTML(f"<div class='kpi'><div class='value'>{', '.join(map(str, sorted(df['pclass'].unique())))}</div><div class='label'>Klassen</div></div>")
264
 
 
265
  gr.Markdown("## 📊 Verken de data", elem_classes=["panel"])
266
  with gr.Row():
267
  g2 = gr.Plot(label="Leeftijdsverdeling per status")
@@ -269,6 +261,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
269
  with gr.Row():
270
  g4 = gr.Plot(label="Ticketprijs per klasse")
271
 
 
272
  with gr.Column(elem_classes=["panel"]):
273
  gr.Markdown("## 🔮 Jouw scenario — bereken je overlevingskans en lees je scène")
274
  with gr.Row():
@@ -283,6 +276,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
283
  btn = gr.Button("🎲 Bereken én vertel mijn verhaal", variant="primary")
284
  story_out = gr.Markdown()
285
 
 
286
  demo.load(fn=train_and_embed_solid, inputs=[], outputs=[status_md, train_plot])
287
  demo.load(lambda: (plot_age_hist(df), plot_gender(df), plot_fare_box(df)), inputs=[], outputs=[g2, g3, g4])
288
  btn.click(predict_and_story,
 
1
+ # app.py — Titanic Data Adventure (uitleg naast de 2D-plot, strak en compact)
2
 
3
  import gradio as gr
4
  import pandas as pd
 
98
  dvis["Leeftijd"] = df["age"].values
99
  dvis["Fare (£)"] = df["fare"].values
100
  dvis["Familie"] = df["family_size"].values
101
+ for c in ["name","ticket","cabin"]:
102
+ if c in df.columns:
103
+ dvis[c.capitalize()] = df[c].values
104
 
105
  fig = px.scatter(
106
  dvis, x="x", y="y",
 
116
  return status, fig
117
 
118
  # ======================================================
119
+ # UITLEGTEKST (compact, bedoeld voor naast de plot)
120
  # ======================================================
121
+ EXPLAIN_MD_SIDE = """
122
+ ### 📘 Wat je ziet
123
+ Bij het opstarten traint de computer een **RandomForest-model** dat leert wie op de Titanic **overleefde** – en waarom.
124
+ Het kijkt naar **klasse**, **geslacht**, **leeftijd**, **familieomvang**, **ticketprijs** en **haven van vertrek**.
125
+ De nauwkeurigheid (bijv. *74%*) betekent: in 74 van de 100 gevallen voorspelt het model correct.
 
 
 
 
 
 
 
126
 
127
  ---
128
 
129
+ ### 🗺️ Landkaart van passagiers
130
+ Elk **bolletje** is één persoon. Met **PCA** brengen we veel kenmerken terug naar **2 dimensies**.
131
+ - **Blauw** overleefd
132
+ - **Grijs** niet overleefd
133
+ - **Vorm** → klasse
134
+ Dichter bij elkaar = vergelijkbare profielen. **Hover** voor details.
 
 
 
 
 
 
135
 
136
  ---
137
 
138
+ ### 💬 Jij in dit verhaal
139
+ Vul onderaan je **eigen profiel** in, ontdek jouw kans en lees je scène uit die nacht.
 
 
 
 
 
140
  """
141
 
142
  # ======================================================
 
227
  """
228
 
229
  with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as demo:
230
+ # Header-intro + foto
231
  with gr.Row():
232
  with gr.Column(scale=2, min_width=420):
233
  gr.Markdown(INTRO_MD, elem_classes=["intro-card"])
 
236
  if hp: gr.Image(value=hp, interactive=False, show_label=False, elem_classes=["hero-img"])
237
  else: gr.Markdown("⚠️ **Geen afbeelding gevonden.** Plaats `titanic_bg.png` of `titanic_bg.jpg` in de root.")
238
 
239
+ # Panel: status + 2D-plot links en uitleg rechts
240
  with gr.Column(elem_classes=["panel"]):
241
  gr.Markdown("## 🔧 Initialisatie & Modeltraining")
242
  status_md = gr.Markdown("⏳ Initialiseren…")
243
+ with gr.Row():
244
+ with gr.Column(scale=2, min_width=420):
245
+ train_plot = gr.Plot(label="2D-projectie — elk bolletje is een passagier")
246
+ with gr.Column(scale=1, min_width=320):
247
+ gr.Markdown(EXPLAIN_MD_SIDE, elem_classes=["explain-card"])
248
 
249
+ # KPIs
250
  with gr.Row():
251
  gr.HTML(f"<div class='kpi'><div class='value'>{len(df):,}</div><div class='label'>Totaal passagiers</div></div>")
252
  gr.HTML(f"<div class='kpi'><div class='value'>{int(df['survived'].sum()):,}</div><div class='label'>Overlevenden</div></div>")
253
  gr.HTML(f"<div class='kpi'><div class='value'>{df['survived'].mean()*100:.1f}%</div><div class='label'>% Overleefd</div></div>")
254
  gr.HTML(f"<div class='kpi'><div class='value'>{', '.join(map(str, sorted(df['pclass'].unique())))}</div><div class='label'>Klassen</div></div>")
255
 
256
+ # Overige visualisaties
257
  gr.Markdown("## 📊 Verken de data", elem_classes=["panel"])
258
  with gr.Row():
259
  g2 = gr.Plot(label="Leeftijdsverdeling per status")
 
261
  with gr.Row():
262
  g4 = gr.Plot(label="Ticketprijs per klasse")
263
 
264
+ # Interactieve voorspelling
265
  with gr.Column(elem_classes=["panel"]):
266
  gr.Markdown("## 🔮 Jouw scenario — bereken je overlevingskans en lees je scène")
267
  with gr.Row():
 
276
  btn = gr.Button("🎲 Bereken én vertel mijn verhaal", variant="primary")
277
  story_out = gr.Markdown()
278
 
279
+ # Loads & acties
280
  demo.load(fn=train_and_embed_solid, inputs=[], outputs=[status_md, train_plot])
281
  demo.load(lambda: (plot_age_hist(df), plot_gender(df), plot_fare_box(df)), inputs=[], outputs=[g2, g3, g4])
282
  btn.click(predict_and_story,