Materiały ze spotkania eRementarz #2: wizualizacja danych w pakiecie ggplot2

Jak zawsze publikujemy materiały z ostatniego spotkania STWURa, które poprowadził Bartosz Kolasa - data scientist z firmy PiLab, a zorganizował Mateusz Staniak.

Materiały

Data Visualisation cheatsheet

https://www.rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf

Github

https://github.com/STWUR/eRementarz2

Eseje o sztuce prezentowania danych http://www.biecek.pl/Eseje/

Pakiety:

  • ggplot2
  • dplyr

Cele wizualizacji

  • zrozumienie danych
  • prezentacja zjawiska
  • przekonanie odbiorcy do określonej tezy

Gramatyka wykresów

Gramatyka wykresów

library(ggplot2)
ggplot(mpg, aes(hwy, cty)) +
  geom_point(aes(color=cyl)) + geom_smooth(method="lm") +
  coord_cartesian() + scale_color_gradient() + theme_bw()

plot of chunk unnamed-chunk-1

Najprostszy przykład

library(ggplot2)
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny.csv")
ggplot(mieszkania, aes(x=dzielnica)) + geom_bar()

plot of chunk unnamed-chunk-2

Zmienna ciągła

library(ggplot2)
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny.csv")
ggplot(mieszkania, aes(x=metraz)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

plot of chunk unnamed-chunk-3

Ograniczenie danych

library(dplyr)
filter(mieszkania, metraz<150) -> mieszkania
ggplot(mieszkania, aes(x=metraz)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

plot of chunk unnamed-chunk-4

Kolejny wymiar

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny.csv")
ggplot(mieszkania, aes(x=dzielnica, fill=as.factor(n_pokoj))) + geom_bar()

plot of chunk unnamed-chunk-5

Rozsądniejsze kolory

library(RColorBrewer)
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny.csv")
ggplot(mieszkania, aes(x=dzielnica, fill=as.factor(n_pokoj))) + geom_bar() + scale_fill_brewer(palette="Reds") 

plot of chunk unnamed-chunk-6

Porównywanie wartości

library(RColorBrewer)
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny.csv")
ggplot(mieszkania, aes(x=dzielnica, fill=as.factor(n_pokoj))) + geom_bar(position="fill") + scale_fill_brewer(name="Liczba pokoi", palette="Reds")

plot of chunk unnamed-chunk-7

Etykietki

library(RColorBrewer)
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny.csv")
ggplot(mieszkania, aes(x=dzielnica, fill=as.factor(n_pokoj))) + geom_bar(position="fill") +
  scale_fill_brewer(name="Liczba pokoi", palette="Reds") + geom_text(aes(label=..count..), stat="count", position="fill", vjust="bottom")

plot of chunk unnamed-chunk-8

Ostatnie szlify

mutate(mieszkania, n_pokoj=if_else(n_pokoj>4, "więcej niż 4", as.character(n_pokoj))) -> mieszkania
ggplot(mieszkania, aes(x=dzielnica, fill=as.factor(n_pokoj))) + geom_bar(position="fill") +
  scale_fill_brewer(name="Liczba pokoi", palette="Reds") + geom_text(aes(label=..count..), stat="count", position="fill", vjust="bottom")

plot of chunk unnamed-chunk-9

Zadania

Do użycia nowy zbiór z pliku “data/mieszkania_wroclaw_ceny_rozbudowana.csv”

  • Narysuj wykres słupkowy liczby mieszkań w wybranych kategoriach cenowych.
  • Zbadaj jak rozkłada się to w zależności od dzielnic.
  • Zbadaj odwrotną relację tzn. liczbę mieszkań w określonych kategoriach cenowych w wybranych dzielnicach

Rozkład kategorii cenowych

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=kat_cenowa)) + geom_bar() 

plot of chunk unnamed-chunk-10

Rozkład kategorii cenowych wg dzielnic

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=kat_cenowa, fill=dzielnica)) +  geom_bar(position="fill") 

plot of chunk unnamed-chunk-11

Rozkład dzielnic wg kategorii

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, fill=kat_cenowa)) +  geom_bar(position="fill") 

plot of chunk unnamed-chunk-12

Dwa wymiary

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=cena)) +  geom_boxplot() 

plot of chunk unnamed-chunk-13

Skala logarytmiczna

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=cena)) +  geom_boxplot()+ scale_y_log10()

plot of chunk unnamed-chunk-14

Z etykietką

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=cena)) + geom_boxplot(stat="boxplot") +scale_y_log10() +
  geom_text(data=aggregate(cena ~ dzielnica,mieszkania, median), aes(label=cena, x=dzielnica, y=cena), vjust=-0.75)

plot of chunk unnamed-chunk-15

Bez outlierów

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
filter(mieszkania, cena < 1000000) -> mieszkania
ggplot(mieszkania, aes(x=dzielnica, y=cena)) + geom_boxplot(stat="boxplot") +scale_y_log10() +
  geom_text(data=aggregate(cena ~ dzielnica,mieszkania, median), aes(label=cena, x=dzielnica, y=cena), vjust=-0.75)

plot of chunk unnamed-chunk-16

Bez outlierów

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=cena)) + geom_boxplot(stat="boxplot") +scale_y_log10() +
  geom_text(data=aggregate(cena ~ dzielnica,mieszkania, median), aes(label=cena, x=dzielnica, y=cena), vjust=-0.75) + ylim(1e5, 1e6)
## Scale for 'y' is already present. Adding another scale for 'y', which
## will replace the existing scale.
## Warning: Removed 97 rows containing non-finite values (stat_boxplot).

plot of chunk unnamed-chunk-17

Zadania

  • Pokaż na wykresie pudełkowym zależność metrażu mieszkań w zależności od dzielnicy
  • Zaznacz kolorem kategorie cenowe
  • Jaką tendencję można wyciągnąć z tego wykresu?
  • Jakie są wartości liczbowe median metrażu?

Metraż wg dzielnic

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=metraz)) +  geom_boxplot() 

plot of chunk unnamed-chunk-18

Metraż wg dzielnic i kategorii cenowych

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=metraz, fill=kat_cenowa)) +  geom_boxplot() 

plot of chunk unnamed-chunk-19

Mediany

aggregate(metraz ~ kat_cenowa + dzielnica, mieszkania, median)
##          kat_cenowa    dzielnica metraz
## 1   1. bardzo tanie    Fabryczna  64.00
## 2          2. tanie    Fabryczna  56.43
## 3         3. drogie    Fabryczna  53.60
## 4  4. bardzo drogie    Fabryczna  48.00
## 5   1. bardzo tanie       Krzyki  70.00
## 6          2. tanie       Krzyki  64.25
## 7         3. drogie       Krzyki  56.00
## 8  4. bardzo drogie       Krzyki  49.00
## 9   1. bardzo tanie    Psie Pole  65.40
## 10         2. tanie    Psie Pole  55.25
## 11        3. drogie    Psie Pole  49.69
## 12 4. bardzo drogie    Psie Pole  53.13
## 13  1. bardzo tanie  Srodmiescie  70.00
## 14         2. tanie  Srodmiescie  63.00
## 15        3. drogie  Srodmiescie  52.60
## 16 4. bardzo drogie  Srodmiescie  64.00
## 17  1. bardzo tanie Stare Miasto  72.00
## 18         2. tanie Stare Miasto  56.75
## 19        3. drogie Stare Miasto  50.55
## 20 4. bardzo drogie Stare Miasto  54.00

Wykres punktowy

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=metraz, y=cena_m2)) + geom_point()

plot of chunk unnamed-chunk-21

Wykres punktowy z podziałami

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=metraz, y=cena_m2)) + geom_point() + facet_wrap(~dzielnica)

plot of chunk unnamed-chunk-22

Wykres z rozrzutem

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=metraz, y=cena_m2)) + geom_jitter(size=0.1) +facet_wrap(~dzielnica) 

plot of chunk unnamed-chunk-23

Wykres z pomocnikiem…

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=metraz, y=cena_m2)) + geom_jitter(size=0.1) + geom_smooth(method="loess") + facet_wrap(~dzielnica) 

plot of chunk unnamed-chunk-24

… i poprawioną skalą

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
filter(mieszkania, metraz<150) -> mieszkania
ggplot(mieszkania, aes(x=metraz, y=cena_m2)) + geom_jitter(size=0.1) + geom_smooth(method="loess") + facet_wrap(~dzielnica)

plot of chunk unnamed-chunk-25

… i bez Starego Miasta

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
filter(mieszkania, metraz<150, dzielnica != "Stare Miasto") -> mieszkania
ggplot(mieszkania, aes(x=metraz, y=cena_m2)) + geom_jitter(size=0.1) + geom_smooth(method="loess") + facet_wrap(~dzielnica)

plot of chunk unnamed-chunk-26

Zadanie

  • Stwórz wersję wykresu metrażu w zależności od dzielnic z użyciem podziałów
  • Czy ta wizualizacja jest lepsza czy gorsza od wersji z kolorami?

Metraż wg dzielnic i kategorii cenowych

mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=metraz)) +  geom_boxplot() + facet_wrap(~kat_cenowa)

plot of chunk unnamed-chunk-27

https://github.com/STWUR/eRementarz2 - kody i dane do spotkania.

Dziękujemy firmie Kruk SA (jedzenie i napoje) za wspieranie spotkań STWURa.