La technologie de séquençage de cellules uniques a transformé la recherche en biologie. La bibliothèque Python Scanpy offre une solution complète et performante pour analyser ces données complexes. Ce guide couvre les fondamentaux de Scanpy pour mener une analyse complète.
Configuration initiale
L'installation se fait via pip. Assurez-vous d'avoir un enivronnement Python avec numpy, pandas et matplotlib. ``` pip install scanpy
### Chargement et inspection des données
Scanpy utilise l'objet AnnData pour stocker les données, les métadonnées cellulaires et les annotations des gènes. ```
import scanpy as sc
import numpy as np
# Charger un jeu de données de démonstration
data_obj = sc.datasets.pbmc68k_reduced()
# Inspecter la structure
print(data_obj.shape) # Nombre de cellules et de gènes
print(data_obj.var_names[:5]) # Noms des premiers gènes
Contrôle qualité et prétraitement
La première étape cruciale est de filtrer les cellules de basse qualité et les gènes non exprimés. ```
Calculer des métriques de contrôle qualité
sc.pp.calculate_qc_metrics(data_obj, percent_top=None, log1p=False, inplace=True)
Appliquer des seuils de filtrage
data_obj = data_obj[data_obj.obs.n_genes_by_counts < 2500, :] data_obj = data_obj[data_obj.obs.pct_counts_mt < 5, :]
Filtrer les gènes présents dans peu de cellules
sc.pp.filter_genes(data_obj, min_cells=10)
### Normalisation et sélection des gènes variables
La normalisation permet de rendre les comptages comparables entre cellules. ```
# Normaliser la profondeur de séquençage par cellule
sc.pp.normalize_total(data_obj, target_sum=1e4)
# Appliquer une transformation logarithmique
sc.pp.log1p(data_obj)
# Identifier les gènes hautement variables
sc.pp.highly_variable_genes(data_obj, min_mean=0.0125, max_mean=3, min_disp=0.5)
# Sauvegarder l'état complet et sous-ensemble sur les gènes variables
data_obj.raw = data_obj
data_obj = data_obj[:, data_obj.var.highly_variable]
Réduction de dimensionnalité
L'Analyse en Composantse Principales (ACP) réduit la dimensionnalité tout en préservant la variance. ```
Mettre à l'échelle les données (moyenne=0, variance=1)
sc.pp.scale(data_obj, max_value=10)
Calculer les composantes principales
sc.tl.pca(data_obj, svd_solver='arpack')
Visualiser la variance expliquée par chaque PC
sc.pl.pca_variance_ratio(data_obj, log=True)
### Clustering cellulaire
La construction d'un graphe de voisinage et l'algoirthme de clustering Leiden permettent d'identifier les populations cellulaires. ```
# Construire le graphe de voisinage (k plus proches voisins)
sc.pp.neighbors(data_obj, n_neighbors=10, n_pcs=40)
# Appliquer le clustering Leiden
sc.tl.leiden(data_obj, resolution=0.5)
# Réduire les dimensions pour la visualisation
sc.tl.umap(data_obj)
# Visualiser les clusters
sc.pl.umap(data_obj, color=['leiden'], palette='Set2')
Analyse des gènes marqueurs
Identifier les gènes surexprimés dans chaque cluster permet de caractériser leur identité biologique. ```
Test statistique de Wilcoxon pour chaque cluster
sc.tl.rank_genes_groups(data_obj, groupby='leiden', method='wilcoxon')
Afficher les 3 meilleurs gènes par cluster
sc.pl.rank_genes_groups(data_obj, n_genes=3, sharey=False)
### Intégration de données et correction de batch
Lorsque l'on combine des échantillons multiples, il est essentiel de corriger les effets techniques. ```
# Simulation d'un effet de batch
data_obj.obs['batch'] = np.random.choice(['laboratoire_A', 'laboratoire_B'], size=data_obj.n_obs)
# Correction par la méthode ComBat
sc.pp.combat(data_obj, key='batch')
Analyse de trajectoire cellulaire
Pour les données dynamiques, comme la différenciation, on peut inférer une trajectoire. ```
Calculer une carte de diffusion
sc.tl.diffmap(data_obj)
Définir une cellule racine (par exemple, basée sur un marqueur)
root_cell_index = np.flatnonzero(data_obj.obs['leiden'] == '0')[0] data_obj.uns['iroot'] = root_cell_index
Calculer la pseudotemps via diffusion
sc.tl.dpt(data_obj) sc.pl.umap(data_obj, color=['dpt_pseudotime'], cmap='viridis')
### Visualisation avancée
Combinez plusieurs informations sur une seule figure pour une interprétation riche. ```
# Graphique composé
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
sc.pl.umap(data_obj, color='leiden', ax=axes[0], show=False)
sc.pl.umap(data_obj, color='CST3', ax=axes[1], show=False)
plt.tight_layout()
Conseils pour les grands jeux de données
Utilisez des formats de stockage efficaces et l'analyse par blocs pour gérer les contraintes mémoire. ```
Sauvegarder/charger en format HDF5 compact
data_obj.write('mon_analyse.h5ad') data_obj = sc.read_h5ad('mon_analyse.h5ad')
Pour un accès à un fichier sans tout charger en mémoire
data_obj = sc.read('mon_fichier_geant.h5ad', backed='r')
### Interprétation biologique
Les clusters et les gènes marqueurs doivent être confrontés à la littérature et à des bases de données de marqueurs cellulaires (ex. CellTypist pour les cellules immunitaires). L'annotation n'est pas automatique et requiert une expertise du domaine.