Python >> Tutoriel Python >  >> Python

Comment calculer les centiles en Python

Cet article traite du calcul des centiles. Les centiles sont des indicateurs statistiques utilisés pour décrire des portions spécifiques d'un échantillon de population. Les sections suivantes expliquent ce que sont les centiles, à quoi ils servent et comment les calculer à l'aide de Python. Comme vous le verrez, Python permet de résoudre ce problème de plusieurs manières, soit en définissant manuellement une fonction, soit en exploitant Numpy .

Que sont les centiles ?

Les centiles sont des indicateurs statistiques qui sont souvent utilisés pour identifier une certaine partie d'un échantillon de population. Plus précisément, nous utilisons un centile pour indiquer la valeur (de la variable considérée) en dessous de laquelle se situe un pourcentage spécifique de l'échantillon de population. Par exemple, si nous considérons la répartition par taille de tous les Anglais vivant au Royaume-Uni ; en disant que la valeur de hauteur de 180 cm identifie le 65 e centile, cela signifie que 65 % de tous les Anglais vivant au Royaume-Uni mesurent moins de 180 cm . Comme vous pouvez l'imaginer, les centiles sont couramment utilisés dans de nombreuses études statistiques et lors de la communication des résultats d'enquêtes ou de mesures sur de grandes populations.

Comment calculer les centiles ?

Supposons avoir collecté la hauteur de n =58 personnes; afin d'évaluer les centiles référés à cette distribution, la première étape consiste à trier toutes les valeurs par ordre croissant. À ce stade, supposons qu'on nous demande de calculer le 75 ème centile de la distribution ; on calcule le soi-disant rang k =percentile/100 . Dans ce cas, k =75/100 =0,75 . Nous devons maintenant multiplier le rang par le nombre total d'échantillons dans la distribution (n, dans ce cas 58) ; on obtient donc k x n =0,75 x 58 =43,5 . Puisque le résultat n'est pas un nombre entier, nous approximons la valeur au nombre entier le plus proche (44 dans ce cas). L'étape suivante consiste à trouver la valeur de hauteur correspondant au 44 ème position dans la distribution de l'échantillon ; cette valeur correspond au 75 ème centile. Dans le cas où le résultat de k x n est un nombre entier, nous allons plus loin en trouvant directement la valeur correspondante dans la distribution de l'échantillon ; c'est déjà notre centile.

Calculer les centiles en Python

Maintenant que nous savons ce que sont les centiles et comment ils peuvent être calculés, nous allons voir comment Python rend cette tâche très facile et rapide. Dans la première partie, nous allons résoudre le problème en définissant une fonction qui exécute toutes les étapes illustrées dans la section précédente tandis que dans la deuxième partie, nous allons exploiter le Numpy fonction intégrée .percentile() .

Importer les bibliothèques appropriées

Nous commençons notre script en important les bibliothèques qui seront utilisées tout au long de l'exemple.

Nous devons importer

  • math pour pouvoir arrondir les nombres flottants à l'entier le plus proche,
  • Numpy pour la fonction .percentile() , et
  • Matplotlib pour la dernière partie, dans laquelle nous tracerons les valeurs des percentiles sur la distribution.
import numpy as np
import math
import matplotlib.pyplot as plt

Écrire une fonction Python pour calculer les centiles

Dans cette première section, nous verrons comment construire une fonction de calcul des percentiles. Le but de cette section est purement didactique, comme vous le verrez plus loin, Python propose des bibliothèques intégrées qui résolvent la tâche automatiquement. Cependant, il est toujours important de comprendre comment le problème est résolu et comment fonctionne une fonction Python spécifique.

def my_percentile(data, percentile):
    n = len(data)
    p = n * percentile / 100
    if p.is_integer():
        return sorted(data)[int(p)]
    else:
        return sorted(data)[int(math.ceil(p)) - 1]

On commence par appeler notre fonction my_percentile , il prendra comme paramètres d'entrée la distribution de l'échantillon et le centile que nous voulons calculer. Comme détaillé ci-dessus, la première étape consiste à évaluer la taille de notre distribution (n); puis nous calculons le produit "p" de la taille de l'échantillon et du rang.

À ce stade, nous devons instancier une instruction if , afin de séparer le cas où k x n est un nombre entier à partir du cas où il ne l'est pas. Nous exploitons le Python méthode .is_integer() pour évaluer si p est un nombre entier ; cette méthode renvoie True dans le cas positif.

Si p.is_integer() renvoie True , nous devons rechercher le p-th valeurs dans notre distribution (triées par ordre croissant). Pour trier la distribution par ordre croissant, nous avons utilisé la fonction sorted() et passer en paramètre d'entrée la distribution elle-même. La chose importante à retenir est de convertir p de float (puisqu'il provient de l'opération mathématique effectuée à la ligne précédente) à integer ; sinon, vous obtiendrez une erreur indiquant que la valeur d'index de la liste doit être un nombre entier.

Nous concluons en levant une instruction else qui couvre le cas où la valeur de p n'est pas un nombre entier ; dans ce cas, en utilisant la fonction .ceil() (du math bibliothèque), nous approchons la valeur de p à l'entier supérieur le plus proche.

Nous convertissons ensuite ce nombre en entier et soustrayons 1 afin de correspondre à l'indexation utilisée dans les listes. Les lignes de code suivantes, vous pouvez trouver toutes les étapes expliquées jusqu'à présent, dans cette section.

Calculer les centiles à l'aide de notre fonction

Pour vérifier si notre fonction fonctionne bien, nous devons d'abord définir une distribution de valeurs; pour cela, on peut exploiter le Numpy fonction .random.randn() , qui tire des valeurs aléatoires de la distribution normale, il suffit de passer en paramètre d'entrée la taille du tableau. Nous choisissons de créer un tableau de 10000 valeurs.  

dist = np.random.randn(10000)

Essayons maintenant de calculer les valeurs du 5 ème , 25 ème , 50 ème , 75 ème et 95 ème centiles. On peut donc construire une liste, appelée "perc_func ” qui contient tous ces centiles, évalués par notre fonction. Avant de faire cela, nous définissons une liste appelée "index ” qui contient les valeurs des centiles qui nous intéressent. Après cela, nous exploitons la compréhension de liste, pour appeler la fonction my_percentile() pour chaque centile défini dans la liste "index ”.

index = [5, 25, 50, 75, 95]
perc_func = [my_percentile(dist, i) for i in index]

À ce stade, la liste "perc_func ” doit contenir les valeurs correspondant à tous les centiles listés dans la liste “index ”.

Calculer les centiles à l'aide de Numpy.percentiles()

Maintenant que nous savons comment calculer les centiles d'une distribution, nous pouvons également exploiter le Numpy fonction intégrée, pour le faire plus rapidement et plus efficacement.

Le .percentile() La fonction prend comme paramètres d'entrée la distribution de l'échantillon et le centile qui nous intéresse. Elle nous permet également de décider quelle méthode doit être utilisée dans le cas où le produit n x k n'est pas un nombre entier ; en effet, il n'y a pas qu'une seule façon correcte de le faire, nous avons précédemment décidé d'approximer la valeur à l'entier le plus proche ; cependant, nous pourrions également choisir de l'approcher de l'entier supérieur/inférieur le plus proche ou de prendre la valeur moyenne entre les entiers inférieurs et supérieurs les plus proches.

Toutes ces options peuvent être sélectionnées en choisissant parmi ces mots clés l'option "interpolation['linear’, ‘lower’, ‘higher’, ‘midpoint’, ‘nearest’].

Vous pouvez trouver la documentation complète sur le .percentile() fonction ici.

Les différentes options peuvent conduire à des résultats légèrement différents, nous choisissons l'option "nearest ”, afin de correspondre à la méthode utilisée dans la fonction “my_percentile ”. De manière similaire à ce que nous avons fait dans la section précédente, nous créons une liste appelée "perc_numpy ” dans lequel on stocke les valeurs du 5 ème , 25 ème , 50 ème , 75 ème et 95 ème centiles, évalués à l'aide du Numpy . Les lignes de code suivantes décrivent les procédures qui viennent d'être expliquées.

# Using numpy for calculating percentiles
perc_numpy = [np.percentile(dist, i, interpolation='nearest') for i in index]

Nous pouvons maintenant imprimer les deux listes et vérifier si les résultats obtenus sont égaux.

print(perc_func)
print(perc_numpy)

Tracé des percentiles sur la distribution

Au début de l'article, nous avons défini ce que représentent les centiles.

Étant donné que les définitions statistiques peuvent être assez difficiles à saisir, nous pouvons afficher notre distribution de valeurs et voir où se situent les centiles calculés dans la distribution.

Pour ce faire, nous exploitons Matplotlib et la fonction .axvline() , qui permet de tracer des lignes verticales sur un tracé. Nous plaçons la fonction axvline() dans une boucle for afin de créer une ligne verticale pour chaque centile contenu dans la liste "perc_func ”. Pour mieux mettre en évidence les lignes centiles, nous utilisons la couleur rouge.

# Plotting 
plt.hist(dist, 50)
for i in range(len(index)):
    plt.axvline(perc_func[i], color='r')
plt.show()

Le résultat final est affiché dans la Figure 1; comme vous pouvez le voir, le 50 ème centile est situé en plein milieu de la distribution, tandis que le 95 e le centile est la dernière ligne et correspond à la valeur en dessous de laquelle on peut trouver les 95 % de la population de l'échantillon.

Illustration 1 : Représentation de la distribution normale utilisée dans l'exemple, avec les traits verticaux rouges correspondant (de gauche à droite) au 5 ème , 25 ème , 50 ème , 75 ème et 95 ème centiles.

Conclusion

Dans cet article, nous avons découvert les percentiles , ce qu'ils sont, ce qu'ils représentent et comment ils peuvent être utilisés pour décrire une partie d'une distribution d'échantillon. A partir de leur définition statistique, nous avons développé une fonction Python pour calculer les centiles d'une distribution d'échantillon.

Après cela, nous avons exploré le Numpy fonction .percentile() qui permet de calculer les centiles d'une distribution d'échantillons de manière ultra-rapide et efficace.

Nous avons ensuite comparé les résultats des deux méthodes et vérifié qu'elles étaient identiques.

Au final, nous avons également montré graphiquement les centiles, que nous avons précédemment calculés, sur la distribution de l'échantillon, afin de mieux comprendre leur signification réelle.