Analyse de données de cellules uniques avec Scanpy : guide pratique

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.

Étiquettes: Python Scanpy single-cell RNA-seq clustering UMAP

Publié le 20 juin à 23h05