Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# app.py — Titanic Data Adventure (
|
| 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 |
-
#
|
| 117 |
# ======================================================
|
| 118 |
-
|
| 119 |
-
### 📘 Wat je
|
| 120 |
-
|
| 121 |
-
|
| 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 |
-
### 🗺️
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 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 |
-
### 💬
|
| 149 |
-
|
| 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 |
-
|
| 257 |
-
|
|
|
|
|
|
|
|
|
|
| 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,
|