Mesurer un lien sans y voir une cause
La corrélation mesure à quel point deux séries de nombres varient ensemble, avec un coefficient entre −1 et 1. Vous saurez calculer ce coefficient, le lire sur un nuage de points et ne pas le confondre avec une cause.
Le loueur remarque que les jours chauds sont aussi les jours chargés. Un nombre peut mesurer ce lien. Il ne dit pas si la chaleur en est la cause.
À la fin de cette leçon
Remarque
Je peux mesurer un lien entre deux séries et dire pourquoi il ne prouve pas une cause.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Nuage de points | un graphique où chaque jour est un point |
| Corrélation | la façon dont deux séries varient ensemble |
| Coefficient r | un nombre de −1 à 1 qui mesure un lien en ligne droite |
| Lien positif | quand l’une monte, l’autre monte aussi |
| Lien négatif | quand l’une monte, l’autre descend |
| Facteur commun | une troisième cause qui agit sur les deux séries |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le coefficient r va de −1 à 1
Sur un nuage de points, un lien positif monte de gauche à droite, un lien négatif descend. Le coefficient de corrélation, noté r, donne ce lien en un nombre.
Il vaut 1 si tous les points sont sur une droite qui monte. Il vaut −1 si elle descend, et 0 s’il n’y a aucun lien en ligne droite.
Exemple travaillé : cinq jours, température et locations
| Température | Locations | Écart x (moy. 9) | Écart y (moy. 240) | Produit | Carré de x | Carré de y |
|---|---|---|---|---|---|---|
| 3 | 180 | -6 | -60 | 360 | 36 | 3600 |
| 6 | 205 | -3 | -35 | 105 | 9 | 1225 |
| 9 | 245 | 0 | 5 | 0 | 0 | 25 |
| 12 | 270 | 3 | 30 | 90 | 9 | 900 |
| 15 | 300 | 6 | 60 | 360 | 36 | 3600 |
| Total | 0 | 0 | 915 | 90 | 9350 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Diviser les produits par la taille des écarts
Chaque produit est positif quand les deux écarts ont le même signe : le jour est chaud et chargé, ou froid et calme. Leur total, 915, mesure le lien.
On le divise par la racine du produit des deux totaux de carrés, √(90 × 9350), soit 917,3. Cela donne r = 915 / 917,3, soit 0,997 : un lien presque parfait.
Le même calcul en Python
# La corrélation de deux séries, calculée à la main.
def correlation(xs, ys):
mx = sum(xs) / len(xs)
my = sum(ys) / len(ys)
haut = 0
bas_x = 0
bas_y = 0
for n in range(len(xs)):
haut = haut + (xs[n] - mx) * (ys[n] - my)
bas_x = bas_x + (xs[n] - mx) ** 2
bas_y = bas_y + (ys[n] - my) ** 2
return haut / (bas_x * bas_y) ** 0.5
temperatures = [3, 6, 9, 12, 15]
locations = [180, 205, 245, 270, 300]
print("température et locations :", round(correlation(temperatures, locations), 3))
courbe_x = [-2, -1, 0, 1, 2]
courbe_y = [4, 1, 0, 1, 4]
print("une courbe en U :", round(correlation(courbe_x, courbe_y), 3))
# Changez 300 en 180, puis relancez.
# Que devient la première corrélation ?
La chaleur lie plus que la pluie
La commande suivante calcule r entre la température et les locations, puis entre la pluie et les locations, sur les 365 jours.
Elle affiche 0,772 puis −0,409. Plus il fait chaud, plus on loue, et le lien est fort. Plus il pleut, moins on loue, et le lien est moyen.
Corrélation de la chaleur et de la pluie
docker exec jupyter python3 -c "import csv, statistics; r = list(csv.DictReader(open('hires.csv'))); v = [int(x['hires']) for x in r]; t = [float(x['temp_c']) for x in r]; p = [float(x['rain_mm']) for x in r]; print(round(statistics.correlation(t, v), 3), round(statistics.correlation(p, v), 3))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un r nul n’exclut pas une courbe
Le coefficient r ne mesure que les liens en ligne droite. Dans le bloc Python, la courbe en U donne r = 0 alors que y se lit sur x.
Dessinez toujours le nuage avant de croire r. Une seule valeur extrême peut aussi le changer beaucoup : en changeant le dernier jour, r passe de 0,997 à 0,256.
Une échelle de lecture, par convention
| Valeur de r sans signe | Lien en ligne droite |
|---|---|
| Moins de 0,3 | faible |
| De 0,3 à moins de 0,7 | moyen |
| 0,7 ou plus | fort |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un lien présent dans chaque groupe
Le week-end loue plus que la semaine. Cela pourrait fausser le lien avec la température. On calcule donc r séparément pour les jours de week-end, puis pour les jours de semaine.
La commande suivante affiche 0,817 puis 0,813. Le lien tient dans chaque groupe : il ne vient pas du seul mélange des deux.
La corrélation dans chaque groupe de jours
docker exec jupyter python3 -c "import csv, statistics; r = list(csv.DictReader(open('hires.csv'))); w = [x for x in r if x['weekday'] in ('Sat', 'Sun')]; s = [x for x in r if x['weekday'] not in ('Sat', 'Sun')]; print(round(statistics.correlation([float(x['temp_c']) for x in w], [int(x['hires']) for x in w]), 3), round(statistics.correlation([float(x['temp_c']) for x in s], [int(x['hires']) for x in s]), 3))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu’une forte corrélation prouve que l’une des séries cause l’autre. Elle prouve seulement qu’elles varient ensemble. Pour parler de cause, il faut une expérience ou un bon argument.
Un lien a trois explications possibles
Quand deux séries varient ensemble, A peut causer B, B peut causer A, ou un facteur commun peut agir sur les deux. Le hasard peut aussi suffire, surtout sur peu de données.
Les glaces vendues et les vélos loués montent ensemble chaque été. La chaleur agit sur les deux : acheter une glace ne fait pas louer un vélo.
Trois explications d’un même lien
| Explication | Exemple | Comment la vérifier |
|---|---|---|
| A cause B | La chaleur fait louer des vélos | Une expérience, ou un lien dans le temps |
| B cause A | Les locations font monter la chaleur | On voit que c’est absurde |
| Facteur commun | La saison agit sur les glaces et les vélos | Séparer les données par saison |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pour aller plus loin
Dans un carnet du labo, dessinez le nuage de la température et des locations avec hires.plot.scatter(x="temp_c", y="hires"). Calculez ensuite hires.corr(numeric_only=True).
Quelles colonnes sont les plus liées à hires ? Choisissez-en une et écrivez en une phrase pourquoi son lien n’est pas forcément une cause.