Modules utiles pour les représentations graphiques et la génération de nombres aléatoires :
%matplotlib inline
import matplotlib.pyplot as plt
import random
from math import sqrt
Génération de la population totale dans la variable pop_totale
: un nombre aléatoire entre 1000 et 7000.
Nombre d'individus marqués lors de la première capture, dans la variable marques
.
pop_totale = random.randint(1000,5000)
marques = 900
La fonction ci-dessous correspond à la phase de Capture-Marquage :
On représente une sous-population marquée par une liste de M nombres égaux à 1.
On représente le reste de la population non marquée par une liste de N-M nombres égaux à 0.
On concatène les deux listes ci-dessus : on obtient une liste de N individus dont les M premiers sont marqués.
Cette liste est renvoyée par la fonction creer_population_marquee
.
def creer_population_marquee(N, M):
m0 = [1]*M
m1 = [0]*(N-M)
popu = m0+m1
return popu
On mélange la liste obtenue par la fonction creer_population_marquee
: les $n$ premiers éléments de cette liste constituent un échantillon de taille $n$ de cette population.
La fonction prelever_echantillon
renvoie un échantillon.
Cela correspond à la phase de recapture.
def prelever_echantillon(P, n):
random.shuffle(P)
return P[:n]
population = creer_population_marquee(pop_totale,marques)
def multi_echantillon(rep, pop, n):
f = []
for i in range(rep):
echantillon = prelever_echantillon(pop, n)
f.append(sum(echantillon)/len(echantillon))
return f
x = list(range(100))
freq_simul = multi_echantillon(100, population, 200)
ymin = min(freq_simul)
ymax = max(freq_simul)
plt.figure(figsize = (10, 5))
plt.ylim(ymin - 0.05, ymax + 0.05)
plt.xlabel("échantillons de taille 200")
plt.ylabel("fréquence obtenue par l'échantillon simulé")
plt.scatter(x, freq_simul, s=10)
#plt.show()
plt.savefig('simul200.png', dpi = 600)
On simule 100 fois une recapture d'un échantillon de 200 individus, puis 100 fois une recapture d'un échantillon de 600 et à nouveau 100 fois une recapture d'un échantillon de 1000 individus.
On représente ensuite graphiquement les 100 simulations dans les trois cas.
list_freq_simul = [multi_echantillon(100, population, 200 + 400 * i) for i in range(3)]
ymin = min([min(list_freq_simul[i]) for i in range(3)])
ymax = max([max(list_freq_simul[i]) for i in range(3)])
p = [marques/pop_totale]*100
plt.figure(figsize = (18, 5))
for i in range(3):
bi = [marques/pop_totale-1/sqrt(200+400*i)]*100
bs = [marques/pop_totale+1/sqrt(200+400*i)]*100
plt.subplot(1, 3, i+1)
plt.ylim(ymin - 0.05, ymax + 0.05)
plt.xlabel("échantillons de taille {}".format(200+400*i))
plt.ylabel("fréq. obtenue par l'échantillon simulé")
plt.scatter(x, list_freq_simul[i], s=10)
plt.plot(x, p, 'g--')
plt.plot(x, bi, '--', color = 'orange')
plt.plot(x, bs, '--', color = 'orange')
#plt.show()
plt.savefig('simul_multiple.png', dpi = 600)
Pour chaque échantillon, on détermine un intervalle de confiance à 95 % permettant d'encadrer la véritable proportion.
Pour chaque fréquence $f$, sur un échantillon de taille $n$, un intervalle de confiance, au niveau de 95%, est: $$\left[ f-\frac{1}{\sqrt{n}};f+\frac{1}{\sqrt{n}}\right]$$
Pour chaque fréquence de chaque échantillon, on trace l'intervalle de confiance correspondant.
Plus $n$ est grand, plus l'intervalle de confiance est étroit.
demi_ampli_confiance = [[1/sqrt(200+400*i)] * 100 for i in range(3)]
plt.figure(figsize = (18, 12))
for i in range(3):
plt.subplot(3, 1, i+1)
plt.ylim(ymin-0.075, ymax+0.075)
plt.xlabel("échantillons de taille {}".format(200+400*i))
plt.ylabel("fréq. obtenue par l'échantillon simulé")
plt.scatter(x, list_freq_simul[i], s=14)
plt.errorbar(x, list_freq_simul[i], yerr = demi_ampli_confiance[i], fmt = 'none', capsize = 4, errorevery = 1, ecolor = 'red')
#plt.show()
plt.savefig('simul_multiple_confiance.png', dpi = 600)
La population totale est contenue dans la variable pop_totale
et le nombre d'individus marqués dans marques
. La proportion d'individus marqués est le quotient de ces deux valeurs.
marques/pop_totale
On ajoute cette valeur (ligne pointillée) aux représentations graphiques ci-dessus pour observer que cette proportion appartient presque toujours aux intervalles de confiance.
p = [marques/pop_totale]*100
plt.figure(figsize = (18, 12))
for i in range(3):
plt.subplot(3, 1, i+1)
plt.ylim(ymin-0.075, ymax+0.075)
plt.xlabel("échantillons de taille {}".format(200+400*i))
plt.ylabel("fréq. obtenue par l'échantillon simulé")
plt.scatter(x, list_freq_simul[i], s=14)
plt.plot(x, p, 'g--')
plt.errorbar(x, list_freq_simul[i], yerr = demi_ampli_confiance[i], fmt = 'none', capsize = 4, errorevery = 1, ecolor = 'red')
#plt.show()
plt.savefig('simul_multiple_confiance_theorie.png', dpi = 600)