Comment calculer des percentiles avec Python ?

Published: 03 décembre 2024

Tags: Statistiques;

DMCA.com Protection Status

Introduction

Les percentiles sont une mesure statistique utile qui indique la valeur en dessous de laquelle un certain pourcentage des données d’un ensemble tombe. Dans de nombreuses tâches d’analyse de données, notamment dans les domaines comme la finance, l’apprentissage automatique et la météorologie, les percentiles permettent de résumer les données et d’identifier les valeurs aberrantes ou les tendances.

Deux bibliothèques courantes utilisées pour calculer les percentiles en Python sont :
- NumPy : Un package fondamental pour le calcul numérique.
- SciPy : Basé sur NumPy, il offre des fonctionnalités supplémentaires pour le calcul scientifique.

Ce guide explique comment calculer des percentiles en Python en utilisant les bibliothèques NumPy et SciPy.

Qu'est-ce qu'un percentile ?

Un percentile représente un point dans vos données où un certain pourcentage des points de données se situent en dessous. Par exemple :
- Le 25ᵉ percentile (également appelé premier quartile) signifie que 25 % des données sont inférieures à cette valeur.
- Le 50ᵉ percentile (la médiane) indique que 50 % des données se situent en dessous de cette valeur.
- Le 90ᵉ percentile signifie que 90 % des données sont inférieures à cette valeur, etc.

Utiliser NumPy

La façon la plus simple de calculer des percentiles est d’utiliser la fonction percentile() de NumPy. Voici comment :

Exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import numpy as np

# Ensemble de données
data = [23, 45, 16, 78, 55, 34, 89, 22, 10, 67]

# Calcul des percentiles 25ᵉ, 50ᵉ (médiane) et 90ᵉ
percentile_25 = np.percentile(data, 25)
percentile_50 = np.percentile(data, 50)
percentile_90 = np.percentile(data, 90)

print(f"25ᵉ Percentile : {percentile_25}")
print(f"50ᵉ Percentile (Médiane) : {percentile_50}")
print(f"90ᵉ Percentile : {percentile_90}")

Résultat :

1
2
3
25 Percentile : 22.25  
50 Percentile (Médiane) : 34.5  
90 Percentile : 78.3

Dans cet exemple, la fonction np.percentile() prend deux arguments :
- L’ensemble de données (liste, tableau ou série).
- Le percentile souhaité (par ex., 25 pour le 25ᵉ percentile).

NumPy permet également de spécifier différentes méthodes d’interpolation pour le calcul des percentiles lorsque les données ne correspondent pas exactement au percentile désiré.

1
2
3
4
5
6
# En utilisant différentes méthodes d'interpolation
np.percentile(data, 25, interpolation='linear')   # par défaut
np.percentile(data, 25, interpolation='nearest')  # point de données le plus proche
np.percentile(data, 25, interpolation='lower')    # point de données inférieur
np.percentile(data, 25, interpolation='higher')   # point de données supérieur
np.percentile(data, 25, interpolation='midpoint') # moyenne des points les plus proches

Utiliser statistics.quantiles()

La fonction quantiles() du module Python intégré statistics peut également être utilisée pour calculer les percentiles. Bien que cette fonction soit principalement utilisée pour calculer des quantiles (qui divisent les données en parties égales), vous pouvez spécifier des positions correspondant aux percentiles souhaités.

Syntaxe :

1
statistics.quantiles(data, n, method='exclusive')
  • data : Ensemble de données (liste, tableau, etc.).
  • n : Nombre de quantiles pour diviser les données (par exemple, 100 pour les percentiles).
  • method : Méthode d’interpolation pour calculer les quantiles ('exclusive' ou 'inclusive').

Exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import statistics as stats

# Ensemble de données
data = [23, 45, 16, 78, 55, 34, 89, 22, 10, 67]

# Calcul des percentiles
percentiles = stats.quantiles(data, n=100)

# 25ᵉ percentile à la position 24, 50ᵉ à 49, etc.
percentile_25 = percentiles[24]
percentile_50 = percentiles[49]
percentile_75 = percentiles[74]

print(f"25ᵉ Percentile : {percentile_25}")
print(f"50ᵉ Percentile (Médiane) : {percentile_50}")
print(f"75ᵉ Percentile : {percentile_75}")

Résultat :

1
2
3
25 Percentile : 22.25  
50 Percentile (Médiane) : 34.5  
75 Percentile : 55.0

Différence entre quantiles() et percentile() (NumPy)

  • NumPy percentile() : Calcule directement les percentiles en fonction des pourcentages spécifiques fournis.
  • statistics.quantiles() : Divise les données en un nombre spécifié de groupes égaux (par exemple, 100 pour les percentiles), mais nécessite une extraction manuelle des positions.

Utiliser SciPy

SciPy propose également la fonction scoreatpercentile() dans le module scipy.stats. Bien que moins utilisée que NumPy, elle offre des fonctionnalités similaires.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from scipy import stats

# Ensemble de données
data = [23, 45, 16, 78, 55, 34, 89, 22, 10, 67]

# Calcul des percentiles
percentile_25 = stats.scoreatpercentile(data, 25)
percentile_50 = stats.scoreatpercentile(data, 50)
percentile_90 = stats.scoreatpercentile(data, 90)

print(f"25ᵉ Percentile : {percentile_25}")
print(f"50ᵉ Percentile (Médiane) : {percentile_50}")
print(f"90ᵉ Percentile : {percentile_90}")

Résultat :

1
2
3
25 Percentile : 22.25  
50 Percentile (Médiane) : 34.5  
90 Percentile : 78.3

Visualiser les percentiles avec Matplotlib

Pour mieux comprendre la relation entre les percentiles et la distribution des données, il est utile de les visualiser. Voici un exemple de tracé d’un histogramme avec des lignes verticales pour les percentiles.

Exemple 1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np
import matplotlib.pyplot as plt

# Données échantillon
data = [23, 45, 16, 78, 55, 34, 89, 22, 10, 67]

# Calcul des percentiles
percentile_25 = np.percentile(data, 25)
percentile_50 = np.percentile(data, 50)
percentile_90 = np.percentile(data, 90)

# Tracé de l'histogramme
plt.hist(data, bins=10, edgecolor='black', alpha=0.7)

# Lignes verticales pour les percentiles
plt.axvline(percentile_25, color='r', linestyle='dashed', linewidth=1, label='25ᵉ Percentile')
plt.axvline(percentile_50, color='g', linestyle='dashed', linewidth=1, label='50ᵉ Percentile (Médiane)')
plt.axvline(percentile_90, color='b', linestyle='dashed', linewidth=1, label='90ᵉ Percentile')

# Étiquettes
plt.title('Distribution des données avec les percentiles')
plt.xlabel('Valeur')
plt.ylabel('Fréquence')
plt.legend()

# Afficher
plt.show()

Comment calculer des percentiles avec Python ?
Comment calculer des percentiles avec Python ?

Exemple 2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import numpy as np
import matplotlib.pyplot as plt

# Generate a normally distributed dataset
np.random.seed(42)  # For reproducibility
data = np.random.normal(loc=0, scale=1, size=50000)  # Mean=0, Std Dev=1, 50000 points

# Calculate percentiles
percentiles = {
    "-3σ (0.13%)": np.percentile(data, 0.13),
    "-2σ (2.28%)": np.percentile(data, 2.28),
    "-1σ (15.87%)": np.percentile(data, 15.87),
    "Mean (50%)": np.percentile(data, 50),
    "+1σ (84.13%)": np.percentile(data, 84.13),
    "+2σ (97.72%)": np.percentile(data, 97.72),
    "+3σ (99.87%)": np.percentile(data, 99.87),
}

# Plot the histogram
plt.figure(figsize=(10, 6))
plt.hist(data, bins=50, edgecolor='black', alpha=0.7, color='skyblue')

# Add vertical lines for percentiles and place corresponding labels
for label, value in percentiles.items():
    plt.axvline(value, color='red', linestyle='dashed', linewidth=1)
    plt.text(value, 1500, label, color='black', rotation=90, verticalalignment='bottom', horizontalalignment='center')

# Labeling
plt.title('Normally Distributed Data with Percentiles and σ (Standard Deviation)')
plt.xlabel('Value')
plt.ylabel('Frequency')

# Save plot
plt.savefig("How_to_Calculate_Percentiles_with_Python_Fig_02.png", bbox_inches='tight', dpi=200)

# Show plot
plt.tight_layout()
plt.show()

Comment calculer des percentiles avec Python ?
Comment calculer des percentiles avec Python ?

Références

Liens Site
Percentile en.wikipedia.org
numpy.percentile numpy.org
statistics.quantiles docs.python.org
scipy.stats.scoreatpercentile docs.scipy.org
Image

of