Graficzna analiza danych

Dariusz Brzeziński

Agenda

  • Cele graficznej analizy danych
  • Zasady tworzenia analiz graficznych
  • Systemy graficzne w R
  • ggplot2

Po co nam wykresy?

  • By zrozumieć dane
  • By znaleźć wzorce w danych
  • By znaleźć najlepszy sposób do modelowania danych
  • Do debugowania
  • Do przedstawiania wyników analizy

Po co nam wykresy?

Podczas pracy z danymi warto tworzyć sporo wykresów. Większość z nich nie będzie zdatna do prezentacji wyników analizy, ale pomoże sterować kierunkiem badań.

Warto eksperymentować z rożnymi sposobami prezentowania tych samych danych. Często dopiero zbiór kilku wykresów wyjaśnia co kryją dane.

Zasady analizy graficznej

Według Edwarda Tufty'ego:

  1. Pokazuj porównania
  2. Pokazuj zależności, wzorce
  3. Pokazuj wielowymiarowe dane
  4. Łącz różne formy wizualizacji
  5. Bądź wiarygodny
  6. Skup się na danych

Zasada 1

plot of chunk zasada1Bad

Pokazuj porównania

Wyniki są interesujące jeśli można je do czegoś odnieść.

Zasada 1

plot of chunk zasada1Good

Pokazuj porównania

Wyniki są interesujące jeśli można je do czegoś odnieść.

Zasada 2

plot of chunk zasada2Good

Pokazuj zależności

Od czego mogą zależeć wyniki? Czy da się tę zależność pokazać?

Zasada 3

plot of chunk zasada3Good

Pokazuj wielowymiarowe dane

Staraj się pokazywać więcej niż dwa wymiary - świat jest wielowymiarowy.

Zasada 3

plot of chunk zasada3Better

Zasady 4, 5, 6

Łącz różne formy wizualizacji

Dodaj tekst, liczby, obrazy

Bądź wiarygodny

Dobieraj odpowiednio wizualizacje, skale, opisuj osie

Skup się na danych

Dobra wizualizacja musi opierać się na dobrych danych

Systemy graficzne w R

  • Podstawowy
  • Lattice
  • ggplot2

Podstawowy system graficzny

  • Najstarszy sposób tworzenia wykresów
  • Jak malowanie obrazu
  • Zaczyna się od pustego płótna, a potem dodaje elementy
  • Do gotowego obrazu wciąż można dodawać elementy

Podstawowy system graficzny

  • Standardowe podejście do rysowania w językach programowania
  • Odzwierciedla to jak myślimy o systemach graficznych
  • Nie można zmieniać raz podjętych decyzji (np. dostosować marginesów)
  • Trzeba zaplanować wszystkie czynności zawczasu
  • Ciężko zamienić jeden typ wizualizacji na alternatywny
  • Ciąg komend w R

Podstawowy system graficzny

library(datasets)
data(cars)
with(cars, plot(speed, dist))

plot of chunk unnamed-chunk-1

Lattice

  • Wykresy tworzone za pomocą pojedynczego wywołania funkcji (xyplot, bwplot, itd.)
  • Najbardziej przydatny przy wykresach porównawczych
  • Takie rzeczy jak marginesy czy odstępy są ustalane automatycznie, bo cały wykres powstaje za jednym razem
  • Dobry wybór przy próbie umieszczanie wielu wykresów na ekranie

Lattice

  • Czasami ciężko jest zdefiniować cały wykres w jednym wywołaniu
  • Opisywanie wykresów mało intuicyjne
  • Tworzenie niestandardowych paneli jest trudne
  • Nie można nic dodać do raz stworzonego wykresu

Lattice

library(lattice)
state <- data.frame(state.x77, region = state.region)
xyplot(Life.Exp ~ Income | region, data = state, layout = c(4, 1))

plot of chunk unnamed-chunk-2

ggplot2

  • W wielu kwestiach rozwiązanie pośrednie między systemem podstawowym a Lattice
  • Automatycznie ustala marginesy i odstępy, ale pozwala też dodawać elementy do już stworzonego wykresu
  • Trochę bardziej intuicyjne niż Lattice
  • Sporo domyślnych ustawień, ale wciąż można konfigurować do woli

ggplot2

library(ggplot2)
data(mpg)
qplot(displ, hwy, data = mpg)

plot of chunk unnamed-chunk-3

Anatomia ggplot2

W ggplot2 wykres tworzy się za pomocą funkcji ggplot(). Wykres może mieć dowolną liczbę warstw. Warstwę można stworzyć za pomocą ogólnej funkcji layer() lub jednej z wielu specjalizowanych funkcji, które wywołują layer() (jak na przykład geom_point()).

++=

Anatomia ggplot2

Oprócz listy warstw wykres ma wyspecyfikowane także układ współrzędnych, skale i panele. Te trzy elementy są wspólne dla wszystkich warstw. Wygląd tych elementów definiowany jest przez motyw.

Anatomia ggplot2

Każda warstwa wykorzystuję jakąś statystykę, aby podsumować dane, rysuje określoną figurę geometryczną dla każdego (podsumowanego) elementu danych i wykorzystuje odpowiednie dopasowanie położenia, aby radzić sobie w sytuacjach, gdy elementy mogą nachodzić na siebie.

gg = Grammar of Graphics (Wilkinson, 1999)

plot: coord scale+ facet? layer+
layer: data mapping stat geom position?

Przykład

p <- ggplot() +
coord_cartesian() +
scale_x_continuous()+
scale_y_continuous()+
scale_color_hue() +
facet_wrap(~cut) +
layer(data=diamonds,
  mapping=aes(
      x=carat,
      y=price,
      color=color),
  stat="identity",
  geom="point",
  position=
   position_jitter()
)

plot of chunk unnamed-chunk-5

Przykład

p + layer(
 data=diamonds,
 mapping=aes(
   x=carat,
   y=price),
 stat="smooth",
 params=list(
   method="glm",
   formula=
     y~poly(x,2),
   color="black"),
 geom="smooth",
 position=
  position_identity()
)

plot of chunk unnamed-chunk-7

Komentarz

Przedstawiona technika pozwala dowolnie modyfikować wizualizacje, jednak do typowych wykresów definicje mogą być znacznie krótsze. Kolejne przykłady pokażą bardziej zwięzłe formy definiowania wykresów.

Istnieje także funkcja qplot(), która pozwala na jeszcze bardziej zwięzłe definicje wykresów. Ze względu na ograniczoną liczbę opcji i trudniejsze modyfikowanie wykresów stworzonych za pomocą qplot() nie będziemy omawiać tej funkcji.

Przykłady - warstwy

ggplot(
  mpg,
  aes(x=displ,
      y=hwy,
   color=factor(cyl)
   )
) +
geom_point()

plot of chunk unnamed-chunk-9

Przykłady - warstwy

ggplot(
  mpg,
  aes(x=displ,
      y=hwy,
   color=factor(cyl)
   )
) +
geom_line()

plot of chunk unnamed-chunk-11

Przykłady - warstwy

ggplot(
  mpg,
  aes(x=displ,
      y=hwy,
   color=factor(cyl)
   )
) +
geom_point() +
geom_line()

plot of chunk unnamed-chunk-13

Przykłady - warstwy

ggplot(
  mpg,
  aes(x=displ,
      y=hwy,
   color=factor(cyl)
   )
) +
geom_bar(
  stat="identity",
  position=
      "identity")

plot of chunk unnamed-chunk-15

Przykłady - warstwy

ggplot(
  mpg,
  aes(x=displ,
      y=hwy,
   color=factor(cyl)
   )
) +
geom_point() +
geom_smooth(
  data=subset(
      mpg,
      cyl != 5),
  method="lm")

plot of chunk unnamed-chunk-17

Przykłady - panele

ggplot(
  mpg,
  aes(x=displ,
      y=hwy)
) +
geom_point() +
geom_smooth() +
facet_grid(. ~ year)

plot of chunk unnamed-chunk-19

Przykłady - warstwy

ggplot(mpg, aes(hwy, fill=drv)) +
    geom_bar()

plot of chunk unnamed-chunk-20

Przykłady - warstwy

ggplot(mpg, aes(hwy, fill=drv,
                alpha=0.25)) +
    geom_density()

plot of chunk unnamed-chunk-21

Przykłady - motywy

ggplot(mpg, aes(hwy, fill=drv,
                alpha=0.25)) +
    geom_density() + theme_bw()

plot of chunk unnamed-chunk-22

Warto również zapoznać się z biblioteką ggthemes!

Przykłady - kolory i kształty

df=data.frame(x=1:10,y=factor(letters[1:5]))
ggplot(df, aes(x, x, size=x)) + geom_point()

plot of chunk unnamed-chunk-23

Przykłady - kolory i kształty

df=data.frame(x=1:10,y=factor(letters[1:5]))
ggplot(df, aes(x, x, color=x))+geom_point()

plot of chunk unnamed-chunk-24

Przykłady - kolory i kształty

df=data.frame(x=1:10,y=factor(letters[1:5]))
ggplot(df, aes(y, y, shape=y))+geom_point()

plot of chunk unnamed-chunk-25

Przykłady - kolory i kształty

df=data.frame(x=1:10,y=factor(letters[1:5]))
ggplot(df, aes(y, y, color=y))+geom_point()

plot of chunk unnamed-chunk-26

Przykłady - układ współrzędnych

d=data.frame(height=c(1,2,2,3,4), weight=c(1,3,4,4,2))
p = ggplot() +
    geom_line(data=d, mapping=aes(x=height, y=weight)) +
    geom_point(data=d, mapping=aes(x=height, y=weight), size=8, fill="white", shape=21) +
    geom_text(data=d,mapping=aes(x=height, y=weight, label=seq(1,nrow(d))))

Przykłady - układ współrzędnych

p

plot of chunk unnamed-chunk-28

Przykłady - układ współrzędnych

p + coord_flip()

plot of chunk unnamed-chunk-29

Przykłady - układ współrzędnych

p + coord_trans(x="log10", y="log10")

plot of chunk unnamed-chunk-30

Przykłady - układ współrzędnych

p + coord_equal()

plot of chunk unnamed-chunk-31

Przykłady - układ współrzędnych

p + coord_polar(theta="x")

plot of chunk unnamed-chunk-32

Przykłady - układ współrzędnych

require(maps)
d = data.frame(map(database="italy", plot=F)[c("x", "y")])
ggplot() + coord_map() +
geom_polygon(data=d, mapping=aes(x=x, y=y), fill="red", color="black", size=0.2)

plot of chunk unnamed-chunk-33

Palety kolorów

p <- ggplot(
 data=mpg,
 aes(x=displ,
   y=hwy,
   fill=factor(cyl))
 ) +
 geom_bar(
   stat="identity",
   position=
       "identity")
p

plot of chunk unnamed-chunk-35

Palety kolorów

ColorBrewer

p + scale_fill_brewer()

plot of chunk unnamed-chunk-37

Palety kolorów

ColorBrewer

p + scale_fill_brewer(
  palette="Set1")

plot of chunk unnamed-chunk-39

Palety kolorów

ColorBrewer

p + scale_fill_brewer(
  palette="Spectral")

plot of chunk unnamed-chunk-41

Palety kolorów

Ręcznie definiowane

p +
scale_fill_manual(
  values=
      c("red",
        "blue",
        "green",
        "orange"))

plot of chunk unnamed-chunk-43

Palety kolorów

Ręcznie definiowane

p +
scale_fill_manual(
  values=
      c("#CC6666",
        "#9999CC",
        "#66CC99",
        "#ffa500"))

plot of chunk unnamed-chunk-45

Przydatne funkcje

  • colorRamp: paleta dla wartości od 0 do 1
  • colorRampPalette: paleta o zadanej liczbie kolorów
pal <- colorRampPalette(c("red", "yellow"))
pal(2)
[1] "#FF0000" "#FFFF00"
pal(10)
 [1] "#FF0000" "#FF1C00" "#FF3800" "#FF5500" "#FF7100" "#FF8D00" "#FFAA00"
 [8] "#FFC600" "#FFE200" "#FFFF00"

Ciekawe palety kolorów i dobre rady

Zapisywanie do pliku

Podsumowanie

p=qplot(displ,hwy,data=mpg,colour=factor(cyl))
summary(p)

Zapisanie obiektu wykresu

save(p, file = "plot.rdata")
load("plot.rdata")

Eksport do obrazka

ggsave("plot.png", width = 5, height = 5)

Na deser

Wykres można ubarwić za pomocą bibliotek dostępnych pod adresami:

Na deser

library(plotly)
dsamp <- diamonds[sample(nrow(diamonds),1000),]

p <- ggplot(dsamp, aes(carat, price,
                       color=clarity)) +
    geom_point()
ggplotly(p)

Na deser

Podsumowanie

  • Cele graficznej analizy danych
  • Zasady tworzenia analiz graficznych
  • Trzy systemy graficzne w R
  • ggplot2
    • warstwy, panele, układy współrzędnych, skale, motywy
    • palety kolory
    • zapisywanie do pliku

Zadanie

Wykonaj następujące wykresy na zbiorze diamonds:

  1. Wyświetl histogram zmiennej depth
  2. Ustaw szerokość kubełka histogramu na 0.2
  3. Ogranicz oś x do przedziału [55, 70]
  4. Sprawdź jak zmienna cut wpływa na histogram
    • za pomocą koloru
    • za pomocą paneli
  5. Powtórz kroki 1-4 dla zmiennej price (być może zmieniając wartości części parametrów)
  6. Zwizualizuj relację między zmiennymi carat i price

Zadanie alternatywne

Tajemniczy zbiór danych

Czy jesteś w stanie wykonać wykresy podobne do tych zaproponowanych na poprzednim slajdzie?

Przydatne linki