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() |
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() |
Références
Liens | Site |
---|---|
Percentile | en.wikipedia.org |
numpy.percentile | numpy.org |
statistics.quantiles | docs.python.org |
scipy.stats.scoreatpercentile | docs.scipy.org |