Stack Python ML : NumPy, Pandas & Matplotlib
“Votre boîte à outils data science — NumPy, Pandas, Matplotlib et le flux de travail Jupyter”
Maîtrisez les outils quotidiens — NumPy, Pandas DataFrames et Matplotlib/Seaborn. La fondation sur laquelle tout le reste repose.
Concepts Couverts
∑Formules Clés
Moyenne Vectorisée
np.mean(X) — NumPy calcule cela en C, des ordres de grandeur plus rapide qu'une boucle Python
Broadcasting
NumPy étire le petit tableau selon la dimension manquante — évite les boucles explicites
Corrélation de Pearson
np.corrcoef(X,Y) — mesure la dépendance linéaire entre deux variables
▶Simulation Interactive
Pourquoi Cette Pile Avant Tout
Chaque framework ML — scikit-learn, PyTorch, TensorFlow, JAX — repose sur les tableaux NumPy. Comprendre comment les tableaux fonctionnent en mémoire (disposition C contiguë, dtype, strides) est la différence entre écrire des boucles Python en O(n²) et des opérations NumPy vectorisées en O(n) qui s'exécutent à la vitesse du C. Pandas vous donne des DataFrames étiquetés pour les données réelles désordonnées, et Matplotlib/Seaborn vous permettent de voir ce qui se passe avant de modéliser. L'écosystème ML tout entier parle NumPy — le maîtriser, c'est maîtriser la lingua franca.
Une boucle Python sur 10 millions de nombres prend ~4 secondes. np.sum() prend ~8ms — 500× plus rapide. C'est crucial lors du calcul des gradients sur un réseau de neurones.
Essentiels NumPy — Ce Dont Vous Avez Vraiment Besoin
Création de tableaux : np.array(), np.zeros(), np.ones(), np.linspace(), np.arange(), np.random.randn()
Manipulation de forme : .reshape(), .T (transposé), np.concatenate(), np.stack(), np.squeeze()
Maths vectorisées : +, -, *, / diffusent élément par élément ; np.dot() / @ pour la multiplication matricielle
Indexation : arr[2:5], arr[arr > 0] (masque booléen), arr[:, 0] (tranche colonne)
Agrégations : .sum(), .mean(), .std(), .max(), .argmax() — tous acceptent le paramètre axis=
Règle de diffusion : aligner les formes par la droite, les dimensions doivent correspondre ou être 1
NumPy, Pandas & Matplotlib — Workflow Complet
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # ── NumPy : tableaux, broadcasting, opérations vectorisées ─────────────────── X = np.random.randn(1000, 5) # 1000 échantillons, 5 variables y = 2*X[:,0] - X[:,1] + 0.5*np.random.randn(1000) print(X.shape, X.dtype) # (1000, 5) float64 print(X.mean(axis=0).round(3)) # moyennes par variable ≈ 0 print(X.std(axis=0).round(3)) # écarts-types par variable ≈ 1 # Broadcasting : soustraire la moyenne et diviser par l'écart-type (StandardScaler manuel) X_scaled = (X - X.mean(axis=0)) / X.std(axis=0) # Multiplication matricielle : X @ W où W est 5×2 W = np.random.randn(5, 2) Z = X_scaled @ W # forme (1000, 2) # Indexation booléenne high_income = X[X[:,0] > 1.0] # lignes où la variable 0 > 1σ print(f"Lignes à revenu élevé : {len(high_income)}") # ── Pandas : DataFrames, EDA ───────────────────────────────────────────────── df = pd.DataFrame(X, columns=[f"var_{i}" for i in range(5)]) df["cible"] = y # EDA rapide print(df.describe().round(2)) # count, mean, std, quartiles print(df.isnull().sum()) # vérifier les valeurs manquantes print(df.dtypes) # Exemple de groupby df["groupe"] = np.where(df["var_0"] > 0, "élevé", "faible") print(df.groupby("groupe")["cible"].agg(["mean","std"]).round(3)) # Corrélations corr = df.drop(columns="groupe").corr() print(corr["cible"].sort_values(ascending=False).round(3)) # ── Matplotlib / Seaborn : visualisation ───────────────────────────────────── fig, axes = plt.subplots(1, 3, figsize=(15, 4)) # 1. Distribution de la cible axes[0].hist(df["cible"], bins=50, color="#6c63ff", alpha=0.8, edgecolor="white") axes[0].set_title("Distribution de la cible") axes[0].set_xlabel("y") # 2. Nuage de points + droite de régression axes[1].scatter(df["var_0"], df["cible"], alpha=0.3, s=10, color="#06b6d4") m, b = np.polyfit(df["var_0"], df["cible"], 1) x_line = np.linspace(-3, 3, 100) axes[1].plot(x_line, m*x_line + b, color="#ff6b6b", lw=2, label=f"pente={m:.2f}") axes[1].set_title("Variable 0 vs Cible") axes[1].legend() # 3. Carte de chaleur des corrélations sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", center=0, ax=axes[2], cbar=False) axes[2].set_title("Matrice de corrélation") plt.tight_layout()
Les Bugs NumPy Les Plus Courants
1) Incompatibilité de forme : (100,) ≠ (100,1). Vérifiez toujours .shape avant les opérations matricielles. 2) Division entière : attention avec les tableaux dtype=int. 3) Copie vs vues : arr[0:5] retourne une VUE — le modifier modifie l'original. Utilisez .copy() pour être sûr. 4) En-place vs hors-place : X *= 2 modifie X sur place ; Y = X * 2 crée un nouveau tableau. 5) Propagation des NaN : np.mean([1,2,np.nan]) = NaN. Utilisez np.nanmean() pour des agrégations sûres.
np.shares_memory(a, b) vous indique si deux tableaux partagent des données sous-jacentes — crucial à savoir quand vous 'copiez' des tranches.
?Vérification des Connaissances
La progression est sauvegardée dans votre navigateur — aucun compte requis.
Besoin d'un Data Scientist ou Ingénieur IA ?
Je construis des modèles ML sur mesure, des chatbots RAG, des pipelines de données et des APIs en production — de l'analyse au déploiement.