Séance 10#
Objectifs
Variables aléatoires
Statistiques
Variables aléatoires discrètes#
Anciennes fonctions#
Avec python, on avait déjà vu les fonctions randint et choice, pour tirer de manière uniforme des entiers dans un intervalle, ou bien des éléments dans un liste.
Ces fonctions sont de nouveau présentes dans Sagemath, sans avoir à les importer.
print([ randint(3, 7) for i in range(10) ])
[3, 5, 5, 5, 3, 7, 4, 5, 3, 4]
L = [ "a", "b", "c", "d" ]
print(choice(L))
c
Distribution discrète#
En mathématiques (et dans d’autres disciplines), il est très courant de manipuler des variables aléatoires dont la distribution n’est pas uniforme. Sagemath va nous permettre de créer ces distributions.
Dans le cas où la variable est à valeurs dans un ensemble fini, une distribution n’est rien d’autre qu’une liste finie de probabilités (c’est-à-dire, de nombres dans \([0,1]\) dont la somme vaut \(1\)). Sagemath nous propose de construire une telle distribution via l’instruction GeneralDiscreteDistribution(P), où P est la liste des probabilités de la distribution.
probas = [0.6, 0.3, 0.1]
distrib = GeneralDiscreteDistribution(probas)
print(distrib)
<sage.probability.probability_distribution.GeneralDiscreteDistribution object at 0x7f14158a18c0>
Ensuite, pour tirer un élément selon cette distribution, on utilise la méthode get_random_element(). Cette méthode renvoie des entiers compris entre \(0\) et \(n-1\), où \(n\) est la longueur de la liste de probabilités donnée en paramètre de GeneralDiscreteDistribution.
print(distrib.get_random_element())
0
print([ distrib.get_random_element() for i in range(30) ])
[0, 1, 0, 1, 1, 0, 0, 0, 0, 2, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 2]
Variables aléatoires continues#
Distribution uniforme#
Avec python, la fonction random() permettait de créer un nombre réel aléatoire entre \(0\) et \(1\). Elle est toujours disponible dans Sagemath ;
print(random())
0.3806561995107228
points( [ (i, random()) for i in range(100) ] )
Sagemath permet d’étendre cette fonctionnalité à d’autres intervalles réels. Ainsi, la fonction uniform(a, b) permet de tirer uniformément dans l’intevalle \([a, b[\).
uniform(1, 7)
3.1252631583273898
points( [ (i, uniform(3,7)) for i in range(100) ], ymin=0, ymax=10)
Autres distributions#
La fonction RealDistribution permet de définir quelques autres distributions.
Loi normale. Par exemple, pour la distribution gaussienne (normale centrée) de variance sigma :
sigma = 1
G = RealDistribution("gaussian", sigma)
On peut ensuite accéder à certaines fonctions associées à cette ditribution. Par exemple, la fonction de densité de probabilité est distribution_function, et la fonction de répartition est cum_distribution_function. Ces fonctions doivent être évaluées en des valeurs réelles :
print(G.distribution_function(0))
print(G.cum_distribution_function(0))
0.3989422804014327
0.5
On peut bien sûr afficher ces fonctions :
plot(G.distribution_function, xmin=-8, xmax=8).show()
plot(G.cum_distribution_function, color='red', xmin=-8, xmax=8).show()
Loi exponentielle. Pour la loi exponentielle, c’est un peu moins direct, il faut passer par une loi plus générale appelée loi de Weibull, et fixer le second paramètre à \(1\). Ainsi, pour la loi exponentielle de paramètre \(\lambda = 0.5\) :
P = RealDistribution('weibull', [0.5, 1])
plot(P.distribution_function, xmin=0, xmax=4)
Statistiques#
Sagemath n’est pas un logiciel spécialisé dans les probabilités et les statistiques, car le calcul formel est peu lié à ces disciplines de nature numérique voire expérimentale.
Néanmoins, Sagemath permet d’importer et d’utiliser des outils adaptés à ce type de calcul. On va rapidement mentionner la bibiothèque scipy.stats et le logiciel R.
La bibliothèque scipy.stats#
Il faut d’abord importer la bibliothèque, par exemple avec import scipy.stats as sc. Puis, s’offre à nous une quantité importante de fonctions (voyez en tapant sc.<tab>). Par exemple pour la loi binomiale avec \(n = 12\) et \(p = 0.2\) :
import scipy.stats as sc
b = sc.binom(12, 0.2)
bar_chart([b.pmf(k) for k in range(13)])
On voit que la fonction .pmf() permet d’obtenir la distribution de la loi. On peut également obtenir la fonction de répartition par .cdf() :
bar_chart([b.cdf(k) for k in range(13)])
Beaucoup d’autres valeurs typiques sont disponibles : l’espérance par .mean() ou .expect(), la variance par .var(), la mediane par .median(), et les moments d’ordres quelconques par .moment(k).
Un exemple avec la loi normale centrée réduite (moyenne \(\mu = 0\), variance \(\sigma = 1\)) :
c = sc.norm(0, 1)
plot(c.pdf, xmin=-4, xmax=4)
print("Moyenne :", c.mean())
print("Espérance :", c.expect())
print("Médiane :", c.median())
print("Variance :", c.var())
print("Moment d'ordre 4 :", c.moment(4))
Moyenne : 0.0
Espérance : 0.0
Médiane : 0.0
Variance : 1.0
Moment d'ordre 4 : 3.0
Le logiciel R#
Le logiciel R est un logiciel libre de pointe pour l’analyse statistiques, qui est utilisé à la fois dans les milieux académiques et industriels.
Le but ici n’est pas de vous (il faudrait plusieurs séances pour apprendre à la manipuler), mais plutôt de vous indiquer que Sagemath vous permet d’y accéder par une interface particulière. Il y a essentiellement deux manières de réaliser cette interface.
En traduisant les commandes. La première est de rester dans sagemath, et demander à sagemath de faire les traductions entre les deux logiciels. Pour cela, on utilise l’objet prédéfini r pour créer des objets statistiques (par exemple des distributions). Puis, on peut utiliser des fonctions du logiciel R, via leur traduction en des méthodes de l’objet r.
Par exemple, supposons que l’on obtienne les données suivantes et que l’on souhaite calculer une régression linéaire.
x = [i for i in range(100)]
y = [ i + 4*random() for i in range(100) ]
points( [[x[i], y[i]] for i in range(100)])
Alors, on peut créer les objets correpsondants dans R et en effectuer la régression linéaire :
rx = r(x)
ry = r(y)
r.line(rx, ry)
Call:
line(sage100, sage201)
Coefficients:
[1] 1.110 1.016
Sagemath nous donne alors les résultats du calcul effectué par le logiciel R, à savoir les coefficients de la régression linéaire.
En lançant l’interpréteur R dans sagemath. Pour cela, utiliser simplement la commande %r.
# %r