Écart-type en Python
Calculez l'écart-type en Python avec le module statistics, NumPy et pandas, et découvrez ses applications concrètes en machine learning avec scikit-learn.
L'écart-type mesure la dispersion des valeurs autour de leur moyenne. C'est l'une des statistiques les plus utilisées en analyse de données et en machine learning — qu'il s'agisse de vérifier si un jeu de données suit une distribution normale ou de mettre à l'échelle des caractéristiques avant d'entraîner un modèle. Ce chapitre explique ce qu'est l'écart-type, comment le calculer en Python avec le module statistics, NumPy et pandas, et comment il s'intègre dans les workflows ML courants.
Qu'est-ce que l'écart-type ?
L'écart-type (σ pour une population, s pour un échantillon) quantifie la distance moyenne entre chaque point de données et la moyenne. Un écart-type petit signifie que les valeurs se regroupent étroitement autour de la moyenne ; un écart-type grand signifie qu'elles sont largement dispersées.
C'est la racine carrée de la variance :
variance = Σ(xᵢ − x̄)² / N # population
variance = Σ(xᵢ − x̄)² / (N − 1) # sample (Bessel's correction)
std dev = √varianceÉcart-type de population vs. d'échantillon
| Terme | Diviseur de la formule | Quand l'utiliser |
|---|---|---|
| Écart-type de population | N | Vous disposez de tous les points de données (ex. : toutes les notes d'une classe) |
| Écart-type d'échantillon | N − 1 | Vous avez un sous-ensemble et souhaitez estimer la population entière |
Le dénominateur N − 1 (correction de Bessel) corrige le biais introduit lors d'une estimation à partir d'un échantillon. En pratique, pour les grands jeux de données la différence est négligeable, mais elle est importante pour les petits échantillons.
Exemple de calcul manuel
data = [10, 20, 30, 40, 50]
mean = (10 + 20 + 30 + 40 + 50) / 5 = 30
Differences from mean: -20, -10, 0, 10, 20
Squared differences: 400, 100, 0, 100, 400
Population variance = (400 + 100 + 0 + 100 + 400) / 5 = 200
Sample variance = (400 + 100 + 0 + 100 + 400) / 4 = 250
Population std dev = √200 ≈ 14.14
Sample std dev = √250 ≈ 15.81Le module statistics
Le module statistics intégré à Python est la solution la plus simple pour calculer l'écart-type sur de petits jeux de données — aucune bibliothèque tierce n'est nécessaire.
stdev() lève une StatisticsError si vous passez moins de deux valeurs, car une liste d'un seul élément n'a pas de dispersion significative.
NumPy std()
NumPy est le choix standard pour travailler avec des arrays, des matrices ou de grands jeux de données. Sa fonction np.std() calcule par défaut l'écart-type de population (ddof=0). Passez ddof=1 pour obtenir l'écart-type d'échantillon à la place.
NumPy permet également de calculer l'écart-type selon un axe spécifique d'un array 2D, ce qui est utile lorsque chaque ligne est une observation et chaque colonne est une caractéristique :
import numpy as np
# 3 samples, 2 features
X = np.array([[1, 10],
[2, 20],
[3, 30]])
print(np.std(X, axis=0, ddof=1)) # std per feature: [1. 10.]
print(np.std(X, axis=1, ddof=1)) # std per sample: [6.36 6.36 6.36] (approx)pandas std() et describe()
Lorsque vos données se trouvent dans un DataFrame, pandas fournit std() directement sur n'importe quelle colonne ou sur l'ensemble du DataFrame. Par défaut, pandas utilise ddof=1 (écart-type d'échantillon), ce qui correspond à la convention de R.
import pandas as pd
temps = [72, 68, 75, 80, 65, 70, 78]
df = pd.DataFrame({"temperature": temps})
print(df["temperature"].std()) # 5.4116 (sample std, ddof=1)
print(df["temperature"].mean()) # 72.5714describe() vous donne un résumé statistique rapide incluant l'écart-type pour chaque colonne numérique :
import pandas as pd
df = pd.DataFrame({
"height_cm": [165, 170, 175, 160, 180],
"weight_kg": [55, 70, 80, 50, 90],
})
print(df.describe())La ligne std dans la sortie affiche l'écart-type d'échantillon pour chaque colonne :
height_cm weight_kg
count 5.000000 5.000000
mean 170.000000 69.000000
std 7.905694 16.733201
min 160.000000 50.000000
25% 165.000000 55.000000
50% 170.000000 70.000000
75% 175.000000 80.000000
max 180.000000 90.000000L'écart-type en machine learning
Mise à l'échelle des caractéristiques avec StandardScaler
Les caractéristiques brutes couvrent souvent des plages très différentes (âge en années vs. revenu en milliers). Les algorithmes tels que la régression linéaire, les SVM et les k-plus-proches-voisins sont sensibles à ce déséquilibre. La standardisation (aussi appelée normalisation par le score z) transforme chaque caractéristique de sorte qu'elle ait une moyenne = 0 et un écart-type = 1 :
z = (x − mean) / stdLe StandardScaler de scikit-learn applique cela automatiquement :
from sklearn.preprocessing import StandardScaler
import numpy as np
# 3 samples, 2 features
features = np.array([[1, 2],
[3, 4],
[5, 6]])
scaler = StandardScaler()
scaled = scaler.fit_transform(features)
print(scaled)
# [[-1.2247 -1.2247]
# [ 0. 0. ]
# [ 1.2247 1.2247]]Après la mise à l'échelle, chaque colonne a une moyenne de 0 et un écart-type de 1. Vous pouvez inspecter les paramètres appris ultérieurement :
print(scaler.mean_) # [3. 4.]
print(scaler.scale_) # [1.6330 1.6330]Comparaison de la variabilité entre groupes
L'écart-type vous aide à déterminer si deux groupes sont véritablement différents ou simplement bruités. Deux classes peuvent avoir une moyenne similaire mais différer considérablement en termes de dispersion :
import statistics
scores_a = [78, 80, 82, 79, 81] # consistent group
scores_b = [60, 100, 55, 95, 70] # high-variance group
print(f"Group A — mean: {statistics.mean(scores_a)}, std: {statistics.stdev(scores_a):.2f}")
# Group A — mean: 80, std: 1.58
print(f"Group B — mean: {statistics.mean(scores_b)}, std: {statistics.stdev(scores_b):.2f}")
# Group B — mean: 76, std: 20.43Le groupe A et le groupe B ont des moyennes similaires, mais l'écart-type du groupe B est environ 13× plus grand, ce qui indique des résultats bien moins prévisibles.
Détection d'anomalies avec les scores z
Un score z indique de combien d'écarts-types une valeur s'éloigne de la moyenne. Les valeurs avec |z| > 3 sont conventionnellement des candidates aux valeurs aberrantes :
import numpy as np
values = np.array([2.0, 2.5, 3.0, 2.8, 100.0, 2.2, 3.1])
mean = np.mean(values)
std = np.std(values, ddof=1)
z_scores = (values - mean) / std
print(z_scores.round(2))
# [-0.39 -0.38 -0.37 -0.37 2.27 -0.39 -0.36]La valeur 100.0 a un score z de 2,27, ce qui — compte tenu de la petite taille du jeu de données — se distingue déjà nettement comme une probable valeur aberrante.
Compréhension de l'incertitude du modèle
L'écart-type apparaît également lorsque vous évaluez un modèle sur plusieurs plis de validation croisée. Un écart-type élevé entre les plis suggère que le modèle est instable ou que les données ont une variance élevée. Consultez le chapitre sur la validation croisée pour une présentation complète.
Choisir le bon outil
| Situation | Outil recommandé |
|---|---|
| Calcul rapide, sans dépendances | statistics.stdev() / statistics.pstdev() |
| Opérations sur des arrays ou des matrices | numpy.std() |
| Statistiques sur des colonnes de DataFrame | pandas.DataFrame.std() |
| Prétraitement des caractéristiques ML | sklearn.preprocessing.StandardScaler |
Erreurs courantes
- Mauvais
ddof: NumPy utilise par défautddof=0(population) tandis que pandas utilise par défautddof=1(échantillon). Vérifiez toujours lequel vous avez besoin avant de comparer les résultats des deux bibliothèques. - Listes d'un seul élément :
statistics.stdev()lève une erreur ;np.std()renvoie0.0silencieusement. - Ajustement du scaler sur les données de test : appelez toujours
scaler.fit_transform()sur le jeu d'entraînement etscaler.transform()(pasfit_transform) sur le jeu de test. Ajuster sur les données de test fait fuiter des informations et gonfle les métriques de performance. Consultez le chapitre sur la séparation entraînement/test pour plus de détails. - Les valeurs aberrantes faussent l'écart-type : une seule valeur extrême peut augmenter considérablement l'écart-type, comme le montre l'exemple de détection d'anomalies ci-dessus. Pensez à vérifier d'abord la présence de valeurs aberrantes (voir le chapitre sur la distribution des données).
Chapitres associés
- Moyenne, médiane et mode — autres mesures de tendance centrale qui complètent l'écart-type
- Percentiles — mesures de dispersion basées sur le rang, robustes aux valeurs aberrantes
- Distribution normale des données — l'écart-type est le paramètre central de la distribution normale
- Mise à l'échelle — stratégies de mise à l'échelle des caractéristiques au-delà de la standardisation
- Distribution des données — visualiser la dispersion et identifier l'asymétrie