Le module statistics en Python

@joekakone

Joseph Konka @joekakone

03/03/2026 · 10 min

Calculez des indicateurs statistiques descriptifs en Python sans bibliothèque externe : tendance centrale (mean, median, mode), dispersion (stdev, variance), quantiles et régression linéaire native.

Le module statistics en langage Python#

Dans les projets de data analytics et de veille décisionnelle (Business Intelligence), il est souvent nécessaire de calculer des métriques statistiques sans vouloir installer des bibliothèques externes lourdes comme NumPy ou SciPy.

Introduit pour répondre à ce besoin, le module standard statistics propose des fonctions rigoureuses et précises pour l'analyse descriptive de séries de données numériques.


1. Mesures de tendance centrale#

Ces indicateurs résument une série statistique par une valeur centrale représentative :

import statistics

salaires = [2200, 2400, 2500, 2500, 2700, 3100, 9500]

# 1. Moyenne arithmétique : mean() et fmean() (optimisée pour les flottants)
moyenne = statistics.mean(salaires)
print(f"Moyenne      : {moyenne:.2f} EUR")  # 3557.14 EUR (fortement distordue par le salaire à 9500)

# 2. Médiane : median() (valeur coupant la population en deux moitiés égales à 50%)
mediane = statistics.median(salaires)
print(f"Mediane      : {mediane:.2f} EUR")  # 2500.00 EUR (robuste face aux valeurs extrêmes !)

# 3. Mode : mode() et multimode() (la valeur la plus fréquemment observée)
mode_val = statistics.mode(salaires)
print(f"Mode         : {mode_val} EUR")    # 2500 EUR

Moyennes spécialisées : Géométrique et Harmonique#

  • statistics.geometric_mean() : idéale pour calculer le taux de croissance moyen d'un portefeuille financier ou d'une population.
  • statistics.harmonic_mean() : indispensable pour faire la moyenne de ratios ou de vitesses (ex: vitesse moyenne d'un trajet aller-retour).
# Taux de rendement annuels (+10%, +25%, +5%)
rendements = [1.10, 1.25, 1.05]
taux_moyen = statistics.geometric_mean(rendements)
print(f"Facteur de croissance annuel moyen : {taux_moyen:.4f}")

2. Mesures de dispersion : Population vs Échantillon#

[!CAUTION] Le piège statistique classique : Population (\(N\)) vs Échantillon (\(N-1\))
- Si vous disposez de l'intégralité de la population, utilisez les fonctions préfixées par p : pvariance() et pstdev() (division par \(N\)). - Si vos données proviennent d'un échantillon représentatif, utilisez les estimateurs sans biais : variance() et stdev() (correction de Bessel avec division par \(N - 1\)).

echantillon_notes = [12, 14, 15, 10, 18, 16]

# Variance et Écart-type d'échantillon
var_ech = statistics.variance(echantillon_notes)
ecart_type = statistics.stdev(echantillon_notes)

print(f"Variance d'echantillon (s^2) : {var_ech:.3f}")
print(f"Ecart-type d'echantillon (s) : {ecart_type:.3f} points")

3. Quantiles et détection des valeurs aberrantes (Outliers)#

La fonction statistics.quantiles(data, n=4) découpe la distribution ordonnée en n intervalles équiprobables. Par défaut, avec n=4, elle calcule les quartiles (\(Q_1\), \(Q_2 = \text{médiane}\), \(Q_3\)) :

import statistics

mesures = [15, 18, 21, 22, 25, 26, 29, 32, 35, 41, 95]

# Découpage en 4 quartiles
q1, q2, q3 = statistics.quantiles(mesures, n=4)
iqr = q3 - q1  # Écart interquartile (Interquartile Range)

print(f"Q1 (25%) : {q1:.1f}")
print(f"Q2 (50%) : {q2:.1f}")
print(f"Q3 (75%) : {q3:.1f}")
print(f"Ecart interquartile (IQR) : {iqr:.1f}")

# Règle de Tukey pour détecter les anomalies (Outliers)
seuil_haut = q3 + 1.5 * iqr
valeurs_aberrantes = [x for x in mesures if x > seuil_haut]
print("Valeurs aberrantes detectees :", valeurs_aberrantes)  # [95]

4. Corrélation et Régression Linéaire (Python 3.10+)#

Depuis Python 3.10, le module permet de modéliser directement une relation linéaire entre deux variables :

import statistics

# Relation entre heures de révision (x) et note obtenue à l'examen (y)
heures = [2, 4, 5, 7, 8, 10, 12]
notes = [9, 11, 13, 14, 16, 17, 19]

# 1. Coefficient de corrélation linéaire de Pearson (-1 à +1)
r = statistics.correlation(heures, notes)
print(f"Coefficient de correlation : r = {r:.4f}")  # ~ 0.99 (forte corrélation positive)

# 2. Droite de régression linéaire y = pente * x + ordonnee
reg = statistics.linear_regression(heures, notes)
print(f"Equation de la droite : y = {reg.slope:.2f} * x + {reg.intercept:.2f}")

# Prédiction pour un étudiant qui réviserait 6 heures
note_predite = reg.slope * 6 + reg.intercept
print(f"Note estimee pour 6 heures d'etude : {note_predite:.1f} / 20")

5. Mise en pratique : Analyse descriptive d'un dataset de vente#

import statistics

prix_produits = [19.99, 24.50, 24.50, 49.00, 15.00, 89.90, 120.00, 35.00, 42.00]

print("=== TABLEAU DE BORD STATISTIQUE DU CATALOGUE ===")
print(f"Nombre de references : {len(prix_produits)}")
print(f"Moyenne arithmetique : {statistics.fmean(prix_produits):>8.2f} EUR")
print(f"Mediane (50% seuil)  : {statistics.median(prix_produits):>8.2f} EUR")
print(f"Mode (prix populaire): {statistics.mode(prix_produits):>8.2f} EUR")
print(f"Ecart-type (stdev)   : {statistics.stdev(prix_produits):>8.2f} EUR")

q1, q2, q3 = statistics.quantiles(prix_produits, n=4)
print(f"25% des articles coutent moins de : {q1:.2f} EUR")
print(f"75% des articles coutent moins de : {q3:.2f} EUR")

6. Défi d'application#

Écrivez une fonction standardiser_donnees(data: list[float]) -> list[float] qui calcule les scores Z (Z-scores) d'un échantillon selon la formule : $\(z_i = \frac{x_i - \bar{x}}{s}\)$ où \(\bar{x}\) est la moyenne et \(s\) l'écart-type de la série. Vérifiez que la liste résultante possède une moyenne proche de 0 et un écart-type égal à 1.

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue