W3docs

É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

TermeDiviseur de la formuleQuand l'utiliser
Écart-type de populationNVous disposez de tous les points de données (ex. : toutes les notes d'une classe)
Écart-type d'échantillonN − 1Vous 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.81

Le 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.

python— editable, runs on the server

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.

python— editable, runs on the server

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.5714

describe() 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.000000

L'é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) / std

Le 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.43

Le 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

SituationOutil recommandé
Calcul rapide, sans dépendancesstatistics.stdev() / statistics.pstdev()
Opérations sur des arrays ou des matricesnumpy.std()
Statistiques sur des colonnes de DataFramepandas.DataFrame.std()
Prétraitement des caractéristiques MLsklearn.preprocessing.StandardScaler

Erreurs courantes

  • Mauvais ddof : NumPy utilise par défaut ddof=0 (population) tandis que pandas utilise par défaut ddof=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() renvoie 0.0 silencieusement.
  • Ajustement du scaler sur les données de test : appelez toujours scaler.fit_transform() sur le jeu d'entraînement et scaler.transform() (pas fit_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

Was this page helpful?