Aller au contenu

Décrivez un échantillon et passez à la population

Un opérateur de trottinettes électriques en libre-service annonce « 30 km d’autonomie ». Vous relevez l’autonomie réelle de 12 trottinettes dans les rues de Rennes et vous obtenez 12 nombres, tous différents. Que dire de ces 12 nombres ? Et surtout, que dire des milliers de trottinettes que vous n’avez pas mesurées ?

Ce chapitre répond à la première question (décrire) et pose le cadre de la seconde (inférer), qui occupe tout le reste du cours. Nous suivrons ces 12 trottinettes du début à la fin.

Population, échantillon, variable : le vocabulaire

Section intitulée « Population, échantillon, variable : le vocabulaire »

La statistique a son vocabulaire, et il vaut la peine de le fixer tout de suite.

  • La population est l’ensemble que l’on veut étudier : ici, toutes les trottinettes de l’opérateur.
  • Un individu (ou unité statistique) est un élément de cette population : une trottinette.
  • Un échantillon est la partie de la population réellement observée : nos 12 trottinettes. Sa taille se note nn.
  • Une variable est une caractéristique mesurée sur chaque individu : l’autonomie, la marque de la batterie, le nombre de pannes.

Les variables n’ont pas toutes la même nature, et c’est elle qui décide des outils utilisables.

NatureSous-typeExemple chez l’opérateurRésumés possibles
Quantitativecontinueautonomie (km)moyenne, variance, quantiles
Quantitativediscrètenombre de pannes dans l’annéemoyenne, variance, diagramme en bâtons
Qualitativenominalemarque de la batterieeffectifs, proportions, mode
Qualitativeordinaleétat (neuf, correct, usé)effectifs, médiane de rang

Résumer une variable quantitative par des nombres

Section intitulée « Résumer une variable quantitative par des nombres »

Voici les autonomies relevées, en kilomètres :

31,228,533,029,835,127,430,632,326,930,034,229,0

Notons x1,…,xnx_1, \dots, x_n ces valeurs, avec n=12n = 12.

La moyenne empirique est

xˉn=1n∑i=1nxi\bar x_n = \frac{1}{n} \sum_{i=1}^{n} x_i

où xˉn\bar x_n se lit « x barre », nn est la taille de l’échantillon et xix_i la ii-ème observation. Ici, la somme vaut 368, donc xˉ12=368/12≈30,67\bar x_{12} = 368 / 12 \approx 30{,}67 km.

La médiane est la valeur qui coupe l’échantillon trié en deux moitiés. Pour la calculer, on range les valeurs dans l’ordre croissant. On obtient la statistique d’ordre x(1)≤x(2)≤⋯≤x(n)x_{(1)} \le x_{(2)} \le \dots \le x_{(n)}, où x(1)x_{(1)} est le minimum et x(n)x_{(n)} le maximum :

26,927,428,529,029,830,030,631,232,333,034,235,126{,}9 \quad 27{,}4 \quad 28{,}5 \quad 29{,}0 \quad 29{,}8 \quad 30{,}0 \quad 30{,}6 \quad 31{,}2 \quad 32{,}3 \quad 33{,}0 \quad 34{,}2 \quad 35{,}1

Avec 12 valeurs, la médiane est la moyenne des 6e et 7e : (30,0+30,6)/2=30,3(30{,}0 + 30{,}6)/2 = 30{,}3 km.

Pourquoi deux indicateurs de position ? Parce qu’ils ne réagissent pas de la même façon aux valeurs extrêmes. Imaginez qu’une 13e trottinette, à la batterie défectueuse, ne tienne que 12 km. La moyenne tombe à 380/13≈29,23380/13 \approx 29{,}23 km, alors que la médiane passe seulement à 30,0 km. On dit que la médiane est robuste.

médiane 30,3moyenne 30,6712 trottinettes101520253035autonomie (km)moyenne 29,23médiane 30,012 km13 trottinettes, dont une batterie défectueuse
Une seule valeur extrême déplace la moyenne de près d'un kilomètre et demi (flèche), alors que la médiane bouge à peine : elle est robuste.

Deux flottes peuvent avoir la même autonomie moyenne et des comportements très différents : l’une régulière, l’autre imprévisible. La variance empirique mesure l’écart quadratique moyen à la moyenne :

sn2=1n∑i=1n(xi−xˉn)2=(1n∑i=1nxi2)−xˉn2s_n^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \bar x_n)^2 = \left( \frac{1}{n} \sum_{i=1}^{n} x_i^2 \right) - \bar x_n^2

La seconde écriture (« moyenne des carrés moins carré de la moyenne ») se démontre en développant le carré : c’est la version empirique de l’identité V(Z)=E[Z2]−E[Z]2V(Z) = E[Z^2] - E[Z]^2 que vous connaissez du cours de probabilités.

On utilise aussi très souvent la variance corrigée, qui divise par n−1n - 1 au lieu de nn :

s~n2=1n−1∑i=1n(xi−xˉn)2=nn−1 sn2\tilde s_n^2 = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar x_n)^2 = \frac{n}{n-1} \, s_n^2

Pourquoi cette correction ? Vous le démontrerez au chapitre suivant : sn2s_n^2 sous-estime systématiquement la variance de la population. Pour l’instant, retenez que c’est s~n2\tilde s_n^2 que calculent var() en R et statistics.variance() en Python.

L’écart-type est la racine carrée de la variance. Il s’exprime dans la même unité que les données, ce qui le rend lisible.

123456789101112trottinette i26283032343638autonomie (km)x̄ = 30,67somme des carrés des écarts ≈ 74,07s² = 74,07 / 12 ≈ 6,17 km² s ≈ 2,48 km
La variance est la moyenne des carrés de ces segments. Les écarts positifs et négatifs se compensent en somme, d'où le carré.

Le quartile Q1Q_1 laisse 25 % des valeurs en dessous de lui, Q3Q_3 en laisse 75 % ; la médiane est Q2Q_2. L’écart interquartile Q3−Q1Q_3 - Q_1 mesure la dispersion de la moitié centrale des données, de façon robuste.

Il existe plusieurs conventions de calcul des quantiles sur un petit échantillon. Avec celle de R par défaut (et de NumPy), on trouve Q1=28,875Q_1 = 28{,}875 et Q3=32,475Q_3 = 32{,}475, soit un écart interquartile de 3,6 km. Sur de gros échantillons, les conventions donnent des valeurs quasi identiques.

Les nombres ne disent pas tout. Trois graphiques couvrent l’essentiel des besoins.

  • L’histogramme découpe l’axe en classes et montre la forme de la distribution : symétrique, étalée à droite, bimodale.
  • La boîte à moustaches (boxplot) résume la médiane, les quartiles et les valeurs atypiques. La boîte va de Q1Q_1 à Q3Q_3 ; les moustaches s’arrêtent à la dernière observation située à moins de 1,51{,}5 écart interquartile de la boîte ; les points au-delà sont signalés un par un. Pour nos trottinettes, les bornes sont 28,875−1,5×3,6=23,47528{,}875 - 1{,}5 \times 3{,}6 = 23{,}475 et 32,475+1,5×3,6=37,87532{,}475 + 1{,}5 \times 3{,}6 = 37{,}875 : aucune valeur atypique. La trottinette à 12 km, elle, serait isolée.
  • Le diagramme en bâtons représente les effectifs d’une variable qualitative ou discrète.
01234effectifhistogramme(classes de 2 km)262830323436autonomie (km)Q₁ = 28,875médiane 30,3Q₃ = 32,475écart interquartile 3,6minmax
Deux vues des mêmes 12 valeurs : l'histogramme montre la forme, la boîte résume la médiane et la moitié centrale (l'écart interquartile de 3,6 km).
101520253035autonomie (km), 13 trottinettesvaleur atypique : 12 kmborne basse 22,8
Avec la 13e trottinette, la valeur 12 km tombe sous la borne Q1 − 1,5 × EIQ : la boîte la signale comme atypique au lieu d'étirer la moustache.

Pour comparer une variable quantitative entre groupes (l’autonomie selon la marque de batterie), on place les boîtes à moustaches côte à côte. C’est l’outil de base du dernier chapitre du cours, sur l’analyse de la variance.

autonomie <- c(31.2, 28.5, 33.0, 29.8, 35.1, 27.4, 30.6, 32.3, 26.9, 30.0, 34.2, 29.0)
summary(autonomie) # min, quartiles, médiane, moyenne, max
var(autonomie) # variance corrigée (division par n - 1)
sd(autonomie) # écart-type corrigé
boxplot(autonomie, horizontal = TRUE, main = "Autonomie (km)")
import numpy as np
autonomie = np.array([31.2, 28.5, 33.0, 29.8, 35.1, 27.4, 30.6, 32.3, 26.9, 30.0, 34.2, 29.0])
print(autonomie.mean(), np.median(autonomie))
print(autonomie.var(ddof=0), autonomie.var(ddof=1)) # s_n^2 puis variance corrigée
print(np.quantile(autonomie, [0.25, 0.75])) # même convention que R par défaut

Jusqu’ici, tout ce que nous avons dit concerne nos 12 trottinettes. C’est la statistique descriptive. Mais l’opérateur ne s’intéresse pas à ces 12-là : il veut connaître l’autonomie moyenne de toute sa flotte, que nous noterons μ\mu. C’est le rôle de la statistique inférentielle : remonter de l’échantillon à la population, avec une marge d’erreur maîtrisée.

Le changement de point de vue est le suivant. Avant de faire les mesures, on ne sait pas quelles trottinettes seront tirées : l’autonomie de la ii-ème est une variable aléatoire XiX_i. On suppose les X1,…,XnX_1, \dots, X_n indépendantes et de même loi (on dit i.i.d.), la loi de la population. Ce nn-uplet s’appelle un nn-échantillon. Les nombres relevés, x1,…,xnx_1, \dots, x_n, en sont une réalisation.

Par convention, les majuscules désignent les variables aléatoires et les minuscules leurs valeurs observées. Ainsi :

  • Xˉn=1n∑Xi\bar X_n = \frac{1}{n}\sum X_i est une variable aléatoire, qui changerait si l’on tirait d’autres trottinettes ;
  • xˉn=30,67\bar x_n = 30{,}67 est le nombre obtenu sur notre échantillon.

Toute fonction de l’échantillon, comme Xˉn\bar X_n, S~n2\tilde S_n^2 ou X(n)=max⁡XiX_{(n)} = \max X_i, s’appelle une statistique. Et puisque c’est une variable aléatoire, elle a une loi, une espérance, une variance. Toute la suite du cours repose sur cette idée : étudier la loi d’une statistique pour savoir à quel point on peut lui faire confiance.

μ inconnuepopulation :toute la flotte222426283032343638autonomie (km)x̄ = 30,67x̄ = 31,01x̄ = 30,76x̄ = 29,39notre échantillond’autres échantillons possibles
Chaque échantillon donne une moyenne différente : x̄ est la réalisation d'une variable aléatoire X̄ (population et autres échantillons simulés pour l'illustration).

Le cours suit alors trois grandes questions :

  1. Estimer : quelle valeur proposer pour μ\mu, et comment juger de sa qualité ? (chapitres 2 à 4)
  2. Tester : les données contredisent-elles l’affirmation « μ=30\mu = 30 km » ? (chapitres 5 à 7)
  3. Modéliser : comment l’autonomie dépend-elle de la température ou de la marque ? (chapitres 8 à 10)
  • Population, individu, échantillon de taille nn et variable : la nature de la variable (quantitative ou qualitative) détermine les outils.
  • La moyenne xˉn\bar x_n est sensible aux valeurs extrêmes, la médiane est robuste.
  • La variance empirique sn2s_n^2 divise par nn, la variance corrigée s~n2\tilde s_n^2 par n−1n - 1 ; les logiciels calculent en général la seconde.
  • Les quartiles, l’écart interquartile et la boîte à moustaches résument la distribution et signalent les valeurs atypiques.
  • En inférence, les observations sont la réalisation d’un nn-échantillon X1,…,XnX_1, \dots, X_n i.i.d. ; toute fonction de l’échantillon est une statistique, donc une variable aléatoire.

Exercice · Identifier la nature des variables

facile

Un fichier décrit les étudiants d’une promotion : numéro d’étudiant, âge en années, moyenne générale sur 20, mention au baccalauréat (sans, assez bien, bien, très bien), département d’origine, nombre de redoublements. Donnez la nature de chaque variable.

Voir la solution
  • Numéro d’étudiant : qualitative nominale. C’est un identifiant, pas une quantité, même s’il s’écrit avec des chiffres.
  • Âge : quantitative discrète si on le compte en années entières (continue si on le mesure précisément).
  • Moyenne générale : quantitative continue.
  • Mention : qualitative ordinale, les modalités ont un ordre naturel.
  • Département d’origine : qualitative nominale (le code 35 n’est pas « plus grand » que le code 29).
  • Nombre de redoublements : quantitative discrète.

En code

import pandas as pd
etudiants = pd.DataFrame({
"numero": ["21004", "21017", "21123"], # identifiant : texte, pas un nombre
"age": [19, 20, 22], # quantitative discrète
"moyenne": [13.5, 11.2, 15.8], # quantitative continue
"mention": ["bien", "sans", "très bien"],
"departement": ["35", "29", "56"], # code, donc qualitatif
"redoublements": [0, 1, 0], # quantitative discrète
})
etudiants["mention"] = pd.Categorical(
etudiants["mention"], ordered=True,
categories=["sans", "assez bien", "bien", "très bien"]) # ordinale
etudiants["departement"] = etudiants["departement"].astype("category") # nominale
print(etudiants.dtypes)
# numero: str, age: int64, moyenne: float64, mention: category,
# departement: category, redoublements: int64
print(etudiants["mention"].max()) # très bien (l'ordre a un sens)

Exercice · Calculer des résumés à la main

moyen

On relève le temps d’attente (en minutes) d’un bus sur 6 jours : 4, 7, 2, 9, 5, 3.

  1. Calculez la moyenne et la médiane.
  2. Calculez sn2s_n^2 avec les deux formules du cours, puis s~n2\tilde s_n^2.
Voir la solution
  1. La somme vaut 30, donc xˉ6=5\bar x_6 = 5 minutes. Triées, les valeurs sont 2, 3, 4, 5, 7, 9 : la médiane est (4+5)/2=4,5(4 + 5)/2 = 4{,}5 minutes.
  2. Les écarts à la moyenne sont −1,2,−3,4,0,−2-1, 2, -3, 4, 0, -2, dont les carrés somment à 1+4+9+16+0+4=341 + 4 + 9 + 16 + 0 + 4 = 34. Donc s62=34/6≈5,67s_6^2 = 34/6 \approx 5{,}67. Avec l’autre formule : la somme des carrés vaut 16+49+4+81+25+9=18416 + 49 + 4 + 81 + 25 + 9 = 184, d’où 184/6−52=30,67−25=5,67184/6 - 5^2 = 30{,}67 - 25 = 5{,}67. On retrouve bien la même valeur. Enfin s~62=34/5=6,8\tilde s_6^2 = 34/5 = 6{,}8.

En code

import numpy as np
attente = np.array([4, 7, 2, 9, 5, 3])
n = len(attente)
print(attente.mean(), np.median(attente)) # 5.0 4.5
print(np.sum((attente - attente.mean())**2) / n) # 5.667 (écarts à la moyenne)
print(np.mean(attente**2) - attente.mean()**2) # 5.667 (moyenne des carrés - carré de la moyenne)
print(attente.var(ddof=0), attente.var(ddof=1)) # 5.667 6.8

Exercice · Moyenne ou médiane ?

moyen

Une start-up rennaise de 10 salariés publie « salaire moyen : 4 100 € net par mois ». Neuf salariés gagnent entre 2 000 et 2 600 €, le fondateur se verse 22 000 €. Quel indicateur décrit mieux le salaire d’un salarié typique ? Que vaut approximativement la moyenne des neuf autres ?

Voir la solution

La moyenne est tirée vers le haut par une seule valeur extrême : elle ne décrit personne. La médiane, qui se situe entre 2 000 et 2 600 €, décrit bien mieux le salarié typique, car elle est robuste.

La masse salariale totale vaut 10×4 100=41 00010 \times 4\,100 = 41\,000 €. Sans le fondateur, il reste 41 000−22 000=19 00041\,000 - 22\,000 = 19\,000 € pour neuf salariés, soit une moyenne d’environ 2 1112\,111 €. C’est cohérent avec la fourchette annoncée, et bien loin des 4 100 € affichés.

En code

import numpy as np
masse = 10 * 4100 # masse salariale totale
print((masse - 22000) / 9) # 2111.1 : moyenne des neuf salariés
# Neuf salaires fictifs compatibles avec l'énoncé, plus le fondateur
salaires = np.array([2000, 2000, 2050, 2100, 2100, 2150, 2150, 2200, 2250, 22000])
print(salaires.mean(), np.median(salaires)) # 4100.0 2125.0