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

Upload 2 files

Browse files
Files changed (1) hide show
  1. app.py +57 -2
app.py CHANGED
@@ -7,6 +7,9 @@ from sklearn import datasets
7
  from sklearn.preprocessing import StandardScaler
8
  from sklearn.decomposition import PCA
9
 
 
 
 
10
  FEATURE_LABELS = {
11
  "age": "Leeftijd",
12
  "sex": "Geslacht",
@@ -22,14 +25,46 @@ FEATURE_LABELS = {
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)
28
  y = pd.Series(d.target, name="target")
29
  df = X.copy()
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 = []
@@ -38,7 +73,7 @@ def compute_overview_table(df: pd.DataFrame):
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),
@@ -54,9 +89,13 @@ def compute_overview_table(df: pd.DataFrame):
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,6 +113,7 @@ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=
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,6 +134,7 @@ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=
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,6 +147,7 @@ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=
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],
@@ -134,8 +176,20 @@ def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=
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,6 +201,7 @@ with gr.Blocks(title="PCA Biplot — Diabetes (NL labels)") as demo:
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")
 
7
  from sklearn.preprocessing import StandardScaler
8
  from sklearn.decomposition import PCA
9
 
10
+ # ======================
11
+ # Labels (NL) voor features
12
+ # ======================
13
  FEATURE_LABELS = {
14
  "age": "Leeftijd",
15
  "sex": "Geslacht",
 
25
  }
26
  LABEL_TO_KEY = {v: k for k, v in FEATURE_LABELS.items()}
27
 
28
+ # ======================
29
+ # Medisch nut (bovenaan) + speels blok
30
+ # ======================
31
+ MEDICAL_MD = r"""
32
+ ### Medisch nut
33
+
34
+ **Wat zien we hier?**
35
+ 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**.
36
+
37
+ 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.
38
+
39
+ **Daar komt kunstmatige intelligentie om de hoek kijken.**
40
+ 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.
41
+
42
+ - Elke punt is één patiënt.
43
+ - De kleur laat zien hoe hoog of laag een bepaalde meting is (standaard: BMI).
44
+ - De pijlen laten zien welke metingen het meeste invloed hebben.
45
+ - Links bovenin kun je kiezen welke meting je als uitgangspunt wilt nemen.
46
+
47
+ **En wat heb je hieraan?**
48
+ 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.
49
+
50
+ 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.
51
+
52
+ **Speel zelf de onderzoeker!**
53
+ 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.
54
+ """
55
+
56
+ # ======================
57
+ # Data
58
+ # ======================
59
  def load_diabetes_df():
60
  d = datasets.load_diabetes()
61
+ X = pd.DataFrame(d.data, columns=d.feature_names) # standardized features
62
  y = pd.Series(d.target, name="target")
63
  df = X.copy()
64
  df["target"] = y
65
  return df
66
 
67
+ # Overzichtstabel (gemiddelde & % boven/onder mean)
68
  def compute_overview_table(df: pd.DataFrame):
69
  keys = ["bmi","bp","s1","s2","s3","s4","s5","s6"]
70
  rows = []
 
73
  if vals.size == 0:
74
  continue
75
  mean = float(vals.mean())
76
+ pct_above = float((vals > 0).mean() * 100.0) # standardised: 0 overall mean
77
  pct_below = float((vals < 0).mean() * 100.0)
78
  rows.append({
79
  "Meting": FEATURE_LABELS.get(k, k),
 
89
  )
90
  return table, note
91
 
92
+ # ======================
93
+ # Kern: PCA biplot
94
+ # ======================
95
  def pca_biplot(color_label="BMI (Body Mass Index)", arrow_scale=2.0, point_size=32, alpha=0.85, n_components=10, standardize=True):
96
  df = load_diabetes_df()
97
  overview_df, overview_note = compute_overview_table(df)
98
+
99
  feature_keys = [c for c in df.columns if c != "target"]
100
  color_key = LABEL_TO_KEY.get(color_label, "bmi")
101
 
 
113
 
114
  cvals = df[color_key].values
115
 
116
+ # Plot 1: Biplot
117
  fig1 = plt.figure(figsize=(7.8, 5.6))
118
  ax = fig1.add_subplot(111)
119
  sc = ax.scatter(Z[:, 0], Z[:, 1], c=cvals, s=point_size, alpha=alpha)
 
134
  ax.grid(True, linestyle=":", linewidth=0.6)
135
  plt.tight_layout()
136
 
137
+ # Plot 2: Explained variance
138
  fig2 = plt.figure(figsize=(7.8, 3.8))
139
  ax2 = fig2.add_subplot(111)
140
  xs = np.arange(1, len(expl) + 1)
 
147
  ax2.grid(True, linestyle=":", linewidth=0.6)
148
  plt.tight_layout()
149
 
150
+ # Tabel: top-features PC1/PC2
151
  load_df = pd.DataFrame({
152
  "feature_key": feature_keys,
153
  "PC1_loading": loadings[:, 0],
 
176
 
177
  return fig1, fig2, table, summary_md, overview_df, overview_note
178
 
179
+ # ======================
180
+ # UI
181
+ # ======================
182
  with gr.Blocks(title="PCA Biplot — Diabetes (NL labels)") as demo:
183
+ # Klein beetje stijl voor de tip-callout
184
+ gr.HTML("""
185
+ <style>
186
+ .callout {padding:12px 14px; border-left:4px solid #2563eb; background:#f1f5f9; border-radius:6px; margin: 8px 0 18px;}
187
+ .smallnote {font-size: 0.92em; opacity: 0.85;}
188
+ </style>
189
+ """)
190
+
191
  gr.Markdown("# PCA Biplot — Diabetes (NL labels)")
192
+ gr.Markdown(MEDICAL_MD)
193
 
194
  with gr.Row():
195
  with gr.Column(scale=1):
 
201
  n_components = gr.Slider(2, 10, value=10, step=1, label="Aantal PCA-componenten (voor variatieplot)")
202
  standardize = gr.Checkbox(value=True, label="Standaardiseer metingen (aanbevolen)")
203
  run_btn = gr.Button("Update visualisaties")
204
+ gr.HTML('<div class="callout smallnote">💡 *Tip:* kies links een meting (bijv. BMI of cholesterol) en klik daarna op <b>Update visualisaties</b>.</div>')
205
  with gr.Column(scale=2):
206
  plot_biplot = gr.Plot(label="PCA-biplot — punten + pijlen")
207
  plot_expl = gr.Plot(label="Uitlegvariantie per component")