Comparaison automatisée d'algorithmes de clustering pour données de spatial proteomics / cytométrie
Project description
spatial-cluster-compare
Pipeline de comparaison automatisée d'algorithmes de clustering pour données de spatial proteomics, cytométrie ou tout tableau de features numériques.
Issu d'un notebook d'analyse (Comparaison_des_clusters.ipynb) et restructuré
en package réutilisable, dans le même esprit que macsima-qc.
Deux façons d'utiliser ce repo
notebooks/Comparaison_des_clusters.ipynb: le pipeline complet en notebook autonome, sans dépendance au package — pratique pour copier-coller le code directement dans ton propre environnement sans installer la lib.spatial_cluster_compare(le package) : la même logique encapsulée en fonctions réutilisables, testées, et installables viapip.
La documentation détaillée pas-à-pas (formules, justification biologique de chaque étape)
est disponible dans docs/02_comparaison_cluster.md.
Ce que fait le pipeline
- Test de clusterabilité (statistique de Hopkins) avant/après normalisation
- Normalisation conditionnelle : StandardScaler appliqué uniquement si cela améliore la structure de clusters
- Réduction de dimension (PCA, variance expliquée paramétrable)
- Sélection automatique de k via un score composite (Silhouette, Davies-Bouldin, Calinski-Harabasz)
- Benchmark multi-algorithmes : KMeans, Agglomerative, Spectral, GMM, DBSCAN (eps estimé automatiquement par la méthode du coude)
- Stabilité bootstrap (ARI moyen) pour chaque méthode
- Sélection automatique de la meilleure méthode selon un score composite normalisé
- Visualisations : bar chart comparatif des métriques, heatmap d'expression moyenne par cluster
Format des données attendues
Export depuis MACSiQView
Dans MACSiQView, l'onglet "Feature Table" permet de sélectionner les descripteurs
à inclure avant export .csv. Pour ce pipeline de clustering (contrairement à la QC de
segmentation morphologique décrite dans macsima-qc, qui exclut les intensités de
fluorescence), il faut au contraire sélectionner les intensités de biomarqueurs
(colonnes du type CD8 Biomarker Exp, CD74 Biomarker Exp, etc.), à l'exclusion ou non
des descripteurs morphologiques (Cell Size...) selon que tu veuilles les inclure dans
le clustering.
Structure du CSV
- Une ligne par cellule, une colonne par marqueur/descripteur.
- Les colonnes numériques (
float64/int64) sont automatiquement utilisées comme features de clustering viaselect_dtypes— pas besoin de les spécifier manuellement. - Les colonnes non numériques (ID, nom de ROI, métadonnées texte) sont ignorées automatiquement et n'ont pas besoin d'être supprimées au préalable.
- Attention : si une colonne numérique n'est pas un marqueur biologique (ex: un
Cell_IDentier, des coordonnées X/Y de centroïde), elle sera quand même incluse à tort dans le clustering. Dans ce cas, retire-la explicitement avant d'appelercompare_clusters, par exemple :data = data.drop(columns=["Cell_ID", "Centroid X", "Centroid Y"])
- Espaces parasites dans les noms de colonnes : MACSiQView peut générer des espaces en
début/fin de nom de colonne. Pense à nettoyer si besoin (
data.columns = data.columns.str.strip()), comme dans le protocole de QC de segmentation. - Valeurs manquantes (NaN) : non gérées automatiquement par le pipeline. Nettoyer
avant (
data.dropna()) ou imputer si certaines cellules ont des valeurs manquantes sur un ou plusieurs marqueurs. - Taille du jeu de données : prévoir au moins quelques centaines de cellules pour que la statistique de Hopkins et le bootstrap de stabilité (ARI) soient fiables. Spectral Clustering peut devenir lent au-delà de ~10-20k lignes.
Installation
pip install -e .
(Publication sur PyPI à faire plus tard, comme pour macsima-qc.)
Usage rapide
import pandas as pd
from spatial_cluster_compare import compare_clusters, plot_comparison_bars, plot_cluster_heatmap
data = pd.read_csv("Cluster_ImmuneCell.csv")
result = compare_clusters(data)
print(result.results_df)
print(f"Meilleure méthode : {result.best_method}")
plot_comparison_bars(result.results_df)
plot_cluster_heatmap(result.X_original, result.best_labels, method_name=result.best_method)
Usage avancé (étape par étape)
from spatial_cluster_compare import (
auto_scale, find_best_k, run_benchmark, select_best_method
)
from sklearn.decomposition import PCA
X = data.select_dtypes(include=["float64", "int64"])
X_best, report = auto_scale(X)
pca = PCA(n_components=0.9)
X_reduced = pca.fit_transform(X_best)
optimal_k, k_results = find_best_k(X_reduced, range(2, 10))
results_df, labels_per_method = run_benchmark(X_reduced, optimal_k=optimal_k)
best_method, best_labels = select_best_method(results_df, labels_per_method)
Correction apportée par rapport au notebook d'origine
Le notebook original référençait best_labels et best_method dans la
cellule de heatmap sans jamais les définir explicitement. La fonction
select_best_method corrige ce point en calculant un score composite
normalisé (Silhouette ↑, Davies-Bouldin ↓ inversé, Calinski-Harabasz ↑,
Stabilité ARI ↑) pour désigner objectivement la meilleure méthode.
Prochaines pistes
- Export PDF/figure automatique du rapport de comparaison
- Support de jeux de données multi-batch (comparaison de clustering entre runs)
- CLI (
spatial-cluster-compare run data.csv)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spatial_cluster_compare-0.1.1.tar.gz.
File metadata
- Download URL: spatial_cluster_compare-0.1.1.tar.gz
- Upload date:
- Size: 12.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7760c0161f621e128ba359e268f72dc0227df87b36d3e919293abe464dfaacbe
|
|
| MD5 |
024c0ad1f87415adbcf19caefe753f1e
|
|
| BLAKE2b-256 |
de52e0ae3690bcdbc7d72c6ef7628f0258aff0a7e6542cd4c194e880a7307816
|
Provenance
The following attestation bundles were made for spatial_cluster_compare-0.1.1.tar.gz:
Publisher:
publish.yml on mathisbouvet/spatial-cluster-compare
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spatial_cluster_compare-0.1.1.tar.gz -
Subject digest:
7760c0161f621e128ba359e268f72dc0227df87b36d3e919293abe464dfaacbe - Sigstore transparency entry: 1870296837
- Sigstore integration time:
-
Permalink:
mathisbouvet/spatial-cluster-compare@78a5d73a538f3f10db8496f39d5ea700958df05a -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/mathisbouvet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@78a5d73a538f3f10db8496f39d5ea700958df05a -
Trigger Event:
push
-
Statement type:
File details
Details for the file spatial_cluster_compare-0.1.1-py3-none-any.whl.
File metadata
- Download URL: spatial_cluster_compare-0.1.1-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d97076ff7164d37deb31262d420f91f41745cbd643faf889c35033708d3f44ef
|
|
| MD5 |
b54bbbe3120234e7a2921fa385bb3fb3
|
|
| BLAKE2b-256 |
f9333261a876a720cdd6d310105c5cb9c8acf68e2c0b45771f5ccbab4d62966b
|
Provenance
The following attestation bundles were made for spatial_cluster_compare-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on mathisbouvet/spatial-cluster-compare
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spatial_cluster_compare-0.1.1-py3-none-any.whl -
Subject digest:
d97076ff7164d37deb31262d420f91f41745cbd643faf889c35033708d3f44ef - Sigstore transparency entry: 1870297000
- Sigstore integration time:
-
Permalink:
mathisbouvet/spatial-cluster-compare@78a5d73a538f3f10db8496f39d5ea700958df05a -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/mathisbouvet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@78a5d73a538f3f10db8496f39d5ea700958df05a -
Trigger Event:
push
-
Statement type: