« Mathématiques avec Python et Ruby/Statistique inférentielle avec Python » : différence entre les versions

Contenu supprimé Contenu ajouté
m Révocation des modifications de 194.214.192.2 (discussion) vers la dernière version de Alain Busser
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 13 :
Pour faire des statistiques, il faut un échantillon de données aléatoires ou non. Et pour avoir des données sous ''Python'', le plus simple est de les fabriquer sous ''Python''. Par exemple si on veut faire des statistiques sur les 100 premiers carrés d'entiers, on peut fabriquer une liste contenant ces 100 nombres:
 
<sourcesyntaxhighlight lang="python">
donnees=[n**2 for n in range(100)]
 
print(len(donnees))
</syntaxhighlight>
</source>
 
==Moyenne==
Ligne 23 :
Pour calculer la moyenne des nombres qui sont dans ''donnees'', on les additionne et on divise la somme par le nombre de nombres qu'il y a dans ''donnees'':
 
<sourcesyntaxhighlight lang="python">
def moyenne(tableau):
return sum(tableau, 0.0) / len(tableau)
 
print(moyenne(donnees))
</syntaxhighlight>
</source>
 
L'algorithme est améliorable puisque si une donnée n'est pas numérique, il ne donne qu'un message d'erreur.
Ligne 36 :
La variance est définie comme la moyenne des carrés des écarts à la moyenne:
 
<sourcesyntaxhighlight lang="python">
def variance(tableau):
m=moyenne(tableau)
Ligne 42 :
 
print(variance(donnees))
</syntaxhighlight>
</source>
 
Une variante pour la variance est donnée par la [[w:Théorème de König-Huyghens|formule de Huyghens]]: Moyenne des carrés moins le carré de la moyenne.
Ligne 50 :
L'écart-type est défini comme la racine carrée de la variance:
 
<sourcesyntaxhighlight lang="python">
def ecartype(tableau):
return variance(tableau)**0.5
 
print(ecartype(donnees))
</syntaxhighlight>
</source>
 
==Échantillons==
Ligne 61 :
On peut créer un échantillon de 100 nombres gaussiens d'espérance 16 et d'écart-type 2, puis calculer sa moyenne et son écart-type:
 
<sourcesyntaxhighlight lang="python">
from random import *
echantillon=[gauss(16,2) for n in range(100)]
Ligne 67 :
print(moyenne(echantillon))
print(ecartype(echantillon))
</syntaxhighlight>
</source>
 
 
Ligne 73 :
On voit que la moyenne est proche de 16 et l'écart-type proche de 2. C'est rassurant. Mais si on y regarde de plus près, on voit un problème: En prenant des échantillons plus petits, on s'attend à ce que leurs moyenne et écart-type fluctuent mais que la moyenne des moyennes (sur beaucoup de petits échantillons) soit 16 et que la moyenne des écarts-types soit proche de 2. C'est vrai pour la moyenne des moyennes mais visiblement pas pour la moyenne des écarts-types:
 
<sourcesyntaxhighlight lang="python">
from random import *
m=[] #liste des moyennes des echantillons
Ligne 89 :
print(ecartype(m)) # Le moyennage resserre les ecarts-types
print(2/5**0.5) # en les divisant par la racine de la taille de l'echantillon
</sourcesyntaxhighlight>
 
En théorie, le nombre par lequel on doit multiplier la moyenne des écarts-types pour estimer l'écart-type de la population est <math>\sqrt{\frac{5}{4}}</math>. Ce n'est pas le cas ici: Il semble que l'algorithme de ''Python'' pour effectuer des tirages avec remise introduise un biais. Par contre on découvre expérimentalement ici que la moyenne des écarts-types doit être multipliée par <math>\sqrt{\frac{10}{7}}</math> pour avoir un estimateur sans biais de l'écart-type...
Ligne 104 :
Comme ''Python'' sait faire des tirages sans remise, on peut constituer une liste ordonnée de ''pour'' et de ''contre'', et y puiser des échantillons au hasard. On peut estimer la proportion d'entre eux qui donne de faux espoirs au maire (au moins 50 ''pour'' parmi les 100).
 
<sourcesyntaxhighlight lang="python">
from random import *
population=['contre' for n in range(57000)]+['pour' for n in range(43000)]
Ligne 117 :
print(p)
print(p/1000)
</syntaxhighlight>
</source>
 
[[Fichier:Votingwomen.jpg|right]]
Ligne 125 :
Plus sérieux (et plus prudent, pour éviter la vindicte de l'ancien maire, désormais dans l'opposition, et qui a maintenant le temps de mener une croisade contre les instituts de sondage) eût été la publication par l'institut de sondage, d'un [[w:Intervalle de confiance|intervalle de confiance]], par exemple à 95% (c'est-à-dire un intervalle qui contient en moyenne 95% des échantillons). Expérimentalement, on peut s'inventer un intervalle et compter la fréquence des échantillons de 100 personnes qui sont dedans. Ce sera un estimateur de la probabilité que l'échantillon soit représentatif de l'ensemble de la population:
 
<sourcesyntaxhighlight lang="python">
from random import *
 
Ligne 137 :
 
print(p/1000)
</sourcesyntaxhighlight>
 
On voit que l'intervalle ''[0,33 ; 0,53]'' obtenu avec ''h=0,1'' est un intervalle à 95 %. En modifiant la valeur de ''h'' on constate que si ''h'' diminue (l'intervalle rétrécit), on perd de la confiance (la probabilité qu'il soit bon diminue aussi). On trouve par tâtonnements la valeur de ''h'' pour laquelle la confiance de l'intervalle vaut 95 %, puis par changement de la taille de l'échantillon, on peut conjecturer le lien entre ''h'' et la taille de l'échantillon.
Ligne 145 :
Là encore, on peut facilement tester des intervalles de confiance, pour des moyennes de variables aléatoires normales, par exemple d'espérance 16, d'écart-type 2 et indépendantes entre elles:
 
<sourcesyntaxhighlight lang="python">
from random import *
 
Ligne 161 :
 
print(p/1000)
</sourcesyntaxhighlight>
 
On découvre que l'intervalle de confiance ''[15,9 ; 16,1]'' donné ci-dessus (pour ''h=0,1'') est à environ 40% de confiance. En modifiant la valeur de ''h'', on retrouve expérimentalement que pour celle-ci égale à environ <math>\frac{2\sigma}{\sqrt{100}}</math>, l'intervalle est à 95 % de confiance.
Ligne 180 :
On se demande si le dé est équilibré. Pour cela, on se choisit comme critère de test la somme des carrés des écarts aux fréquences théoriques: <math>d2=\sum_{k=1}^6 \left(f_k -\frac{1}{6}\right)^2</math>:
 
<sourcesyntaxhighlight lang="python">
d2=(0.15-1/6)**2+(0.16-1/6)**2+(0.17-1/6)**2+(0.16-1/6)**2+(0.16-1/6)**2+(0.2-1/6)**2
</syntaxhighlight>
</source>
 
Soit mais encore, que faire avec ''d2'': Est-ce qu'on doit dire que 0,0015 est anormalement élevé et que le dé est truqué, ou que 0,0015 est suffisamment petit pour attribuer ces résultats à la fluctuation d'échantillonnage? Pour le savoir, on va simuler 10000 lancers de dés et calculer l'équivalent de ''d2'' pour chacun d'entre eux, puis faire une étude statistique sur le ''d2'' observé. La réponse statistique à la question ''Qu'est-ce qui est normal?'' est en général fournie par les [[w:Décile|déciles]]: On dira que le dé est vraisemblablement truqué si le ''d2'' observé est supérieur au neuvième décile de la série. Pour calculer ce décile, on va devoir trier les données.
 
<sourcesyntaxhighlight lang="python">
from random import *
khi2=[]
Ligne 203 :
print(decile9)
print(d2)
</syntaxhighlight>
</source>
 
''d2'' est environ 10 fois plus petit que le neuvième décile de la série, donc on se trompe de plus de 10 % en considérant que le dé est truqué: Il est parfaitement normal pour autant qu'on sache.
Ligne 211 :
Euler affirme que, si on joue 19 fois au [[Mathématiques_avec_Python_et_Ruby/Nombres_pseudoaléatoires_en_Python#Permutations_et_arrangements|jeu de treize]], le joueur A gagnera ''probablement 12 fois''. On peut détailler cette affirmation, en jouant 19 fois au jeu pour chaque échantillon, et en répétant l'expérience 1000 fois (donc 1000 échantillons de 19 parties). Voici le script:
 
<sourcesyntaxhighlight lang="python">
valeurs={1,7,8,9,10,'Valet','Dame','Roi'}
couleurs={'carreau','coeur','pique','trefle'}
Ligne 231 :
 
print(pg)
</syntaxhighlight>
</source>
 
Le tableau affiché par ce script est celui des parties gagnées par A parmi les 19; il s'agit d'un tableau d'effectifs (le total des nombres entiers affichés est d'ailleurs 1000). Voici un exemple de diagramme en bâtons de ce tableau, traîtreusement déguisé en histogramme: