« Python pour le calcul scientifique/Statistiques » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Ligne 70 : Ligne 70 :


On peut générer une matrice aléatoire avec les fonctions <code>random.rand()</code>, qui utilise une loi uniforme sur [0 ; 1], et <code>random.randn()</code> qui utilise une loi normale centrée réduite.
On peut générer une matrice aléatoire avec les fonctions <code>random.rand()</code>, qui utilise une loi uniforme sur [0 ; 1], et <code>random.randn()</code> qui utilise une loi normale centrée réduite.

Lorsque l'on dispose d'une série de données aléatoires, qu'elles aient été mesurées ou bien générées par une fonction aléatoire, on peut ensuite les mettre dans des classes ''({{lang|en|bins}})''. Les classes sont définies par un vecteur (ou une liste, un n-uplet) <code>[c1, c2,c3, …, cn]</code>. La classe 0 désigne les valeurs inférieures à <code>c1</code> ; la classe 1 désigne les valeurs <code>c1</code> ≤ ''x'' &lt; <code>c2</code> ; la classe ''n'' (<code>n ==len(classes)</code>) désigne les valeurs supérieures à <code>cn</code>.

La fonction <code>digitize()</code> indique dans quelle classe se trouve un nombre. Si on lui donne une matrice (ou un vecteur, une liste, un n-uplet), il renvoie une matrice de même dimension, <code>digitize(M, classes)[i, j]</code> étant la classe de l'élément <code>M[i, j]</code>. Par exemple :

<source lang="python">
M = np.random.rand(10)

classes = (0, 0.2, 0.4, 0.6, 0.8, 1)

print(M)
print(np.digitize(M, classes))
</source>


[[Fichier:Histogramme loi normale 50 ech numpy pyplot.png|vignette|Histogramme de la loi centrée réduite tracé avec Python/Numpy/Matplotlib.]]
[[Fichier:Histogramme loi normale 50 ech numpy pyplot.png|vignette|Histogramme de la loi centrée réduite tracé avec Python/Numpy/Matplotlib.]]

Version du 23 mars 2019 à 11:05

Le module NumPy fournit des fonctions statistiques.

Rappelons que dorénavant les programmes commencent tous par :

import numpy as np
import matplotlib.pyplot as plt

Méthodes de matrices

Rappel : la classe des matrices (ndarray) dispose de méthodes permettant de calculer des statistiques sur les éléments des matrices :

  • min() : minimum des valeurs ;
  • max() : maximum des valeurs ;
  • ptp() : écart amplitude « max – min » (peak to peak) ;
  • mean() : moyenne ;
  • std() : écart type (standard deviation).

Statistiques descriptives

NumPy fournit la fonction quantile() qui détermine les quantiles avec la syntaxe :

np.quantile(M, q)

M est une matrice (ou une liste, un n-uplet, bref un itérable de nombres) et q est un quantile ou un vecteur de quantiles sous la forme d'un nombre entre 0 et 1. Par exemple, pour avoir les quartiles :

np.quantile(M, [0, 0.25, 0.5, 0.75, 1])

Si un des éléments de la matrice est un NaN, le résultat est un NaN. Pour éviter cela, on peut utiliser la fonction nanquantile() qui ignore les NaN.

Les fonctions percentile() et nanpercentile() donnent les centiles ; on indique alors le centile que l'on veut sous la forme d'un nombre entier entre 0 et 100.

Nous disposons également des fonctions suivantes :

  • amin(), nanmin() : minimum ;
  • amax(), nanmax() : maximum ;
  • ptp() : amplitude.

Notons que pour toutes les fonctions, il est possible d'indiquer l'axe selon lequel on effectue le calcul. Par exemple,

M = np.arange(9).reshape(3, 3)
# [[0, 1, 2]
#  [3, 4, 5]
#  [6, 7, 8]]
print(np.quantile(M, [0.25, 0.5], 0))
# [[1.5 2.5 3.5]  : 1er quartile des colonnes
#  [3.  4.  5. ]] : médiane des colonnes
print(np.quantile(M, [0.25, 0.5], 1))
# [[0.5 3.5 6.5]  : 1er quartile des lignes
#  [1.  4.  7. ]] : médiane des lignes

Indicateurs de position et de dispersion

NumPy fournit les indicateurs de tendance centrale suivants :

  • mean() et nanmean() : moyenne ;
  • average() et nanaverage() : moyenne pondérée ; la syntaxe est average(M, axe, poids) ou bien average(M, weights = poids) (voir ci-après) ;
  • median() et nanmedian() : médiane.

En terme de performances, la fonction np.mean() est équivalente à la méthode M.mean() et à la fonction np.average() sans poids (ce qui équivaut donc à la moyenne). En revanche, la fonction np.nanmean() est plus lente, de même que la fonction np.average() lorsque l'on utilise des poids (même s'ils sont tous égaux à 1).

Comme précédemment, on peut indiquer l'axe (si l'on veut évaluer les valeurs par colonne ou par ligne). Pour la moyenne pondérée, on utilise une matrice poids P de même dimension que la matrice de valeurs M, P[i, j] étant le poids associé à la valeur M[i, j]. Par exemple, si l'on veut évaluer la moyenne pondérée pour toutes les valeurs de M (pas d'axe), on peut écrire une des deux solutions suivantes :

np.average(M, None, P) # l'axe est le 2e paramètre
np.average(M, weights = P)

NumPy fournit également les indicateurs de dispersion suivants :

  • std(), nanstd() : écart type (standard deviation) ;
  • var(), nanvar() : variance.

Fréquence, histogramme

On peut générer une matrice aléatoire avec les fonctions random.rand(), qui utilise une loi uniforme sur [0 ; 1], et random.randn() qui utilise une loi normale centrée réduite.

Lorsque l'on dispose d'une série de données aléatoires, qu'elles aient été mesurées ou bien générées par une fonction aléatoire, on peut ensuite les mettre dans des classes (bins). Les classes sont définies par un vecteur (ou une liste, un n-uplet) [c1, c2,c3, …, cn]. La classe 0 désigne les valeurs inférieures à c1 ; la classe 1 désigne les valeurs c1x < c2 ; la classe n (n ==len(classes)) désigne les valeurs supérieures à cn.

La fonction digitize() indique dans quelle classe se trouve un nombre. Si on lui donne une matrice (ou un vecteur, une liste, un n-uplet), il renvoie une matrice de même dimension, digitize(M, classes)[i, j] étant la classe de l'élément M[i, j]. Par exemple :

M = np.random.rand(10)

classes = (0, 0.2, 0.4, 0.6, 0.8, 1)

print(M)
print(np.digitize(M, classes))
Histogramme de la loi centrée réduite tracé avec Python/Numpy/Matplotlib.
A = np.random.rand((2, 3))
print(A)

B = np.random.randn(100)
plt.plot(B, np.ones_like(B), "|")
plt.hist(B, bins=10, density=1)

Notes et références


Polynômes < >