Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Corrélation et causalité

Après cette leçon: Je peux mesurer un lien entre deux séries et dire pourquoi il ne prouve pas une cause.

Leçon de 60 min2 commandesLab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

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

MotCe que ça veut dire
Nuage de pointsun graphique où chaque jour est un point
Corrélationla façon dont deux séries varient ensemble
Coefficient run nombre de −1 à 1 qui mesure un lien en ligne droite
Lien positifquand l’une monte, l’autre monte aussi
Lien négatifquand l’une monte, l’autre descend
Facteur communune 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ératureLocationsÉcart x (moy. 9)Écart y (moy. 240)ProduitCarré de xCarré de y
3180-6-60360363600
6205-3-3510591225
9245050025
12270330909900
15300660360363600
Total00915909350

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

Code: 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

Commande
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 signeLien en ligne droite
Moins de 0,3faible
De 0,3 à moins de 0,7moyen
0,7 ou plusfort

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

Commande
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

ExplicationExempleComment la vérifier
A cause BLa chaleur fait louer des vélosUne expérience, ou un lien dans le temps
B cause ALes locations font monter la chaleurOn voit que c’est absurde
Facteur communLa saison agit sur les glaces et les vélosSé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.

À propos de ce labo et de sa source: Lab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.