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])