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
library(ggplot2)
ggplot(mpg, aes(hwy, cty)) +
geom_point(aes(color=cyl)) + geom_smooth(method="lm") +
coord_cartesian() + scale_color_gradient() + theme_bw()
Najprostszy przykład
library(ggplot2)
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny.csv")
ggplot(mieszkania, aes(x=dzielnica)) + geom_bar()
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`.
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`.
Kolejny wymiar
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny.csv")
ggplot(mieszkania, aes(x=dzielnica, fill=as.factor(n_pokoj))) + geom_bar()
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")
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")
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")
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")
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()
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")
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")
Dwa wymiary
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=cena)) + geom_boxplot()
Skala logarytmiczna
mieszkania <- read.csv("data/mieszkania_wroclaw_ceny_rozbudowana.csv")
ggplot(mieszkania, aes(x=dzielnica, y=cena)) + geom_boxplot()+ scale_y_log10()
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)
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)
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).
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()
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()
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()
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)
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)
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)
… 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)
… 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)
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)
Link do repotyzorium
https://github.com/STWUR/eRementarz2 - kody i dane do spotkania.
Dziękujemy firmie Kruk SA (jedzenie i napoje) za wspieranie spotkań STWURa.