#import des modules
import matplotlib.pyplot as plt
import numpy as np
import random
% matplotlib inline
#Fonctions statistiques pour une série brute
def moyenne(tab):
return sum(tab)/len(tab)
def variance(tab):
return sum(map(lambda x : x**2, tab))/len(tab) - moyenne(tab)**2
def ecart_type(tab):
return np.sqrt(variance(tab))
#Attention comme les tableaux sont indexés à partir de 0
#il faut translater tous les indices de -1 dans les formules
def mediane(tab):
tab2 = tab[:]
tab2.sort()
n = len(tab2)
if n%2 == 0:
return (tab2[n//2-1] + tab2[n//2])/2, 'hors-série'
return tab2[(n+1)//2-1], (n+1)//2
def decile(tab, q):
tab2 = tab[:]
tab2.sort()
n = len(tab2)
position = n*q
if position == int(position):
return tab[int(position)-1], int(position)
return tab[int(position)], int(position) + 1
def cumul(tab):
cumultab = [tab[0]]
for e in tab[1:]:
cumultab.append(e + cumultab[-1])
return cumultab
#Fonctions statistiques pour une série donnée sous la forme tableau de valeurs, tableau d'effectifs
#En fait on a juste besoin de la fonction serie_brute pour réutiliser les fonctions précédentes
def moyenne_effectif(valeur, effectif):
return sum([x*n for (x, n) in zip(valeur, effectif)])/sum(effectif)
def variance_effectif(valeur, effectif):
return sum([x**2*n for (x, n) in zip(valeur, effectif)])/sum(effectif) - moyenne_effectif(valeur, effectif)**2
def ecart_type_effectif(valeur, effectif):
return np.sqrt(variance_effectif(tab))
#Attention comme les tableaux sont indexés à partir de 0
#il faut translater tous les indices de -1 dans les formules
def serie_brute(valeur, effectif):
"""Reconstitution d'une série brute à partir des tableaux de valeurs et d'effectifs"""
return [x for i, x in enumerate(valeur) for k in range(effectif[i])]
def valeur_effectif(brute):
"""Retourne un tableau de valeurs et un tableau d'effectifs
à partir d'une série brute"""
tab2 = brute[:]
tab2.sort() #tri
valeur, effectif = [tab2[0]], [1]
for e in tab2[1:]:
if e != valeur[-1]:
valeur.append(e)
effectif.append(1)
else:
effectif[-1] += 1
return valeur, effectif
def affiche_tableau(brute=None, valeur=None, effectif=None, croissant=False, conversion_effectif = lambda x : x):
"""Affiche un tableau Valeurs/ Effectifs"""
if brute != None:
if effectif == None and valeur == None:
valeur, effectif = valeur_effectif(brute)
if effectif != None and valeur != None and len(valeur) == len(effectif):
if croissant:
effectifcumul = cumul(effectif)
print('|{:^30s}|{:^30s}|{:^30s}|'.format('Valeur', 'Effectif', 'Effectif cumulé croissant'))
for val, eff, effcumul in zip(valeur, effectif, effectifcumul):
print('|{:^30g}|{:^30g}|{:^30g}|'.format(val, conversion_effectif(eff), conversion_effectif(effcumul)))
else:
print('|{:^40s}|{:^40s}|'.format('Valeur', 'Effectif'))
for val, eff in zip(valeur, effectif):
print('|{:^40g}|{:^40g}|'.format(val, conversion_effectif(eff)))
def diagramme_circulaire(valeur, effectif):
# The slices will be ordered and plotted counter-clockwise.
#plt.clf()
labels = [str(x) for x in valeur]
sizes = effectif
colors = ['#ECE9E9', '#ACAAAA', '#857E7E', '#848484']
plt.pie(sizes, labels=labels,
autopct='%1.1f%%', shadow=True, colors=colors,startangle=90)
# Set aspect ratio to be equal so that pie is drawn as a circle.
plt.axis('equal')
#plt.show()
def diagramme_baton(valeur, effectif, largeur=1):
#plt.clf()
plt.bar(valeur, effectif,align='center', width=largeur,color='red')
plt.xlabel('Valeurs')
plt.ylabel('Effectifs')
plt.ylim(min(effectif) - 0.1*(max(effectif) - min(effectif)),
max(effectif) + 0.1*(max(effectif) - min(effectif)))
for p, e in zip(valeur, effectif):
plt.annotate(str(e),xy=(p,e), xycoords='data', fontsize=16)
# Tweak spacing to prevent clipping of ylabel
plt.subplots_adjust(left=0.15)
#plt.show()
def diagramme_boite(brute=None, valeur=None, effectif=None, xmin=None, xmax=None):
def diagramme_boite_brute(tab):
#plt.clf()
if xmin != None and xmax != None:
plt.xlim(xmin, xmax)
else:
plt.xlim(min(tab) - 0.1*(max(tab) - min(tab)), max(tab) + 0.1*(max(tab) - min(tab)))
plt.boxplot(tab,vert=False,whis=10,medianprops=dict(linestyle='-',color='red'),boxprops=dict(linewidth=3))
#plt.show()
if brute == None:
if effectif != None and valeur != None and len(valeur) == len(effectif):
diagramme_boite_brute(sorted(serie_brute(valeur, effectif)))
elif effectif == None and valeur == None:
diagramme_boite_brute(sorted(brute))
def polygone_cumul(valeur, effectif,conversion_effectif = lambda x : x):
plt.xlabel('Valeurs')
plt.ylabel('Effectifs cumulés croissants')
serie_tri = sorted( [(v, e) for (v,e) in zip(valeur, effectif)])
val_tri = [couple[0] for couple in serie_tri]
eff_tri = [conversion_effectif(couple[1]) for couple in serie_tri]
cum_tri = cumul(eff_tri)
plt.ylim(min(cum_tri) - 0.1*(max(cum_tri) - min(cum_tri)),
max(cum_tri) + 0.1*(max(cum_tri) - min(cum_tri)))
plt.xlim(min(val_tri) - 0.1*(max(val_tri) - min(val_tri)),
max(val_tri) + 0.1*(max(val_tri) - min(val_tri)))
plt.plot(val_tri, cum_tri,'o-')
plt.grid(True)
def nuage(valeur, effectif):
plt.xlabel('Valeurs')
plt.ylabel('Effectifs')
plt.ylim(min(effectif) - 0.1*(max(effectif) - min(effectif)),
max(effectif) + 0.1*(max(effectif) - min(effectif)))
plt.scatter(valeur, effectif,marker = 'o')
plt.grid(True)
def histogramme(brute=None,effectif=None,valeur=None, nbclasses = 1, binf = 0, bsup = 0):
if valeur and effectif:
brute = serie_brute(valeur, effectif)
# the histogram of the data
n, bins, patches = plt.hist(brute, nbclasses, range = (binf, bsup), facecolor='grey', alpha=0.5)
plt.xlabel('Valeur')
plt.ylabel('Effectif')
plt.title(r'Histogramme')
# Tweak spacing to prevent clipping of ylabel
plt.subplots_adjust(left=0.15)
#plt.savefig('histo-nba.pdf')
#plt.show()
def indicateurs(brute=None,effectif=None,valeur=None, conversion_effectif = lambda x : x):
def indicateurs_brute(tab):
tab2 = tab[:]
tab2.sort()
print('Série triée :')
valeur, effectif = valeur_effectif(tab2)
affiche_tableau(valeur=valeur, effectif=effectif, croissant=True, conversion_effectif = conversion_effectif)
print('Effectif total = %s'%conversion_effectif(len(tab2)))
print('Moyenne = %.4f'%moyenne(tab2))
print('Variance = %.4f'%variance(tab2))
print('Ecart-type = %.4f'%ecart_type(tab2))
print('Min = %s'%min(tab2))
print('D1 = %s en position %s'%decile(tab2, 0.1))
print('Q1 = %s en position %s'%decile(tab2, 0.25))
print('Mediane = %s en position %s'%mediane(tab2))
print('Q2 = %s en position %s'% decile(tab2, 0.5))
print('Q3 = %s en position %s'%decile(tab2, 0.75))
print('D9 = %s en position %s'%decile(tab2, 0.9))
print('Max = %s '%max(tab2))
if brute == None:
if effectif != None and valeur != None and len(valeur) == len(effectif):
indicateurs_brute(serie_brute(valeur, effectif))
elif effectif == None and valeur == None:
indicateurs_brute(brute)
#test de la fonction serie_brute
serie_brute([1,2,3],[4,1,5])
#test des fonctions
tabalea1 = [random.randint(1, 100) for i in range(11)]
tabalea2 = [random.randint(1, 100) for i in range(10)]
for t in [tabalea1, tabalea2]:
print('Série = ', t)
indicateurs(brute=t)
print()
tabalea3 = [random.randint(1, 10) for i in range(50)]
valeur3, effectif3 = valeur_effectif(tabalea3)
valeur3, effectif3
polygone_cumul(valeur3, effectif3)
brute1 = [11, 11, 12, 13, 9, 9, 10, 9, 20, 9, 13, 14, 10, 10, 12, 13, 7, 11, 10,
7, 13, 12, 13, 9, 13, 14, 11, 11, 9, 14, 12, 14, 11, 9, 7, 9, 11]
indicateurs(brute=brute1)
val1, eff1 = valeur_effectif(brute1)
nuage(val1, eff1)
diagramme_circulaire(valeur = val1, effectif = eff1)
diagramme_boite(valeur = val1, effectif = eff1)
polygone_cumul(val1, eff1)
val1, eff1 = [50,55,60,65,70,75,80,85,90], [1,2,6,10,11,9,4,5,2]
nuage(val1, eff1)
indicateurs(valeur = val1, effectif = eff1)
val3, eff3 = [1.5,3.5,5,8], [30,30,40,40]
indicateurs(valeur = val3, effectif = eff3)
val4, eff4 = [0,1,2,3,4,5,6,7,8,9,10], [1,1,1,2,2,6,4,5,3,1,1]
indicateurs(valeur = val4, effectif = eff4)
prix = [900+i for i in range(0,700,100)]
prix.remove(1100)
effectif = [150,180,240,120,150,150]
affiche_tableau(valeur=prix, effectif=effectif)
diagramme_baton(prix, effectif,largeur=50)
diagramme_boite(valeur=prix,effectif=effectif)
#indicateurs de la série
indicateurs(valeur=prix,effectif=effectif)
#on change le prix minimum et le prix maximum
prix[0], prix[-1] = 500, 2000
#indicateurs de la nouvelel série
indicateurs(valeur=prix,effectif=effectif)
On peut remarquer que la médiane et les quartiles sont insensibles au changement des valeurs extremes mais que ce n'est pas le cas de la mouenne et de l'écart-type
diagramme_circulaire(['0,98 L', '0,99 L', '1 L', '1,1 L'], [45, 22, 27, 6])
valeur = [float(chaine.rstrip(' L').replace(',','.')) for chaine in ['0,98 L', '0,99 L', '1 L', '1,1 L']]
effectif = [45, 22, 27, 6]
indicateurs(valeur=valeur,effectif=effectif)
Question 4 Moyenne approché de la série regroupée par classes de l'histogramme de l'exemple 3
$$\frac{1,5 \times 30 + 3,5 \times 30 + 5 \times 40 + 8 \times 40}{140} \approx 4,79$$
serieA = [21, 19, 17, 11, 9, 16, 8, 6, 12]
indicateurs(brute=serieA)
diagramme_boite(brute=serieA)
serieB = [2,9,7,2,9,8,8,6,2,8,6,8]
indicateurs(brute=serieB)
diagramme_boite(brute=serieB)
serieA = [49, 21, 19, 42, 7, 29, 9, 29, 10, 4, 46, 44, 14, 52, 23, 34, 39, 43, 51, 40, 51, 18]
indicateurs(brute=serieA)
Pour la série A :
serieB = [53, 19, 9, 21, 49, 51, 56, 58, 39, 27, 14, 28, 41, 46, 18, 53,
58, 6, 44, 53, 16, 41, 15, 11, 32]
indicateurs(brute=serieB)
Pour la série B :
diagramme_boite(brute=serieA)
diagramme_boite(brute=serieB)
serie6 = [49, 55, 57, 57, 57, 58, 58, 59, 60, 60 ,60, 62, 63, 63, 63, 63 ,64 ,64 ,64 ,64 ,64,
65 , 65 ,65 ,66 ,67, 69, 69, 70, 70, 72, 74, 74, 75 ,75 ,76, 77, 78, 79, 80, 80, 82]
indicateurs(brute=serie6)
valeur6, effectif6 = valeur_effectif(serie6)
diagramme_boite(valeur=valeur6, effectif=effectif6)
serie11 = [9, 14, 13, 0, 18, 6, 25, 5, 16, 8, 14, 8, 8, 12, 14, 12, 0, 3, 11, 4, 1, 11, 1, 8, 14, 9, 10, 5]
indicateurs(brute=serie11)
valeur11, effectif11 = valeur_effectif(serie11)
diagramme_baton(valeur=valeur11, effectif=effectif11)
diagramme_boite(brute=serie11)
diagramme_circulaire(['Etat', 'Régions', 'Départements', 'Communes'], [56, 9, 7, 28])
for e, p in zip(['Etat', 'Régions', 'Départements', 'Communes'], [56, 9, 7, 28]):
print('{:} : Montant en millions d\'euros : {:.3f}'.format(e, p/100*108,6))
On considère que la population étudiée est celle des douze mois de l'année et que le caractère mesuré est la fréquentation des cinémas en millions d'entrées pour un mois fixé.
Ce caractère est quantitatif.
entree = [16.2, 17.6, 16.4, 20.9, 16.2, 14.6, 16.9, 14.1, 11.1, 18, 22.8, 18.6]
valeur, effectif = valeur_effectif(entree)
indicateurs(brute = entree)
Polygone des effectifs cumulés croissants
polygone_cumul(valeur, effectif)
On considère que la population étudiée est celle des entrées au cinéma payées sur une année civile et que que le caractère mesuré est le mois où cette entrée a été réalisée. Les mois sont codés de 1 à 12, il s'agit donc de l'étude d'un caractère quantitatif. Dans ce point de vue, il est difficile d'interpréter la moyenne. En revanche, la fréquence cumulée croissante des entrées sur les six premiers mois de l'année est intéressante, elle est de $\frac{101,9}{203,4} \approx 0,501$ c'est-à-dire que la fréquentation des cinémas sur les six premiers mois représente $50,1 \%$ de la fréquentation totale ce qui est équilibré.
mois = [n for n in range(1, 13)]
entree = list(map(lambda x : int(x*10), [16.2, 17.6, 16.4, 20.9, 16.2, 14.6, 16.9, 14.1, 11.1, 18, 22.8, 18.6]))
indicateurs(valeur = mois, effectif = entree, conversion_effectif = lambda x : x*10**5)
polygone_cumul(mois, entree, conversion_effectif = lambda x : x*10**5)
duree = [5]*2 + [15]*3 + [25]*8 + [35]*3 + [45]*4 + [55]*5
indicateurs(brute = duree)
polygone_cumul(*valeur_effectif(duree))
histogramme(brute = duree, nbclasses = 6, binf = 0, bsup = 60)
valeur, effectif = [69, 70, 71, 72, 73, 74], [2, 16, 11, 8, 7, 6]
diagramme_baton(valeur = valeur, effectif = effectif)
diagramme_circulaire(valeur, effectif )
indicateurs(valeur = valeur, effectif = effectif)
serie49 = [12,9,6,13,10,9,8,16,11,17,9,9,16,13,17,9,14]
indicateurs(brute = serie49)
diagramme_baton(*valeur_effectif(serie49))
corentin = [12, 12, 11, 13, 12]
gavin = [2, 18, 19, 10, 11]
morgane = [14, 2, 16, 10, 14]
indicateurs(corentin)
indicateurs(gavin)
indicateurs(morgane)
Le meilleur tireur est Corentin car il a la meilleure moyenne à égalité avec Gavin, mais il est plus régulier que Gavin car son écart interquartile $Q_{3}- Q_{1}$ est plus faible ($0$ pour Corentin et $8$ pour Gavin).