mathématiques en seconde générale et technologique – Algorithmes

Étude d'une série statistique

Pour des données réelles ou issues d'une simulation, lire et comprendre une fonction écrite en Python renvoyant la moyenne m, l'écart type s, et la proportion d'éléments appartenant à [m-2s, m+2s].
def effectif(serie) :
    compteur = 0
    for x in serie :
        compteur += 1
    return compteur

def somme(serie) :
    accu = 0
    for x in serie :
        accu += x
    return accu

def moyenne(serie) :
    compteur = 0
    accu = 0
    for x in serie :
        compteur += 1
        accu += x
    return accu / compteur

from math import sqrt
# par définition
def ecart_type(serie) :
    m = moyenne(serie)
    accu = 0
    for x in serie :
        accu += (x - m) ** 2
    return sqrt(accu / effectif(serie))

# formule de König–Huygens 
def ecart_type_kh(serie) :
    accu = 0
    for x in serie :
        accu += x ** 2
    n = effectif(serie)
    m = moyenne(serie)
    return sqrt(accu / n - m ** 2)

def effectif_2s(serie) :
    m = moyenne(serie)
    s = ecart_type(serie)
    compteur = 0
    for x in serie :
        if m - 2 * s <= x <= m + 2 * s :
            compteur += 1
    return compteur

import matplotlib.pyplot as plt
from matplotlib import colors
def plot(serie, m, s) :
    n = effectif(serie)
    ld = [m - 2 * s <= x <= m + 2 * s for x in serie]
    plt.figure()
    plt.scatter(range(n), serie, s=3, c=ld,
                   cmap=colors.ListedColormap(["red", "green"]))
    plt.axhline(m - 2 * s)
    plt.axhline(m + 2 * s)
    plt.savefig("figure.svg")

def run(serie) :
    n = effectif(serie)
    m = moyenne(serie)
    s = ecart_type(serie)
    skh = ecart_type_kh(serie)
    e2s = effectif_2s(serie)
    f2s = e2s / n
    print("effectif : n =", n)
    print("moyenne : m ≈", m)
    print("écart-type : s ≈ {} ≈ {}".format(s, skh))
    print("fréquence des x ∈ [m-2s, m+2s] : f = {} / {} ≈ {}"
              .format(e2s, n, f2s))
    plot(serie, m, s)

import random
serie = []
for i in range(1000) :
    serie.append(random.gauss(0, 1))
run(serie)
effectif : n = 1000
moyenne : m ≈ -0.05564211387720778
écart-type : s ≈ 0.9907238609583238 ≈ 0.9907238609583241
fréquence des x ∈ [m-2s, m+2s] : f = 945 / 1000 ≈ 0.945

Code compact

from math import sqrt
def parametres(serie) :
    n = len(serie)
    m = sum(serie) / n
    s = sqrt(sum((x - m) ** 2 for x in serie) / n)
    skh = sqrt(sum(x ** 2 for x in serie) / n - m ** 2)
    ld = [m - 2 * s <= x <= m + 2 * s for x in serie]
    e2s = sum(ld)
    f2s = e2s / n
    return n, m, s, skh, ld, e2s, f2s

import matplotlib.pyplot as plt
from matplotlib import colors
def plot(serie, n, ld, m, s) :
    plt.figure()
    plt.scatter(range(n), serie, s=3, c=ld,
                   cmap=colors.ListedColormap(["red", "green"]))
    plt.axhline(m - 2 * s)
    plt.axhline(m + 2 * s)
    plt.savefig("figure_optimise.svg")

def run(serie) :
    n, m, s, skh, ld, e2s, f2s = parametres(serie)
    print("effectif : n =", n)
    print("moyenne : m ≈", m)
    print("écart-type : s ≈ {} ≈ {}".format(s, skh))
    print("fréquence des x ∈ [m-2s, m+2s] : f = {} / {} ≈ {}"
              .format(e2s, n, f2s))
    plot(serie, n, ld, m, s)

import random
serie = [random.gauss(0, 1) for i in range(1000)]
run(serie)
effectif : n = 1000
moyenne : m ≈ -0.017750818847298146
écart-type : s ≈ 0.9972826289190838 ≈ 0.9972826289190831
fréquence des x ∈ [m-2s, m+2s] : f = 950 / 1000 ≈ 0.95
Lionel Avon