Multiples simulations de recaptures et effet de la taille de l'échantillon

Modules utiles pour les représentations graphiques et la génération de nombres aléatoires :

In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
import random
from math import sqrt

Initialisation des variables

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.

In [2]:
pop_totale = random.randint(1000,5000)
marques = 900

Phase de Capture - Marquage

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.

In [3]:
def creer_population_marquee(N, M):
    m0 = [1]*M
    m1 = [0]*(N-M)
    popu = m0+m1
    return popu

Phase de Recapture

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.

In [4]:
def prelever_echantillon(P, n):
    random.shuffle(P)
    return P[:n]

Simulation de plusieurs échantillons de même taille

  • Création d'une population marquée
  • Sur cette population, on simule 100 fois la recapture d'un échantillon de taille 200
  • Représentation graphique des fréquences (nombre d'individus marqués/taille de l'échantillon) obtenues
In [5]:
population = creer_population_marquee(pop_totale,marques)
In [6]:
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
In [7]:
x = list(range(100))
freq_simul = multi_echantillon(100, population, 200)
In [8]:
ymin = min(freq_simul) 
ymax = max(freq_simul)
In [9]:
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)

Simulation de 100 recaptures pour des échantillons de taille 200, puis 600 et 1000

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.

In [10]:
list_freq_simul = [multi_echantillon(100, population, 200 + 400 * i) for i in range(3)]
In [11]:
ymin = min([min(list_freq_simul[i]) for i in range(3)])
ymax = max([max(list_freq_simul[i]) for i in range(3)])
In [12]:
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)

Représentation des intervalles de confiance

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.

In [13]:
demi_ampli_confiance = [[1/sqrt(200+400*i)] * 100 for i in range(3)]
In [14]:
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 proportion théorique est presque toujours dans l'intervalle de confiance

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.

In [15]:
marques/pop_totale
Out[15]:
0.3723624327678941

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.

In [16]:
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)
In [ ]: