Menu

Nuage de points en R : plot(), droites de régression et pairs()

Comment faire un nuage de points en R - tracer deux variables avec plot(), ajouter une droite de régression avec abline(lm()), lisser avec lowess(), et construire une matrice pairs().

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Ce que montre un nuage de points

Un nuage de points affiche la relation entre deux variables numériques : chaque observation devient un point, placé selon sa première valeur en abscisse et sa seconde valeur en ordonnée. Si les deux variables évoluent ensemble, les points forment un motif ; sinon, tu obtiens un nuage informe. C'est le premier regard standard avant d'ajuster un modèle - et R en dessine un avec la même fonction plot() traitée dans le guide de plot().

On va utiliser mtcars, un jeu de données intégré de 32 voitures, et poser une question physique : les voitures plus lourdes ont-elles des moteurs plus puissants ?

Faire le graphique

wt est le poids en milliers de livres, hp la puissance en chevaux :

plot(mtcars$wt, mtcars$hp,
     main = "Horsepower vs. weight",
     xlab = "Weight (1000 lbs)",
     ylab = "Horsepower",
     pch  = 19,
     col  = "steelblue")

L'image : trente-deux points pleins montant depuis le coin bas du graphique (voitures légères, autour de 1,5 sur l'échelle de poids, vers 60-90 chevaux) vers les voitures lourdes au-delà de 5 qui dépassent les 200 chevaux. La montée est indiscutable mais pas nette - à un poids donné, les points s'étalent sur une belle bande de puissances.

Le style est la trousse habituelle du tracé de base : pch = 19 pour des cercles pleins (le creux par défaut disparaît dans les captures d'écran), col pour la couleur, cex = 1.3 si les points doivent être plus gros. Pour colorer les points selon une troisième variable catégorielle, indexe un vecteur de couleurs avec un facteur - col = c("tomato", "steelblue", "darkgreen")[factor(mtcars$cyl)] donne à chaque nombre de cylindres sa propre couleur.

Le lire : direction, force, forme

Trois questions, dans l'ordre, chaque fois que tu regardes un nuage de points :

  • La direction. Les points montent (relation positive) ou descendent (négative) quand tu balaies l'axe horizontal ? Ici ils montent : plus lourd signifie plus puissant. Trace plutôt mpg contre wt et le nuage descend - plus lourd signifie plus gourmand.
  • La force. À quel point les points épousent-ils un chemin unique ? Une bande fine comme un crayon indique une relation forte ; une pulvérisation lâche une relation faible. Ce nuage est modérément serré.
  • La forme et les surprises. Le chemin est-il droit ou courbe ? Y a-t-il des amas, ou des points loin de tout le reste ? Dans mtcars, la Maserati Bora trône visiblement au-dessus du peloton - 335 chevaux pour un poids moyen. Un seul point de ce genre peut tirer sensiblement une droite ajustée, ce qui est exactement pourquoi tu regardes avant d'ajuster.

Ajouter la droite de tendance

Un nuage de points énonce une relation ; une droite à travers lui résume l'affirmation. Ajuste un modèle linéaire et donne-le directement à abline() :

plot(mtcars$wt, mtcars$hp,
     pch = 19, col = "steelblue",
     xlab = "Weight (1000 lbs)", ylab = "Horsepower")

abline(lm(hp ~ wt, data = mtcars), col = "tomato", lwd = 2)

lm(hp ~ wt) ajuste la droite des moindres carrés - lis la formule comme « hp expliqué par wt », la variable de l'axe vertical avant le ~ - et abline() la trace en travers du graphique. La droite monte d'environ 46 chevaux par millier de livres. Ce que signifie ce modèle, et comment lire son résumé, c'est le sujet de la régression linéaire.

Si tu ne veux pas supposer une droite, lowess() dessine une courbe lisse qui suit les données où qu'elles aillent :

lines(lowess(mtcars$wt, mtcars$hp), col = "darkgreen", lwd = 2, lty = 2)

Quand la courbe lowess et la droite s'accordent grossièrement, un résumé linéaire est honnête. Quand la courbe s'en écarte, la relation est non linéaire et une droite la représenterait mal.

Vérifier les nombres avec cor()

Le graphique te donne la forme ; cor() te donne la force en un seul nombre. Cette étape est de la pure sortie texte, alors exécute-la ici :

Poids et puissance corrèlent à environ 0,66 - le nuage montant modérément serré, en un nombre. La matrice ajoute que mpg corrèle fortement négativement avec les deux (environ −0,87 avec le poids). Garde toutefois l'ordre des opérations : le graphique d'abord, le coefficient ensuite. Une seule valeur de r peut masquer une courbe ou être gonflée par une valeur aberrante - voir la corrélation pour les façons classiques dont elle induit en erreur.

La matrice de nuages de points : pairs()

Avec plusieurs colonnes numériques, dessiner chaque appariement à la main devient vite pénible. pairs() le fait en un appel :

pairs(mtcars[, c("mpg", "wt", "hp")],
      pch = 19, col = "steelblue")

Le résultat est une grille 3 × 3 : les noms de variables courent le long de la diagonale, et chaque panneau hors diagonale est le nuage de points d'une paire - mpg contre wt, mpg contre hp, wt contre hp, chacun apparaissant deux fois avec les axes échangés. C'est la façon la plus rapide de trier un nouveau jeu de données : un coup d'œil montre quelles paires sont liées, quelles relations sont courbes, et où se cachent les valeurs aberrantes. Sélectionne d'abord les colonnes, comme ici - au-delà de six ou sept variables les panneaux deviennent illisibles.

La version ggplot2

Dans ggplot2, le nuage de points plus une droite ajustée, ce sont deux couches :

library(ggplot2)

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point(color = "steelblue", size = 2) +
    geom_smooth(method = "lm", color = "tomato") +
    labs(title = "Horsepower vs. weight",
         x = "Weight (1000 lbs)", y = "Horsepower")

geom_smooth(method = "lm") c'est abline(lm(...)) avec un bonus : une bande de confiance ombrée autour de la droite. Laisse method non défini et il ajuste une courbe loess à la place - le pendant ggplot2 de lowess(). R de base gagne sur la vitesse de frappe pour un coup d'œil rapide ; ggplot2 gagne dès que tu veux des points colorés par groupe avec une légende automatique.

Ce que tu retiens

  • plot(x, y) avec deux vecteurs numériques donne un nuage de points ; pch = 19 et des axes étiquetés le rendent présentable.
  • Lis la direction, la force et la forme - et repère les valeurs aberrantes - avant de calculer quoi que ce soit.
  • abline(lm(y ~ x, data = df)) ajoute la droite de régression ; lines(lowess(x, y)) ajoute une courbe qui ne suppose pas la linéarité.
  • cor() quantifie ce que montre le graphique ; le graphique garde le nombre honnête.
  • pairs(df[, cols]) dessine tous les nuages de points par paires d'un coup - le tri le plus rapide d'un nouveau jeu de données.

Prochaine étape : le diagramme en barres - on quitte les paires numériques pour comparer des effectifs entre catégories.

Questions fréquentes

Comment faire un nuage de points en R ?

Appelle plot(x, y) avec deux vecteurs numériques - par exemple plot(mtcars$wt, mtcars$hp). Chaque observation devient un point. Ajoute pch = 19 pour des points pleins et main, xlab, ylab pour les étiquettes.

Comment ajouter une droite de régression à un nuage de points en R ?

Ajuste le modèle et donne-le à abline() : abline(lm(hp ~ wt, data = mtcars)) trace la droite des moindres carrés par-dessus le graphique existant. Note l'ordre de la formule - la variable de l'axe vertical vient avant le ~.

Comment tracer de nombreuses paires de variables d'un coup en R ?

pairs(df) dessine une matrice de nuages de points : un petit panneau pour chaque paire de colonnes. Sélectionne d'abord un sous-ensemble - pairs(mtcars[, c("mpg", "wt", "hp")]) - parce qu'au-delà de six ou sept colonnes les panneaux deviennent trop petits pour être lus.

Que dit un nuage de points que la corrélation ne dit pas ?

La forme. Un coefficient de corrélation est un seul nombre et peut être identique pour une droite nette, une courbe, ou un nuage avec une valeur aberrante extrême. Le nuage de points montre directement la courbure, les amas et les valeurs aberrantes - c'est pourquoi tu traces d'abord et calcules cor() ensuite.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER