Marcel0123 commited on
Commit
13f7ecd
·
verified ·
1 Parent(s): 03df781

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -27
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # app.py — Titanic Data Adventure (stabiele versie met PCA-visualisatie en uitgebreide introductie)
2
 
3
  import gradio as gr
4
  import pandas as pd
@@ -64,13 +64,7 @@ def make_plot(fig, title):
64
  # MODELTRAINING + 2D VISUALISATIE
65
  # ======================================================
66
  def train_and_embed_solid():
67
- """
68
- Robuuste initialisatie:
69
- - traint het model
70
- - maakt stabiele 2D-projectie (PCA)
71
- """
72
  global MODEL, MODEL_ACC
73
-
74
  features = ["pclass","sex","age","sibsp","parch","fare","embarked","family_size"]
75
  X = df[features].copy()
76
  y = df["survived"].astype(int)
@@ -93,7 +87,6 @@ def train_and_embed_solid():
93
  MODEL = pipe
94
  MODEL_ACC = pipe.score(Xte, yte)
95
 
96
- # 2D embedding met PCA (altijd stabiel)
97
  Z = pre.fit_transform(X)
98
  Z = Z.toarray() if hasattr(Z, "toarray") else Z
99
  emb = PCA(n_components=2, random_state=42).fit_transform(Z)
@@ -105,9 +98,6 @@ def train_and_embed_solid():
105
  dvis["Leeftijd"] = df["age"].values
106
  dvis["Fare (£)"] = df["fare"].values
107
  dvis["Familie"] = df["family_size"].values
108
- for c in ["name","ticket","cabin"]:
109
- if c in df.columns:
110
- dvis[c.capitalize()] = df[c].values
111
 
112
  fig = px.scatter(
113
  dvis, x="x", y="y",
@@ -122,6 +112,48 @@ def train_and_embed_solid():
122
  status = f"✅ Model getraind (RandomForest) — nauwkeurigheid: **{MODEL_ACC:.2%}**. 2D-projectie gereed; hover voor details."
123
  return status, fig
124
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  # ======================================================
126
  # OVERIGE GRAFIEKEN
127
  # ======================================================
@@ -191,20 +223,6 @@ De zee is kalm; de toekomst lijkt maakbaar.
191
  Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met **data**.
192
  Elk record in deze dataset is een menselijk verhaal: iemand met een plek aan tafel, een ticket, een familie, een keuze.
193
  Door de gegevens te verkennen, begrijpen we beter **wie overleefde — en waarom**.
194
-
195
- ---
196
-
197
- ## Wat je in dit dashboard ziet
198
- - **2D-Passagierskaart** — elk bolletje is één passagier (hover voor details).
199
- - **Leeftijdsverdeling**, **Geslachtsverdeling**, **Fare per klasse**.
200
- - **Jouw scenario** — stel je kenmerken in, bereken je kans en lees je scène uit die nacht.
201
-
202
- ---
203
-
204
- ## Wat het model wél en niet doet
205
- - ✅ Herkent patronen (*geslacht + klasse + leeftijd*).
206
- - ✅ Geeft **kansen**, geen zekerheden.
207
- - ❌ Kent geen context buiten de data: emotie, paniek, toeval.
208
  """
209
 
210
  # ======================================================
@@ -220,6 +238,7 @@ h1, h2, h3, h4 { color:#1B4B91; }
220
  background:#FFFFFF; border:1px solid #E0E6F3; border-radius:12px; padding:14px; }
221
  .kpi .value { font-size:1.6rem; font-weight:800; color:#1B4B91; }
222
  .kpi .label { font-size:.9rem; color:#3F557A; }
 
223
  """
224
 
225
  with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as demo:
@@ -235,6 +254,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
235
  gr.Markdown("## 🔧 Initialisatie & Modeltraining")
236
  status_md = gr.Markdown("⏳ Initialiseren…")
237
  train_plot = gr.Plot(label="2D-projectie — elk bolletje is een passagier")
 
238
 
239
  with gr.Row():
240
  gr.HTML(f"<div class='kpi'><div class='value'>{len(df):,}</div><div class='label'>Totaal passagiers</div></div>")
@@ -263,7 +283,6 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
263
  btn = gr.Button("🎲 Bereken én vertel mijn verhaal", variant="primary")
264
  story_out = gr.Markdown()
265
 
266
- # Laden van data en plots
267
  demo.load(fn=train_and_embed_solid, inputs=[], outputs=[status_md, train_plot])
268
  demo.load(lambda: (plot_age_hist(df), plot_gender(df), plot_fare_box(df)), inputs=[], outputs=[g2, g3, g4])
269
  btn.click(predict_and_story,
@@ -271,4 +290,3 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
271
  outputs=story_out)
272
 
273
  demo.launch()
274
-
 
1
+ # app.py — Titanic Data Adventure (met uitlegpaneel onder modeltraining)
2
 
3
  import gradio as gr
4
  import pandas as pd
 
64
  # MODELTRAINING + 2D VISUALISATIE
65
  # ======================================================
66
  def train_and_embed_solid():
 
 
 
 
 
67
  global MODEL, MODEL_ACC
 
68
  features = ["pclass","sex","age","sibsp","parch","fare","embarked","family_size"]
69
  X = df[features].copy()
70
  y = df["survived"].astype(int)
 
87
  MODEL = pipe
88
  MODEL_ACC = pipe.score(Xte, yte)
89
 
 
90
  Z = pre.fit_transform(X)
91
  Z = Z.toarray() if hasattr(Z, "toarray") else Z
92
  emb = PCA(n_components=2, random_state=42).fit_transform(Z)
 
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",
 
112
  status = f"✅ Model getraind (RandomForest) — nauwkeurigheid: **{MODEL_ACC:.2%}**. 2D-projectie gereed; hover voor details."
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
  # ======================================================
158
  # OVERIGE GRAFIEKEN
159
  # ======================================================
 
223
  Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met **data**.
224
  Elk record in deze dataset is een menselijk verhaal: iemand met een plek aan tafel, een ticket, een familie, een keuze.
225
  Door de gegevens te verkennen, begrijpen we beter **wie overleefde — en waarom**.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  """
227
 
228
  # ======================================================
 
238
  background:#FFFFFF; border:1px solid #E0E6F3; border-radius:12px; padding:14px; }
239
  .kpi .value { font-size:1.6rem; font-weight:800; color:#1B4B91; }
240
  .kpi .label { font-size:.9rem; color:#3F557A; }
241
+ .explain-card { background:#EAF0FF; border-radius:12px; padding:18px; border:1px solid #D5E0FA; }
242
  """
243
 
244
  with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as demo:
 
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>")
 
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,
 
290
  outputs=story_out)
291
 
292
  demo.launch()