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)