Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 29-03-2020 10:07:23

didine
Membre
Inscription : 29-03-2020
Messages : 4

Python Probabilité

Bonjour à tous,

J'espère que l'un de vous pourra m'aider

je souhaiterai savoir pourquoi mon programme ne fonctionne pas. C'est a dire pourquoi je n'obtiens pas de probabilité.

Merci d'avance.

Dernière modification par didine (02-04-2020 00:12:06)

Hors ligne

#2 29-03-2020 16:22:07

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Python Probabilité

Bonjour,

d'abord une habitude à prendre, placer les def au début :

from random import*
import numpy as np

def echantillon(n):
    fumeur = [1]
    for k in range (n):
        return fumeur

prob=[]

population= np.random.choice(np.arange(0,2), size=1000, p=[0.65,0.35])
print(population)

echantillon=np.random.choice(population,size=16)
print(echantillon)
 

Quand je teste ton programme, moi la chose qui me frappe c'est que j'ai 10 lignes de message d'erreur...

Pas chez toi ?
Ensuite, ton programme plante ou ne pourrait donner de résultats cohérents parce que echantillon désigne deux choses différentes :
- c'est le nom de ta fonction
- c'est le non d'un tableau
Si je ne teste que ce morceau de code :

from random import*
import numpy as np

prob=[]

population= np.random.choice(np.arange(0,2), size=1000, p=[0.65,0.35])
print(population)

echantillon=np.random.choice(population,size=16)
print(echantillon)
 

Voilà ce que j'obtiens :

[0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0
 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
 0 1 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0
 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0
 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0
 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0
 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0
 0 0 1 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0
 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1
 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 1 1 0 1
 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1
 0 0 1 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0
 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0
 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0
 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1
 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 1 0
 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0
 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1
 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0
 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1
 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1
 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0
 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0
 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1
 1]
[0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1]

ce qui ne me choque pas...
Tu as créé une population virtuelle ou chaque élément est représenté par son code 0 non fumeur et 1 fumeur, déterminé aléatoirement, population sur laquelle tu prélèves un échantillon : cette partie là fonctionne.

Alors ? Alors ne JAMAIS donner le même nom à deux objets différents...

Si je renomme def echantillon(n) en def Echantillon(n), ce n'est pas un nom bien choisi parce j'ignore ce que fait ta fonction.
Je relance : plus de messages d'erreur, mais mêmes résultats que ci-dessus.
Donc, je conclus qu'elle ne sert à rien...
Mais que fait-elle donc ? Apparemment, rien...
Je vais l'appeler 10 fois par print (Echantillon(10)) :

from random import*
import numpy as np

def Echantillon(n):
    fumeur = [1]
    for k in range (n):
        return fumeur

prob=[]
population= np.random.choice(np.arange(0,2), size=1000, p=[0.65,0.35])
print(population)

echantillon=np.random.choice(population,size=16)
print(echantillon)

print (Echantillon(10))

Résultat


[1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0
 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0
 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0
 1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1
 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 0 1 1 1
 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1
 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 0
 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1
 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 0
 0 0 0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0
 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
 1 1 1 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1
 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1
 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 1 0
 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0
 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 1
 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 1
 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 0
 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 1
 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1
 1 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1
 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0
 1 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0
 1]
[0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0]
[1]

Ah bin tiens, si, la def sert à quelque chose : elle renvoie effectivement fumeur c'est à dire [1]...
Examinons ta boucle
for i in range(n):
   return fumeur
Si je la traduis en français ;
Exécute n fois de suite les instructions qui suivent:
     Renvoie-moi fumeur

Que n=10, 100, 1000, 1 000 000, dès le 1er tour elle renvoie fumeur c'est à dire [1], 1 fois et 1 seule !
Parce que une fois le renvoi effectué, on est sorti de la boucle et de la def...
Si entre les deux lignes tu intercales print("fumeur") et que tu ne désindentes pas le return, tu verras qu'il n'est affiché qu'une fois le string "fumeur".
Donc ta boucle ne faisant rien d'autre que de te renvoyer [1] 1 fois et 1 une seule, ta fonction à condition que tu l'appelles avec un nom différent de celui de ton tableau ne te renvoie que [1]...

Mais attention, fumeur=[1], tout comme prob=[] dont d'ailleurs tu ne te sers pas, sont des déclarations de listes qui ne sont pas des tableaux numpy...

Bon tu as du pain sur la planche : tes probas ne tomberont pas du ciel, il faudra bien les calculer et j'ignore comment tu veux procéder, donc, je m'arrête là...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 30-03-2020 09:19:47

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Python Probabilité

Re,

J'ai modifié ton script pour avoir un résultat.

A partir du moment où une population de 1000 personnes  (0 ou 1) est créée,
- on extrait un échantillon de 16 personnes
- on le passe en paramètre à la fonction Comptage (j'ai renommé la def Echantillon)
- la fonction Comptage, compte (c'est pas original) le nombre de 1 (fumeurs) dans l'échantillon et le renvoie (return fumeurs)
- valeur que je récupère sous le nom de X
- si X est compris entre 4 et 7 alors la proba est égale à 1, 0 dans le cas contraire...

Alors j'ai imaginé pour la simulation demandée, dès la population créée d'extraire cent fois un échantillon de 16 et de répéter les opérations ci-dessus.
Je somme à chaque fois les 1 obtenus et je divise le résultat final par 100 (puisque j'ai testé 100 échantillons)....

Maintenant, question : ente 4 et 7 est-ce $4\leqslant X \leqslant 7$  ou $4<X<7$ ?

Est-cela que tu cherchais à faire ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#4 30-03-2020 11:02:16

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Python Probabilité

Salut Yoshi !

je ne suis pas compétent en Python. Je vais profiter du confinement pour monter en compétence, mais à mon (grand) âge, c'est un peu compliqué, j'ai trop de réflexes acquis de longue date sur deux autres langages de programmation.

Sur l'aspect théorique, que notre ami devrait développer, je pense qu'il y a une erreur de principe.

On a une population de 1.000 personnes, dont 350 fument. On en tire 16 au hasard. L'univers de référence de cette expérience aléatoire est donc tous les 16-uplets possibles choisis parmi 1.000.
La question commence par savoir quelle est la probabilité qu'il y ait $p$ égal à 0, ou 1, ou …, ou 16 fumeurs.
Et donc, théoriquement, comment se calcule cette proba ?
A priori, on est typiquement sur un tirage sans remise de $p$ individus parmi 350, et de $16- p$ individus parmi $1.000-350$. C'est du calcul combinatoire, classiquement.
Techniquement, on a donc le calcul du nombre de choix possible de $p$ parmi $350$ associés au nombre de choix possibles de $16-p$ parmi les $650$ qui ne fument pas, le tout rapporté au nombre de choix possible de 16 parmi 1.000.
C'est ce schéma-là que le pgm doit simuler.
Yoshi, c'est ça que tu fais ?

Dernière modification par freddy (30-03-2020 11:13:10)


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#5 30-03-2020 13:06:33

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Python Probabilité

Re,

une idée de pgm.
Convenir que les 1.000 personnes sont numérotées de 1 à 1.000.
Convenir que les numéros 1 à 350 sont ceux des fumeurs.
Effectuer un tirage aléatoire de 16 numéros parmi 1.000 (si un même numéro sort, ne pas en tenir compte et refaire un tour).
Regarder combien de fumeurs sont présents dans ce tirage et recommencer tant que* … c'est là où ça se complique, définir à partir de combien de tirages on cesse.
Je pense que 100 n'est pas suffisant, faudrait voir beaucoup plus, genre 10.000 voire 100.000, et confronter les résultats avec les résultats théoriques.
Bien entendu, il faut fabriquer un générateur de nombre pseudo aléatoires "propres", comme on sait ;-)
*Et là, on compte le nombre de cas favorables (entre 4 et 7 fumeurs) au nombre de tirages faits.

Je pense que Yoshi va nous faire ça vite fait sur le gaz !

Dernière modification par freddy (30-03-2020 13:07:21)


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#6 30-03-2020 13:20:35

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Python Probabilité

Re,

Normal que tu aies du mal, moi aussi...
La miss travaille avec numpy qui est une des extensions scientifiques (presque un langage à part) de Python, j'ai fini par comprendre ce qu'elle avait fait avec la doc de numpy et une analyse du code.
Donc elle a commencé à créer une population aléatoire de 1000 personnes représentées par deux chiffres 0 et 1, en répartition respectives 65 / 35...
Population stockée dans un tableau.
De ce tableau, elle avait extrait aléatoirement un échantillon de 16 personnes de ce tableau ...

Elle avait créé une fonction chargée de traiter cet échantillon...
Fonction qui ne ne faisait rien d'autre que retourner une seule fois 1 parce qu'elle ne traitait aucun échantillon.

Comme elle attendait que son script lui fournisse la probabilité attendue et qu'il ne lui affichait que sa population et l'échantillon extrait, elle s'est étonnée de ne pas avoir la proba attendue...

C'est là que j'interviens.
Après avoir corrigé quelques aberrations, puis cette nuit, je me suis attaqué mentalement au cœur du problème.
Ce matin, j'ai fait en sorte que ledit échantillon soit transmis à la fonction que j'ai modifiée pour qu'elle renvoie en sortie le nombre de 1 de l'échantillon traité... J'ai vérifié que ça fonctionnait
A partir de là, j'ai relu l'énoncé et je me suis dit que calculer un % du nombre de 1 sur un échantillon de 16 personnes, d'autant que l'énoncé impose un nombre compris entre 4 et 7 sur 16...
Alors 1ere question : bornes incluses ou exclues...
Je suis passé outre et j'ai décidé d'ajouter une boucle qui à partir de la population créée extrait 100 fois de suite un échantillon aléatoire de 16 personnes.
Bien évidemment chaque échantillon est passé à la fonction qui me restitue donc 100 fois de suite le nombre de fumeurs de l'échantillon, la fameuse variable X.
Cette variable récupérée, je comptabilise 1 de plus dans une autre variable p (initialisée à 0) si elle est comprise entre 4 et 7.
Et à la fin, je calcule p/100.
J'ai fait plusieurs fois deux essais
l'un avec 4 et 7 inclus et je tombe grosso modo sur p=0,7
l'autre avec 4 et 7 exclus et je tombe grosso modo sur p=0,35...
Là je me suis dit que je tournais en rond...

Voilà, ce que je te décris peut se traduire dans n'importe quel langage, donc tu ne dois pas être dépaysé.

Tu confirmes ce que je pressentais : tu vois, apparemment ça n'a rien à voir avec ce que je fais... ce n'est pas du tout ce que je fais.
Si je tire aléatoirement 100 échantillons de 16 personnes sur une même population, c'est du tirage avec remise..

Ton univers comprend 42 363 682 220 592 706 806 295 710 413 082 750 16-uplets !

Alors verdict ? Où corriger ? Je suis tes explications jusqu'à tes p et 16-p individus...
Ton p ici ressemble un peu à celui que je calcule...
Je fais des stats sur 100 16-uplets aléatoires. Est-ce que ça présente un intérêt ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#7 30-03-2020 13:20:49

didine
Membre
Inscription : 29-03-2020
Messages : 4

Re : Python Probabilité

Bonjour et merci à vous deux pour vos réponses.

Yoshi,
suite à ton message hier, j'ai pensé à ca mais je coince au niveau de la probabilité d'obtenir entre 4 et 7 fumeurs.
Qu'est ce que tu en penses?

import numpy as np

prob=[]
prob_m=[]   

#population
population=np.random.choice(np.arange(0,2),size=1000,p=[0.65,0.35])
print(population)

#echantillon
a1=np.random.choice(population,size=16)
print(a1)



#remplacer 1 par fumeur et 0 par non fumeur

length = a1
for i in a1:
    if( i==1):
        print(i, "fumeur",0.35)
    elif(i==0):
        print(i,"non fumeur",0.65) 
       

Merci d'avance

Hors ligne

#8 30-03-2020 14:44:00

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Python Probabilité

yoshi a écrit :

Re,

Normal que tu aies du mal, moi aussi...
La miss travaille avec numpy qui est une des extensions scientifiques (presque un langage à part) de Python, j'ai fini par comprendre ce qu'elle avait fait avec la doc de numpy et une analyse du code.
Donc elle a commencé à créer une population aléatoire de 1000 personnes représentées par deux chiffres 0 et 1, en répartition respectives 65 / 35...
Population stockée dans un tableau. Jusque là, c'est bon.
De ce tableau, elle avait extrait aléatoirement un échantillon de 16 personnes de ce tableau ...

Elle avait créé une fonction chargée de traiter cet échantillon...
Fonction qui ne ne faisait rien d'autre que retourner une seule fois 1 parce qu'elle ne traitait aucun échantillon.

Comme elle attendait que son script lui fournisse la probabilité attendue et qu'il ne lui affichait que sa population et l'échantillon extrait, elle s'est étonnée de ne pas avoir la proba attendue...

C'est là que j'interviens.

Après avoir corrigé quelques aberrations, puis cette nuit, je me suis attaqué mentalement au cœur du problème.
Ce matin, j'ai fait en sorte que ledit échantillon soit transmis à la fonction que j'ai modifiée pour qu'elle renvoie en sortie le nombre de 1 de l'échantillon traité... J'ai vérifié que ça fonctionnait
A partir de là, j'ai relu l'énoncé et je me suis dit que calculer un % du nombre de 1 sur un échantillon de 16 personnes, d'autant que l'énoncé impose un nombre compris entre 4 et 7 sur 16...
Alors 1ere question : bornes incluses ou exclues...
Je suis passé outre et j'ai décidé d'ajouter une boucle qui à partir de la population créée extrait 100 fois de suite un échantillon aléatoire de 16 personnes.
Bien évidemment chaque échantillon est passé à la fonction qui me restitue donc 100 fois de suite le nombre de fumeurs de l'échantillon, la fameuse variable X.
Cette variable récupérée, je comptabilise 1 de plus dans une autre variable p (initialisée à 0) si elle est comprise entre 4 et 7.
Et à la fin, je calcule p/100.
J'ai fait plusieurs fois deux essais
l'un avec 4 et 7 inclus et je tombe grosso modo sur p=0,7 C'est bon !
l'autre avec 4 et 7 exclus et je tombe grosso modo sur p=0,35...
Là je me suis dit que je tournais en rond...

Voilà, ce que je te décris peut se traduire dans n'importe quel langage, donc tu ne dois pas être dépaysé.

Tu confirmes ce que je pressentais : tu vois, apparemment ça n'a rien à voir avec ce que je fais... ce n'est pas du tout ce que je fais.
Si je tire aléatoirement 100 échantillons de 16 personnes sur une même population, c'est du tirage avec remise.. Ce n'est pas gênant, mais il faut que les 16 soient tirés sans remise, c'est plus compliqué à faire., je pense.

@+

Re,

oui, le début a l'air pas mal. Ensuite, tirer du tableau d'origine un échantillon de 16 personnes et compter combien il y a de fumeur, c'est bien, mais comme tu l'as fait, faut répéter plusieurs l'expérience.

Ensuite, je comprends qu'on compte le nombre de fumeur compris entre 4 et 7, bornes incluses.

Je n'ai pas calculé les probas théoriques, mais ça devrait être une bonne indication du nombre de fois où il faut répéter l'expérience. Bon, on n'est pas trop loin de ce que la miss cherche. Manifestement, elle n'avait pas trop mal démarré.

J'ai proposé ci-dessus en #5 un protocole expérimental, c'est ce que j'aurais fait sur SAS. Dis moi ce que ça donne.

Pour les probas théoriques, on peut passer directement des calculs que je propose à ceux issus d'une loi binomiale de paramètre (0,35, 16).
Je trouve 70,67 % pour 4<=X<=7
Donc tu as un calcul correct.
Pour 4<=X<7, tu devrais trouver 55,43 %
et pour 4<X<7, on trouve 39,89 %.

Dernière modification par freddy (30-03-2020 16:18:21)


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#9 30-03-2020 15:08:35

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Python Probabilité

Salut,

length = a1

length = longueur en anglais.
Et qu'est-ce que tu appelles "longueur" ? Le tableau a1 ce que tu appelais avant echantillon...
Dans un premier temps, j'ai cru que tu voulais connaitre le nombre d'éléments de a1, alors je m'apprêtais à dire que que le size=16 était suffisamment explicite.
Et alors je m'aperçois que tu n'utilises  pas  length (copie du tableau a1)...
Sais-tu ce que tu fais ?
Après, tu dois faire une simulation ?
Ta simulation se résume en passer en revue les 16 éléments de ton échantillon d'écrire  1 ou 0 selon l'élément avec à côté fumeur et 0.35 ou non fumeur et 0.65...
C'est ça ta simulation ?
Pour moi, tu ne simules rien du tout...
Faire une simulation par exemple, c'est
- faire effectuer par Python une expérience que tu ferais réellement (ou que tu as faite réellement) pour vérifier les résultats de l'un avec l'autre
- exemples :
   * Jeter une pièce de monnaie en l'air 100 fois de suite regarder combien de "face" ou de "pile" tu as obtenus.
      Le faire faire par Python, qui va simuler ce que tu as fait, soit tirer aléatoirement 0 ou 1, 100 fois de suite et te donner ses résultats...
   * faire rouler un dé sur une table 10000 fois et compter le nombre de sorties du 1, 2, 3, 4, 5, 6.
      Simuler ça avec Python, soit lui faire effectuer 10000 fois de suite le tirage aléatoire d'un entier compris entre 1 et 6( bornes incluses), et
      comptabilise chaque sortie... Je viens de le faire. Python me donne : [1661, 1694, 1636, 1680, 1654, 1675]
     A partir de là, je peux calculer les probabilités de sortie de chaque chiffre.
     Sans surprise, je tombe sur 0.1661, 0.1694, 0.1636, 0.1680, 0.1654, 0.1675. NB : 1/6 = 0.16666....

La problématique de ton exercice est hélas un peu plus nébuleuse pour moi...

Autre question : l'énoncé dit entre 4 et 7 : 4 et 7 inclus ou exclus ??? Ça change mon résultat qui n'a peut-être pas de sens d'ailleurs...

J'ai fait quelque chose de plus proche de ce que pourrait être une simulation : je sais ce que je fais avec numpy, comment je le fais, pourquoi je le fais... Mais c'est le bien fondé de ce "pourquoi" dont je doute beaucoup...
Je ne suis pas spécialiste des probas, l'ami freddy, oui, c'est pourquoi je l'ai appelé à la rescousse, sauf que je suis largué à partir d'un moment : si on me dit ce que je dois faire, pas de souci pour le traduire avec Python+numpy...
Mais là...
Bon, voilà ce que je vais devoir modifier quand je saurai ce qu'il faut faire...


from random import*
import numpy as np

def Comptage(echantillon):
    nb_fumeurs=np.count_nonzero(echantillon)
    return nb_fumeurs

Positifs=[]
population= np.random.choice(np.arange(0,2), size=1000, p=[0.65,0.35])
print(population)

for i in range(100):
    echantillon=np.random.choice(population,size=16)
    X=Comptage(echantillon)
    Positifs.append(X)

p=0
for elem in Positifs:
    if elem in [5,6]:
        p+=1
proba=p/100
print ("Probabilité",proba)


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 30-03-2020 15:31:20

didine
Membre
Inscription : 29-03-2020
Messages : 4

Re : Python Probabilité

Un grand merci!
l'énoncé dit entre 4 et 7 : 4 et 7 inclus ou exclus ??? Ça change mon résultat qui n'a peut-être pas de sens d'ailleurs... Oui 4 et 7 sont inclus.

A quoi sert:  positif []?
Etant donné que dans mon échantillon j'ai uniquement des 0 et 1

Dernière modification par didine (30-03-2020 15:35:15)

Hors ligne

#11 30-03-2020 15:46:46

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Python Probabilité

Salut freddy,

Vu le cardinal de l'univers j'ai décidé de porter le nombre d'extractions d'un échantillon à 100000... une misère
et mon résultat arrondi 0,01 près est de 0.4

T'en penses quoi ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#12 30-03-2020 15:55:29

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Python Probabilité

Re,

Si tu regardais Python d'un peu plus près, tu verrais que Positifs est une liste qui contient  le nombre de 1 contenu ans l'échantillon traité .
Après je comptabilise le nombre d'échantillons (sur 100000 : oui, je suis passé de 100 à 100000 extractions) et je divise donc par 100000 ce résultat et l'arrondit à 0,01 près, ce qui me donne le pourcentage d'extractions positives (c'est à dire contenant entre 4 et 7 fumeurs)
Avec ta réponse, je vais modifier 
if elem in [5,6]:
en
if elem in [4,5,6,7]:

C'est fait...
Avec 100000 extractions d'un échantillon aléatoire de la population, je tombe sur 0,71 qui correspond à ce que dit freddy.
code rectifié :

from random import*
import numpy as np

def Comptage(echantillon):
    fumeurs=np.count_nonzero(echantillon)
    return fumeurs

Positifs=[]
population= np.random.choice(np.arange(0,2), size=1000, p=[0.65,0.35])
print(population)

n=100000
for i in range(n):
    echantillon=np.random.choice(population,size=16)
    X=Comptage(echantillon)
    Positifs.append(X)

p=0
for elem in Positifs:
    if elem in [4,5,6,7]:
        p+=1
proba=round(p/n,2)
print ("Probabilité",proba)

Questions ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#13 30-03-2020 16:04:05

didine
Membre
Inscription : 29-03-2020
Messages : 4

Re : Python Probabilité

D'accord

Merci à vous deux

très bonne fin de journée

Hors ligne

#14 30-03-2020 16:35:17

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Python Probabilité

B'soir,

Ave freddy
J'avais pas vu le #5
Convenir que les 1.000 personnes sont numérotées de 1 à 1.000. -- ok, je veux bien
Convenir que les numéros 1 à 350 sont ceux des fumeurs. Alors là, combien de chances sur des nombres astronomiques que ce soit vrai ?
Et puis ton pseudo-code ne s'en sert pas (ou je ne le vois pas)...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#15 30-03-2020 16:59:44

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Python Probabilité

yoshi a écrit :

B'soir,

Ave freddy
J'avais pas vu le #5
Convenir que les 1.000 personnes sont numérotées de 1 à 1.000. -- ok, je veux bien
Convenir que les numéros 1 à 350 sont ceux des fumeurs. Alors là, combien de chances sur des nombres astronomiques que ce soit vrai ?
Et puis ton pseudo-code ne s'en sert pas (ou je ne le vois pas)...

@+

yoshi,

en fait, (1) tu tires au hasard 16 numéros parmi les numéros de 1 à 1.000. Le tirage doit faire apparaitre 16 numéros distincts. Puis, tu comptes les fumeurs parmi eux. Et là, tu conviens qu'un fumeur a un numéro compris entre 1 et 350. Tu peux faire d'autres conventions, le plus important est qu'il y ait 350 fumeurs identifiés parmi les 1.000.
(2) Quand tu as fait ça, tu recommences (1) un nombre N de fois ; et à la fin, tu comptes les tirages tels que le nombre de fumeurs est compris entre 4 et 7.
En fait, tu alimentes un seul compteur n, celui qui vérifie que 4<=X<=7, à chaque tirage.
(3) A la fin, tu as le quotient n/N qui est la proba recherchée.

Je pense que c'est très proche de ce que tu as fait :-)

Dernière modification par freddy (30-03-2020 17:00:37)


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#16 30-03-2020 17:37:11

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Python Probabilité

Re,

En principe, les tranches de 16 de numpy sont toutes composée d'individus distincts...
Je tâcherai de tester ton système demain
Merci

[HS]Je t'ai envoyé un lien plus complet que ceux d'hier... pas sur la même adresse[\HS]

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#17 30-03-2020 21:35:46

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : Python Probabilité

yoshi a écrit :

Re,


[HS]Je t'ai envoyé un lien plus complet que ceux d'hier... pas sur la même adresse[\HS]

@+

Sur laquelle, je n'en ai qu'une privée ... ?


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

Pied de page des forums