Marcel0123 commited on
Commit
519b255
·
verified ·
1 Parent(s): 6c26cb8

Upload 2 files

Browse files
Files changed (1) hide show
  1. app.py +31 -42
app.py CHANGED
@@ -22,31 +22,6 @@ FEATURE_LABELS = {
22
  }
23
  LABEL_TO_KEY = {v: k for k, v in FEATURE_LABELS.items()}
24
 
25
- MEDICAL_MD = r"""
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.
35
-
36
- - Elke punt is één patiënt.
37
- - De kleur laat zien hoe hoog of laag een bepaalde meting is (standaard: BMI).
38
- - De pijlen laten zien welke metingen het meeste invloed hebben.
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
-
46
- **Speel zelf de onderzoeker!**
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)
@@ -55,8 +30,33 @@ def load_diabetes_df():
55
  df["target"] = y
56
  return df
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=32, alpha=0.85, n_components=10, standardize=True):
59
  df = load_diabetes_df()
 
60
  feature_keys = [c for c in df.columns if c != "target"]
61
  color_key = LABEL_TO_KEY.get(color_label, "bmi")
62
 
@@ -74,7 +74,6 @@ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=
74
 
75
  cvals = df[color_key].values
76
 
77
- # Biplot
78
  fig1 = plt.figure(figsize=(7.8, 5.6))
79
  ax = fig1.add_subplot(111)
80
  sc = ax.scatter(Z[:, 0], Z[:, 1], c=cvals, s=point_size, alpha=alpha)
@@ -95,7 +94,6 @@ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=
95
  ax.grid(True, linestyle=":", linewidth=0.6)
96
  plt.tight_layout()
97
 
98
- # Explained variance plot
99
  fig2 = plt.figure(figsize=(7.8, 3.8))
100
  ax2 = fig2.add_subplot(111)
101
  xs = np.arange(1, len(expl) + 1)
@@ -108,7 +106,6 @@ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=
108
  ax2.grid(True, linestyle=":", linewidth=0.6)
109
  plt.tight_layout()
110
 
111
- # Top-features table
112
  load_df = pd.DataFrame({
113
  "feature_key": feature_keys,
114
  "PC1_loading": loadings[:, 0],
@@ -135,20 +132,10 @@ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=
135
  - **Balkgrafiek** = per component hoeveel variatie hij uitlegt; **lijn** = cumulatief.
136
  """
137
 
138
- return fig1, fig2, table, summary_md
139
 
140
  with gr.Blocks(title="PCA Biplot — Diabetes (NL labels)") as demo:
141
- # Callout styles
142
- gr.HTML("""
143
- <style>
144
- .callout {padding:12px 14px; border-left:4px solid #2563eb; background:#f1f5f9; border-radius:6px; margin: 8px 0 18px;}
145
- .smallnote {font-size: 0.92em; opacity: 0.85;}
146
- </style>
147
- """)
148
-
149
  gr.Markdown("# PCA Biplot — Diabetes (NL labels)")
150
- # Place the medical text at the very top so it's always visible
151
- gr.Markdown(MEDICAL_MD)
152
 
153
  with gr.Row():
154
  with gr.Column(scale=1):
@@ -160,16 +147,18 @@ with gr.Blocks(title="PCA Biplot — Diabetes (NL labels)") as demo:
160
  n_components = gr.Slider(2, 10, value=10, step=1, label="Aantal PCA-componenten (voor variatieplot)")
161
  standardize = gr.Checkbox(value=True, label="Standaardiseer metingen (aanbevolen)")
162
  run_btn = gr.Button("Update visualisaties")
163
- gr.HTML('<div class="callout smallnote">💡 *Tip:* kies links een meting (bijv. BMI of cholesterol) en klik daarna op <b>Update visualisaties</b>.</div>')
164
  with gr.Column(scale=2):
165
  plot_biplot = gr.Plot(label="PCA-biplot — punten + pijlen")
166
  plot_expl = gr.Plot(label="Uitlegvariantie per component")
167
  table = gr.Dataframe(headers=["Feature (PC1)", "Loading PC1", "Feature (PC2)", "Loading PC2"], row_count=6)
168
  summary = gr.Markdown()
 
 
 
169
 
170
  inputs = [color_feat, arrow_scale, point_size, alpha, n_components, standardize]
171
- run_btn.click(fn=pca_biplot, inputs=inputs, outputs=[plot_biplot, plot_expl, table, summary])
172
- demo.load(fn=pca_biplot, inputs=inputs, outputs=[plot_biplot, plot_expl, table, summary])
173
 
174
  if __name__ == "__main__":
175
  demo.queue().launch(server_name="0.0.0.0", server_port=7860, ssr_mode=False, show_api=False)
 
22
  }
23
  LABEL_TO_KEY = {v: k for k, v in FEATURE_LABELS.items()}
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  def load_diabetes_df():
26
  d = datasets.load_diabetes()
27
  X = pd.DataFrame(d.data, columns=d.feature_names)
 
30
  df["target"] = y
31
  return df
32
 
33
+ def compute_overview_table(df: pd.DataFrame):
34
+ keys = ["bmi","bp","s1","s2","s3","s4","s5","s6"]
35
+ rows = []
36
+ for k in keys:
37
+ vals = df[k].dropna().values
38
+ if vals.size == 0:
39
+ continue
40
+ mean = float(vals.mean())
41
+ pct_above = float((vals > 0).mean() * 100.0) # standardized: 0 ~ mean
42
+ pct_below = float((vals < 0).mean() * 100.0)
43
+ rows.append({
44
+ "Meting": FEATURE_LABELS.get(k, k),
45
+ "Gemiddelde (gestandaardiseerd)": round(mean, 3),
46
+ "% boven gemiddelde": round(pct_above, 1),
47
+ "% onder gemiddelde": round(pct_below, 1),
48
+ })
49
+ table = pd.DataFrame(rows)
50
+ note = (
51
+ "Let op: waarden in deze dataset zijn **gestandaardiseerd**. "
52
+ "`0` betekent ongeveer het **algemene gemiddelde**. "
53
+ "Positief = hoger dan gemiddeld, negatief = lager dan gemiddeld."
54
+ )
55
+ return table, note
56
+
57
  def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=32, alpha=0.85, n_components=10, standardize=True):
58
  df = load_diabetes_df()
59
+ overview_df, overview_note = compute_overview_table(df)
60
  feature_keys = [c for c in df.columns if c != "target"]
61
  color_key = LABEL_TO_KEY.get(color_label, "bmi")
62
 
 
74
 
75
  cvals = df[color_key].values
76
 
 
77
  fig1 = plt.figure(figsize=(7.8, 5.6))
78
  ax = fig1.add_subplot(111)
79
  sc = ax.scatter(Z[:, 0], Z[:, 1], c=cvals, s=point_size, alpha=alpha)
 
94
  ax.grid(True, linestyle=":", linewidth=0.6)
95
  plt.tight_layout()
96
 
 
97
  fig2 = plt.figure(figsize=(7.8, 3.8))
98
  ax2 = fig2.add_subplot(111)
99
  xs = np.arange(1, len(expl) + 1)
 
106
  ax2.grid(True, linestyle=":", linewidth=0.6)
107
  plt.tight_layout()
108
 
 
109
  load_df = pd.DataFrame({
110
  "feature_key": feature_keys,
111
  "PC1_loading": loadings[:, 0],
 
132
  - **Balkgrafiek** = per component hoeveel variatie hij uitlegt; **lijn** = cumulatief.
133
  """
134
 
135
+ return fig1, fig2, table, summary_md, overview_df, overview_note
136
 
137
  with gr.Blocks(title="PCA Biplot — Diabetes (NL labels)") as demo:
 
 
 
 
 
 
 
 
138
  gr.Markdown("# PCA Biplot — Diabetes (NL labels)")
 
 
139
 
140
  with gr.Row():
141
  with gr.Column(scale=1):
 
147
  n_components = gr.Slider(2, 10, value=10, step=1, label="Aantal PCA-componenten (voor variatieplot)")
148
  standardize = gr.Checkbox(value=True, label="Standaardiseer metingen (aanbevolen)")
149
  run_btn = gr.Button("Update visualisaties")
 
150
  with gr.Column(scale=2):
151
  plot_biplot = gr.Plot(label="PCA-biplot — punten + pijlen")
152
  plot_expl = gr.Plot(label="Uitlegvariantie per component")
153
  table = gr.Dataframe(headers=["Feature (PC1)", "Loading PC1", "Feature (PC2)", "Loading PC2"], row_count=6)
154
  summary = gr.Markdown()
155
+ gr.Markdown("### Overzicht (gemiddelden & verdeling)")
156
+ overview_tbl = gr.Dataframe(interactive=False)
157
+ overview_note_md = gr.Markdown()
158
 
159
  inputs = [color_feat, arrow_scale, point_size, alpha, n_components, standardize]
160
+ run_btn.click(fn=pca_biplot, inputs=inputs, outputs=[plot_biplot, plot_expl, table, summary, overview_tbl, overview_note_md])
161
+ demo.load(fn=pca_biplot, inputs=inputs, outputs=[plot_biplot, plot_expl, table, summary, overview_tbl, overview_note_md])
162
 
163
  if __name__ == "__main__":
164
  demo.queue().launch(server_name="0.0.0.0", server_port=7860, ssr_mode=False, show_api=False)