Marcel0123 commited on
Commit
dedc31d
·
verified ·
1 Parent(s): 85788bb

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +9 -42
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import gradio as gr
2
  import numpy as np
3
  import pandas as pd
@@ -6,9 +7,6 @@ from sklearn import datasets
6
  from sklearn.preprocessing import StandardScaler
7
  from sklearn.decomposition import PCA
8
 
9
- # ======================
10
- # NL labels voor features
11
- # ======================
12
  FEATURE_LABELS = {
13
  "age": "Leeftijd",
14
  "sex": "Geslacht",
@@ -24,16 +22,13 @@ FEATURE_LABELS = {
24
  }
25
  LABEL_TO_KEY = {v: k for k, v in FEATURE_LABELS.items()}
26
 
27
- # ======================
28
- # Medisch nut (bovenaan) + speels blok
29
- # ======================
30
- MEDICAL_MD = r"""
31
  ### Medisch nut
32
 
33
  **Wat zien we hier?**
34
  Ik heb een bestaande, anonieme gezondheidsdataset gebruikt die speciaal beschikbaar is gemaakt voor onderzoek en studie. In deze gegevens staan metingen van een grote groep patiënten, zoals **bloedwaarden, BMI, cholesterol en bloedsuiker**.
35
 
36
- Zon enorme berg cijfers is voor artsen en ziekenhuizen bijna niet in één keer te overzien. Het is gewoon te veel om met het blote oog patronen uit te halen.
37
 
38
  **Daar komt kunstmatige intelligentie om de hoek kijken.**
39
  Met deze techniek (PCA) kan de computer de data slim samenvatten en patronen zichtbaar maken. Dit programma dat ik heb ontworpen laat live zien hoe die samenvatting werkt.
@@ -44,7 +39,7 @@ Met deze techniek (PCA) kan de computer de data slim samenvatten en patronen zic
44
  - Links bovenin kun je kiezen welke meting je als uitgangspunt wilt nemen.
45
 
46
  **En wat heb je hieraan?**
47
- In de praktijk gebruiken artsen en onderzoekers zon plot om patronen en verbanden te ontdekken. 👉 Het is dus niet alleen een mooi plaatje, maar echt een manier om grote hoeveelheden data sneller en slimmer te begrijpen.
48
 
49
  Met AI kunnen we patronen vinden die je met het blote oog nooit zou zien. Dat maakt dit niet alleen een mooie visualisatie, maar ook een knap stukje technologie met échte waarde voor onderzoek en zorg.
50
 
@@ -52,19 +47,15 @@ Met AI kunnen we patronen vinden die je met het blote oog nooit zou zien. Dat ma
52
  Doe alsof je een arts bent en kies links bovenin een waarde, bijvoorbeeld **cholesterol**, **leeftijd** of **geslacht**. Klik daarna op *Update visualisaties* en ontdek je eigen patronen in de data.
53
  """
54
 
55
- # ======================
56
- # Data helpers
57
- # ======================
58
  def load_diabetes_df():
59
  d = datasets.load_diabetes()
60
- X = pd.DataFrame(d.data, columns=d.feature_names) # standardized features
61
  y = pd.Series(d.target, name="target")
62
  df = X.copy()
63
  df["target"] = y
64
  return df
65
 
66
  def compute_overview_table(df: pd.DataFrame):
67
- """Gemiddelde + % boven/onder gemiddelde voor kernmetingen (gestandaardiseerd)."""
68
  keys = ["bmi","bp","s1","s2","s3","s4","s5","s6"]
69
  rows = []
70
  for k in keys:
@@ -72,7 +63,7 @@ def compute_overview_table(df: pd.DataFrame):
72
  if vals.size == 0:
73
  continue
74
  mean = float(vals.mean())
75
- pct_above = float((vals > 0).mean() * 100.0) # 0 ≈ globaal gemiddelde
76
  pct_below = float((vals < 0).mean() * 100.0)
77
  rows.append({
78
  "Meting": FEATURE_LABELS.get(k, k),
@@ -88,17 +79,7 @@ def compute_overview_table(df: pd.DataFrame):
88
  )
89
  return table, note
90
 
91
- # ======================
92
- # PCA biplot kernel
93
- # ======================
94
- def pca_biplot(
95
- color_label="BMI (Body Mass Index)",
96
- arrow_scale=2.0,
97
- point_size=32,
98
- alpha=0.85,
99
- n_components=10,
100
- standardize=True,
101
- ):
102
  df = load_diabetes_df()
103
  overview_df, overview_note = compute_overview_table(df)
104
 
@@ -119,7 +100,6 @@ def pca_biplot(
119
 
120
  cvals = df[color_key].values
121
 
122
- # Plot 1: Biplot
123
  fig1 = plt.figure(figsize=(7.8, 5.6))
124
  ax = fig1.add_subplot(111)
125
  sc = ax.scatter(Z[:, 0], Z[:, 1], c=cvals, s=point_size, alpha=alpha)
@@ -132,18 +112,14 @@ def pca_biplot(
132
  for i, key in enumerate(feature_keys):
133
  x_arrow = loadings[i, 0] * arrow_scale
134
  y_arrow = loadings[i, 1] * arrow_scale
135
- ax.arrow(0, 0, x_arrow, y_arrow, head_width=0.05, head_length=0.08,
136
- fc="k", ec="k", length_includes_head=True)
137
- ax.text(x_arrow * 1.08, y_arrow * 1.08,
138
- FEATURE_LABELS.get(key, key),
139
- fontsize=9, ha="center", va="center")
140
 
141
  ax.axhline(0, color="grey", linewidth=0.6, linestyle=":")
142
  ax.axvline(0, color="grey", linewidth=0.6, linestyle=":")
143
  ax.grid(True, linestyle=":", linewidth=0.6)
144
  plt.tight_layout()
145
 
146
- # Plot 2: Explained variance
147
  fig2 = plt.figure(figsize=(7.8, 3.8))
148
  ax2 = fig2.add_subplot(111)
149
  xs = np.arange(1, len(expl) + 1)
@@ -156,7 +132,6 @@ def pca_biplot(
156
  ax2.grid(True, linestyle=":", linewidth=0.6)
157
  plt.tight_layout()
158
 
159
- # Tabel: top-features PC1/PC2
160
  load_df = pd.DataFrame({
161
  "feature_key": feature_keys,
162
  "PC1_loading": loadings[:, 0],
@@ -185,11 +160,7 @@ def pca_biplot(
185
 
186
  return fig1, fig2, table, summary_md, overview_df, overview_note
187
 
188
- # ======================
189
- # UI
190
- # ======================
191
  with gr.Blocks(title="PCA Biplot — Diabetes (NL labels)") as demo:
192
- # Klein beetje stijl voor de tip-callout
193
  gr.HTML("""
194
  <style>
195
  .callout {padding:12px 14px; border-left:4px solid #2563eb; background:#f1f5f9; border-radius:6px; margin: 8px 0 18px;}
@@ -227,8 +198,4 @@ with gr.Blocks(title="PCA Biplot — Diabetes (NL labels)") as demo:
227
  outputs=[plot_biplot, plot_expl, table, summary, overview_tbl, overview_note_md])
228
 
229
  if __name__ == "__main__":
230
- # Belangrijk voor Spaces: queue + ssr_mode uit
231
  demo.queue().launch(server_name="0.0.0.0", server_port=7860, ssr_mode=False, show_api=False)
232
-
233
-
234
-
 
1
+
2
  import gradio as gr
3
  import numpy as np
4
  import pandas as pd
 
7
  from sklearn.preprocessing import StandardScaler
8
  from sklearn.decomposition import PCA
9
 
 
 
 
10
  FEATURE_LABELS = {
11
  "age": "Leeftijd",
12
  "sex": "Geslacht",
 
22
  }
23
  LABEL_TO_KEY = {v: k for k, v in FEATURE_LABELS.items()}
24
 
25
+ MEDICAL_MD = """
 
 
 
26
  ### Medisch nut
27
 
28
  **Wat zien we hier?**
29
  Ik heb een bestaande, anonieme gezondheidsdataset gebruikt die speciaal beschikbaar is gemaakt voor onderzoek en studie. In deze gegevens staan metingen van een grote groep patiënten, zoals **bloedwaarden, BMI, cholesterol en bloedsuiker**.
30
 
31
+ Zo'n enorme berg cijfers is voor artsen en ziekenhuizen bijna niet in één keer te overzien. Het is gewoon te veel om met het blote oog patronen uit te halen.
32
 
33
  **Daar komt kunstmatige intelligentie om de hoek kijken.**
34
  Met deze techniek (PCA) kan de computer de data slim samenvatten en patronen zichtbaar maken. Dit programma dat ik heb ontworpen laat live zien hoe die samenvatting werkt.
 
39
  - Links bovenin kun je kiezen welke meting je als uitgangspunt wilt nemen.
40
 
41
  **En wat heb je hieraan?**
42
+ In de praktijk gebruiken artsen en onderzoekers zo'n plot om patronen en verbanden te ontdekken. 👉 Het is dus niet alleen een mooi plaatje, maar echt een manier om grote hoeveelheden data sneller en slimmer te begrijpen.
43
 
44
  Met AI kunnen we patronen vinden die je met het blote oog nooit zou zien. Dat maakt dit niet alleen een mooie visualisatie, maar ook een knap stukje technologie met échte waarde voor onderzoek en zorg.
45
 
 
47
  Doe alsof je een arts bent en kies links bovenin een waarde, bijvoorbeeld **cholesterol**, **leeftijd** of **geslacht**. Klik daarna op *Update visualisaties* en ontdek je eigen patronen in de data.
48
  """
49
 
 
 
 
50
  def load_diabetes_df():
51
  d = datasets.load_diabetes()
52
+ X = pd.DataFrame(d.data, columns=d.feature_names)
53
  y = pd.Series(d.target, name="target")
54
  df = X.copy()
55
  df["target"] = y
56
  return df
57
 
58
  def compute_overview_table(df: pd.DataFrame):
 
59
  keys = ["bmi","bp","s1","s2","s3","s4","s5","s6"]
60
  rows = []
61
  for k in keys:
 
63
  if vals.size == 0:
64
  continue
65
  mean = float(vals.mean())
66
+ pct_above = float((vals > 0).mean() * 100.0)
67
  pct_below = float((vals < 0).mean() * 100.0)
68
  rows.append({
69
  "Meting": FEATURE_LABELS.get(k, k),
 
79
  )
80
  return table, note
81
 
82
+ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=32, alpha=0.85, n_components=10, standardize=True):
 
 
 
 
 
 
 
 
 
 
83
  df = load_diabetes_df()
84
  overview_df, overview_note = compute_overview_table(df)
85
 
 
100
 
101
  cvals = df[color_key].values
102
 
 
103
  fig1 = plt.figure(figsize=(7.8, 5.6))
104
  ax = fig1.add_subplot(111)
105
  sc = ax.scatter(Z[:, 0], Z[:, 1], c=cvals, s=point_size, alpha=alpha)
 
112
  for i, key in enumerate(feature_keys):
113
  x_arrow = loadings[i, 0] * arrow_scale
114
  y_arrow = loadings[i, 1] * arrow_scale
115
+ ax.arrow(0, 0, x_arrow, y_arrow, head_width=0.05, head_length=0.08, fc="k", ec="k", length_includes_head=True)
116
+ ax.text(x_arrow * 1.08, y_arrow * 1.08, FEATURE_LABELS.get(key, key), fontsize=9, ha="center", va="center")
 
 
 
117
 
118
  ax.axhline(0, color="grey", linewidth=0.6, linestyle=":")
119
  ax.axvline(0, color="grey", linewidth=0.6, linestyle=":")
120
  ax.grid(True, linestyle=":", linewidth=0.6)
121
  plt.tight_layout()
122
 
 
123
  fig2 = plt.figure(figsize=(7.8, 3.8))
124
  ax2 = fig2.add_subplot(111)
125
  xs = np.arange(1, len(expl) + 1)
 
132
  ax2.grid(True, linestyle=":", linewidth=0.6)
133
  plt.tight_layout()
134
 
 
135
  load_df = pd.DataFrame({
136
  "feature_key": feature_keys,
137
  "PC1_loading": loadings[:, 0],
 
160
 
161
  return fig1, fig2, table, summary_md, overview_df, overview_note
162
 
 
 
 
163
  with gr.Blocks(title="PCA Biplot — Diabetes (NL labels)") as demo:
 
164
  gr.HTML("""
165
  <style>
166
  .callout {padding:12px 14px; border-left:4px solid #2563eb; background:#f1f5f9; border-radius:6px; margin: 8px 0 18px;}
 
198
  outputs=[plot_biplot, plot_expl, table, summary, overview_tbl, overview_note_md])
199
 
200
  if __name__ == "__main__":
 
201
  demo.queue().launch(server_name="0.0.0.0", server_port=7860, ssr_mode=False, show_api=False)