Menu

Wykres punktowy w R: plot(), linia regresji i pairs()

Jak zrobić wykres punktowy w R: narysuj dwie zmienne przez plot(), dodaj linię regresji przez abline(lm()), wygładź przez lowess() i zbuduj macierz wykresów pairs().

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Co pokazuje wykres punktowy

Wykres punktowy pokazuje związek między dwiema zmiennymi liczbowymi: każda obserwacja staje się jednym punktem, umieszczonym według pierwszej wartości na osi poziomej i drugiej wartości na osi pionowej. Jeśli obie zmienne zmieniają się razem, punkty układają się we wzór; jeśli nie, dostajesz bezkształtną chmurę. To standardowe pierwsze spojrzenie przed dopasowaniem jakiegokolwiek modelu, a R rysuje go tą samą funkcją plot(), którą opisuje przewodnik po plot().

Użyjemy mtcars, wbudowanego zbioru danych o 32 samochodach, i zadamy pytanie z fizyki: czy cięższe samochody mają mocniejsze silniki?

Rysowanie wykresu

wt to masa w tysiącach funtów, a hp to moc w koniach mechanicznych:

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

Obraz: trzydzieści dwa wypełnione punkty wznoszące się od dolnego rogu wykresu (lekkie samochody, około 1.5 na skali masy, w okolicach 60 do 90 koni mechanicznych) w stronę ciężkich samochodów powyżej 5, które przekraczają 200 koni mechanicznych. Wzrost jest nie do przeoczenia, ale nieuporządkowany: przy danej masie punkty rozkładają się na dość szerokim pasie mocy.

Styl to zwykły zestaw narzędzi wykresów bazowych: pch = 19 dla wypełnionych kółek (domyślne puste znikają na zrzutach ekranu), col dla koloru, cex = 1.3, jeśli punkty mają być większe. Żeby pokolorować punkty według trzeciej, kategorycznej zmiennej, zaindeksuj wektor kolorów czynnikiem: col = c("tomato", "steelblue", "darkgreen")[factor(mtcars$cyl)] daje każdej liczbie cylindrów własny kolor.

Odczytywanie: kierunek, siła, kształt

Trzy pytania, po kolei, za każdym razem, gdy patrzysz na wykres punktowy:

  • Kierunek. Czy punkty rosną (związek dodatni), czy spadają (ujemny), gdy przesuwasz wzrok wzdłuż osi poziomej? Tutaj rosną: cięższy znaczy mocniejszy. Narysuj zamiast tego mpg względem wt, a chmura opada: cięższy znaczy bardziej paliwożerny.
  • Siła. Jak ciasno punkty trzymają się jednej ścieżki? Pasek cienki jak ołówek to silny związek; luźny rozprysk to słaby. Ta chmura jest umiarkowanie ciasna.
  • Kształt i niespodzianki. Czy ścieżka jest prosta, czy zakrzywiona? Czy są skupiska albo punkty daleko od całej reszty? W mtcars Maserati Bora wyraźnie odstaje nad resztą: 335 koni mechanicznych przy przeciętnej masie. Jeden taki punkt potrafi zauważalnie przesunąć dopasowaną linię i właśnie dlatego najpierw patrzysz, a potem dopasowujesz.

Dodawanie linii trendu

Wykres punktowy pokazuje związek; linia przez niego streszcza to twierdzenie. Dopasuj model liniowy i przekaż go od razu do 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) dopasowuje linię najmniejszych kwadratów (czytaj formułę jako „hp wyjaśniane przez wt”, ze zmienną z osi pionowej przed ~), a abline() rysuje ją na wykresie. Linia rośnie o około 46 koni mechanicznych na tysiąc funtów. Co oznacza ten model i jak czytać jego podsumowanie, opisuje artykuł o regresji liniowej.

Jeśli nie chcesz zakładać linii prostej, lowess() rysuje gładką krzywą, która podąża za danymi, dokądkolwiek idą:

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

Gdy krzywa lowess i linia prosta mniej więcej się zgadzają, liniowe podsumowanie jest uczciwe. Gdy krzywa odgina się w bok, związek jest nieliniowy, a linia prosta by go przekłamała.

Sprawdzanie liczb przez cor()

Wykres daje ci kształt; cor() daje siłę związku w postaci jednej liczby. Ten krok to czysty wynik tekstowy, więc uruchom go tutaj:

Masa i moc korelują na poziomie około 0.66: to umiarkowanie ciasna, rosnąca chmura wyrażona liczbą. Macierz dodaje, że mpg koreluje silnie ujemnie z obiema zmiennymi (około −0.87 z masą). Trzymaj się jednak kolejności: najpierw wykres, potem współczynnik. Pojedyncza wartość r może ukryć krzywą albo zostać zawyżona przez jedną obserwację odstającą. Klasyczne sposoby, na jakie wprowadza w błąd, opisuje artykuł o korelacji.

Macierz wykresów punktowych: pairs()

Przy kilku kolumnach liczbowych rysowanie każdej pary ręcznie szybko się nudzi. pairs() robi to jednym wywołaniem:

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

Wynikiem jest siatka 3 × 3: nazwy zmiennych biegną po przekątnej, a każdy panel poza przekątną to wykres punktowy jednej pary: mpg względem wt, mpg względem hp, wt względem hp, każda para dwa razy, z zamienionymi osiami. To najszybszy sposób na wstępną ocenę nowego zbioru danych: jedno spojrzenie pokazuje, które pary są powiązane, które związki się zakrzywiają i gdzie chowają się wartości odstające. Najpierw wybierz podzbiór kolumn, tak jak tutaj: przy więcej niż sześciu czy siedmiu zmiennych panele kurczą się poniżej czytelności.

Wersja w ggplot2

W ggplot2 wykres punktowy z dopasowaną linią to dwie warstwy:

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") to abline(lm(...)) z bonusem: zacienionym pasmem ufności wokół linii. Jeśli nie ustawisz method, dopasuje zamiast tego krzywą loess, czyli odpowiednik lowess() w ggplot2. Bazowy R wygrywa szybkością pisania przy szybkim podglądzie; ggplot2 wygrywa w chwili, gdy chcesz pokolorować punkty według grup z automatyczną legendą.

Najważniejsze informacje

  • plot(x, y) z dwoma wektorami liczbowymi to wykres punktowy; pch = 19 i podpisane osie sprawiają, że nadaje się do pokazania.
  • Odczytaj kierunek, siłę i kształt oraz wypatrz wartości odstające, zanim cokolwiek policzysz.
  • abline(lm(y ~ x, data = df)) dodaje linię regresji; lines(lowess(x, y)) dodaje krzywą, która nie zakłada prostoliniowości.
  • cor() wyraża liczbowo to, co pokazuje wykres; wykres pilnuje, żeby liczba była uczciwa.
  • pairs(df[, cols]) rysuje naraz wszystkie wykresy punktowe par: to najszybsza wstępna ocena nowego zbioru danych.

Dalej: wykres słupkowy, czyli zostawiamy pary liczb i porównujemy liczebności między kategoriami.

Najczęściej zadawane pytania

Jak zrobić wykres punktowy w R?

Wywołaj plot(x, y) z dwoma wektorami liczbowymi, na przykład plot(mtcars$wt, mtcars$hp). Każda obserwacja staje się jednym punktem. Dodaj pch = 19, żeby punkty były wypełnione, oraz main, xlab, ylab dla podpisów.

Jak dodać linię regresji do wykresu punktowego w R?

Dopasuj model i przekaż go do abline(): abline(lm(hp ~ wt, data = mtcars)) rysuje linię najmniejszych kwadratów na istniejącym wykresie. Zwróć uwagę na kolejność w formule: zmienna z osi pionowej stoi przed ~.

Jak narysować w R wiele par zmiennych naraz?

pairs(df) rysuje macierz wykresów rozrzutu: jeden mały panel dla każdej pary kolumn. Najpierw wybierz podzbiór kolumn, pairs(mtcars[, c("mpg", "wt", "hp")]), bo przy więcej niż sześciu czy siedmiu kolumnach panele robią się za małe, żeby je odczytać.

Co mówi wykres punktowy, czego nie mówi korelacja?

Kształt. Współczynnik korelacji to jedna liczba i może być identyczny dla czystej linii, krzywej albo chmury z jedną skrajną obserwacją odstającą. Wykres punktowy bezpośrednio pokazuje krzywiznę, skupiska i wartości odstające, dlatego najpierw rysujesz wykres, a dopiero potem liczysz cor().

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ