ML Learning Hub
Fondationsdébutant

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.

35 min
6 diagrammes
7 Concepts Couverts

Concepts Couverts

NumPy ArraysBroadcastingPandas DataFrameEDAMatplotlibSeabornVectorization

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

Loading visualization…
🎯

Pourquoi Cette Pile Avant Tout

motivation

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

algorithm
1

Création de tableaux : np.array(), np.zeros(), np.ones(), np.linspace(), np.arange(), np.random.randn()

2

Manipulation de forme : .reshape(), .T (transposé), np.concatenate(), np.stack(), np.squeeze()

3

Maths vectorisées : +, -, *, / diffusent élément par élément ; np.dot() / @ pour la multiplication matricielle

4

Indexation : arr[2:5], arr[arr > 0] (masque booléen), arr[:, 0] (tranche colonne)

5

Agrégations : .sum(), .mean(), .std(), .max(), .argmax() — tous acceptent le paramètre axis=

6

Règle de diffusion : aligner les formes par la droite, les dimensions doivent correspondre ou être 1

</>

NumPy, Pandas & Matplotlib — Workflow Complet

code
python63 lines
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

class="tok-comment"># ── NumPy : tableaux, broadcasting, opérations vectorisées ───────────────────
X = np.random.randn(class="tok-num">1000, class="tok-num">5)          class="tok-comment"># class="tok-num">1000 échantillons, class="tok-num">5 variables
y = class="tok-num">2*X[:,class="tok-num">0] - X[:,class="tok-num">1] + class="tok-num">0.5*np.random.randn(class="tok-num">1000)

print(X.shape, X.dtype)               class="tok-comment"># (class="tok-num">1000, class="tok-num">5) float64
print(X.mean(axis=class="tok-num">0).round(class="tok-num">3))        class="tok-comment"># moyennes par variable ≈ class="tok-num">0
print(X.std(axis=class="tok-num">0).round(class="tok-num">3))         class="tok-comment"># écarts-types par variable ≈ class="tok-num">1

class="tok-comment"># Broadcasting : soustraire la moyenne et diviser par l'écart-type (StandardScaler manuel)
X_scaled = (X - X.mean(axis=class="tok-num">0)) / X.std(axis=class="tok-num">0)

class="tok-comment"># Multiplication matricielle : X @ W où W est class="tok-num">5×class="tok-num">2
W = np.random.randn(class="tok-num">5, class="tok-num">2)
Z = X_scaled @ W                       class="tok-comment"># forme (class="tok-num">1000, class="tok-num">2)

class="tok-comment"># Indexation booléenne
high_income = X[X[:,class="tok-num">0] > class="tok-num">1.0]         class="tok-comment"># lignes où la variable class="tok-num">0 > class="tok-num">1σ
print(fclass="tok-str">"Lignes à revenu élevé : {len(high_income)}")

class="tok-comment"># ── Pandas : DataFrames, EDA ─────────────────────────────────────────────────
df = pd.DataFrame(X, columns=[fclass="tok-str">"var_{i}" for i in range(class="tok-num">5)])
df[class="tok-str">"cible"] = y

class="tok-comment"># EDA rapide
print(df.describe().round(class="tok-num">2))          class="tok-comment"># count, mean, std, quartiles
print(df.isnull().sum())               class="tok-comment"># vérifier les valeurs manquantes
print(df.dtypes)

class="tok-comment"># Exemple de groupby
df[class="tok-str">"groupe"] = np.where(df[class="tok-str">"var_0"] > class="tok-num">0, class="tok-str">"élevé", class="tok-str">"faible")
print(df.groupby(class="tok-str">"groupe")[class="tok-str">"cible"].agg([class="tok-str">"mean",class="tok-str">"std"]).round(class="tok-num">3))

class="tok-comment"># Corrélations
corr = df.drop(columns=class="tok-str">"groupe").corr()
print(corr[class="tok-str">"cible"].sort_values(ascending=False).round(class="tok-num">3))

class="tok-comment"># ── Matplotlib / Seaborn : visualisation ─────────────────────────────────────
fig, axes = plt.subplots(class="tok-num">1, class="tok-num">3, figsize=(class="tok-num">15, class="tok-num">4))

class="tok-comment"># class="tok-num">1. Distribution de la cible
axes[class="tok-num">0].hist(df[class="tok-str">"cible"], bins=class="tok-num">50, color=class="tok-str">"class="tok-comment">#6c63ff", alpha=class="tok-num">0.8, edgecolor=class="tok-str">"white")
axes[class="tok-num">0].set_title(class="tok-str">"Distribution de la cible")
axes[class="tok-num">0].set_xlabel(class="tok-str">"y")

class="tok-comment"># class="tok-num">2. Nuage de points + droite de régression
axes[class="tok-num">1].scatter(df[class="tok-str">"var_0"], df[class="tok-str">"cible"], alpha=class="tok-num">0.3, s=class="tok-num">10, color=class="tok-str">"class="tok-comment">#06b6d4")
m, b = np.polyfit(df[class="tok-str">"var_0"], df[class="tok-str">"cible"], class="tok-num">1)
x_line = np.linspace(-class="tok-num">3, class="tok-num">3, class="tok-num">100)
axes[class="tok-num">1].plot(x_line, m*x_line + b, color=class="tok-str">"class="tok-comment">#ff6b6b", lw=class="tok-num">2, label=fclass="tok-str">"pente={m:.2f}")
axes[class="tok-num">1].set_title(class="tok-str">"Variable class="tok-num">0 vs Cible")
axes[class="tok-num">1].legend()

class="tok-comment"># class="tok-num">3. Carte de chaleur des corrélations
sns.heatmap(corr, annot=True, fmt=class="tok-str">".2f", cmap=class="tok-str">"coolwarm",
            center=class="tok-num">0, ax=axes[class="tok-num">2], cbar=False)
axes[class="tok-num">2].set_title(class="tok-str">"Matrice de corrélation")

plt.tight_layout()
⚠️

Les Bugs NumPy Les Plus Courants

pitfall

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 ingénieur IA ou data scientist ?

Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.