Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -49,6 +49,17 @@ def hero_path():
|
|
| 49 |
return n
|
| 50 |
return None
|
| 51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
def make_plot(fig, title):
|
| 53 |
fig.update_layout(
|
| 54 |
title=title,
|
|
@@ -122,23 +133,18 @@ def train_and_embed_solid():
|
|
| 122 |
INTRO_MD = """
|
| 123 |
# 🛳️ Titanic Data Adventure
|
| 124 |
### Een datagedreven reis door hoop, hiërarchie en toeval
|
| 125 |
-
|
| 126 |
**April 1912.**
|
| 127 |
De RMS *Titanic* vertrekt richting New York: een drijvend paleis, gevuld met verwachtingen.
|
| 128 |
Aan boord: industriëlen in avondkleding, jonge gezinnen met één koffer, bemanningsleden met routine.
|
| 129 |
De zee is kalm; de toekomst lijkt maakbaar.
|
| 130 |
-
|
| 131 |
Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met **data**.
|
| 132 |
Elk record in deze dataset is een menselijk verhaal: iemand met een plek aan tafel, een ticket, een familie, een keuze.
|
| 133 |
Door de gegevens te verkennen, begrijpen we beter **wie overleefde — en waarom**.
|
| 134 |
-
|
| 135 |
---
|
| 136 |
-
|
| 137 |
### ⚓ De nacht die geschiedenis werd
|
| 138 |
Op **14 april 1912**, net voor middernacht, raakte de *Titanic* een **ijsberg** in de ijskoude Noord-Atlantische Oceaan.
|
| 139 |
Binnen drie uur zonk het schip – het “onzinkbare” symbool van vooruitgang bleek kwetsbaar.
|
| 140 |
Meer dan **1.500 mensen** kwamen om, slechts een derde van de opvarenden vond redding in de sloepen.
|
| 141 |
-
|
| 142 |
De verdeling tussen rijk en arm, man en vrouw, jong en oud bleek letterlijk van levensbelang.
|
| 143 |
In deze applicatie duiken we opnieuw die nacht in – niet met reddingsvesten, maar met grafieken, modellen en cijfers
|
| 144 |
die het menselijk verhaal achter de ramp zichtbaar maken.
|
|
@@ -152,18 +158,14 @@ EXPLAIN_MD_SIDE = """
|
|
| 152 |
Bij het opstarten traint de computer een **RandomForest-model** dat leert wie op de Titanic **overleefde** – en waarom.
|
| 153 |
Het kijkt naar **klasse**, **geslacht**, **leeftijd**, **familieomvang**, **ticketprijs** en **haven van vertrek**.
|
| 154 |
De nauwkeurigheid (bijv. *74%*) betekent: in 74 van de 100 gevallen voorspelt het model correct.
|
| 155 |
-
|
| 156 |
---
|
| 157 |
-
|
| 158 |
### 🗺️ Landkaart van passagiers
|
| 159 |
Elk **bolletje** is één persoon. Met **PCA** brengen we veel kenmerken terug naar **2 dimensies**.
|
| 160 |
- **Blauw** → overleefd
|
| 161 |
- **Grijs** → niet overleefd
|
| 162 |
- **Vorm** → klasse
|
| 163 |
Dichter bij elkaar = vergelijkbare profielen. **Hover** voor details.
|
| 164 |
-
|
| 165 |
---
|
| 166 |
-
|
| 167 |
### 💬 Jij in dit verhaal
|
| 168 |
Vul onderaan je **eigen profiel** in, ontdek jouw kans en lees je scène uit die nacht.
|
| 169 |
"""
|
|
@@ -214,11 +216,8 @@ def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
|
|
| 214 |
tone, ending = ("Het ziet er somber uit.",
|
| 215 |
"Je klampt je vast terwijl de oceaan meedogenloos wordt.")
|
| 216 |
return f"""### 🔮 Jouw overlevingskans: **{pct:.1f}%**
|
| 217 |
-
|
| 218 |
**Situatie:** {rol_txt}, **{klasse_txt} klasse**, inscheping **{haven_txt}** — leeftijd **{int(age)}**, familie **{int(sibsp)}+{int(parch)}** (totaal {int(sibsp)+int(parch)+1}), ticket **£{float(fare):.2f}**.
|
| 219 |
-
|
| 220 |
**Analyse:** {tone} Het model weegt o.a. klasse, geslacht, leeftijd en familieomvang mee.
|
| 221 |
-
|
| 222 |
**Avontuur:** De nacht is stil; fluiten, geroep, voetstappen. {ending}
|
| 223 |
"""
|
| 224 |
|
|
@@ -269,7 +268,7 @@ body { background:#FFFFFF; color:#0B1C3F; }
|
|
| 269 |
.gradio-container { background:#FFFFFF; }
|
| 270 |
h1, h2, h3, h4 { color:#1B4B91; }
|
| 271 |
.panel, .intro-card { background:#F9FBFF; border:1px solid #E0E6F3; border-radius:12px; padding:16px; }
|
| 272 |
-
.hero-img img { border-radius:12px; border:1px solid #E0E6F3; }
|
| 273 |
.kpi { display:flex; flex-direction:column; align-items:center; justify-content:center;
|
| 274 |
background:#FFFFFF; border:1px solid #E0E6F3; border-radius:12px; padding:14px; }
|
| 275 |
.kpi .value { font-size:1.6rem; font-weight:800; color:#1B4B91; }
|
|
@@ -317,9 +316,9 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
|
|
| 317 |
# Tekstblok + gauge naast elkaar
|
| 318 |
with gr.Row():
|
| 319 |
with gr.Column(scale=2, min_width=420):
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
1. **Kies je profiel**
|
| 324 |
- **Klasse:** 1e, 2e of 3e klasse (je reiscomfort en dekpositie).
|
| 325 |
- **Geslacht:** man of vrouw — dit had invloed op reddingsvoorrang.
|
|
@@ -327,16 +326,17 @@ Hier kun je ontdekken **hoe groot jouw kans op overleving** zou zijn geweest aan
|
|
| 327 |
- **Broers/zussen** en **ouders/kinderen**: hoeveel familieleden reisden met je mee.
|
| 328 |
- **Ticketprijs (£):** hoe duur je passage was.
|
| 329 |
- **Vertrekhaven:** Cherbourg (C), Queenstown (Q) of Southampton (S).
|
| 330 |
-
|
| 331 |
2. **Klik op de knop “🎲 Bereken én vertel mijn verhaal”**
|
| 332 |
Het model schat jouw **overlevingskans** op basis van historische patronen.
|
| 333 |
-
|
| 334 |
3. **Lees je persoonlijke scène**
|
| 335 |
Onder de knop verschijnt een korte beschrijving die je meeneemt naar die nacht —
|
| 336 |
gebaseerd op jouw ingevulde profiel en de berekende kans.
|
| 337 |
-
|
| 338 |
> 💡 *De voorspelling is een statistische schatting, geen oordeel.
|
| 339 |
> Ze helpt je zien hoe factoren zoals klasse, geslacht en leeftijd destijds iemands lot konden bepalen.*""")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 340 |
with gr.Column(scale=1, min_width=320):
|
| 341 |
viz_plot = gr.Plot(label="Jouw overlevingskans (live)")
|
| 342 |
|
|
|
|
| 49 |
return n
|
| 50 |
return None
|
| 51 |
|
| 52 |
+
def story_image_path():
|
| 53 |
+
"""
|
| 54 |
+
Zoek naar de afbeelding voor het 'witte vlak' naast de gauge.
|
| 55 |
+
We checken zowel de projectroot als /mnt/data (handig voor Spaces).
|
| 56 |
+
"""
|
| 57 |
+
candidates = ["sink.png", os.path.join("/mnt/data", "sink.png")]
|
| 58 |
+
for p in candidates:
|
| 59 |
+
if os.path.exists(p):
|
| 60 |
+
return p
|
| 61 |
+
return None
|
| 62 |
+
|
| 63 |
def make_plot(fig, title):
|
| 64 |
fig.update_layout(
|
| 65 |
title=title,
|
|
|
|
| 133 |
INTRO_MD = """
|
| 134 |
# 🛳️ Titanic Data Adventure
|
| 135 |
### Een datagedreven reis door hoop, hiërarchie en toeval
|
|
|
|
| 136 |
**April 1912.**
|
| 137 |
De RMS *Titanic* vertrekt richting New York: een drijvend paleis, gevuld met verwachtingen.
|
| 138 |
Aan boord: industriëlen in avondkleding, jonge gezinnen met één koffer, bemanningsleden met routine.
|
| 139 |
De zee is kalm; de toekomst lijkt maakbaar.
|
|
|
|
| 140 |
Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met **data**.
|
| 141 |
Elk record in deze dataset is een menselijk verhaal: iemand met een plek aan tafel, een ticket, een familie, een keuze.
|
| 142 |
Door de gegevens te verkennen, begrijpen we beter **wie overleefde — en waarom**.
|
|
|
|
| 143 |
---
|
|
|
|
| 144 |
### ⚓ De nacht die geschiedenis werd
|
| 145 |
Op **14 april 1912**, net voor middernacht, raakte de *Titanic* een **ijsberg** in de ijskoude Noord-Atlantische Oceaan.
|
| 146 |
Binnen drie uur zonk het schip – het “onzinkbare” symbool van vooruitgang bleek kwetsbaar.
|
| 147 |
Meer dan **1.500 mensen** kwamen om, slechts een derde van de opvarenden vond redding in de sloepen.
|
|
|
|
| 148 |
De verdeling tussen rijk en arm, man en vrouw, jong en oud bleek letterlijk van levensbelang.
|
| 149 |
In deze applicatie duiken we opnieuw die nacht in – niet met reddingsvesten, maar met grafieken, modellen en cijfers
|
| 150 |
die het menselijk verhaal achter de ramp zichtbaar maken.
|
|
|
|
| 158 |
Bij het opstarten traint de computer een **RandomForest-model** dat leert wie op de Titanic **overleefde** – en waarom.
|
| 159 |
Het kijkt naar **klasse**, **geslacht**, **leeftijd**, **familieomvang**, **ticketprijs** en **haven van vertrek**.
|
| 160 |
De nauwkeurigheid (bijv. *74%*) betekent: in 74 van de 100 gevallen voorspelt het model correct.
|
|
|
|
| 161 |
---
|
|
|
|
| 162 |
### 🗺️ Landkaart van passagiers
|
| 163 |
Elk **bolletje** is één persoon. Met **PCA** brengen we veel kenmerken terug naar **2 dimensies**.
|
| 164 |
- **Blauw** → overleefd
|
| 165 |
- **Grijs** → niet overleefd
|
| 166 |
- **Vorm** → klasse
|
| 167 |
Dichter bij elkaar = vergelijkbare profielen. **Hover** voor details.
|
|
|
|
| 168 |
---
|
|
|
|
| 169 |
### 💬 Jij in dit verhaal
|
| 170 |
Vul onderaan je **eigen profiel** in, ontdek jouw kans en lees je scène uit die nacht.
|
| 171 |
"""
|
|
|
|
| 216 |
tone, ending = ("Het ziet er somber uit.",
|
| 217 |
"Je klampt je vast terwijl de oceaan meedogenloos wordt.")
|
| 218 |
return f"""### 🔮 Jouw overlevingskans: **{pct:.1f}%**
|
|
|
|
| 219 |
**Situatie:** {rol_txt}, **{klasse_txt} klasse**, inscheping **{haven_txt}** — leeftijd **{int(age)}**, familie **{int(sibsp)}+{int(parch)}** (totaal {int(sibsp)+int(parch)+1}), ticket **£{float(fare):.2f}**.
|
|
|
|
| 220 |
**Analyse:** {tone} Het model weegt o.a. klasse, geslacht, leeftijd en familieomvang mee.
|
|
|
|
| 221 |
**Avontuur:** De nacht is stil; fluiten, geroep, voetstappen. {ending}
|
| 222 |
"""
|
| 223 |
|
|
|
|
| 268 |
.gradio-container { background:#FFFFFF; }
|
| 269 |
h1, h2, h3, h4 { color:#1B4B91; }
|
| 270 |
.panel, .intro-card { background:#F9FBFF; border:1px solid #E0E6F3; border-radius:12px; padding:16px; }
|
| 271 |
+
.hero-img img { border-radius:12px; border:1px solid #E0E6F3; width:100%; height:auto; }
|
| 272 |
.kpi { display:flex; flex-direction:column; align-items:center; justify-content:center;
|
| 273 |
background:#FFFFFF; border:1px solid #E0E6F3; border-radius:12px; padding:14px; }
|
| 274 |
.kpi .value { font-size:1.6rem; font-weight:800; color:#1B4B91; }
|
|
|
|
| 316 |
# Tekstblok + gauge naast elkaar
|
| 317 |
with gr.Row():
|
| 318 |
with gr.Column(scale=2, min_width=420):
|
| 319 |
+
# Let op: de zin '— en meteen het verhaal van jouw nacht lezen.' is weggelaten
|
| 320 |
+
gr.Markdown("""## 🔮 Jouw scenario — bereken je overlevingskans
|
| 321 |
+
Hier kun je ontdekken **hoe groot jouw kans op overleving** zou zijn geweest aan boord van de *Titanic*.
|
| 322 |
1. **Kies je profiel**
|
| 323 |
- **Klasse:** 1e, 2e of 3e klasse (je reiscomfort en dekpositie).
|
| 324 |
- **Geslacht:** man of vrouw — dit had invloed op reddingsvoorrang.
|
|
|
|
| 326 |
- **Broers/zussen** en **ouders/kinderen**: hoeveel familieleden reisden met je mee.
|
| 327 |
- **Ticketprijs (£):** hoe duur je passage was.
|
| 328 |
- **Vertrekhaven:** Cherbourg (C), Queenstown (Q) of Southampton (S).
|
|
|
|
| 329 |
2. **Klik op de knop “🎲 Bereken én vertel mijn verhaal”**
|
| 330 |
Het model schat jouw **overlevingskans** op basis van historische patronen.
|
|
|
|
| 331 |
3. **Lees je persoonlijke scène**
|
| 332 |
Onder de knop verschijnt een korte beschrijving die je meeneemt naar die nacht —
|
| 333 |
gebaseerd op jouw ingevulde profiel en de berekende kans.
|
|
|
|
| 334 |
> 💡 *De voorspelling is een statistische schatting, geen oordeel.
|
| 335 |
> Ze helpt je zien hoe factoren zoals klasse, geslacht en leeftijd destijds iemands lot konden bepalen.*""")
|
| 336 |
+
sp = story_image_path()
|
| 337 |
+
if sp:
|
| 338 |
+
# Plaats de afbeelding in het witte vlak onder de tekst
|
| 339 |
+
gr.Image(value=sp, interactive=False, show_label=False, elem_classes=["hero-img"])
|
| 340 |
with gr.Column(scale=1, min_width=320):
|
| 341 |
viz_plot = gr.Plot(label="Jouw overlevingskans (live)")
|
| 342 |
|