Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# app.py — Titanic Data Adventure (wit thema, vaste layout, 2D
|
| 2 |
import gradio as gr
|
| 3 |
import pandas as pd
|
| 4 |
import numpy as np
|
|
@@ -76,32 +76,32 @@ def make_plot(fig, title):
|
|
| 76 |
)
|
| 77 |
return fig
|
| 78 |
|
| 79 |
-
def
|
| 80 |
"""
|
| 81 |
-
2D
|
| 82 |
-
|
| 83 |
-
Kleur = overlevingsstatus, symbool = klasse, grootte = family_size.
|
| 84 |
-
Hover toont zoveel mogelijk relevante velden (naam indien aanwezig).
|
| 85 |
"""
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
|
|
|
| 89 |
|
| 90 |
fig = px.scatter(
|
| 91 |
-
|
| 92 |
-
x="age",
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
size="family_size",
|
| 96 |
-
size_max=16,
|
| 97 |
-
opacity=0.75,
|
| 98 |
hover_data=hover_cols,
|
| 99 |
-
|
| 100 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
)
|
| 102 |
-
|
| 103 |
-
fig
|
| 104 |
-
return make_plot(fig, "Passagierskaart — Leeftijd (x) versus Ticketprijs (y)")
|
| 105 |
|
| 106 |
def plot_leeftijdsverdeling(dfx):
|
| 107 |
f = px.histogram(
|
|
@@ -140,7 +140,6 @@ HERO_PATH = get_hero_image_path()
|
|
| 140 |
# Interactieve voorspelling + avontuur-tekst
|
| 141 |
# =========================
|
| 142 |
def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
|
| 143 |
-
# Encode invoer net als model
|
| 144 |
sex_enc = 1 if str(sex).lower().startswith("v") else 0 # Vrouw=1, Man=0
|
| 145 |
embarked_enc = {"C":0,"Q":1,"S":2}.get(embarked, 2)
|
| 146 |
family_size = int(sibsp) + int(parch) + 1
|
|
@@ -149,7 +148,6 @@ def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
|
|
| 149 |
prob = float(MODEL.predict_proba(X_row)[0,1])
|
| 150 |
pct = prob * 100
|
| 151 |
|
| 152 |
-
# Avontuur-tekst op basis van invoer en kans
|
| 153 |
klasse_txt = {1:"eerste", 2:"tweede", 3:"derde"}.get(int(pclass), "onbekende")
|
| 154 |
haven_txt = {"C":"Cherbourg","Q":"Queenstown","S":"Southampton"}.get(embarked, "een onbekende haven")
|
| 155 |
rol_txt = "vrouw" if sex_enc==1 else "man"
|
|
@@ -183,7 +181,7 @@ Je voelt de houten reling koud onder je hand. {ending}
|
|
| 183 |
return story
|
| 184 |
|
| 185 |
# =========================
|
| 186 |
-
# Introductietekst (aangepast: uitleg over
|
| 187 |
# =========================
|
| 188 |
INTRO_MD = """
|
| 189 |
# 🛳️ Titanic Data Adventure
|
|
@@ -192,14 +190,14 @@ INTRO_MD = """
|
|
| 192 |
**April 1912.**
|
| 193 |
De RMS *Titanic* vertrekt richting New York: een drijvend paleis, gevuld met verwachtingen. Aan boord: industriëlen in avondkleding, jonge gezinnen met één koffer, bemanningsleden die elke dag routine tot ritueel verheffen. De zee is kalm; de toekomst lijkt maakbaar.
|
| 194 |
|
| 195 |
-
Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met **data**. Elk record in deze dataset is een menselijk verhaal
|
| 196 |
|
| 197 |
---
|
| 198 |
|
| 199 |
## Wat je in dit dashboard gaat zien
|
| 200 |
-
- **
|
| 201 |
-
*X-as = leeftijd*, *Y-as =
|
| 202 |
-
|
| 203 |
- **Leeftijdsverdeling** — overlappende histogrammen tonen verschillen tussen overlevers en niet-overlevers.
|
| 204 |
- **Geslachtsverdeling** — verhoudingen mannen/vrouwen in de dataset.
|
| 205 |
- **Fare per klasse** — prijsverschillen en spreiding, gekoppeld aan overleving.
|
|
@@ -258,7 +256,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
|
|
| 258 |
# Visualisaties
|
| 259 |
gr.Markdown("## 📊 Verken de data", elem_classes=["panel"])
|
| 260 |
with gr.Row():
|
| 261 |
-
g1 = gr.Plot(label="
|
| 262 |
g2 = gr.Plot(label="Leeftijdsverdeling per status")
|
| 263 |
with gr.Row():
|
| 264 |
g3 = gr.Plot(label="Geslachtsverdeling")
|
|
@@ -282,7 +280,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
|
|
| 282 |
# callbacks
|
| 283 |
def load_graphs():
|
| 284 |
return (
|
| 285 |
-
|
| 286 |
plot_leeftijdsverdeling(df),
|
| 287 |
plot_geslacht(df),
|
| 288 |
plot_fare_vs_klasse(df),
|
|
|
|
| 1 |
+
# app.py — Titanic Data Adventure (wit thema, vaste layout, 2D overleving vs leeftijd met ronde bolletjes)
|
| 2 |
import gradio as gr
|
| 3 |
import pandas as pd
|
| 4 |
import numpy as np
|
|
|
|
| 76 |
)
|
| 77 |
return fig
|
| 78 |
|
| 79 |
+
def plot_survival_vs_age(dfx):
|
| 80 |
"""
|
| 81 |
+
2D plot: ronde bolletjes; X = leeftijd, Y = overleving (twee rijen).
|
| 82 |
+
Kleur = geslacht (duidelijk contrast), hover toont rijke passagiersinfo.
|
|
|
|
|
|
|
| 83 |
"""
|
| 84 |
+
d = dfx.copy()
|
| 85 |
+
d["overleving"] = d["survived"].map({0:"Niet overleefd", 1:"Overleefd"})
|
| 86 |
+
extra_cols = [c for c in ["name","ticket","cabin"] if c in d.columns]
|
| 87 |
+
hover_cols = ["pclass","sex","age","sibsp","parch","family_size","fare","embarked","overleving"] + extra_cols
|
| 88 |
|
| 89 |
fig = px.scatter(
|
| 90 |
+
d,
|
| 91 |
+
x="age",
|
| 92 |
+
y="overleving", # categorische y: twee nette rijen
|
| 93 |
+
color="sex", # extra dimensie zonder rommel
|
|
|
|
|
|
|
|
|
|
| 94 |
hover_data=hover_cols,
|
| 95 |
+
labels={"age":"Leeftijd (jaar)", "overleving":"Overleving"},
|
| 96 |
+
color_discrete_map={"Male":"#A3B1C6","Female":"#1B4B91"},
|
| 97 |
+
render_mode="auto"
|
| 98 |
+
)
|
| 99 |
+
fig.update_traces(
|
| 100 |
+
mode="markers",
|
| 101 |
+
marker=dict(symbol="circle", size=9, opacity=0.7, line=dict(width=0.6, color="white"))
|
| 102 |
)
|
| 103 |
+
fig.update_yaxes(categoryorder="array", categoryarray=["Niet overleefd","Overleefd"], title=None)
|
| 104 |
+
return make_plot(fig, "Overleving (y) versus Leeftijd (x) — ronde bolletjes (hover voor details)")
|
|
|
|
| 105 |
|
| 106 |
def plot_leeftijdsverdeling(dfx):
|
| 107 |
f = px.histogram(
|
|
|
|
| 140 |
# Interactieve voorspelling + avontuur-tekst
|
| 141 |
# =========================
|
| 142 |
def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
|
|
|
|
| 143 |
sex_enc = 1 if str(sex).lower().startswith("v") else 0 # Vrouw=1, Man=0
|
| 144 |
embarked_enc = {"C":0,"Q":1,"S":2}.get(embarked, 2)
|
| 145 |
family_size = int(sibsp) + int(parch) + 1
|
|
|
|
| 148 |
prob = float(MODEL.predict_proba(X_row)[0,1])
|
| 149 |
pct = prob * 100
|
| 150 |
|
|
|
|
| 151 |
klasse_txt = {1:"eerste", 2:"tweede", 3:"derde"}.get(int(pclass), "onbekende")
|
| 152 |
haven_txt = {"C":"Cherbourg","Q":"Queenstown","S":"Southampton"}.get(embarked, "een onbekende haven")
|
| 153 |
rol_txt = "vrouw" if sex_enc==1 else "man"
|
|
|
|
| 181 |
return story
|
| 182 |
|
| 183 |
# =========================
|
| 184 |
+
# Introductietekst (aangepast: uitleg over 2D-bollenplot)
|
| 185 |
# =========================
|
| 186 |
INTRO_MD = """
|
| 187 |
# 🛳️ Titanic Data Adventure
|
|
|
|
| 190 |
**April 1912.**
|
| 191 |
De RMS *Titanic* vertrekt richting New York: een drijvend paleis, gevuld met verwachtingen. Aan boord: industriëlen in avondkleding, jonge gezinnen met één koffer, bemanningsleden die elke dag routine tot ritueel verheffen. De zee is kalm; de toekomst lijkt maakbaar.
|
| 192 |
|
| 193 |
+
Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met **data**. Elk record in deze dataset is een menselijk verhaal. Door de gegevens te verkennen, begrijpen we beter **wie overleefde — en waarom**.
|
| 194 |
|
| 195 |
---
|
| 196 |
|
| 197 |
## Wat je in dit dashboard gaat zien
|
| 198 |
+
- **Overleving versus leeftijd (2D)** — elk **rond bolletje** is één passagier.
|
| 199 |
+
*X-as = leeftijd*, *Y-as = overleving* (twee rijen: *Niet overleefd* en *Overleefd*).
|
| 200 |
+
**Kleur = geslacht**, en **hover** toont details (klasse, familieomvang, vertrekhaven, prijs en – als aanwezig – naam/ticket/cabin).
|
| 201 |
- **Leeftijdsverdeling** — overlappende histogrammen tonen verschillen tussen overlevers en niet-overlevers.
|
| 202 |
- **Geslachtsverdeling** — verhoudingen mannen/vrouwen in de dataset.
|
| 203 |
- **Fare per klasse** — prijsverschillen en spreiding, gekoppeld aan overleving.
|
|
|
|
| 256 |
# Visualisaties
|
| 257 |
gr.Markdown("## 📊 Verken de data", elem_classes=["panel"])
|
| 258 |
with gr.Row():
|
| 259 |
+
g1 = gr.Plot(label="Overleving vs Leeftijd (2D)")
|
| 260 |
g2 = gr.Plot(label="Leeftijdsverdeling per status")
|
| 261 |
with gr.Row():
|
| 262 |
g3 = gr.Plot(label="Geslachtsverdeling")
|
|
|
|
| 280 |
# callbacks
|
| 281 |
def load_graphs():
|
| 282 |
return (
|
| 283 |
+
plot_survival_vs_age(df), # NIEUW: ronde bolletjes, Y=overleving
|
| 284 |
plot_leeftijdsverdeling(df),
|
| 285 |
plot_geslacht(df),
|
| 286 |
plot_fare_vs_klasse(df),
|