Opérations statistiques de base

en langage python

A taper éventuellement dans la console windows

python -m pip install --user numpy statistics

Vérifier que vous avez bien la dernière version, certaines fonctionnalités de statistics ne sont disponibles sur sur python 3.8.

python -V

A taper dans python pour importer les modules

from statistics import *

from numpy import *

1- Fonction de base de statistiques descriptives

Une fois que numpy et statistics ont été importés.

Calculer la moyenne

x = random.normal(size=30,loc=20) # moyenne attendue : 20

y = mean(x) ; print(y) # Moyenne normale

# Moyenne géométrique : la moyenne c de deux valeurs représentera le côté d'un carré de même surface que le rectangle ayant pour côtés ces deux valeurs

y = geometric_mean(x) ; print(y) # Moyenne géométrique

# Ou sinon :

from scipy.stats.mstats import gmean

gmean(x)

# Moyenne harmonique : la vitesse moyenne (moyenne harmonique) d'un véhicule roulante à 40 km/h sur un km puis 60 km/h sur un autre km est de 48 km/h (et non pas 50 km/h, moyenne classique)

y = harmonic_mean(x) ; print(y) # Moyenne harmonique

Calculer la médiane

from numpy import * ; x = random.normal(size = 30,loc=20) # médiane attendue 20

y = median(x) ; print(y)

  • Calcul de l'écart-type

Manuellement

x = [12,10,9,15,8,17,11,10]

from numpy import *

sd = sqrt(sum((array(x)-mean(x))**2)/(len(x)-1)) ; print(sd)

Méthode 1 - écart-type d'une population (mieux vaut favoriser la méthode 2 en général !) - attention écart-type d'une population

from numpy import * ; x = [12,10,9,15,8,17,11,10] ; # SD attendu : 3

sd = std(x) ; print(sd) # Cette formule renvoie l'écart-type ou l'on divise par n

Méthode 2 - écart-type d'un échantillon (avec division par n-1) - écart-type d'un échantillon

from statistics import * ; x = [12,10,9,15,8,17,11,10] ; # SD attendu : 3

sd = stdev(x) ; print(sd)

Méthode 3 - Avec numpy - écart-type d'une population !!! (attention, en général, il faut celui d'un échantillon)

from numpy import * ; x = [12,10,9,15,8,17,11,10] ; # SD attendu : 3

# std permet des calculs ligne par ligne ou colonne par colonne (cf. aide sur les arrays)


std(x) # renvoie un écart-type d'une population

std(x, ddof =1) # renvoie un écart-type d'un échantillon

  • Quantile

import numpy as np

x = [12,10,9,15,8,17,11,10]

np.quantile(x,0.25) # Premier quartile

np.quantile(x,[0.25,0.5,0.75]) # Ensemble des quartile

Cette fonction est utile avec l'argument axis on peut l'applique aux lignes, colonnes ou nième dimension d'une array.

2- Appliquer des calculs statistiques aux tableaux pandas

  • Description générale d'un jeu de données DataFrame - équivalents de la fonction summary() de R en python

Disponible pour les objets dataframe pandas.

mytab.iloc[:,0].describe()

  • Calculer des moyennes (OU AUTRE!!!) pour chaque colonne ou ligne d'une data.frame pandas

taille = [175,160,186,173,176]

poids = [50,60,62,70,40]

age= [18,19,20,21,20]

cat= ["M","M","F","F","F"]

import pandas as pd

mytab = pd.DataFrame({"Poids":poids,"Taille":taille,"Age":age,"Cat":cat})

import numpy as np # Permet d'avoir la fonction de somme

mytab.apply(np.sum,axis=0) # Somme de chaque colonne : on peut prendre n'importe quelle fonction

mytab.apply(np.sum,axis=1) # Somme de chaque ligne : on peut prendre n'importe quelle fonction

  • Calculer des moyennes (OU AUTRE!!!) d'une variable pour chaque groupe indiqué dans une variable de catégories d'une data.frame pandas : équivalent de la fonction by() de R ("R by function in python").

En reprenant le tableau mytab ci-dessus :

mytab.groupby("Cat").apply(np.sum)

En appliquant cet exemple uniquement à une variable : avoir le poids moyen par exemple de chaque catégorie :

mytab[["Poids","Cat"]].groupby("Cat").apply(np.mean)

Pour visualiser, on ajouter .plot(kind="bar") à la fin.

Attention : Certaines fonctions ne passeront pas dans apply sans conversion préalable tel mean de statistics qui rendra une erreur alors mean de numpy passera sans problème.

  • Fonctions de statistiques colonne par colonne déjà intégrées à pandas

print(mytab.mean()) # Moyennes

print(mytab.std()) # Ecart-type

print(mytab.describe()) # Summary

Amplitude = mytab.iloc[:,:3].max()-mytab.iloc[:,:3].min() ; print(Amplitude)

# iloc ici est utilisé pour dégager la 4ème colonne, celle des catégories.


# Synthèse

# Concaténer en ajoutant des colonnes

synthese = pd.concat([mytab.mean(),mytab.std()],axis=1)

synthese.columns = ["mean","std"]

print(synthese)