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

m
<source> -> <syntaxhighlight> (phab:T237267)
(→‎Lois de probabilités : diagramme qq)
m (<source> -> <syntaxhighlight> (phab:T237267))
 
Rappelons que dorénavant les programmes commencent tous par :
<sourcesyntaxhighlight lang="python">
import numpy as np
import matplotlib.pyplot as plt
</syntaxhighlight>
</source>
 
== Méthodes de matrices ==
 
NumPy fournit la fonction <code>np.quantile()</code> qui détermine les quantiles avec la syntaxe :
<sourcesyntaxhighlight lang="python">
np.quantile(M, q)
</syntaxhighlight>
</source>
où <code>M</code> est une matrice (ou une liste, un n-uplet, bref un itérable de nombres) et <code>q</code> est un quantile ou un vecteur de quantiles sous la forme d'un nombre entre 0 et 1. Par exemple, pour avoir les quartiles :
<sourcesyntaxhighlight lang="python">
np.quantile(M, [0, 0.25, 0.5, 0.75, 1])
</syntaxhighlight>
</source>
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 <code>np.nanquantile()</code> qui ignore les NaN.
 
 
Notons que pour toutes les fonctions, il est possible d'indiquer l'axe selon lequel on effectue le calcul. Par exemple,
<sourcesyntaxhighlight lang="python">
M = np.arange(9).reshape(3, 3)
# [[0, 1, 2]
# [[0.5 3.5 6.5] : 1er quartile des lignes
# [1. 4. 7. ]] : médiane des lignes
</syntaxhighlight>
</source>
 
== Indicateurs de position et de dispersion ==
 
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, <code>P[i, j]</code> étant le poids associé à la valeur <code>M[i, j]</code>. 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 :
<sourcesyntaxhighlight lang="python">
np.average(M, None, P) # l'axe est le 2e paramètre
np.average(M, weights = P)
</syntaxhighlight>
</source>
 
NumPy fournit également les indicateurs de dispersion suivants :
La fonction <code>np.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>np.digitize(M, classes)[i, j]</code> étant la classe de l'élément <code>M[i, j]</code>. Par exemple :
 
<sourcesyntaxhighlight lang="python">
M = np.random.rand(10)
 
print(M)
print(np.digitize(M, classes))
</syntaxhighlight>
</source>
On peut changer la « largeur » des inégalités avec le paramètre <code>right = True</code> : ''{{lang|en|right}}'', « droite », est vrai ''({{lang|en|true}})'' lorsque l'inégalité large est à droite, la classe ''i'' désigne les valeurs ''c<sub>i</sub>'' &lt; ''x'' ≤ ''c''<sub>''i'' + 1</sub>. La syntaxe est alors <code>np.digitize(M, classes, True)</code> ou bien <code>np.digitize(M, classes, right = True)</code>. Le sens de l'inégalité ne dépend pas du sens du vecteur de classes ; ainsi, ''{{lang|en|right}}'' désigne la valeur supérieure de l'intervalle même si le vecteur de classes est classé par ordre décroissant.
 
 
Pour tracer l'histogramme, nous disposons de la fonction <code>plt.hist()</code> :
<sourcesyntaxhighlight lang="python">
M = np.random.randn(50)
plt.plot(M, np.ones_like(M), "|")
plt.hist(M, bins=10, density=1)
</syntaxhighlight>
</source>
 
La fonction <code>np.bincount()</code> travaille sur les listes de nombre entiers. Elle renvoie un n-uplet, <code>np.bincount(M)[i]</code> est le nombre de fois que le nombre ''i'' revient dans la matrice M — rappel, le premier élément du n-uplet <code>np.bincount(M)</code> a l'indice 0 donc correspond au nombre de fois que le nombre 0 apparaît dans la matrice M.
* <code>.fit()</code> : calcule les paramètres de la loi correspondant au mieux à un échantillon, au sens du maximum de vraisemblance ; uniquement pour les lois continues.
Par exemple
<sourcesyntaxhighlight lang="python">
from scipy import stats
 
plt.plot(x, y2, label="répartition")
plt.legend()
</syntaxhighlight>
</source>
Par défaut, les lois continues sont centrées réduites (de moyenne nulle et d'écart type unité). Les objets disposent des paramètres <code>loc</code> (''location'', position) et <code>scale</code> (échelle) ; par exemple pour un tirage aléatoire de 100 échantillons avec une loi normale de moyenne 10 et d'écart type 5 :
<sourcesyntaxhighlight lang="python">
stats.norm.rvs(100, loc=5, scale=10)
</syntaxhighlight>
</source>
Il est possible de fixer ces paramètres pour une loi, de la « geler », par exemple :
 
<sourcesyntaxhighlight lang="python">
from scipy import stats
 
plt.hist(x)
print(varAl.mean(), varAl.std())
</syntaxhighlight>
</source>
ou encore
<sourcesyntaxhighlight lang="python">
from scipy import stats
 
res = stats.norm.fit(x)
print(res)
</syntaxhighlight>
</source>
 
[[File:Diagramme qq python matplotlib.svg|vignette|upright=1.5||Diagramme quantile-quantile avec Python Scipy et Matplotlib.]]
L'exemple suivant consiste à vérifier qu'un échantillon suit bien une loi normale centrée réduite en traçant sa droite de Henry :
 
<sourcesyntaxhighlight lang="python">
import numpy as np
from scipy import stats
 
plt.savefig("diagramme_qq_python_matplotlib.svg")
</syntaxhighlight>
</source>
 
Pour les lois discrète, il est nécessaire d'indiquer leurs paramètres. Par exemple :
1 535

modifications