Correction de l'activité 12 : La notion d'intervalle de fluctuation
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
#Importation des bibliothèques nécessaires au fonctionnement du programme
#-------------------------------------------------------------------------------
#Bibliothèque mathématiques
#https://docs.python.org/fr/3.5/library/math.html
from math import*
#Autres bibliothèques
#Importation du module pylab qui permet de dessiner dans un repère
#http://www.courspython.com/introduction-courbes.html
from pylab import*
#Bibliothèque random
#https://docs.python.org/2/library/random.html
from random import*
#-------------------------------------------------------------------------------
#Création des fonctions Python nécessaires au fonctionnement du programme
#-------------------------------------------------------------------------------
#Fonction qui suit une loi de Bernoulli de paramètre p contenu dans ]0;1[
def loiBernoulli(probaSucces):
p=probaSucces
if random() < p:
r=1 #Dans ce cas c'est un succès
else:
r=0 #Dans ce cas c'est un échec
return r
#Fonction qui suit une loi binomiale
def loiBinomiale(nbRepetition,probaSucces):
n=nbRepetition
p=probaSucces
compteur=0
for i in range(n):
r=loiBernoulli(p)
compteur=compteur+r
return compteur
def compteurIntSec(frequence,compteur,nbRepetition,probaSucces):
p=probaSucces
n=nbRepetition
x=p-1/sqrt(n)
y=p+1/sqrt(n)
f=frequence
if (x < f and f < y):
compteur=compteur+1
return compteur
def compteurIntTerm(frequence,compteur,nbRepetition,probaSucces):
p=probaSucces
n=nbRepetition
x=p-1.96*sqrt(p*(1-p))/(sqrt(n))
y=p+1.96*sqrt(p*(1-p))/(sqrt(n))
f=frequence
if x < f and f < y:
compteur=compteur+1
return compteur
def pourcentage(effectif,nbRepetition):
pourc=100*effectif/nbRepetition
return pourc
#Pour obtenir la réponse à la question 1 :
# Fonction Python qui permet de dessiner la courbe du chien
def Nuage(nbRepetition,probaSucces,nbEchantillon,compteurSec,compteurTerm):
n=nbRepetition
p=probaSucces
M=nbEchantillon
fig=figure(figsize=(10, 8))
ax = fig.add_subplot(1, 1, 1)
xlim(0, M)
ylim(0, 1)
grid(True)
axis([0, M, 0, 1])
#graduations secondaires
major_ticks = arange(0, 1, 0.1)
minor_ticks = arange(0, 1, 0.05)
ax.set_yticks(major_ticks)
ax.set_yticks(minor_ticks, minor=True)
ax.grid(which='minor', alpha=0.5)
ax.grid(which='major', alpha=1)
for i in range(M):
y=loiBinomiale(n,p)/n
compteurSec=compteurIntSec(y,compteurSec,nbRepetition,probaSucces)
compteurTerm=compteurIntTerm(y,compteurTerm,nbRepetition,probaSucces)
plot(i,y,'r.')
pourSec=pourcentage(compteurSec,M)
pourTerm=pourcentage(compteurTerm,M)
return pourSec,pourTerm
#calcul des bornes de l'intervalle de fluctuation de seconde
def InterFluctuSeconde(nbRepetition,probaSucces):
n=nbRepetition
p=probaSucces
legende='Int. de fluctuation au seuil de 95% (seconde)'
x=p-1/sqrt(n)
y=p+1/sqrt(n)
return x,y,legende
#calcul des bornes de l'intervalle de fluctuation de seconde
def InterFluctuTerm(nbRepetition,probaSucces):
n=nbRepetition
p=probaSucces
legende='Int. de fluctuation asymptotique au seuil de 95% (terminale)'
x=p-1.96*sqrt(p*(1-p))/(sqrt(n))
y=p+1.96*sqrt(p*(1-p))/(sqrt(n))
return x,y,legende
#Représentation des intervalles de fluctuation
def representationIntervalle(borneInf,borneSup,nbEchantillon,couleur,legende):
a=borneInf
b=borneSup
M=nbEchantillon
xlim(0, M)
ylim(0, 1)
x=array([0, M])
y=array([a, a])
plot(x,y,couleur,label=legende,linewidth=2)
legend(fontsize="10")
x=array([0, M])
z=array([b, b])
plot(x,z,couleur,linewidth=2)
#----------------------------------
#Déclaration des variables globales
#----------------------------------
probaSucces=0.39 #Probabilité du succès
nbRepetition=200 #Nombre de répétitions
nbEchantillon=183
compteurSec=0
compteurTerm=0
#--------------------------------------------------------------------------
#Programme principal
#--------------------------------------------------------------------------
#Loi de Binomiale
'''
binom=loiBinomiale(nbRepetition,probaSucces)
print(binom)
'''
nuage=Nuage(nbRepetition,probaSucces,nbEchantillon,compteurSec,compteurTerm)
#Calcul des bornes de l'intervalle de fluctuation au seuil de 95% (de seconde)
liste=InterFluctuSeconde(nbRepetition,probaSucces)
print(liste[2])
print(liste[0])
print(liste[1])
borneInf=liste[0]
borneSup=liste[1]
leg=liste[2]
representationIntervalle(borneInf,borneSup,nbEchantillon,'g',leg)
#Calcul des bornes de l'intervalle de fluctuation asymptotique au seuil de 95% (de terminale)
liste=InterFluctuTerm(nbRepetition,probaSucces)
print(liste[2])
print(liste[0])
print(liste[1])
borneInf=liste[0]
borneSup=liste[1]
leg=liste[2]
representationIntervalle(borneInf,borneSup,nbEchantillon,'r',leg)
titre1='Fluctuation des fréquences observées dans le cas où n= '
titre2=str(nbEchantillon)+' et p= '+str(probaSucces)+'\n'
#titre3="Pourcentage de points à l'interieur de l'int. de seconde : "+str(nuage[0])+" %\n"
titre4="Pourcentage de points à l'interieur de l'int. de terminale : "+str(nuage[1])+" % \n"
titre5="Intervalle de fluct. asymptotique au seuil de 95% ["+str(borneInf)+" ; "+str(borneSup)+" ]\n"
#title(titre1+titre2+titre3+titre4+titre5)
title(titre1+titre2+titre4+titre5)
show()
print("Pourcentage de points dans l'intervalle de seconde :",nuage[0])
print("Pourcentage de points dans l'intervalle de terminale :",nuage[1])