Article épinglé

vendredi 5 février 2021

Tirage avec remise en python, fonction choices

Fonctionnement de choices

Tout est là:


#debut du script
import random
#mise en place des categories, ici mon ensemble contient soit des "chomeur", soit des "non chomeur", soit des "rentier"
maliste = ["chomeur", "non chomeur", "rentier"]


'''
ceci est une liste memorisee dans tirage
elle comprendra 10 elements tires au hasard avec remise dans un sac comprenant 33 chomeur, 70 non chomeur et 10 rentier)
'''
tirage=random.choices(maliste, weights = [33, 70,10], k = 10)
print(tirage, len(tirage))
#fin du script

Application 1

Ce qui donne l'idée suivante pour mes collègues de maths:
J'ai un population de 1000 personnes comprenant 158 chômeurs et donc 1000-158 non chômeurs.
On dira que je ne connais pas le nombre de personnes dans ma population!
Je tire un échantillon (ici 20)
Si pour l'échantillon je calcule le ratio chômeur de l'échantillon /effectif de l'échantillon 
Alors puisque le tirage est aléatoire et sans remise ce ratio doit être le même que celui de ma population

=> d'ou l'estimation de la population 

Ex de simulation

['chomeur', 'non chomeur', 'chomeur', 'non chomeur', 'non chomeur', 'chomeur', 'non chomeur', 'non chomeur', 'non chomeur', 'chomeur', 'non chomeur', 'non chomeur', 'non chomeur', 'chomeur', 'non chomeur', 'non chomeur', 'chomeur', 'non chomeur', 'non chomeur', 'non chomeur']
526.6666666666666

Script

#debut du script
import random

#mise en place
mylist = ["chomeur", "non chomeur"]

#pour test jouer avec les valeurs des 3 lignes du dessous
nbrepop=1000 # pop de sees ;)
nbrechompop=158 # nbre de chomeurs de sees
ech=20 # nombre d'element tiré

nbrenonchompop=nbrepop-nbrechompop

#population
'''
Soit une population de 1000 indiv comprenant 158 chomeurs et 842 non chomeurs
tirage est alors une liste extraite au hasard de 20 elements tires parmis les 1000

Attention, erreur possible div par 0 si pas de chom tiré dans l'echantillon
'''
#ceci est une liste mémorisée dans tirage
tirage=random.choices(mylist, weights = [nbrechompop, nbrenonchompop], k = ech)
print(tirage)

# xxxech pour echantillon 
nbrechomech=tirage.count("chomeur")
nbrenonchomech=tirage.count("non chomeur")

#estimation selon methode delphine jugan
nbrepop=ech*nbrechompop/nbrechomech
print(nbrepop)
#fin du script

Application 2

Mais un prof de maths n'est jamais satisfait ;)

Principe

Sur la base du problème du dessus, je simule ici 100 tirages et donc 100 estimations de la population initiale que je mémorise dans une liste. Puis je calcule la moyenne puis la médiane de cette liste d'estimations

Script

import random
import numpy as np

#mise en place
mylist = ["chomeur", "non chomeur"]

#pour test jouer avec les valeurs des 3 lignes du dessous
nbrepop=1000 # pop de sees ;)
nbrechompop=158 # nbre de chomeurs de sees
ech=10 # nombre d'element tiré

nbrenonchompop=nbrepop-nbrechompop

#population
'''
Soit une population de 1000 indiv comprenant 158 chomeurs et 842 non chomeurs
tirage est alors une liste extraite au hasard de 20 elements tires parmis les 1000

Attention, erreur possible div par 0 si pas de chom tiré dans l'echantillon => protection ligne 22-26
'''
simu=[]
for i in range(100):
    
    #ceci est une liste mémorisée dans tirage 
    tirage=random.choices(mylist, weights = [nbrechompop, nbrenonchompop], k = ech)
    #ceci est une protection pour eviter un tirage avec nbrechomech=0 car sinon erreur div 0 en bas
    while tirage.count("chomeur")==0:
        tirage=random.choices(mylist, weights = [nbrechompop, nbrenonchompop], k = ech)
    #fin de la protection
    
    # xxxech pour echantillon 
    nbrechomech=tirage.count("chomeur")
    nbrenonchomech=tirage.count("non chomeur")

    #estimation pop initiale
    nbrepop=ech*nbrechompop/nbrechomech
    simu.append(nbrepop)
    
print(simu)
print(np.mean(simu))
print(np.median(simu))

Aucun commentaire:

Enregistrer un commentaire

Tout commentaire nous engage ;)